@staix/agent-hub 0.12.33 → 0.12.35

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 (126) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +3 -3
  3. package/docs/agent-notes/adapters.md +9 -3
  4. package/docs/agent-notes/budget.md +7 -3
  5. package/docs/agent-notes/bus.md +2 -1
  6. package/docs/agent-notes/daemon.md +7 -3
  7. package/docs/agent-notes/local-worker.md +1 -1
  8. package/docs/agent-notes/tasks.md +6 -2
  9. package/docs/agent-notes/tests.md +2 -1
  10. package/docs/gsd-collaboration-analysis.md +5 -1
  11. package/docs/operations.md +80 -16
  12. package/docs/quickstart.md +10 -2
  13. package/docs/sdlc.md +59 -34
  14. package/docs/security.md +7 -4
  15. package/docs/smoke.md +1 -1
  16. package/docs/specs/2026-09-19-agent-hub-design.md +407 -10
  17. package/docs/verification/2026-10-18-0.12.34.md +48 -0
  18. package/docs/verification/2026-10-18-0.12.35.md +49 -0
  19. package/docs/verification/2026-10-18-493-claude-busy-channel.md +91 -0
  20. package/docs/verified.json +35 -19
  21. package/package.json +1 -1
  22. package/plugins/agent-hub/.claude-plugin/plugin.json +1 -1
  23. package/plugins/agent-hub/server.js +23567 -16606
  24. package/src/adapters/acp.ts +3 -1
  25. package/src/adapters/claude-channel.ts +59 -29
  26. package/src/adapters/codex-appserver.ts +82 -12
  27. package/src/adapters/definitions/builtin-metadata.ts +101 -7
  28. package/src/adapters/definitions/native-cli-claude-launch.ts +90 -0
  29. package/src/adapters/definitions/native-cli-claude-setup.ts +80 -0
  30. package/src/adapters/definitions/native-cli-codex-launch.ts +14 -0
  31. package/src/adapters/definitions/native-cli-doctor.ts +46 -0
  32. package/src/adapters/definitions/native-cli-entry-claude.ts +52 -0
  33. package/src/adapters/definitions/native-cli-entry-codex.ts +34 -0
  34. package/src/adapters/definitions/native-cli-entry-jcode.ts +27 -0
  35. package/src/adapters/definitions/native-cli-entry-kimi.ts +57 -0
  36. package/src/adapters/definitions/native-cli-entry-local.ts +15 -0
  37. package/src/adapters/definitions/native-cli-entry-pi.ts +53 -0
  38. package/src/adapters/definitions/native-cli-entry-qwen.ts +21 -0
  39. package/src/adapters/definitions/native-cli-entry-types.ts +41 -0
  40. package/src/adapters/definitions/native-cli-entry.ts +19 -0
  41. package/src/adapters/definitions/native-cli-jcode-mcp.ts +58 -0
  42. package/src/adapters/definitions/native-cli-launch-common.ts +17 -0
  43. package/src/adapters/definitions/native-cli-pi.ts +33 -0
  44. package/src/adapters/definitions/native-cli-preview-claude.ts +37 -0
  45. package/src/adapters/definitions/native-cli-preview-codex.ts +20 -0
  46. package/src/adapters/definitions/native-cli-preview-common.ts +57 -0
  47. package/src/adapters/definitions/native-cli-preview-jcode.ts +20 -0
  48. package/src/adapters/definitions/native-cli-preview-kimi.ts +28 -0
  49. package/src/adapters/definitions/native-cli-preview-pi.ts +36 -0
  50. package/src/adapters/definitions/native-cli-preview-qwen.ts +22 -0
  51. package/src/adapters/definitions/native-cli-preview.ts +16 -0
  52. package/src/adapters/definitions/native-config-defaults.ts +19 -0
  53. package/src/adapters/definitions/native-config-policy.ts +35 -0
  54. package/src/adapters/definitions/native-context.ts +35 -0
  55. package/src/adapters/definitions/native-daemon-kimi.ts +5 -0
  56. package/src/adapters/definitions/native-daemon-policy.ts +18 -0
  57. package/src/adapters/definitions/native-display.ts +18 -0
  58. package/src/adapters/definitions/native-factories.ts +48 -0
  59. package/src/adapters/definitions/native-policy-aux.ts +130 -0
  60. package/src/adapters/definitions/native-quota.ts +29 -0
  61. package/src/adapters/definitions/native-recovery-continuity.ts +12 -0
  62. package/src/adapters/definitions/native-recovery.ts +88 -0
  63. package/src/adapters/definitions/qwen-native.ts +2 -2
  64. package/src/adapters/definitions/qwen.ts +8 -4
  65. package/src/adapters/local-worker.ts +3 -2
  66. package/src/adapters/pi.ts +3 -1
  67. package/src/adapters/registry-types.ts +100 -10
  68. package/src/adapters/registry.ts +127 -11
  69. package/src/cli/console-state.ts +5 -5
  70. package/src/cli/identity.ts +8 -7
  71. package/src/cli/jcode-mcp.ts +2 -58
  72. package/src/cli/launch.ts +41 -102
  73. package/src/cli/main.ts +126 -290
  74. package/src/cli/output.ts +3 -2
  75. package/src/cli/preview.ts +26 -126
  76. package/src/cli/recovery-guidance.ts +43 -22
  77. package/src/cli/setup.ts +2 -80
  78. package/src/cli/shell-quote.ts +3 -0
  79. package/src/cli/terminal-recovery.ts +81 -22
  80. package/src/cli/upgrade-interactive.ts +4 -2
  81. package/src/cli/upgrade-restore-state.ts +17 -7
  82. package/src/cli/upgrade-runtime.ts +126 -147
  83. package/src/cli/upgrade.ts +44 -27
  84. package/src/hub/budget.ts +59 -31
  85. package/src/hub/bus.ts +1 -1
  86. package/src/hub/conductor.ts +19 -9
  87. package/src/hub/config-apply.ts +22 -15
  88. package/src/hub/config-reload.ts +18 -3
  89. package/src/hub/config-trust.ts +1 -1
  90. package/src/hub/context-window.ts +3 -27
  91. package/src/hub/control-client.ts +1 -1
  92. package/src/hub/crash.ts +15 -39
  93. package/src/hub/daemon.ts +506 -341
  94. package/src/hub/execution-budget.ts +3 -2
  95. package/src/hub/hub-tools.ts +19 -8
  96. package/src/hub/instance-budget.ts +73 -0
  97. package/src/hub/instance-config.ts +47 -0
  98. package/src/hub/instance-execution.ts +50 -0
  99. package/src/hub/instances.ts +100 -0
  100. package/src/hub/lifecycle-schema.ts +7 -3
  101. package/src/hub/peer-catalog.ts +4 -13
  102. package/src/hub/permission-mode.ts +14 -17
  103. package/src/hub/recovery-continuity.ts +6 -5
  104. package/src/hub/report.ts +9 -8
  105. package/src/hub/roster.ts +9 -9
  106. package/src/hub/routing.ts +94 -19
  107. package/src/hub/sdlc-queue.ts +2 -2
  108. package/src/hub/sdlc.ts +84 -38
  109. package/src/hub/settings.ts +39 -10
  110. package/src/hub/settled-roles.ts +1 -1
  111. package/src/hub/snapshots.ts +40 -9
  112. package/src/hub/start-mode.ts +13 -8
  113. package/src/hub/status-roster.ts +8 -0
  114. package/src/hub/tasks.ts +60 -27
  115. package/src/hub/text-projection.ts +7 -3
  116. package/src/hub/tooling.ts +4 -60
  117. package/src/hub/ui.ts +3 -1
  118. package/src/hub/workflow.ts +30 -52
  119. package/src/memory/recall.ts +4 -5
  120. package/src/models/route/signals.ts +3 -1
  121. package/src/pi/launch.ts +5 -3
  122. package/src/ui/index.html +4 -3
  123. package/src/ui/office-model.ts +3 -1
  124. package/src/ui/peer-palette.ts +16 -6
  125. package/templates/AGENTS.block.md +2 -1
  126. package/templates/routing.toml +2 -2
