@staix/agent-hub 0.28.0 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +5 -3
  3. package/docs/agent-notes/README.md +12 -0
  4. package/docs/agent-notes/adapters.md +2 -1
  5. package/docs/agent-notes/bus.md +1 -0
  6. package/docs/agent-notes/daemon.md +4 -1
  7. package/docs/agent-notes/local-worker.md +3 -1
  8. package/docs/agent-notes/tasks.md +7 -3
  9. package/docs/agent-notes/tests.md +3 -0
  10. package/docs/design/adapters.md +56 -0
  11. package/docs/design/agent-hub-architecture.md +12 -0
  12. package/docs/design/bus.md +8 -0
  13. package/docs/design/task-board.md +19 -1
  14. package/docs/dogfood.md +13 -7
  15. package/docs/operations.md +177 -20
  16. package/docs/quickstart.md +18 -3
  17. package/docs/sdlc.md +2 -2
  18. package/docs/security.md +45 -4
  19. package/docs/smoke.md +13 -2
  20. package/docs/specs/2026-10-12-office-view-design.md +86 -3
  21. package/docs/verification/2026-11-03-0.29.0.md +59 -0
  22. package/docs/verification/2026-11-03-0.30.0.md +54 -0
  23. package/docs/verification/2026-11-03-agy-1.4.12-launcher-nonce.md +42 -0
  24. package/docs/verification/2026-11-03-agy-1.4.12.md +90 -0
  25. package/docs/verification/2026-11-03-agy-tui-close.md +49 -0
  26. package/docs/verification/2026-11-03-control-write-stall-windows.json +241 -0
  27. package/docs/verification/2026-11-03-control-write-stall-windows.md +20 -0
  28. package/docs/verification/2026-11-03-grok-1.0.62-t0.md +150 -0
  29. package/docs/verification/2026-11-03-live-board-latency.json +556 -0
  30. package/docs/verification/2026-11-03-live-board-latency.md +64 -0
  31. package/docs/verification/2026-11-03-pi-150-compat.md +40 -0
  32. package/docs/verification/2026-11-03-pi-title-api.md +26 -0
  33. package/docs/verification/2026-11-03-qwen-0265-acp.md +55 -0
  34. package/docs/verification/2026-11-03-qwen-0265-dual-output.md +40 -0
  35. package/docs/verification/dogfood/2026-11-03.md +3095 -0
  36. package/docs/verification/pi-150-model-free.ts +57 -0
  37. package/docs/verification/pi-150-native.mjs +21 -0
  38. package/docs/verification/pi-150-title-api.mjs +31 -0
  39. package/docs/verified.json +14 -14
  40. package/package.json +2 -2
  41. package/plugins/agent-hub/.claude-plugin/plugin.json +1 -1
  42. package/plugins/agent-hub/server.js +715 -45
  43. package/src/adapters/compat.ts +10 -10
  44. package/src/adapters/definitions/builtin-metadata.ts +2 -2
  45. package/src/adapters/local-worker.ts +22 -6
  46. package/src/adapters/pi.ts +92 -10
  47. package/src/adapters/registry-types.ts +4 -0
  48. package/src/adapters/registry.ts +2 -0
  49. package/src/cli/autonomy.ts +66 -1
  50. package/src/cli/console-state.ts +6 -2
  51. package/src/cli/help.ts +3 -1
  52. package/src/cli/identity.ts +8 -1
  53. package/src/cli/main.ts +39 -0
  54. package/src/cli/output.ts +5 -0
  55. package/src/cli/recovery-package.ts +9 -0
  56. package/src/cli/worktree-tidy.ts +158 -0
  57. package/src/cli/worktrees-output.ts +43 -0
  58. package/src/hub/board.ts +31 -5
  59. package/src/hub/bus.ts +4 -4
  60. package/src/hub/conductor.ts +4 -3
  61. package/src/hub/config-apply.ts +2 -1
  62. package/src/hub/control-client.ts +16 -1
  63. package/src/hub/control-write-trace.ts +409 -0
  64. package/src/hub/daemon.ts +408 -66
  65. package/src/hub/dogfood-read.ts +62 -9
  66. package/src/hub/hub-tools.ts +12 -6
  67. package/src/hub/manager.ts +9 -1
  68. package/src/hub/peer-doing.ts +33 -3
  69. package/src/hub/peers.ts +7 -0
  70. package/src/hub/routing.ts +9 -2
  71. package/src/hub/runtime-capture-prune.ts +4 -1
  72. package/src/hub/sdlc-release-authorization.ts +13 -4
  73. package/src/hub/sdlc-release.ts +23 -10
  74. package/src/hub/sdlc.ts +15 -2
  75. package/src/hub/settings.ts +3 -0
  76. package/src/hub/task-worktree.ts +331 -0
  77. package/src/hub/tasks.ts +192 -25
  78. package/src/hub/ui.ts +2 -0
  79. package/src/hub/worktree-prs.ts +100 -0
  80. package/src/hub/worktree-shelf.ts +246 -0
  81. package/src/local/deny.ts +49 -0
  82. package/src/local/tools.ts +4 -2
  83. package/src/memory/brief.ts +5 -0
  84. package/src/memory/capture.ts +1 -1
  85. package/src/memory/client.ts +5 -2
  86. package/src/pi/extension.ts +43 -3
  87. package/src/ui/index.html +133 -10
  88. package/src/ui/office-model.ts +64 -8
  89. package/src/ui/office-space.ts +1 -0
  90. package/src/ui/plugin.ts +14 -3
