Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
191 commits
Select commit Hold shift + click to select a range
5a38045
Fix: instance-scope the per-agent theme.json (ADR 0004/0042) (#1294)
mabry1985 Jun 22, 2026
f62e486
Sync the tab favicon + theme-color with the active per-agent theme (#…
mabry1985 Jun 22, 2026
2a402a3
fix(acp): reap coding-agent subprocesses — kill the process group, ha…
mabry1985 Jun 22, 2026
6f9b0cd
fix(acp): initialize-only health probe + strip nested-Claude env + ro…
mabry1985 Jun 22, 2026
91f7a0d
fix(desktop): give the sidecar the user's real PATH; probe honors del…
mabry1985 Jun 22, 2026
2ad4131
test(chat-e2e): cover the ✕-cancel of a queued steer (closes #1103) (…
mabry1985 Jun 22, 2026
188b14c
docs(changelog): backfill Unreleased entries for the 0.67 batch (#1304)
mabry1985 Jun 22, 2026
d0026aa
chore: release v0.67.0 (#1305)
mabry1985 Jun 22, 2026
824e492
ci(web-e2e): cache Playwright browsers + timeout/retry the install (f…
mabry1985 Jun 22, 2026
c3b2a23
fix(docker): multi-stage console build + dep-drift guard (closes #874…
mabry1985 Jun 22, 2026
ae8632a
perf: off-loop console handlers + inbox/activity retention (#875) (#1…
mabry1985 Jun 22, 2026
1320d7a
fix(console): disable rail panel-toggle buttons when the rail is empt…
mabry1985 Jun 22, 2026
3dc845d
perf(chat): incremental mid-stream output/reasoning views — kill the …
mabry1985 Jun 22, 2026
6e2a9a1
perf(console): goals/tasks panels invalidate on the event bus, drop t…
mabry1985 Jun 22, 2026
a8972dd
feat(tooling): scripts/reset.sh — CLI factory-reset for the default i…
mabry1985 Jun 22, 2026
014cc17
chore(issues): issue forms + silent validation gate (#1314)
mabry1985 Jun 23, 2026
eb083c5
feat: /issue — user-only GitHub issue command + console form dialog (…
mabry1985 Jun 23, 2026
c813998
feat(issue): repo picker list + util-bar bug action + tooltip popover…
mabry1985 Jun 23, 2026
7de0de4
fix(console): Background-agents util pill uses the DS Tooltip popover…
mabry1985 Jun 23, 2026
c1006b1
chore(web): @protolabsai/ui 0.45 → 0.46.0 (collision-aware Tooltip) (…
mabry1985 Jun 23, 2026
4975687
fix(task-tool): error-state cards + subagent label + fold settled too…
mabry1985 Jun 23, 2026
eed6292
chore(web): swap local ToolCardSummary shim for the published DS prim…
mabry1985 Jun 23, 2026
8d6beec
fix: nest subagent tool cards under the task by explicit parent id (#…
mabry1985 Jun 23, 2026
b98ad46
chore(tools): temporarily disable the show_component tool (see #1323)…
mabry1985 Jun 23, 2026
56a1c9f
fix(web): collapse a delegation's nested tools (stable height, no bou…
mabry1985 Jun 23, 2026
84afcc1
docs(changelog): tool-call rendering overhaul + show_component disabl…
mabry1985 Jun 23, 2026
d0fc715
chore: release v0.68.0 (#1326)
mabry1985 Jun 23, 2026
c980963
feat: native reasoning + folded work block + streamdown chat markdown…
mabry1985 Jun 23, 2026
6e0cddc
test(web): full markdown-surface smoke test (chat renderer audit) (#1…
mabry1985 Jun 23, 2026
7966cab
feat(web): adopt the DS Markdown renderer (@protolabsai/ui 0.48) — cl…
mabry1985 Jun 24, 2026
ed8f941
docs(changelog): native reasoning + DS markdown renderer under [Unrel…
mabry1985 Jun 24, 2026
b139f84
chore: release v0.69.0 (#1333)
mabry1985 Jun 24, 2026
79e4088
feat(plugins): seam for plugin-owned /<name> chat commands (#1334)
mabry1985 Jun 24, 2026
3caba9b
feat(web): "Report a bug" link in the hamburger menu (#1335)
mabry1985 Jun 24, 2026
c5aee7e
feat: remove GitHub from core — it's a standalone plugin now (PR2) (#…
mabry1985 Jun 24, 2026
350333a
docs(marketing): point the GitHub plugin directory entry at the stand…
mabry1985 Jun 24, 2026
da82898
chore: release v0.70.0 (#1339)
mabry1985 Jun 24, 2026
ecb00b5
feat(web): fork-safe console behavior seams — slash / composer / pale…
mabry1985 Jun 24, 2026
65f3878
feat(web): createUISlice — fork-owned persisted UI state (ADR 0061, c…
mabry1985 Jun 24, 2026
e2c6a04
fix(web): console SSE sends the sse-token the server requires under a…
mabry1985 Jun 25, 2026
3d70ec0
fix(a2a): drop legacy pre-SDK tasks table on boot so the SDK can recr…
mabry1985 Jun 25, 2026
f17f5e6
feat(delegates): add list_agents tool alongside delegate_to (#1344)
mabry1985 Jun 25, 2026
8a114c1
feat(plugins): let a plugin declare auth-exempt paths in its manifest…
mabry1985 Jun 25, 2026
edcb940
feat(fleet): auto-enable a bundle's plugins when creating an agent fr…
mabry1985 Jun 26, 2026
0921a37
feat(plugins): apply a bundle's recommended config defaults on instal…
mabry1985 Jun 26, 2026
92cad7f
feat(subagents): allow_skill_emission flag to opt a subagent out of d…
mabry1985 Jun 26, 2026
c25631f
docs(fleet): note last-write-wins merge semantics in _apply_bundle_co…
mabry1985 Jun 26, 2026
a2c8ad4
feat(web): compact plugin rows + Configure opens a per-plugin setting…
mabry1985 Jun 26, 2026
5fe263e
feat(web): declutter plugin rows — drop redundant status badges, fix …
mabry1985 Jun 26, 2026
3e32050
fix(web): plugin views now pick up the theme on first paint (handshak…
mabry1985 Jun 26, 2026
8c65c40
chore(web): bump @protolabsai/ui to 0.48.3 (plugin-kit ready handshak…
mabry1985 Jun 26, 2026
ae053fb
fix(coding_agent): find node/npx when the server runs as a service (n…
mabry1985 Jun 26, 2026
e69f24b
feat(plugins): live config accessor + comma-separated string_list inp…
mabry1985 Jun 26, 2026
ea65103
fix(coding_agent): show the bare tool name for MCP calls, not mcp__se…
mabry1985 Jun 26, 2026
63f817e
fix(plugins): auto-exempt console view pages from the auth gate (#1360)
mabry1985 Jun 27, 2026
bd78085
feat(web): hide rail surfaces without disabling + Configure from the …
mabry1985 Jun 27, 2026
004864f
feat(config): PROTOAGENT_SEED_CONFIG + Docker config-as-code deploy g…
mabry1985 Jun 27, 2026
05edce4
chore(web): strip hardcoded emojis from UI strings (strict no-emoji) …
mabry1985 Jun 27, 2026
638df13
feat(web): Shift+click a chat tab's ✕ to quick-delete (no confirm, no…
mabry1985 Jun 27, 2026
cfa3843
fix(web): full-width raw streaming text — drop the loading side-bar (…
mabry1985 Jun 27, 2026
349d92e
feat(web): scoped, user-rebindable keybinding system (ADR 0063) (#1364)
mabry1985 Jun 27, 2026
1aa423d
feat(web): full-screen document viewer — read background reports in-p…
mabry1985 Jun 27, 2026
b1d1871
refactor(web): shared <ChatMessageView> for the main + ⌘K palette cha…
mabry1985 Jun 27, 2026
8d7fa91
feat(web): live text↔tool interleave in the ⌘K palette chat (#1370)
mabry1985 Jun 27, 2026
9a7ddc2
feat(web): panel-focus keybindings ⌃1-4 (ADR 0063) (#1371)
mabry1985 Jun 27, 2026
2e6a3a2
chore: release v0.71.0 (#1376)
mabry1985 Jun 27, 2026
cb0cca7
feat: context-window meter + per-turn cost/time in chat (#1372, #1378…
mabry1985 Jun 27, 2026
b2e3df1
fix(web): show the chat-tab trash only on the hovered ✕, not every ta…
mabry1985 Jun 27, 2026
7af77d4
fix(web): clear error for images on a text-only model, instead of a c…
mabry1985 Jun 27, 2026
03c5604
feat: vision-describe pass — attach images to a text-only chat model …
mabry1985 Jun 27, 2026
3b2fe82
feat: attribute each Activity response to the stimulus it replies to …
mabry1985 Jun 27, 2026
4bb6126
fix: dedup inbox/activity now-item notifications + deliver-before-fir…
mabry1985 Jun 27, 2026
8bef8d3
feat: re-enable inline components — extensible registry + clean order…
mabry1985 Jun 28, 2026
f09bc24
feat(web): "Get models" — pull a gateway's model list into the Primar…
mabry1985 Jun 28, 2026
47344bc
refactor(web): inline action feedback → toasts (settings + 7 panels) …
mabry1985 Jun 28, 2026
461d526
chore: release v0.72.0 (#1390)
mabry1985 Jun 28, 2026
6ff05e3
ci: bump GitHub Actions off the deprecated Node 20 runtime (#1392)
mabry1985 Jun 28, 2026
232103e
fix(security): secure defaults — gate /metrics + strip secrets from M…
mabry1985 Jun 28, 2026
6a4f0a9
feat(web): Tools view — group plugin tools by plugin, split the Gener…
mabry1985 Jun 28, 2026
151a87a
feat(web): domain-first settings IA (ADR 0048) — all slices (#1393)
mabry1985 Jun 28, 2026
267599f
fix(security): Batch 1 backend hardening — SSRF guard, busy_timeout, …
mabry1985 Jun 28, 2026
3606ebf
docs(changelog): add Unreleased entries for #1393 (settings IA) + #13…
mabry1985 Jun 28, 2026
54cc8e2
fix(security): Batch 2 (1/2) — plugin public_paths auth-bypass, data-…
mabry1985 Jun 28, 2026
34ed91d
fix(security): Batch 2 (2/2) — fail-safe plugin secret redaction (dis…
mabry1985 Jun 29, 2026
680a18a
fix(web): requestForm reads the error body once (restores 401 prompt …
mabry1985 Jun 29, 2026
1c9c5cc
feat(web): Tools view — group MCP tools by server (#1405)
mabry1985 Jun 29, 2026
2c8834a
feat(background): task_batch(run_in_background=True) + a background c…
mabry1985 Jun 29, 2026
b6c4f4f
fix(chat): isolate subagent token streams from the lead turn (no inte…
mabry1985 Jun 29, 2026
58c0844
feat(web): live tool-card feed for background jobs (ADR 0050 Phase 3)…
mabry1985 Jun 29, 2026
a7207d3
fix: serialize ACP runtime registry + never evict an in-flight runtim…
mabry1985 Jun 29, 2026
61ed593
fix(web): guard streaming against cross-context frames (#1394 follow-…
mabry1985 Jun 29, 2026
c5dbba6
docs(dev): goal trust-gate token-model design note (for decision) (#1…
mabry1985 Jun 29, 2026
c3240df
feat(web): split Settings ▸ Knowledge into Recall/Ingestion/History +…
mabry1985 Jun 29, 2026
85a53c2
fix(chat/a2a): Batch 4 finalization quick-wins — no answer truncation…
mabry1985 Jun 29, 2026
eef7d79
fix(chat): serialize same-context A2A turns + no silent empty answer …
mabry1985 Jun 29, 2026
5bd7af1
refactor(subagents): de-protocol subagent prompts (answer natively, n…
mabry1985 Jun 29, 2026
b9dd458
refactor(output): retire the <scratch_pad>/<output> structured-output…
mabry1985 Jun 29, 2026
b876042
fix(chat): merge cross-tab chat-store writes instead of last-writer-w…
mabry1985 Jun 29, 2026
cde366b
docs(security): document the console localStorage bearer; recommend e…
mabry1985 Jun 29, 2026
e2abd49
docs(changelog): record the launch-hardening + Batch 4 + background w…
mabry1985 Jun 29, 2026
0b5c0f3
chore: release v0.73.0 (#1416)
mabry1985 Jun 29, 2026
0f47447
feat(tools): run_command via /bin/sh -c so shell operators work (#1419)
mabry1985 Jun 29, 2026
49cfbe3
feat(chat): reusable tone-aware system-note type for in-thread notice…
mabry1985 Jun 29, 2026
1311467
feat(tools): bypass-permissions mode — per-tab auto-approve for run_c…
mabry1985 Jun 29, 2026
e20209b
chore: release v0.74.0 (#1421)
mabry1985 Jun 29, 2026
ba046b2
fix: custom api_base gateway not blocked + plugin config appears with…
mabry1985 Jun 29, 2026
0416427
docs(changelog): record #1422 egress fix + #1423 plugin-config fix (#…
mabry1985 Jun 29, 2026
71ffca7
chore: release v0.75.0 (#1425)
mabry1985 Jun 29, 2026
94dd8a9
feat(web): add "Manage plugins…" to the rail context menus (#1426)
mabry1985 Jun 29, 2026
f1106da
docs(changelog): record #1426 rail "Manage plugins…" under Unreleased…
mabry1985 Jun 29, 2026
13febcf
fix(web): retire the two residual /api/config writers (identity name …
mabry1985 Jun 29, 2026
81f093f
docs(adr-0048): record the settings/views/config true-up + DS extract…
mabry1985 Jun 29, 2026
b33df77
fix(web): Skills surface self-reports errors via toast (no more silen…
mabry1985 Jun 29, 2026
44a8906
refactor(web): toast-convention sweep — MCP · Plugins · Knowledge (Ph…
mabry1985 Jun 30, 2026
083703e
refactor(web): plugin uninstall/restart use ConfirmDialog, not window…
mabry1985 Jun 30, 2026
b2d0767
refactor(web): delete the dead hostLayer path from SettingsCategory (…
mabry1985 Jun 30, 2026
9f674a2
refactor(web): adopt DS TextLink + Kbd (drop hand-rolled link anchor …
mabry1985 Jun 30, 2026
3691a65
docs(dev): bank the remaining settings true-up stages (T6 + Phase 4) …
mabry1985 Jun 30, 2026
3f89502
refactor(web): Playbooks surface reads via TanStack Query (T6) (#1436)
mabry1985 Jun 30, 2026
19ed088
refactor(web): Knowledge store reads via TanStack Query (T6) (#1437)
mabry1985 Jun 30, 2026
02a26ce
refactor(web): adopt DS ToastProvider `position`; drop the toast-stac…
mabry1985 Jun 30, 2026
6ce705e
refactor(web): adopt DS `Button loading`; retire the app `.spin` keyf…
mabry1985 Jun 30, 2026
c0db461
refactor(web): MCP catalog & plugin Discover use DS Input icon + segm…
mabry1985 Jun 30, 2026
a4f2c35
refactor(web): secret fields use DS SecretInput (password + reveal to…
mabry1985 Jun 30, 2026
02e6ef8
docs(changelog): record the settings true-up batch under Unreleased (…
mabry1985 Jun 30, 2026
b522435
chore: release v0.76.0 (#1445)
mabry1985 Jun 30, 2026
c58bfb1
feat(graph): StallGuardMiddleware — break a no-progress tool loop (#1…
mabry1985 Jun 30, 2026
6663bb9
fix(web): allow pointer lock in plugin-view iframes (#1448)
mabry1985 Jun 30, 2026
f94ad14
coder: execution-grounded code-solve (ADR 0064 + P1) (#1449)
mabry1985 Jun 30, 2026
ca00c4a
fix(desktop): open plugin-iframe external links in the system browser…
mabry1985 Jun 30, 2026
490cb86
fix(coder): address review — concurrency, parse robustness, frozen gu…
mabry1985 Jun 30, 2026
8ed1753
feat(coder): P3 — wire the fusion rung (ADR 0064) (#1452)
mabry1985 Jun 30, 2026
43e65a9
feat(plugins): bundle the artifact plugin into core (off by default) …
mabry1985 Jun 30, 2026
ae30375
fix(web): stop interstitial text/components flashing into main chat b…
mabry1985 Jun 30, 2026
c2790f1
feat(plugins): ship the artifact plugin on by default (#1455)
mabry1985 Jun 30, 2026
18de395
fix(settings): surface when agent config shadows a host-scoped field …
mabry1985 Jun 30, 2026
8bbef0b
feat(artifact): surface render errors back to the agent (#1458) (#1461)
mabry1985 Jun 30, 2026
0e883da
docs: phone/LAN/tailnet access guide + tunnel section (#1462)
mabry1985 Jun 30, 2026
56815e9
feat(paths): add two-tier InstancePaths resolver (box/instance) (#1463)
mabry1985 Jun 30, 2026
e5617ac
feat(hitl): autonomous-turn guard + multi-step wizard / choice-card f…
mabry1985 Jun 30, 2026
5bd0e1a
feat(config): cut config tier over to InstancePaths + seamless upgrad…
mabry1985 Jun 30, 2026
a26fce3
fix(hitl): autonomous turns force-complete (+ clear interrupt) past t…
mabry1985 Jun 30, 2026
b19ae0b
test(integration): real-subprocess multi-instance fleet harness (skel…
mabry1985 Jun 30, 2026
0c392e0
feat(delegates): configurable A2A poll timeout + error transparency (…
mabry1985 Jun 30, 2026
9516257
fix(hitl): hard-deny HITL tools from subagents + multi-interrupt trip…
mabry1985 Jun 30, 2026
b86ede4
feat(fleet): remote-member health robustness — probe-on-register, fre…
mabry1985 Jun 30, 2026
4b34970
feat(fleet): auto-sweep discovery on hub boot so first console open i…
mabry1985 Jun 30, 2026
b2dfabc
test(integration): cover fleet member crash -> detect -> restart (#1472)
mabry1985 Jun 30, 2026
08c02f0
docs(hitl): changelog + starter-tools for the HITL forms/guard work (…
mabry1985 Jun 30, 2026
acc8909
fix(fleet): detect a crashed co-located member (reap its zombie) (#1474)
mabry1985 Jun 30, 2026
d17c7a2
feat(config): add `config explain` diagnostic (CLI + operator API) (#…
mabry1985 Jun 30, 2026
dbf4151
feat(a2a): protocol-version negotiation — fail fast on an older peer …
mabry1985 Jun 30, 2026
bef2e58
docs(knowledge): document fleet/commons sharing + fix stale top_k def…
mabry1985 Jun 30, 2026
fc60897
docs(changelog): record today's config-foundation + fleet-hardening w…
mabry1985 Jun 30, 2026
1c4986a
fix(docs): route in-content cross-reference links in-app, not inside …
mabry1985 Jun 30, 2026
399718d
refactor(paths): complete the two-tier path model — store-tier migrat…
mabry1985 Jun 30, 2026
736166e
ci(checks): add fleet-integration job for the real multi-instance har…
mabry1985 Jul 1, 2026
d8a70fe
refactor(reset): rewrite factory-reset scripts for the ADR-0065 two-t…
mabry1985 Jul 1, 2026
1e4a588
feat(knowledge): give the agent a knowledge_ingest tool (URLs + media…
mabry1985 Jul 1, 2026
a793e5b
feat(knowledge): run slow ingests in the background (ADR 0050 work jo…
mabry1985 Jul 1, 2026
9696b07
feat(artifact): auto-mount React <App/> so the first-try render just …
mabry1985 Jul 1, 2026
469c8f7
docs(subagents): document background jobs + the reusable spawn_work p…
mabry1985 Jul 1, 2026
b306be5
feat(palette): the ⌘K chat survives being closed mid-turn (durable re…
mabry1985 Jul 1, 2026
18a3869
docs(changelog): add this session's knowledge-ingest + palette entrie…
mabry1985 Jul 1, 2026
86f8918
chore: release v0.77.0 (#1490)
mabry1985 Jul 1, 2026
3eb2918
feat(goals): retire the goal-continuation XML for tools (update_goal_…
mabry1985 Jul 1, 2026
7ab840c
fix(goals): gate /goal chat verifiers to close the RCE-via-chat hole …
mabry1985 Jul 1, 2026
744c727
fix(web): grant allow-pointer-lock to palette-morph plugin iframes (#…
mabry1985 Jul 1, 2026
8c32e24
feat(goals): sdk.run_in_session — a goal-fire → follow-up-agent-turn …
mabry1985 Jul 1, 2026
ab303d9
refactor(goals): unify the drive-loop fresh-context continuation conf…
mabry1985 Jul 1, 2026
bced134
feat(goals): monitor-goal deadline + stall_after (ADR 0030 D5) (#1499)
mabry1985 Jul 1, 2026
ba4e198
fix(docs): make docs_search thread-safe (fixes float(None) TypeError …
mabry1985 Jul 1, 2026
28b3e87
fix(skills): make SkillsIndex thread-safe (same shared-sqlite-connect…
mabry1985 Jul 1, 2026
52061c1
feat(security): federation token + /api operator ceiling; operator go…
mabry1985 Jul 1, 2026
2b03ec3
feat(watches): standalone watch primitive — many concurrent supervise…
mabry1985 Jul 1, 2026
03b6a45
feat(goals): surface live goal.iteration progress in the Goals panel …
mabry1985 Jul 1, 2026
09e3e90
feat(watches): operator /api/watches + sdk.create_watch + register_wa…
mabry1985 Jul 1, 2026
0426561
feat(watches): console Watches panel (ADR 0067 PR3) (#1508)
mabry1985 Jul 1, 2026
ef4241c
fix(watches): serialize evaluate per watch id + disambiguate store fi…
mabry1985 Jul 1, 2026
e7ca4af
feat(goals): console set-goal form (ADR 0066 follow-up) (#1510)
mabry1985 Jul 1, 2026
b384814
refactor(goals): retire the monitor disposition — goals are drive-onl…
mabry1985 Jul 1, 2026
6db32d0
docs: changelog + watches guide + drive-only true-up for the goal/wat…
mabry1985 Jul 1, 2026
5fadaa3
chore(beads): clear out stale issue tracker (67 → 0) (#1513)
mabry1985 Jul 1, 2026
c651500
feat(artifact): pan & zoom for mermaid + svg diagrams (#1495) (#1517)
mabry1985 Jul 1, 2026
8c4dd4a
feat(web): open Knowledge Upload/Add in a dialog, not inline (#1502) …
mabry1985 Jul 1, 2026
7c81983
feat(web): expose registerKeybinding on the fork extension seam (#145…
mabry1985 Jul 1, 2026
23bc012
feat(web): terminal-style input history in the chat composer (#1496) …
mabry1985 Jul 1, 2026
74dbd9e
docs(adr): 0068 — developer flags & the Developer panel (#1506) (#1531)
mabry1985 Jul 1, 2026
d085994
docs(portfolio): add 'spinning up teams on demand' + gateway inherita…
mabry1985 Jul 1, 2026
e069b96
Merge remote-tracking branch 'upstream/main' into chore/sync-upstream…
mabry1985 Jul 1, 2026
86d5056
test(config): update roundtrip golden to the Lead Engineer example co…
mabry1985 Jul 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
67 changes: 0 additions & 67 deletions .beads/issues.jsonl

Large diffs are not rendered by default.

10 changes: 8 additions & 2 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,15 @@ tests/

# Docs site — VitePress builds to gh-pages, not into the container
docs/

# node_modules NEVER enter the build context — the web-builder stage runs a fresh
# `npm ci` and the python runtime installs via pip, so a host's node_modules would
# only bloat the context and risk leaking platform-specific binaries.
node_modules/
package.json
package-lock.json
# NOTE: package.json / package-lock.json are deliberately NOT excluded — the
# web-builder stage COPYs them to run `npm ci` and build the React console
# (apps/web/dist). Re-excluding them breaks that stage (the #874 console-never-
# ships bug). They're harmless in the runtime image (Python ignores them).

# Seccomp profile — Docker reads this on the host at runtime
# (via docker-compose security_opt), NOT from inside the image
Expand Down
54 changes: 54 additions & 0 deletions .github/ISSUE_TEMPLATE/bug.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
name: Bug report
description: Something is broken or behaves incorrectly.
title: "bug: "
labels: ["bug"]
body:
- type: markdown
attributes:
value: |
Thanks for filing. The required fields below map 1:1 to the issue gate
(`.github/workflows/issue-gate.yml`) — fill them and the gate passes.
See #1300 / #1310 for the house style.
- type: textarea
id: problem
attributes:
label: Problem / what's wrong
description: What's broken, and where? Name the file / subsystem, and link the relevant ADR if any.
placeholder: "`server/chat.py` does X every chunk but the contract says Y…"
validations:
required: true
- type: textarea
id: repro
attributes:
label: Steps to reproduce / evidence
description: Minimal steps, logs, or a stack trace that demonstrate it.
validations:
required: true
- type: textarea
id: expected-actual
attributes:
label: Expected vs. actual
description: What you expected to happen, and what actually happened.
validations:
required: true
- type: textarea
id: acceptance
attributes:
label: Acceptance
description: How we'll know it's fixed — verifiable criteria.
validations:
required: true
- type: input
id: env
attributes:
label: Environment
description: Instance (default/dev), OS, app vs. CLI, version / commit.
validations:
required: false
- type: textarea
id: refs
attributes:
label: Refs
description: Related issues / PRs / ADRs (e.g. #1298, ADR 0047).
validations:
required: false
11 changes: 11 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Keep blank issues enabled: maintainers/agents may file intentional free-form
# issues (tracking notes, quick split-outs). The gate flags those unless they
# carry the `gate-exempt` label — see CONTRIBUTING.md.
blank_issues_enabled: true
contact_links:
- name: Issue standard & contributing
url: https://github.com/protoLabsAI/protoAgent/blob/main/CONTRIBUTING.md
about: What a good issue needs (the same checks the silent gate runs) and how to clear the needs-info label.
- name: Report a security vulnerability
url: https://github.com/protoLabsAI/protoAgent/security/advisories/new
about: Disclose vulnerabilities privately — do not open a public issue.
39 changes: 39 additions & 0 deletions .github/ISSUE_TEMPLATE/enhancement.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
name: Enhancement / feature
description: A new capability, or an improvement to an existing one.
title: "feat: "
labels: ["enhancement"]
body:
- type: markdown
attributes:
value: |
The required fields below map 1:1 to the issue gate
(`.github/workflows/issue-gate.yml`) — fill them and the gate passes.
See #1159 for the house style.
- type: textarea
id: problem
attributes:
label: Problem / motivation
description: What gap or pain motivates this? Who's affected, and where does it live today?
validations:
required: true
- type: textarea
id: proposal
attributes:
label: Proposed direction
description: Sketch the approach. Multiple options are fine — note the trade-offs.
validations:
required: true
- type: textarea
id: acceptance
attributes:
label: Acceptance
description: Verifiable criteria for "done".
validations:
required: true
- type: textarea
id: refs
attributes:
label: Refs
description: Related issues / PRs / ADRs.
validations:
required: false
85 changes: 73 additions & 12 deletions .github/workflows/checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ jobs:
runs-on: ubuntu-latest # workspace-config: allow-hosted-runner public repo — GH-hosted is free
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- uses: actions/checkout@v5
- uses: actions/setup-node@v5
with:
node-version: "20"
- name: Verify workspace config (.beads / .automaker / owned runners)
Expand Down Expand Up @@ -64,8 +64,8 @@ jobs:
runs-on: ubuntu-latest # workspace-config: allow-hosted-runner public repo — GH-hosted is free
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
- uses: actions/checkout@v5
- uses: actions/setup-python@v6
with:
python-version: "3.12"
- name: Ruff check
Expand All @@ -89,8 +89,8 @@ jobs:
runs-on: ubuntu-latest # workspace-config: allow-hosted-runner public repo — GH-hosted is free
timeout-minutes: 15
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
- uses: actions/checkout@v5
- uses: actions/setup-python@v6
with:
python-version: "3.12"
cache: pip
Expand All @@ -107,13 +107,45 @@ jobs:
. .venv/bin/activate
python -m pytest tests/ -q

fleet-integration:
name: Fleet integration (multi-instance)
runs-on: ubuntu-latest # workspace-config: allow-hosted-runner public repo — GH-hosted is free
# These tests boot real `python -m server` hub+member processes (against the
# local scripts/fake_openai_server.py) on free loopback ports + tmp roots, so
# they're much slower than the unit suite — allow ~10 min. Kept a SEPARATE job
# from `tests` so its real-boot slowness never gates the fast unit run.
timeout-minutes: 12
steps:
- uses: actions/checkout@v5
- uses: actions/setup-python@v6
with:
python-version: "3.12"
cache: pip
- name: Install dependencies
# Mirror the `tests` job: full requirements.txt in a venv so
# tests/conftest.py's site.getsitepackages() reorder resolves (#175).
run: |
python -m venv .venv
. .venv/bin/activate
python -m pip install --upgrade pip
pip install -r requirements.txt pytest pytest-asyncio
- name: Boot real multi-instance fleet (hub + members) and exercise it
# PA_RUN_INTEGRATION=1 flips on the real-subprocess harness the default
# `pytest tests/` skips. Covers instance isolation, hub→member proxy
# round-trip, cross-instance A2A delegation, and member crash→detect→restart
# (POSIX zombie-reap — works on Linux). No network egress beyond loopback:
# the fake gateway is local; mDNS advertise binds loopback only.
run: |
. .venv/bin/activate
PA_RUN_INTEGRATION=1 python -m pytest tests/integration -q

live-smoke:
name: A2A live smoke (lean tier)
runs-on: ubuntu-latest # workspace-config: allow-hosted-runner public repo — GH-hosted is free
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
- uses: actions/checkout@v5
- uses: actions/setup-python@v6
with:
python-version: "3.12"
cache: pip
Expand All @@ -139,8 +171,8 @@ jobs:
runs-on: ubuntu-latest # workspace-config: allow-hosted-runner public repo — GH-hosted is free
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- uses: actions/checkout@v5
- uses: actions/setup-node@v5
with:
node-version: "20"
cache: npm
Expand All @@ -151,8 +183,37 @@ jobs:
# the uiStore persist migration). Fast — runs before the heavier
# Playwright path so a reducer regression fails the job early.
run: npm run test:unit --workspace @protoagent/web
- name: Install Playwright chromium
run: npm --workspace @protoagent/web exec -- playwright install --with-deps chromium
- name: Resolve Playwright version
id: pw
run: echo "version=$(node -p "require('@playwright/test/package.json').version")" >> "$GITHUB_OUTPUT"
- name: Cache Playwright browsers
id: pw-cache
uses: actions/cache@v5
with:
path: ~/.cache/ms-playwright
key: playwright-${{ runner.os }}-${{ steps.pw.outputs.version }}
- name: Install Playwright browser + deps
# The chromium binary is the slow ~100MB CDN download that intermittently
# stalled ~10min until the job-level orphan-kill fired (#1167). Cache it keyed
# on the Playwright version (skips the download entirely on a hit — only the
# fast apt system-deps run then), and hard-cap each attempt with `timeout` so
# a stalled download fails fast and retries instead of hanging the whole job.
timeout-minutes: 8
run: |
if [ "${{ steps.pw-cache.outputs.cache-hit }}" = "true" ]; then
cmd="playwright install-deps chromium" # binary cached → apt deps only
else
cmd="playwright install --with-deps chromium"
fi
for attempt in 1 2 3; do
if timeout 240 npm --workspace @protoagent/web exec -- $cmd; then
exit 0
fi
echo "::warning::playwright install attempt $attempt stalled/failed; retrying…"
sleep 5
done
echo "::error::playwright install failed after 3 attempts"
exit 1
- name: Run E2E smoke (built SPA vs mock backend)
# Builds the web app, then drives it with Playwright against the
# deterministic mock backend (apps/web/e2e/mock-server.mjs) — no Python,
Expand Down
12 changes: 6 additions & 6 deletions .github/workflows/desktop-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -82,17 +82,17 @@ jobs:
target: x86_64-pc-windows-msvc
bundles: nsis
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
ref: ${{ inputs.tag || github.ref }}

- name: Setup Python
uses: actions/setup-python@v5
uses: actions/setup-python@v6
with:
python-version: '3.12'

- name: Setup Node
uses: actions/setup-node@v4
uses: actions/setup-node@v5
with:
node-version: '20'

Expand Down Expand Up @@ -337,7 +337,7 @@ jobs:

- name: Upload dispatch artifact
if: github.event_name == 'workflow_dispatch'
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: protoAgent-${{ steps.version.outputs.version }}-${{ matrix.target }}
path: dist-desktop/*
Expand Down Expand Up @@ -371,12 +371,12 @@ jobs:
# in-app updater notes (below). By tag-push time CHANGELOG.md already holds the
# dated `## [VERSION]` section — the bump PR (prepare-release.yml) merged before
# the tag. Without this the job has no working tree (it only `gh release`s).
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
ref: ${{ github.ref_name }}

- name: Setup Node
uses: actions/setup-node@v4
uses: actions/setup-node@v5
with:
node-version: '20'

Expand Down
10 changes: 5 additions & 5 deletions .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,21 +34,21 @@ jobs:

steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@v4

- name: Log in to GHCR
uses: docker/login-action@v3
uses: docker/login-action@v4
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Generate image metadata
id: meta
uses: docker/metadata-action@v5
uses: docker/metadata-action@v6
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: |
Expand All @@ -62,7 +62,7 @@ jobs:

- name: Build and push
id: build
uses: docker/build-push-action@v5
uses: docker/build-push-action@v7
with:
context: .
file: Dockerfile
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,14 @@ jobs:
build:
runs-on: ubuntu-latest # workspace-config: allow-hosted-runner public repo — GH-hosted is free
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- uses: actions/checkout@v5
- uses: actions/setup-node@v5
with:
node-version: 20
cache: npm
- run: npm install
- run: npm run docs:build
- uses: actions/upload-pages-artifact@v3
- uses: actions/upload-pages-artifact@v5
# Only needed to feed the deploy job — skip on PRs (build-only gate).
if: github.event_name != 'pull_request'
with:
Expand All @@ -49,4 +49,4 @@ jobs:
url: ${{ steps.deployment.outputs.page_url }}
steps:
- id: deployment
uses: actions/deploy-pages@v4
uses: actions/deploy-pages@v5
Loading
Loading