@@ -0,0 +1,91 @@
1
+ # Busy Claude channel notification receipt (#493)
2
+
3
+ ## Result
4
+
5
+ Positive native interactive receipt: Claude Code 2.1.302, Sonnet 5.5 (the native
6
+ `sonnet` alias), consumed a channel notification during the original busy turn.
7
+ The model called the observation tool with the exact random token before its
8
+ first `end_turn`. This supports important-only channel steering in the tested
9
+ interactive mode. It does not prove an arbitrary notification was read merely
10
+ because its stdout write succeeded, nor does it prove delivery in print mode.
11
+
12
+ ## Native experiment
13
+
14
+ - A new scratch project outside the repository used one explicitly selected
15
+ development MCP channel, `busy-probe`. The harness preserved the executing
16
+ agent marker, removed live hub binding variables, loaded no project/user
17
+ settings or hooks, and exposed only three fixed fixture tools. It connected
18
+ neither to the person's hub nor to another peer.
19
+ - The original instruction called `probe_hold`, then `probe_after_hold`, then
20
+ finished with `DONE`. It also asked the model to report any actually observed
21
+ channel token, without inventing one. The token was generated only after
22
+ `probe_hold` started; neither the prompt nor the hold result contained it.
23
+ - While that tool was pending, the MCP server wrote
24
+ `notifications/claude/channel` with `priority: important` and the random token.
25
+ The fixed hold result contained only `ready: true`.
26
+ - The interactive run used a real PTY. The operator confirmed that this was a
27
+ locally written development channel. No trust or tool-approval prompt was
28
+ answered automatically, and no second model prompt was sent. After the
29
+ original response completed, the operator exited with Ctrl-D.
30
+
31
+ | Evidence | UTC on 2026-10-18 |
32
+ | --- | --- |
33
+ | Native tool barrier entered | 07:25:36.997 |
34
+ | Notification written while tool pending | 07:25:37.298 |
35
+ | Fixed hold result released | 07:25:38.801 |
36
+ | Correct token received by observation tool | 07:25:41.948 |
37
+ | First original assistant `end_turn`, `DONE` | 07:25:43.016 |
38
+
39
+ The native transcript's zero-based record positions were 29 for the hold call,
40
+ 49 for the matching observation call, and 52 for the first original `end_turn`.
41
+ The observation was after the tool barrier released but before that original
42
+ turn ended. The TUI also displayed the channel notification during its busy
43
+ indicator. Native exit was 0; process-table verification found no remaining
44
+ probe-owned native, helper or MCP server processes. The 90-second deadline did
45
+ not fire.
46
+
47
+ The automatic resource controller initially deferred on ordinary Teams/Jump
48
+ Desktop processes with no repository attribution. Manual inspection identified
49
+ their application origins and confirmed normal memory/thermal state, CPU idle
50
+ above 50%, no competing repository job and one probe worker. No existing app
51
+ was stopped. Native account/session metadata writes were not suppressed or
52
+ audited; this receipt does not claim the native client made no home-directory
53
+ writes.
54
+
55
+ ## Preserved evidence
56
+
57
+ Private run artifacts are retained under workspace-relative
58
+ `scratchpad/temp/ahub-493-probe/interactive-zaTWkS/`; the invocation receipt points
59
+ to the native client's own transcript. Raw account/profile paths and the random
60
+ token are not copied into this document.
61
+
62
+ | Artifact | SHA-256 |
63
+ | --- | --- |
64
+ | `receipt.json` | `5108a491e3469baf9de67860d7d3fff37b5eb89b980fa9f1835ff28510f524b7` |
65
+ | `server-events.jsonl` | `43b079866ec2c8ac0437d51d2fd50549fec035b1a76feaa8c20142a58cdb1258` |
66
+ | `native-tui.log` | `2fc9182a355038c0b26d662054ee7abee9fda78569ea6b07893afeb44fd6da51` |
67
+ | `pty-events.jsonl` | `5ab8c672ea56512a6bdce111fe6960fc85ceb47ff88d7a1b17d528b1fdb10229` |
68
+ | Native transcript | `0acfd6f66ec20f0cb5ad4fe020d044e326c240289019785c15f3af64ca188ede` |
69
+
70
+ Token SHA-256:
71
+ `ea4326fdc248ddc69ba250005a472f5393c2250b1876fbe039cbef0561125d08`.
72
+
73
+ An earlier isolated print/stream-json run (`run-YwEcfC`) initialized the same
74
+ channel and wrote a notification while the hold tool was pending, then finished
75
+ without an observation call. That result remains inconclusive for interactive
76
+ delivery. It was not treated as a negative, and steering was added only after
77
+ the positive interactive receipt above.
78
+
79
+ ## Implementation boundary
80
+
81
+ - A channel-capable attached `WsPeer` exposes steer only while it owns a push
82
+ socket; detach and pull-only attachment remove that capability. The bus admits
83
+ important work only, retains its existing pause/recovery/uncertainty holds and
84
+ removes the queued item before transport hand-off.
85
+ - A steered notification uses the ordinary delivery id, connection generation,
86
+ accepted receipt and explicit completion/correlated-reply contract. A transport
87
+ failure stays uncertain. An idle transition must not deliver it again.
88
+ - Queued ordinary work can be read through `hub_inbox` during a busy turn using
89
+ the existing atomic pull completion path. This does not settle a previously
90
+ accepted push. Fake-transport regressions cover these contracts separately
91
+ from this native observation.
@@ -2,7 +2,7 @@
2
2
  "schemaVersion": 1,
