@staix/agent-hub 0.7.2 → 0.7.3
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.
- package/CHANGELOG.md +5 -0
- package/README.md +2 -2
- package/docs/operations.md +6 -6
- package/docs/quickstart.md +1 -1
- package/package.json +1 -1
- package/plugins/agent-hub/.claude-plugin/plugin.json +1 -1
- package/plugins/agent-hub/server.js +1 -1
- package/src/cli/upgrade-runtime.ts +15 -2
- package/src/hub/daemon.ts +5 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 0.7.3
|
|
6
|
+
|
|
7
|
+
- A peer that detaches mid-upgrade no longer wedges the recovery: readiness ignores a now-offline peer's stale identity (a reattach with a different thread still blocks), an already-exited terminal is closed as a no-op instead of being waited on, and resume can drive the operation to release once the peer returns (#21).
|
|
8
|
+
- The check.sh leak guard matches tmp test roots only, so a real hub in a directory starting with `ahub-` no longer trips it (#56).
|
|
9
|
+
|
|
5
10
|
## 0.7.2
|
|
6
11
|
|
|
7
12
|
- Local inference defaults to a bounded Ollama MLX runtime: `ahub models setup/start/stop` manages it, the configured context is advertised to Pi, and the legacy standalone MLX runtime needs an explicit legacy provider (#51, #52).
|
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@ Native multi-agent hub for one developer's machine: Claude Code, Codex, Kimi Cod
|
|
|
4
4
|
hub-owned local-LLM worker collaborate as peers in independent project directories, with
|
|
5
5
|
task-aware model routing (Switchyard) in front of a self-hosted gateway (OmniRoute).
|
|
6
6
|
|
|
7
|
-
Status: 0.7.
|
|
7
|
+
Status: 0.7.3, control protocol 10. Durable delivery records distinguish queued
|
|
8
8
|
work from uncertain execution. The [smoke checklist](docs/smoke.md) records
|
|
9
9
|
verified paths and remaining prerequisites.
|
|
10
10
|
|
|
@@ -28,7 +28,7 @@ cd <your project> && ahub init && ahub up && ahub tail
|
|
|
28
28
|
Or install the same version from GitHub:
|
|
29
29
|
|
|
30
30
|
```bash
|
|
31
|
-
bun add -g github:STAIxBWLB/agent-hub#v0.7.
|
|
31
|
+
bun add -g github:STAIxBWLB/agent-hub#v0.7.3 && ahub setup
|
|
32
32
|
```
|
|
33
33
|
|
|
34
34
|
The installed commands remain `ahub` and `agent-hub`.
|
package/docs/operations.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Operations guide
|
|
2
2
|
|
|
3
|
-
This guide describes ahub 0.7.
|
|
3
|
+
This guide describes ahub 0.7.3 and control protocol 10. Live verification
|
|
4
4
|
results and remaining prerequisites are recorded separately in [the smoke ledger](smoke.md).
|
|
5
5
|
|
|
6
6
|
## Install and start
|
|
@@ -182,27 +182,27 @@ For an upgrade from 0.6.4 (protocol 9) or 0.7.0, use the patched coordinator wit
|
|
|
182
182
|
replacing the global CLI prematurely. Run from the project directory:
|
|
183
183
|
|
|
184
184
|
```bash
|
|
185
|
-
bunx --package @staix/agent-hub@0.7.
|
|
186
|
-
bunx --package @staix/agent-hub@0.7.
|
|
185
|
+
bunx --package @staix/agent-hub@0.7.3 ahub upgrade --to 0.7.3 --dry-run
|
|
186
|
+
bunx --package @staix/agent-hub@0.7.3 ahub upgrade --to 0.7.3 --yes
|
|
187
187
|
```
|
|
188
188
|
|
|
189
189
|
The coordinator verifies and retains the exact target package, preserves its
|
|
190
190
|
own source, and promotes the global CLI only after restored projects pass
|
|
191
191
|
readback. Do not use the old protocol-9 coordinator to target protocol 10.
|
|
192
192
|
|
|
193
|
-
Once the installed CLI is 0.7.
|
|
193
|
+
Once the installed CLI is 0.7.3, review the current project or all registered
|
|
194
194
|
projects first:
|
|
195
195
|
|
|
196
196
|
```bash
|
|
197
197
|
ahub restart --dry-run
|
|
198
|
-
ahub upgrade --to 0.7.
|
|
198
|
+
ahub upgrade --to 0.7.3 --dry-run
|
|
199
199
|
```
|
|
200
200
|
|
|
201
201
|
Apply only after reviewing the plan:
|
|
202
202
|
|
|
203
203
|
```bash
|
|
204
204
|
ahub restart --yes
|
|
205
|
-
ahub upgrade --to 0.7.
|
|
205
|
+
ahub upgrade --to 0.7.3 --yes
|
|
206
206
|
ahub recovery status <operation-id>
|
|
207
207
|
ahub recovery resume <operation-id>
|
|
208
208
|
ahub recovery abort <operation-id>
|
package/docs/quickstart.md
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-hub",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.3",
|
|
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",
|
|
@@ -15727,7 +15727,7 @@ class ControlClient {
|
|
|
15727
15727
|
// package.json
|
|
15728
15728
|
var package_default = {
|
|
15729
15729
|
name: "@staix/agent-hub",
|
|
15730
|
-
version: "0.7.
|
|
15730
|
+
version: "0.7.3",
|
|
15731
15731
|
description: "Native multi-agent hub: Claude Code, Codex, Kimi Code, Pi and local inference as peers in one project",
|
|
15732
15732
|
license: "MIT",
|
|
15733
15733
|
type: "module",
|
|
@@ -224,13 +224,26 @@ export function makeRecoveryDriver(run: RunCommand = runCommand): RecoveryDriver
|
|
|
224
224
|
}
|
|
225
225
|
progress.terminals[key] = true; save(); continue;
|
|
226
226
|
}
|
|
227
|
+
// A peer whose TUI already exited left nothing to close: the source reports it
|
|
228
|
+
// detached, and inventory silence is the same proof the pending-reconcile path
|
|
229
|
+
// accepts. No mutation is issued for a terminal that no longer exists (#21).
|
|
230
|
+
const attached = (await inspectRecovery(planned.project)).peers.find((item) => item.id === binding.peer);
|
|
231
|
+
if (attached?.state === "offline") {
|
|
232
|
+
const result = await run([orcaExecutable(), "terminal", "list", "--json"]);
|
|
233
|
+
const inventory = JSON.parse(result.stdout);
|
|
234
|
+
const rows = inventory.result?.terminals;
|
|
235
|
+
if (result.code !== 0 || inventory.ok !== true || !Array.isArray(rows) || inventory.result?.truncated ||
|
|
236
|
+
rows.some((t: any) => t.handle === binding.handle || t.incarnationId === binding.incarnationId)) {
|
|
237
|
+
throw new Error(`${binding.peer}: terminal close outcome needs manual reconciliation`);
|
|
238
|
+
}
|
|
239
|
+
progress.terminals[key] = true; save(); continue;
|
|
240
|
+
}
|
|
227
241
|
const idle = await waitForIdle(binding, 600_000, terminalOptions(run));
|
|
228
242
|
if (!idle.satisfied) throw new Error(`${binding.peer}: terminal is not verified idle; source retained`);
|
|
229
243
|
const source = await inspectRecovery(planned.project);
|
|
230
244
|
if (source.instanceId !== planned.source.instanceId || source.recovery?.operationId !== op.id || !source.recovery.ready) {
|
|
231
245
|
throw new Error("source preparation expired or changed while waiting for the terminal; no terminal was closed");
|
|
232
|
-
}
|
|
233
|
-
// Refresh the same prepared lease immediately before the terminal effect. Preserve
|
|
246
|
+
} // Refresh the same prepared lease immediately before the terminal effect. Preserve
|
|
234
247
|
// the original peer roster, including any terminal already closed in this operation.
|
|
235
248
|
await control(planned.project, "prepare", op.id, planned.source.instanceId!);
|
|
236
249
|
progress.terminals[key] = "pending"; save();
|
package/src/hub/daemon.ts
CHANGED
|
@@ -471,6 +471,11 @@ export async function startDaemon(opts: DaemonOptions) {
|
|
|
471
471
|
return recoveryPeerSnapshot.every((saved) => {
|
|
472
472
|
const now = current[saved.id];
|
|
473
473
|
if (!now) return true; // a detached peer is checked by the coordinator before terminal close
|
|
474
|
+
// A peer that went offline detached; it is not a changed conversation (#21). It is
|
|
475
|
+
// compared again the moment it reattaches, and release refuses while a peer that was
|
|
476
|
+
// online at the snapshot is still offline, so skipping the comparison cannot hide an
|
|
477
|
+
// identity change - it only keeps a detach from wedging readiness forever.
|
|
478
|
+
if (now.state === "offline") return true;
|
|
474
479
|
if (saved.threadId && saved.threadId !== now.threadId) return false;
|
|
475
480
|
// Kimi/local rebuild a fresh worker with task context on the target; native
|
|
476
481
|
// Claude and Pi sessions must keep their exact identities across restoration.
|