@@ -0,0 +1,26 @@
1
+ # Pi 1.5.0 session-title API probe
2
+
3
+ Task #689, Refs #1055 (T1). Model-free native API receipt, macOS arm64, Node 24.18.1.
4
+
5
+ The installed `@earendil-works/pi-coding-agent@1.5.0` exposes a working native session-name setter and reader:
6
+
7
+ - Extension API: `setSessionName(name: string): void` and `getSessionName(): string | undefined`.
8
+ - Session: `AgentSession.setSessionName(name: string)` and the `sessionName` getter.
9
+ - Session manager: `appendSessionInfo(name: string)` and `getSessionName(): string | undefined`.
10
+
11
+ The [producer](pi-150-title-api.mjs) loads the real package's `DefaultResourceLoader`, `createAgentSession` and extension runner. It registers an account-free probe tool, invokes that callback directly after `bindExtensions`, and asserts the native API changes an initially unnamed session to `Fixture session title`. Both the extension reader and `SessionManager` return that name. After disposal, `SessionManager.open(sessionFile).getSessionName()` returns the same name. No prompt is submitted to an agent or provider.
12
+
13
+ The native setter appends a `session_info` entry. A handler registered through the real `ExtensionAPI.on("session_info_changed", handler)` receives the new name, also asserted by the producer. Pi delays creating a new session file until a user or assistant message exists. This probe appends a synthetic user fixture to the session manager before calling the setter; the fixture is never sent to a model. It proves native persistence for an existing conversation, not persistence of an empty session.
14
+
15
+ ## Isolation and result
16
+
17
+ - Fresh HOME under `getconf DARWIN_USER_TEMP_DIR`, separate `PI_CODING_AGENT_DIR`, XDG config/data/cache and TMPDIR. The child environment contains only these paths, PATH and the explicit package path.
18
+ - Exact 1.5.0 package from the existing scratch npm prefix used by the [compatibility receipt](2026-11-03-pi-150-compat.md). The person's default launcher still selects 1.4.0; it was not invoked or changed.
19
+ - Frozen worktree dependencies installed before the probe: `@staix/agent-mem@0.20.1`, matching the exact manifest pin. Native package version independently asserted as 1.5.0.
20
+ - `sandbox-exec` uses `src/local/sandbox.ts`'s network-disabled profile, adds a real-home read/write deny, then grants only read access to the scratch native package and Node installation. Writable files are confined to the disposable HOME. No credentials or live hub connection.
21
+ - SHA-256 manifests of the 15 real `~/.pi` configuration/launcher entries were identical before and after. The manifest excludes sessions, logs, cache and install trees; it is not a claim to hash every installed package or historical session. Private per-file digests remain in the scratch evidence directory.
22
+ - Exit 0, empty stderr, setter/reader/reopen assertions PASS. An initial hand-written sandbox profile terminated Node before the producer ran; the final run used the repository profile and passed.
23
+
24
+ Reproduction: run `node docs/verification/pi-150-title-api.mjs` with `PI_TITLE_PACKAGE` pointing to the exact 1.5.0 package and fresh HOME/tool-home paths, inside the network-disabled sandbox described above. Do not run with the person's real HOME.
25
+
26
+ This permits the native-slot implementation for Pi. It does not prove a model-generated `hub_set_title` call, delivery through a live hub, or a live Pi restart. AC7 remains a separate live receipt in #1143.
@@ -0,0 +1,55 @@
1
+ # Qwen Code 0.26.5 ACP receipt
2
+
3
+ Date: 2026-11-03. Task #684, Refs #888, `qwen` row only. This repeats the [0.26.4 ACP receipt](2026-10-31-qwen-0264-acp.md) on the published `@qwen-code/qwen-code@0.26.5`, with a private npm prefix, isolated HOME and fixed synthetic configuration. No account, real credential, provider inference or ACP prompt was used. It does not admit the separate `qwen-dual` contract (see the [dual-output receipt](2026-11-03-qwen-0265-dual-output.md)).
4
+
5
+ **Decision: add `0.26.5` to `COMPAT.qwen.verified`.** Every ACP leg passed. No intermediate release and no range is inferred. `latest` on npm is 0.26.6 today; it is not admitted.
6
+
7
+ ## Artifact and isolation
8
+
9
+ The package was installed under the local scratch workspace in a private prefix with a scratch HOME, cache and temporary directory and empty npm user and global config files. The person's global prefix, `~/.qwen` and `~/.pi` were not installation targets. npm held one lifecycle script, `@qwen-code/audio-capture` `install` (`node install.js`). It was read, found to locate a prebuilt microphone addon with a non-fatal failure path, and replayed under the same isolated environment: exit 0. No install script was disabled to make the probe pass.
10
+
11
+ | Artifact | Binding |
12
+ | --- | --- |
13
+ | npm release | 0.26.5, `gitHead` and upstream `v0.26.5` tag `db0e4e24a0d89b211b2a15f4af2be22adac71dfc` |
14
+ | npm integrity | `sha512-iqcBqLQDmKvOtRcVvF78l7bf0NpdymGFBo0qNY0ausPezht+PLXkh15vnIILaBKtM4BabtHSv60xWftMomJ7hw==` |
15
+ | `cli-entry.js` SHA-256 | `113efe4104a9fc66f507d34bfd6abbd896ceb77de47f4b468a0825a327fdc6a5` (the same bytes as the 0.26.1 and 0.26.4 entry files: the entry is a loader, the code is in chunks) |
16
+ | `chunks/acpAgent-HO52UOPA.js` SHA-256 | `794bda74c4d100ab3367ae2e5d880ef0a610df4c84d1db1475d78283b75a8e1e` (the chunk name differs from 0.26.4's `acpAgent-D7OFGHAI.js`) |
17
+ | Host | macOS arm64, Node 24.18.1 |
18
+
19
+ Every native process received a fresh temporary HOME and cwd, private `QWEN_HOME`, `QWEN_RUNTIME_DIR` and `XDG_CONFIG_HOME`, a synthetic API key and `--auth-type openai --model fixture-model --openai-base-url http://127.0.0.1:9/v1 --telemetry=false`. The 0.26.4 receipt's Node preload denied application network APIs and recorded six blocked startup attempts here too; none connected through those guarded APIs. This is preload evidence, not a kernel network sandbox.
20
+
21
+ Real configuration: SHA-256 of every file under the person's `~/.qwen` and `~/.pi/agent` (excluding sessions, logs, caches, installs and `bin`) and of the globally installed qwen's `cli-entry.js` and `package.json` was taken before and after the producer runs: 9550 entries, identical.
22
+
23
+ ## Native ACP, no prompts
24
+
25
+ `qwen --acp --bare --advisor off` initialized with protocol version 1 and `agentInfo` name `qwen-code`, title `Qwen Code`, version `0.26.5`. The only offered authentication method was the synthetic `openai` terminal method. No prompt was sent.
26
+
27
+ `session/new` succeeded. Available modes were `plan`, `default`, `auto-edit`, `auto` and `yolo`, with current mode `default`: the same five ids as 0.26.4. Each transition in `default -> auto-edit -> yolo -> default` returned an acknowledgement, so the hub's ask/default, ask-when-needed/auto-edit and never-ask/yolo map is still a subset of the native ids. The session exposed only the fixture model.
28
+
29
+ The native leader exited after its owned group received SIGTERM, and the producer confirmed `groupGone: true`.
30
+
31
+ ## Actual published permission handler
32
+
33
+ An exports-only scratch copy of the published ACP chunk (`export{SubAgentTracker,toPermissionOptions,resolvePermissionOutcome}` appended) was placed beside the original inside the private package, preserving its relative imports. The original chunk was not edited. The fixture invoked the actual `SubAgentTracker.createApprovalHandler` with synthetic client, tool and event ports, not a model-generated tool turn.
34
+
35
+ - The request carried the fixture session, pending tool-call id, raw input, native MCP tool metadata and permission progress updates.
36
+ - The exact options were `proceed_always_project` and `proceed_always_user` as `allow_always`, `proceed_once` as `allow_once`, and `cancel` as `reject_once`.
37
+ - An allow-once response reached `event.respond` as `proceed_once`; a cancelled outcome reached it as `cancel`; the real outcome helper rejected an unoffered option.
38
+
39
+ ## Not verified
40
+
41
+ A real model-generated permission turn, a real login or provider, model behavior, Linux and Intel macOS. This receipt did not review upstream source between 0.26.4 and 0.26.5; the claim is the native behaviors above on the exact published artifact. Host changed-source checks and exact-head CI are separate PR evidence.
42
+
43
+ ## Evidence fingerprints
44
+
45
+ Producers and result JSONs stay outside git under the local scratch workspace.
46
+
47
+ | File | SHA-256 |
48
+ | --- | --- |
49
+ | `qwen-acp-probe.py` | `12e60602ca5d00ed29473f3afef277b0c5661aca286692864da8fc69ced9d2e2` |
50
+ | `qwen-acp-result.json` | `442f2e33c13232723eb646119f49f52fcb8df06de7c59ee32402ab377525710a` |
51
+ | `qwen-permission.mjs` | `989ba620e7d099b74ec5b4b1efb78d9d6cc96b5ef5b364c058a077dfc8621a31` |
52
+ | `qwen-permission-result.json` | `958a77ea7618e0efd04a78520aadf83654e5b74a0158a05061d0bed4406d7c31` |
53
+ | `deny-network.cjs` | `361148af658dd4b65ed35308622ec99bb882ec5a25fab54581776546f139e892` |
54
+
55
+ The two probe copies differ from the 0.26.4 producers only in paths and the expected version string.
@@ -0,0 +1,40 @@
1
+ # Qwen 0.26.5 dual-output attempt, not qualified
2
+
3
+ Date: 2026-11-03. Task #684, Refs #888, the separate `qwen-dual` row. The [0.26.5 ACP receipt](2026-11-03-qwen-0265-acp.md) does not qualify the TUI contract. This repeats the corrected [0.26.4 attempt](2026-10-31-qwen-0264-dual-output.md) (the v2 producer, fixed OpenAI-compatible loopback responses, no real model, account or credential) on `@qwen-code/qwen-code@0.26.5`.
4
+
5
+ **Decision: do not add 0.26.5 to `COMPAT["qwen-dual"].verified`.** Q2 did not pass. Exactly 0.26.1 stays verified for this entry, and `src/adapters/compat.ts` is unchanged for it.
6
+
7
+ ## Artifact and controls
8
+
9
+ The candidate is the private-prefix package described in the ACP receipt (upstream tag and `gitHead` `db0e4e24a0d89b211b2a15f4af2be22adac71dfc`, Node 24.18.1, macOS arm64). The retained global 0.26.1 install (`cli-entry.js` SHA-256 `113efe4104a9fc66f507d34bfd6abbd896ceb77de47f4b468a0825a327fdc6a5`) served as a read-only matched control, always with a fresh temporary HOME and cwd and the same producer. Each fixture used a PTY, private input and event files, a scratch git project, a synthetic key and a loopback server. The Node network guard's positive control passed; every observed Node process loaded the guard; every owned process group was confirmed gone; the temporary roots were removed. Model inference calls: 0.
10
+
11
+ Real configuration: the person's `~/.qwen`, `~/.pi/agent` and the global qwen install hashed the same before and after (9550 entries, together with the ACP runs).
12
+
13
+ ## Observed outcomes
14
+
15
+ | Check | 0.26.5 | Matched 0.26.1 control |
16
+ | --- | --- | --- |
17
+ | Q7 version and guard positive control | pass, 0.26.5 | pass, 0.26.1 |
18
+ | Q2 second submit becomes a separate user turn after the first completes | **fail**: `Q2 fewer than two user events` | **fail**, the same error, same fixture |
19
+ | Q3 shell and native MCP `can_use_tool`, allow, TUI Enter, duplicate refused, read-only control | pass | not selected |
20
+ | Q4 external SIGINT leaves the turn running; person Esc stops it and the next turn works | pass | not selected |
21
+ | Q5 unread output FIFO does not block the TUI answer | pass | not selected |
22
+ | Q6 resume id, no old-submit replay, prior context in the resumed request | pass | not selected |
23
+
24
+ Q2 fails identically on the already-verified 0.26.1 with this producer, so it is a limit of the held-stream workload the corrected fixture uses and not a 0.26.5 regression: the same outcome the 0.26.4 receipt recorded. It also means this fixture cannot reproduce the queued-submit observation the [original 0.26.1 receipt](2026-10-25-qwen-dual-output-t0.md) rests on. The task gate (promote only when every model-free leg passes) does not allow a `qwen-dual` bump while a required leg is unestablished, and no TUI adapter, queue, cancellation policy or existing admission is changed.
25
+
26
+ ## Source note
27
+
28
+ Upstream `DualOutputBridge.ts` and `RemoteInputWatcher.ts` have the same blob ids at v0.26.1 (`b475278c`), v0.26.4 (`715a550c`) and v0.26.5 (`db0e4e24`): `1e1a4e71fafd0c29c62e4ca60243449bd698d20a` and `8a3eabf4e29804ce5f63d40d4a083d14f489dbb3`. That is scoped supporting evidence about those two files, not native acceptance.
29
+
30
+ ## Not verified
31
+
32
+ Q2 on any version with this producer, a real account or provider, model choices and quality, token and quota behavior, Linux and Intel macOS. Explicitly failed and unselected legs above are not relabelled as passes.
33
+
34
+ ## Evidence fingerprints
35
+
36
+ | File | SHA-256 |
37
+ | --- | --- |
38
+ | `qwen-dual-probe-v2.py` | `114c032afce5caef4f59072f0a1730bc78a70788fd49ad17e5ff2f1eef4c947e` |
39
+ | `qwen-dual-v2-0265-result.json` | `1062244e51f5c1aab71f2778d08116c3c00f81929be9aa209fc3467763cc0471` |
40
+ | `qwen-dual-v2-0261-control-result.json` | `d4384d0b54f42e789f09f44346201b75285b1afafc78eb3d22ff3271b38ce72a` |