3
3
  "documents": {
4
4
  "README.md": {
5
- "verifiedAgainst": "38dfe1876c3b20d061b6232919e28965e1bb486e",
5
+ "verifiedAgainst": "03209040585a57c7c0a1f2b81f6be814df88267c",
6
6
  "paths": [
7
7
  "package.json",
8
8
  "src/",
@@ -11,14 +11,14 @@
11
11
  ]
12
12
  },
13
13
  "docs/security.md": {
14
- "verifiedAgainst": "38dfe1876c3b20d061b6232919e28965e1bb486e",
14
+ "verifiedAgainst": "03209040585a57c7c0a1f2b81f6be814df88267c",
15
15
  "paths": [
16
16
  "src/",
17
17
  "templates/"
18
18
  ]
19
19
  },
20
20
  "docs/operations.md": {
21
- "verifiedAgainst": "38dfe1876c3b20d061b6232919e28965e1bb486e",
21
+ "verifiedAgainst": "03209040585a57c7c0a1f2b81f6be814df88267c",
22
22
  "paths": [
23
23
  "package.json",
24
24
  "src/",
@@ -35,7 +35,7 @@
35
35
  ]
36
36
  },
37
37
  "docs/quickstart.md": {
38
- "verifiedAgainst": "38dfe1876c3b20d061b6232919e28965e1bb486e",
38
+ "verifiedAgainst": "03209040585a57c7c0a1f2b81f6be814df88267c",
39
39
  "paths": [
40
40
  "package.json",
41
41
  "src/",
@@ -43,7 +43,7 @@
43
43
  ]
44
44
  },
45
45
  "docs/agent-notes/adapters.md": {
46
- "verifiedAgainst": "38dfe1876c3b20d061b6232919e28965e1bb486e",
46
+ "verifiedAgainst": "03209040585a57c7c0a1f2b81f6be814df88267c",
47
47
  "paths": [
48
48
  "src/adapters/",
49
49
  "src/pi/",
@@ -58,11 +58,13 @@
58
58
  "src/cli/identity.ts",
59
59
  "src/local/tools.ts",
60
60
  "src/hub/start-mode.ts",
61
- "src/hub/terminal-open.ts"
61
+ "src/hub/terminal-open.ts",
62
+ "test/registry-guard.test.ts",
63
+ "test/registry-guard.baseline.json"
62
64
  ]
63
65
  },
64
66
  "docs/agent-notes/benchmarks.md": {
65
- "verifiedAgainst": "cf3026feab218207f0c21b300552eada0d5be227",
67
+ "verifiedAgainst": "03209040585a57c7c0a1f2b81f6be814df88267c",
66
68
  "paths": [
67
69
  "scripts/benchmarks/",
68
70
  "test/benchmarks/",
@@ -74,7 +76,7 @@
74
76
  ]
75
77
  },
76
78
  "docs/agent-notes/budget.md": {
77
- "verifiedAgainst": "38dfe1876c3b20d061b6232919e28965e1bb486e",
79
+ "verifiedAgainst": "03209040585a57c7c0a1f2b81f6be814df88267c",
78
80
  "paths": [
79
81
  "src/hub/budget.ts",
80
82
  "src/cli/statusline-tee.ts",
@@ -82,11 +84,15 @@
82
84
  "src/hub/delivery-journal.ts",
83
85
  "src/hub/restart.ts",
84
86
  "src/hub/context-window.ts",
85
- "src/hub/daemon.ts"
87
+ "src/hub/daemon.ts",
88
+ "src/adapters/definitions/native-quota.ts",
89
+ "src/adapters/definitions/native-context.ts",
90
+ "src/adapters/registry.ts",
91
+ "src/hub/instance-budget.ts"
86
92
  ]
87
93
  },
88
94
  "docs/agent-notes/bus.md": {
89
- "verifiedAgainst": "38dfe1876c3b20d061b6232919e28965e1bb486e",
95
+ "verifiedAgainst": "03209040585a57c7c0a1f2b81f6be814df88267c",
90
96
  "paths": [
91
97
  "src/hub/bus.ts",
92
98
  "src/hub/envelope.ts",
@@ -100,7 +106,7 @@
100
106
  ]
101
107
  },
102
108
  "docs/agent-notes/daemon.md": {
103
- "verifiedAgainst": "38dfe1876c3b20d061b6232919e28965e1bb486e",
109
+ "verifiedAgainst": "03209040585a57c7c0a1f2b81f6be814df88267c",
104
110
  "paths": [
105
111
  "src/hub/daemon.ts",
106
112
  "src/hub/control-client.ts",
@@ -138,22 +144,30 @@
138
144
  "src/hub/config-reload.ts",
139
145
  "src/hub/config-apply.ts",
140
146
  "src/hub/recovery-continuity.ts",
141
- "src/cli/recovery-presentation-options.ts"
147
+ "src/cli/recovery-presentation-options.ts",
148
+ "src/adapters/definitions/native-recovery*.ts",
149
+ "src/adapters/definitions/native-policy-aux.ts",
150
+ "src/adapters/definitions/native-config-*.ts",
151
+ "src/adapters/definitions/native-cli-*.ts",
152
+ "src/hub/instances.ts",
153
+ "src/hub/instance-config.ts",
154
+ "src/hub/instance-execution.ts"
142
155
  ]
143
156
  },
144
157
  "docs/agent-notes/local-worker.md": {
145
- "verifiedAgainst": "cf3026feab218207f0c21b300552eada0d5be227",
158
+ "verifiedAgainst": "03209040585a57c7c0a1f2b81f6be814df88267c",
146
159
  "paths": [
147
160
  "src/adapters/local-worker.ts",
148
161
  "src/local/",
149
162
  "src/memory/capture.ts",
150
163
  "src/hub/facts.ts",
151
164
  "src/hub/permission-mode.ts",
152
- "src/hub/git.ts"
165
+ "src/hub/git.ts",
166
+ "src/hub/instance-execution.ts"
153
167
  ]
154
168
  },
155
169
  "docs/agent-notes/models.md": {
156
- "verifiedAgainst": "6dcc7fe00c38f13613bcf53524fa3d1527a708e5",
170
+ "verifiedAgainst": "b91d2cacb80b58ec85fa4cf538cdb1f3ed6079cc",
157
171
  "paths": [
158
172
  "src/models/",
159
173
  "src/hub/inference.ts",
@@ -162,7 +176,7 @@
162
176
  ]
163
177
  },
164
178
  "docs/agent-notes/tasks.md": {
165
- "verifiedAgainst": "38dfe1876c3b20d061b6232919e28965e1bb486e",
179
+ "verifiedAgainst": "03209040585a57c7c0a1f2b81f6be814df88267c",
166
180
  "paths": [
167
181
  "src/hub/tasks.ts",
168
182
  "src/hub/board.ts",
@@ -176,11 +190,13 @@
176
190
  "src/hub/supervision.ts",
177
191
  "src/hub/tool-refusal.ts",
178
192
  "src/hub/daemon.ts",
179
- "src/hub/settled-roles.ts"
193
+ "src/hub/settled-roles.ts",
194
+ "src/adapters/definitions/builtin-metadata.ts",
195
+ "src/hub/bus.ts"
180
196
  ]
181
197
  },
182
198
  "docs/agent-notes/tests.md": {
183
- "verifiedAgainst": "38dfe1876c3b20d061b6232919e28965e1bb486e",
199
+ "verifiedAgainst": "03209040585a57c7c0a1f2b81f6be814df88267c",
184
200
  "paths": [
185
201
  "test/",
186
202
  "scripts/check.sh",
@@ -199,7 +215,7 @@
199
215
  ]
200
216
  },
201
217
  "docs/agent-notes/README.md": {
202
- "verifiedAgainst": "38dfe1876c3b20d061b6232919e28965e1bb486e",
218
+ "verifiedAgainst": "03209040585a57c7c0a1f2b81f6be814df88267c",
203
219
  "paths": [
204
220
  "src/cli/console-state.ts",
205
221
  "src/cli/attention.ts",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@staix/agent-hub",
3
- "version": "0.12.33",
3
+ "version": "0.12.35",
4
4
  "description": "Native multi-agent hub: Claude Code, Codex, Kimi Code, Pi and local inference as peers in one project",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-hub",
3
- "version": "0.12.33",
3
+ "version": "0.12.35",
4
4
  "description": "Channel between Claude Code and the agent-hub daemon: peer messages from Codex, Kimi and the local worker arrive as channel events; hub_send replies.",
5
5
  "author": {
6
6
  "name": "Young Joon Lee",