swarmdo 1.58.15 → 1.58.18
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/.claude/helpers/agent-bridge-hook.cjs +174 -0
- package/.claude/helpers/hook-handler.cjs +23 -1
- package/.claude/settings.json +16 -0
- package/.claude/settings.local.json +7 -0
- package/README.md +2 -2
- package/package.json +1 -1
- package/v3/@swarmdo/cli/.claude/settings.json +22 -10
- package/v3/@swarmdo/cli/dist/src/init/settings-generator.js +33 -5
- package/v3/@swarmdo/cli/package.json +1 -1
- package/v3/@swarmdo/cli-core/dist/src/index.js +1 -1
- package/v3/@swarmdo/codex/dist/cli.js +0 -0
- package/v3/@swarmdo/hooks/dist/cli/guidance-cli.js +0 -0
- package/v3/@swarmdo/hooks/dist/statusline/index.d.ts +3 -3
- package/v3/@swarmdo/hooks/dist/statusline/index.js +3 -3
- package/v3/@swarmdo/integration/dist/__tests__/agentic-flow-agent.test.js +1 -4
- package/v3/@swarmdo/neural/dist/flash-attention.d.ts +1 -1
- package/v3/@swarmdo/neural/dist/flash-attention.js +1 -1
- package/v3/@swarmdo/plugin-agent-federation/dist/plugin.js +1 -1
- package/v3/@swarmdo/plugin-agent-federation/dist/transport/midstream-aware-loader.js +2 -2
- package/v3/@swarmdo/plugin-iot-cognitum/dist/application/index.d.ts +2 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/application/index.js +2 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/application/iot-coordinator.d.ts +138 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/application/iot-coordinator.js +418 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/bin.d.ts +15 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/bin.js +240 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/cli-commands.d.ts +7 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/cli-commands.js +508 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-agent.d.ts +54 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-agent.js +2 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-fleet.d.ts +46 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-fleet.js +2 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-trust-level.d.ts +18 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-trust-level.js +28 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/index.d.ts +5 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/index.js +2 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/telemetry.d.ts +35 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/telemetry.js +2 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/device-repository.d.ts +11 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/device-repository.js +2 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/fleet-repository.d.ts +9 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/fleet-repository.js +2 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/index.d.ts +5 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/index.js +2 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/telemetry-repository.d.ts +12 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/telemetry-repository.js +2 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/trust-history-repository.d.ts +19 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/trust-history-repository.js +2 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/anomaly-detection-service.d.ts +44 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/anomaly-detection-service.js +117 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/device-lifecycle-service.d.ts +70 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/device-lifecycle-service.js +194 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/firmware-orchestration-service.d.ts +69 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/firmware-orchestration-service.js +139 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/fleet-topology-service.d.ts +34 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/fleet-topology-service.js +101 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/index.d.ts +10 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/index.js +10 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/mesh-service.d.ts +64 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/mesh-service.js +70 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/sona-integration-service.d.ts +44 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/sona-integration-service.js +79 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-ingestion-service.d.ts +37 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-ingestion-service.js +39 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-service.d.ts +67 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-service.js +58 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/witness-verification-service.d.ts +45 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/witness-verification-service.js +63 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/index.d.ts +26 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/index.js +17 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/agentdb-telemetry-repository.d.ts +51 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/agentdb-telemetry-repository.js +110 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-device-repository.d.ts +13 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-device-repository.js +25 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-fleet-repository.d.ts +11 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-fleet-repository.js +19 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-trust-history-repository.d.ts +11 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-trust-history-repository.js +27 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/index.d.ts +6 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/index.js +6 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/seed-client-factory.d.ts +41 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/seed-client-factory.js +64 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/mcp-tools.d.ts +8 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/mcp-tools.js +703 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/plugin.d.ts +23 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/plugin.js +239 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/anomaly-scan-worker.d.ts +17 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/anomaly-scan-worker.js +42 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/firmware-watch-worker.d.ts +18 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/firmware-watch-worker.js +45 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/health-probe-worker.d.ts +19 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/health-probe-worker.js +50 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/mesh-sync-worker.d.ts +19 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/mesh-sync-worker.js +47 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/telemetry-ingest-worker.d.ts +17 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/telemetry-ingest-worker.js +40 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/witness-audit-worker.d.ts +18 -0
- package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/witness-audit-worker.js +51 -0
- package/v3/@swarmdo/providers/dist/swarmvector-provider.d.ts +1 -1
- package/v3/@swarmdo/providers/dist/swarmvector-provider.js +1 -1
- package/v3/@swarmdo/security/dist/input-validator.d.ts +6 -6
- package/v3/@swarmdo/shared/dist/hooks/safety/git-commit.js +1 -1
- package/v3/@swarmdo/shared/dist/mcp/transport/http.js +1 -8
- package/v3/@swarmdo/testing/dist/fixtures/agent-fixtures.d.ts +214 -0
- package/v3/@swarmdo/testing/dist/fixtures/agent-fixtures.js +595 -0
- package/v3/@swarmdo/testing/dist/fixtures/agents.d.ts +76 -0
- package/v3/@swarmdo/testing/dist/fixtures/agents.js +158 -0
- package/v3/@swarmdo/testing/dist/fixtures/configurations.d.ts +157 -0
- package/v3/@swarmdo/testing/dist/fixtures/configurations.js +337 -0
- package/v3/@swarmdo/testing/dist/fixtures/index.d.ts +10 -0
- package/v3/@swarmdo/testing/dist/fixtures/index.js +17 -0
- package/v3/@swarmdo/testing/dist/fixtures/mcp-fixtures.d.ts +329 -0
- package/v3/@swarmdo/testing/dist/fixtures/mcp-fixtures.js +714 -0
- package/v3/@swarmdo/testing/dist/fixtures/memory-entries.d.ts +159 -0
- package/v3/@swarmdo/testing/dist/fixtures/memory-entries.js +262 -0
- package/v3/@swarmdo/testing/dist/fixtures/memory-fixtures.d.ts +290 -0
- package/v3/@swarmdo/testing/dist/fixtures/memory-fixtures.js +547 -0
- package/v3/@swarmdo/testing/dist/fixtures/swarm-fixtures.d.ts +289 -0
- package/v3/@swarmdo/testing/dist/fixtures/swarm-fixtures.js +534 -0
- package/v3/@swarmdo/testing/dist/fixtures/tasks.d.ts +106 -0
- package/v3/@swarmdo/testing/dist/fixtures/tasks.js +229 -0
- package/v3/@swarmdo/testing/dist/helpers/assertion-helpers.d.ts +213 -0
- package/v3/@swarmdo/testing/dist/helpers/assertion-helpers.js +435 -0
- package/v3/@swarmdo/testing/dist/helpers/assertions.d.ts +135 -0
- package/v3/@swarmdo/testing/dist/helpers/assertions.js +217 -0
- package/v3/@swarmdo/testing/dist/helpers/create-mock.d.ts +96 -0
- package/v3/@swarmdo/testing/dist/helpers/create-mock.js +164 -0
- package/v3/@swarmdo/testing/dist/helpers/index.d.ts +14 -0
- package/v3/@swarmdo/testing/dist/helpers/index.js +22 -0
- package/v3/@swarmdo/testing/dist/helpers/mock-factory.d.ts +323 -0
- package/v3/@swarmdo/testing/dist/helpers/mock-factory.js +350 -0
- package/v3/@swarmdo/testing/dist/helpers/setup-teardown.d.ts +271 -0
- package/v3/@swarmdo/testing/dist/helpers/setup-teardown.js +446 -0
- package/v3/@swarmdo/testing/dist/helpers/swarm-instance.d.ts +142 -0
- package/v3/@swarmdo/testing/dist/helpers/swarm-instance.js +205 -0
- package/v3/@swarmdo/testing/dist/helpers/test-application.d.ts +190 -0
- package/v3/@swarmdo/testing/dist/helpers/test-application.js +138 -0
- package/v3/@swarmdo/testing/dist/helpers/test-utils.d.ts +274 -0
- package/v3/@swarmdo/testing/dist/helpers/test-utils.js +456 -0
- package/v3/@swarmdo/testing/dist/index.d.ts +42 -0
- package/v3/@swarmdo/testing/dist/index.js +66 -0
- package/v3/@swarmdo/testing/dist/mocks/index.d.ts +8 -0
- package/v3/@swarmdo/testing/dist/mocks/index.js +10 -0
- package/v3/@swarmdo/testing/dist/mocks/mock-mcp-client.d.ts +206 -0
- package/v3/@swarmdo/testing/dist/mocks/mock-mcp-client.js +575 -0
- package/v3/@swarmdo/testing/dist/mocks/mock-services.d.ts +287 -0
- package/v3/@swarmdo/testing/dist/mocks/mock-services.js +563 -0
- package/v3/@swarmdo/testing/dist/regression/api-contract.d.ts +109 -0
- package/v3/@swarmdo/testing/dist/regression/api-contract.js +374 -0
- package/v3/@swarmdo/testing/dist/regression/index.d.ts +18 -0
- package/v3/@swarmdo/testing/dist/regression/index.js +18 -0
- package/v3/@swarmdo/testing/dist/regression/integration-regression.d.ts +67 -0
- package/v3/@swarmdo/testing/dist/regression/integration-regression.js +334 -0
- package/v3/@swarmdo/testing/dist/regression/performance-baseline.d.ts +106 -0
- package/v3/@swarmdo/testing/dist/regression/performance-baseline.js +268 -0
- package/v3/@swarmdo/testing/dist/regression/regression-runner.d.ts +124 -0
- package/v3/@swarmdo/testing/dist/regression/regression-runner.js +227 -0
- package/v3/@swarmdo/testing/dist/regression/security-regression.d.ts +73 -0
- package/v3/@swarmdo/testing/dist/regression/security-regression.js +258 -0
- package/v3/@swarmdo/testing/dist/setup.d.ts +43 -0
- package/v3/@swarmdo/testing/dist/setup.js +91 -0
- package/v3/@swarmdo/testing/dist/v2-compat/api-compat.test.d.ts +10 -0
- package/v3/@swarmdo/testing/dist/v2-compat/api-compat.test.js +433 -0
- package/v3/@swarmdo/testing/dist/v2-compat/cli-compat.test.d.ts +10 -0
- package/v3/@swarmdo/testing/dist/v2-compat/cli-compat.test.js +352 -0
- package/v3/@swarmdo/testing/dist/v2-compat/compatibility-validator.d.ts +206 -0
- package/v3/@swarmdo/testing/dist/v2-compat/compatibility-validator.js +839 -0
- package/v3/@swarmdo/testing/dist/v2-compat/hooks-compat.test.d.ts +10 -0
- package/v3/@swarmdo/testing/dist/v2-compat/hooks-compat.test.js +428 -0
- package/v3/@swarmdo/testing/dist/v2-compat/index.d.ts +38 -0
- package/v3/@swarmdo/testing/dist/v2-compat/index.js +41 -0
- package/v3/@swarmdo/testing/dist/v2-compat/mcp-compat.test.d.ts +10 -0
- package/v3/@swarmdo/testing/dist/v2-compat/mcp-compat.test.js +419 -0
- package/v3/@swarmdo/testing/dist/v2-compat/report-generator.d.ts +34 -0
- package/v3/@swarmdo/testing/dist/v2-compat/report-generator.js +372 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent-bridge-hook.cjs — bind real Claude Code subagents into Swarmdo's
|
|
3
|
+
* canonical agent registry, automatically.
|
|
4
|
+
*
|
|
5
|
+
* #108. `src/agent-bridge/bridge.ts` was written to solve "a session can run
|
|
6
|
+
* four Claude Code agents while `swarmdo agent list` stays empty", and is pure
|
|
7
|
+
* by design because "All fs / MCP / spawning lives in the command + hook
|
|
8
|
+
* layers". The command layer got built (`swarmdo agent bridge register`); the
|
|
9
|
+
* hook layer never did. So nothing ever registered a Task/Agent-tool subagent,
|
|
10
|
+
* `.swarmdo/agents/store.json` stayed `{"agents":{}}`, and the statusline's
|
|
11
|
+
* `🐝 Swarms N 🤖 Agents M` sat at 0/0 forever. This file is that missing
|
|
12
|
+
* hook layer.
|
|
13
|
+
*
|
|
14
|
+
* Why shell out to the CLI instead of writing the store here: registering is
|
|
15
|
+
* not just a store write — `agent_bridge_register` also auto-forms a swarm from
|
|
16
|
+
* config and enrolls the agent (agent-tools.ts:462), which is what makes the
|
|
17
|
+
* Swarms counter move too. bridge.ts's own rule is to go through the canonical
|
|
18
|
+
* registerAgent path — "NO parallel store". Reimplementing that in CJS would
|
|
19
|
+
* fork the registry. The CLI costs ~850ms to boot (it loads ONNX), far too slow
|
|
20
|
+
* to block every subagent spawn, so calls are fired detached and unref'd: the
|
|
21
|
+
* hook returns immediately and the registry lands ~1s later. The statusline
|
|
22
|
+
* polls every 5s, so eventual consistency is invisible here.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
const fs = require('fs');
|
|
26
|
+
const os = require('os');
|
|
27
|
+
const path = require('path');
|
|
28
|
+
const { spawn } = require('child_process');
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Mirror of src/agent-bridge/bridge.ts `bridgeAgentId` — kept in sync by hand,
|
|
32
|
+
* because this hook is standalone CommonJS and cannot import the ESM engine
|
|
33
|
+
* (the same constraint router.cjs already works under for classifyPrompt).
|
|
34
|
+
* __tests__/agent-bridge-hook.test.ts asserts the two implementations agree.
|
|
35
|
+
*
|
|
36
|
+
* Deterministic, so SubagentStart and SubagentStop derive the SAME id from the
|
|
37
|
+
* same agent_id and the stop reliably terminates the record the start created.
|
|
38
|
+
*/
|
|
39
|
+
function bridgeAgentId(d) {
|
|
40
|
+
const sess = d.sessionId
|
|
41
|
+
? d.sessionId.replace(/[^A-Za-z0-9]/g, '').slice(0, 8) || 'nosess'
|
|
42
|
+
: 'nosess';
|
|
43
|
+
const safe = String(d.name || '').replace(/[^A-Za-z0-9_-]+/g, '-').replace(/^-+|-+$/g, '') || 'agent';
|
|
44
|
+
return `cc-${sess}-${safe}`;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Locate an installed CLI bin. Mirror of statusline.cjs resolveCliBin() — same
|
|
49
|
+
* candidate order, same reason (#2337): never `npx @latest` from a hook.
|
|
50
|
+
* Returns null when nothing is installed, in which case we no-op rather than
|
|
51
|
+
* pay a registry round-trip on every subagent spawn.
|
|
52
|
+
*/
|
|
53
|
+
function resolveCliBin(cwd) {
|
|
54
|
+
try {
|
|
55
|
+
const home = os.homedir();
|
|
56
|
+
const base = cwd || process.cwd();
|
|
57
|
+
const candidates = [
|
|
58
|
+
path.join(home, '.claude', 'plugins', 'marketplaces', 'swarmdo', 'bin', 'cli.js'),
|
|
59
|
+
path.join(base, 'node_modules', '@swarmdo', 'cli', 'bin', 'cli.js'),
|
|
60
|
+
path.join(base, 'node_modules', 'swarmdo', 'bin', 'cli.js'),
|
|
61
|
+
path.join(base, 'v3', '@swarmdo', 'cli', 'bin', 'cli.js'),
|
|
62
|
+
];
|
|
63
|
+
try {
|
|
64
|
+
const binDir = path.dirname(process.execPath);
|
|
65
|
+
const globalModuleDirs = [
|
|
66
|
+
path.join(binDir, '..', 'lib', 'node_modules'),
|
|
67
|
+
path.join(binDir, 'node_modules'),
|
|
68
|
+
'/opt/homebrew/lib/node_modules',
|
|
69
|
+
'/usr/local/lib/node_modules',
|
|
70
|
+
];
|
|
71
|
+
for (const prefix of [process.env.npm_config_prefix, process.env.PREFIX, path.join(home, '.npm-global')]) {
|
|
72
|
+
if (prefix) globalModuleDirs.push(path.join(prefix, 'lib', 'node_modules'));
|
|
73
|
+
}
|
|
74
|
+
for (const gm of globalModuleDirs) {
|
|
75
|
+
candidates.push(
|
|
76
|
+
path.join(gm, 'swarmdo', 'bin', 'cli.js'),
|
|
77
|
+
path.join(gm, '@swarmdo', 'cli', 'bin', 'cli.js'),
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
} catch { /* ignore */ }
|
|
81
|
+
for (const p of candidates) {
|
|
82
|
+
if (fs.existsSync(p)) return p;
|
|
83
|
+
}
|
|
84
|
+
} catch { /* ignore */ }
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Is this hook payload a real subagent event we should act on? `agent_id` is
|
|
90
|
+
* present ONLY when the hook fires for a subagent, so it doubles as the guard
|
|
91
|
+
* against main-thread invocations. Pure.
|
|
92
|
+
*/
|
|
93
|
+
function isSubagentEvent(hookInput) {
|
|
94
|
+
const id = hookInput && (hookInput.agent_id || hookInput.agentId);
|
|
95
|
+
return typeof id === 'string' && id.length > 0;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Build the `agent bridge register` argv for a SubagentStart payload, or null
|
|
100
|
+
* when the payload is not a subagent event. Pure — the spawn happens in
|
|
101
|
+
* register(). Registering is idempotent on name+session, so a duplicate
|
|
102
|
+
* SubagentStart updates the bound record rather than forking a second one.
|
|
103
|
+
*/
|
|
104
|
+
function buildRegisterArgs(hookInput) {
|
|
105
|
+
if (!isSubagentEvent(hookInput)) return null;
|
|
106
|
+
const agentId = hookInput.agent_id || hookInput.agentId;
|
|
107
|
+
const sessionId = hookInput.session_id || hookInput.sessionId || '';
|
|
108
|
+
const agentType = hookInput.agent_type || hookInput.agentType || 'general-purpose';
|
|
109
|
+
const args = ['agent', 'bridge', 'register', '-n', agentId, '-t', agentType];
|
|
110
|
+
if (sessionId) args.push('-s', sessionId);
|
|
111
|
+
return args;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Build the `agent stop` argv for a SubagentStop payload, or null when the
|
|
116
|
+
* payload is not a subagent event. `agent stop` sets status='terminated'
|
|
117
|
+
* (agent-tools.ts:721), which is precisely what computeSwarmStatus filters on,
|
|
118
|
+
* so the Agents count decrements when a subagent finishes. `-f` because a hook
|
|
119
|
+
* has no TTY and must not hit the interactive confirm. Pure.
|
|
120
|
+
*/
|
|
121
|
+
function buildTerminateArgs(hookInput) {
|
|
122
|
+
if (!isSubagentEvent(hookInput)) return null;
|
|
123
|
+
const id = bridgeAgentId({
|
|
124
|
+
name: hookInput.agent_id || hookInput.agentId,
|
|
125
|
+
sessionId: hookInput.session_id || hookInput.sessionId,
|
|
126
|
+
});
|
|
127
|
+
return ['agent', 'stop', id, '-f'];
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Fire a CLI subcommand and forget it. Detached + unref'd + stdio ignored so
|
|
132
|
+
* the hook process can exit immediately without waiting on the CLI's ~850ms
|
|
133
|
+
* boot, and without the child dying alongside it.
|
|
134
|
+
*/
|
|
135
|
+
function spawnDetached(args, cwd) {
|
|
136
|
+
const cliBin = resolveCliBin(cwd);
|
|
137
|
+
if (!cliBin) return false;
|
|
138
|
+
try {
|
|
139
|
+
const child = spawn(process.execPath, [cliBin, ...args], {
|
|
140
|
+
cwd: cwd || process.cwd(),
|
|
141
|
+
detached: true,
|
|
142
|
+
stdio: 'ignore',
|
|
143
|
+
});
|
|
144
|
+
child.unref();
|
|
145
|
+
return true;
|
|
146
|
+
} catch {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** SubagentStart → bind the subagent (and auto-form its swarm). */
|
|
152
|
+
function register(hookInput, cwd) {
|
|
153
|
+
const args = buildRegisterArgs(hookInput);
|
|
154
|
+
if (!args) return false;
|
|
155
|
+
return spawnDetached(args, cwd || (hookInput && hookInput.cwd));
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/** SubagentStop → mark the bound record terminated. */
|
|
159
|
+
function terminate(hookInput, cwd) {
|
|
160
|
+
const args = buildTerminateArgs(hookInput);
|
|
161
|
+
if (!args) return false;
|
|
162
|
+
return spawnDetached(args, cwd || (hookInput && hookInput.cwd));
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
module.exports = {
|
|
166
|
+
bridgeAgentId,
|
|
167
|
+
resolveCliBin,
|
|
168
|
+
isSubagentEvent,
|
|
169
|
+
buildRegisterArgs,
|
|
170
|
+
buildTerminateArgs,
|
|
171
|
+
spawnDetached,
|
|
172
|
+
register,
|
|
173
|
+
terminate,
|
|
174
|
+
};
|
|
@@ -34,6 +34,7 @@ const router = safeRequire(path.join(helpersDir, 'router.cjs'));
|
|
|
34
34
|
const session = safeRequire(path.join(helpersDir, 'session.cjs'));
|
|
35
35
|
const memory = safeRequire(path.join(helpersDir, 'memory.cjs'));
|
|
36
36
|
const intelligence = safeRequire(path.join(helpersDir, 'intelligence.cjs'));
|
|
37
|
+
const agentBridge = safeRequire(path.join(helpersDir, 'agent-bridge-hook.cjs'));
|
|
37
38
|
|
|
38
39
|
// ── Intelligence timeout protection (fixes #1530, #1531) ───────────────────
|
|
39
40
|
var INTELLIGENCE_TIMEOUT_MS = 3000;
|
|
@@ -270,6 +271,27 @@ const handlers = {
|
|
|
270
271
|
console.log('[OK] Status check');
|
|
271
272
|
},
|
|
272
273
|
|
|
274
|
+
// SubagentStart — bind the spawned Claude Code subagent into Swarmdo's
|
|
275
|
+
// canonical registry so `swarmdo agent list` and the statusline's
|
|
276
|
+
// `🐝 Swarms N 🤖 Agents M` reflect agents that actually exist (#108).
|
|
277
|
+
// Registering also auto-forms the swarm, so both counters move.
|
|
278
|
+
'agent-register': () => {
|
|
279
|
+
if (!agentBridge) return;
|
|
280
|
+
if (!agentBridge.isSubagentEvent(hookInput)) return; // main-thread call
|
|
281
|
+
var ok = agentBridge.register(hookInput);
|
|
282
|
+
console.log(ok
|
|
283
|
+
? '[OK] Bridged subagent ' + (hookInput.agent_type || 'agent') + ' into Swarmdo'
|
|
284
|
+
: '[WARN] Could not bridge subagent (no installed CLI found)');
|
|
285
|
+
},
|
|
286
|
+
|
|
287
|
+
// SubagentStop — mark the bound record terminated so the Agents count
|
|
288
|
+
// decrements. Same deterministic id the register side derived (#108).
|
|
289
|
+
'agent-terminate': () => {
|
|
290
|
+
if (!agentBridge) return;
|
|
291
|
+
if (!agentBridge.isSubagentEvent(hookInput)) return;
|
|
292
|
+
agentBridge.terminate(hookInput);
|
|
293
|
+
},
|
|
294
|
+
|
|
273
295
|
'stats': () => {
|
|
274
296
|
if (intelligence && intelligence.stats) {
|
|
275
297
|
intelligence.stats(args.includes('--json'));
|
|
@@ -288,7 +310,7 @@ if (command && handlers[command]) {
|
|
|
288
310
|
} else if (command) {
|
|
289
311
|
console.log('[OK] Hook: ' + command);
|
|
290
312
|
} else {
|
|
291
|
-
console.log('Usage: hook-handler.cjs <route|pre-bash|post-edit|session-restore|session-end|pre-task|post-task|compact-manual|compact-auto|status|stats>');
|
|
313
|
+
console.log('Usage: hook-handler.cjs <route|pre-bash|post-edit|session-restore|session-end|pre-task|post-task|agent-register|agent-terminate|compact-manual|compact-auto|status|stats>');
|
|
292
314
|
}
|
|
293
315
|
}
|
|
294
316
|
|
package/.claude/settings.json
CHANGED
|
@@ -144,6 +144,17 @@
|
|
|
144
144
|
]
|
|
145
145
|
}
|
|
146
146
|
],
|
|
147
|
+
"SubagentStart": [
|
|
148
|
+
{
|
|
149
|
+
"hooks": [
|
|
150
|
+
{
|
|
151
|
+
"type": "command",
|
|
152
|
+
"command": "node \"$CLAUDE_PROJECT_DIR/.claude/helpers/hook-handler.cjs\" agent-register",
|
|
153
|
+
"timeout": 5000
|
|
154
|
+
}
|
|
155
|
+
]
|
|
156
|
+
}
|
|
157
|
+
],
|
|
147
158
|
"SubagentStop": [
|
|
148
159
|
{
|
|
149
160
|
"hooks": [
|
|
@@ -151,6 +162,11 @@
|
|
|
151
162
|
"type": "command",
|
|
152
163
|
"command": "node \"$CLAUDE_PROJECT_DIR/.claude/helpers/hook-handler.cjs\" post-task",
|
|
153
164
|
"timeout": 5000
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"type": "command",
|
|
168
|
+
"command": "node \"$CLAUDE_PROJECT_DIR/.claude/helpers/hook-handler.cjs\" agent-terminate",
|
|
169
|
+
"timeout": 5000
|
|
154
170
|
}
|
|
155
171
|
]
|
|
156
172
|
}
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://swarmdo.com)
|
|
4
4
|
|
|
5
|
-
[](https://img.shields.io/badge/npx%20swarmdo-v1.58.18-cb3837?style=for-the-badge&logo=npm&logoColor=white)](https://github.com/SwarmDo/swarmdo/releases)
|
|
6
6
|
[](https://github.com/SwarmDo/swarmdo/blob/main/LICENSE)
|
|
7
7
|
[](https://swarmdo.com)
|
|
8
8
|
[](https://github.com/SwarmDo/swarmdo)
|
|
@@ -294,7 +294,7 @@ The recent release train added a full day-to-day operations layer around the swa
|
|
|
294
294
|
| `swarmdo hidden-coupling` | **Co-change with no import edge** — join the two graphs swarmdo already owns (temporal `coupling` from git + `codegraph`'s import graph) and emit the set difference: file pairs that keep changing together yet nothing in the code links them ("logical minus structural coupling" — a config and its consumers, a schema and its mirror type). The co-edit `affected` can't see. `--since`, `--min-shared`, `--csv`, `--format json`. Grounded in Gall et al. (ICSM 1998). Deterministic |
|
|
295
295
|
| `swarmdo standup` (alias `mine`) | **What did I do?** — your commits since your last working day, grouped by day with a diffstat. **Weekend-aware** (git-standup parity): on Monday it reaches back to Friday, on Sunday to Friday, otherwise to yesterday — one-command recall for a standup or for re-orienting at the start of a session. Defaults to the current git user; `--author <name>`/`--all` for teammates, `--days N` or `--since 2w` to override the window, `--format json`. Pure engine (weekend math + per-day fold) → fixture-tested. Deterministic |
|
|
296
296
|
| `swarmdo commands` (alias `slash`) | **Hot/cold/orphan usage report** for your authored `.claude/` surface — which custom slash-commands (`.claude/commands/**`) and subagents (`.claude/agents/**`) you actually invoke (**hot**, with counts), which are **cold** (defined but never used → prune candidates), and which are **orphan** (invoked but undefined → a typo or a builtin). `config lint` says "are these valid?"; this says "are these used?" — joining the defined files against invocation counts mined from local transcripts (`<command-name>` markers + `subagent_type` fields). `--unused` prints just the prune list, `--unused --strict` is a CI gate (exit 1 if anything's dead), `--all` counts across every project, `--json`. Pure parsers + join → fixture-tested |
|
|
297
|
-
| `swarmdo agent bridge` | **Link Claude Code agents ⇄ Swarmdo** — the fix for "Swarmdo is installed but never actually used." Swarmdo can't call Claude Code's `Agent` tool (only the main loop can), so `agent bridge register -n <name>` binds a real Claude Code agent into Swarmdo's registry (`swarmdo agent list` stops being empty) and **auto-spins-up a swarm from your config, enrolling the agent** — the next bind joins the same swarm. `bridge list` (bound vs native), `bridge sync --live a,b` (reconcile drift), `bridge advise "<prompt>"` (should this warrant a swarm? which roles?). Also MCP tools `agent_bridge_register`/`agent_bridge_list`. Pure engine → 16 tests |
|
|
297
|
+
| `swarmdo agent bridge` | **Link Claude Code agents ⇄ Swarmdo** — the fix for "Swarmdo is installed but never actually used." Swarmdo can't call Claude Code's `Agent` tool (only the main loop can), so `agent bridge register -n <name>` binds a real Claude Code agent into Swarmdo's registry (`swarmdo agent list` stops being empty) and **auto-spins-up a swarm from your config, enrolling the agent** — the next bind joins the same swarm. **Automatic since 1.58.18:** `swarmdo init` wires a `SubagentStart` hook that registers every Claude Code subagent as it spawns, and a `SubagentStop` hook that marks it terminated — so the statusline's `🐝 Swarms N 🤖 Agents M` tracks real agents with no manual step (#108). `bridge list` (bound vs native), `bridge sync --live a,b` (reconcile drift), `bridge advise "<prompt>"` (should this warrant a swarm? which roles?). Also MCP tools `agent_bridge_register`/`agent_bridge_list`. Pure engine → 16 tests |
|
|
298
298
|
| `swarmdo testreport` | **JUnit/TAP → failure digest** — turn raw test-result files into the exact failing test names + `file:line` + assertion messages, instead of scanning hundreds of log lines. The front-half of the test→fix loop: feed the failures straight into `repair`. Reads a file, a directory, or stdin; `--ci` exits 1 on any failure, `--format json`. Also an MCP tool (`testreport`). Deterministic |
|
|
299
299
|
| `swarmdo integrations` (alias `integrate`) | **Use swarmdo from Codex CLI, GitHub Copilot CLI, and pi** — one command wires AGENTS.md + each CLI's MCP config (idempotent, dry-run first, never touches your Claude Code setup) |
|
|
300
300
|
| OpenRouter model pool | **Let swarms pick from any models you configure** — declare tier-mapped OpenRouter models in `swarmdo.config.json`; the router Thompson-samples among them per task and the execution layer dispatches the winner |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "swarmdo",
|
|
3
|
-
"version": "1.58.
|
|
3
|
+
"version": "1.58.18",
|
|
4
4
|
"description": "Swarmdo - Enterprise AI agent orchestration for Claude Code. Deploy 60+ specialized agents in coordinated swarms with self-learning, fault-tolerant consensus, vector memory, and MCP integration",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"hooks": [
|
|
12
12
|
{
|
|
13
13
|
"type": "command",
|
|
14
|
-
"command": "node "$CLAUDE_PROJECT_DIR/.claude/helpers/hook-handler.cjs" pre-bash",
|
|
14
|
+
"command": "node \"$CLAUDE_PROJECT_DIR/.claude/helpers/hook-handler.cjs\" pre-bash",
|
|
15
15
|
"timeout": 5000
|
|
16
16
|
}
|
|
17
17
|
]
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"hooks": [
|
|
24
24
|
{
|
|
25
25
|
"type": "command",
|
|
26
|
-
"command": "node "$CLAUDE_PROJECT_DIR/.claude/helpers/hook-handler.cjs" post-edit",
|
|
26
|
+
"command": "node \"$CLAUDE_PROJECT_DIR/.claude/helpers/hook-handler.cjs\" post-edit",
|
|
27
27
|
"timeout": 10000
|
|
28
28
|
}
|
|
29
29
|
]
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"hooks": [
|
|
35
35
|
{
|
|
36
36
|
"type": "command",
|
|
37
|
-
"command": "node "$CLAUDE_PROJECT_DIR/.claude/helpers/hook-handler.cjs" route",
|
|
37
|
+
"command": "node \"$CLAUDE_PROJECT_DIR/.claude/helpers/hook-handler.cjs\" route",
|
|
38
38
|
"timeout": 10000
|
|
39
39
|
}
|
|
40
40
|
]
|
|
@@ -46,13 +46,13 @@
|
|
|
46
46
|
"hooks": [
|
|
47
47
|
{
|
|
48
48
|
"type": "command",
|
|
49
|
-
"command": "node "$CLAUDE_PROJECT_DIR/.claude/helpers/hook-handler.cjs" session-restore",
|
|
49
|
+
"command": "node \"$CLAUDE_PROJECT_DIR/.claude/helpers/hook-handler.cjs\" session-restore",
|
|
50
50
|
"timeout": 15000,
|
|
51
51
|
"continueOnError": true
|
|
52
52
|
},
|
|
53
53
|
{
|
|
54
54
|
"type": "command",
|
|
55
|
-
"command": "node "$CLAUDE_PROJECT_DIR/.claude/helpers/auto-memory-hook.mjs" import",
|
|
55
|
+
"command": "node \"$CLAUDE_PROJECT_DIR/.claude/helpers/auto-memory-hook.mjs\" import",
|
|
56
56
|
"timeout": 8000,
|
|
57
57
|
"continueOnError": true
|
|
58
58
|
}
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"hooks": [
|
|
65
65
|
{
|
|
66
66
|
"type": "command",
|
|
67
|
-
"command": "node "$CLAUDE_PROJECT_DIR/.claude/helpers/hook-handler.cjs" session-end",
|
|
67
|
+
"command": "node \"$CLAUDE_PROJECT_DIR/.claude/helpers/hook-handler.cjs\" session-end",
|
|
68
68
|
"timeout": 10000,
|
|
69
69
|
"continueOnError": true
|
|
70
70
|
}
|
|
@@ -76,8 +76,20 @@
|
|
|
76
76
|
"hooks": [
|
|
77
77
|
{
|
|
78
78
|
"type": "command",
|
|
79
|
-
"command": "node "$CLAUDE_PROJECT_DIR/.claude/helpers/hook-handler.cjs"
|
|
80
|
-
"timeout":
|
|
79
|
+
"command": "node \"$CLAUDE_PROJECT_DIR/.claude/helpers/hook-handler.cjs\" agent-register",
|
|
80
|
+
"timeout": 5000,
|
|
81
|
+
"continueOnError": true
|
|
82
|
+
}
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
],
|
|
86
|
+
"SubagentStop": [
|
|
87
|
+
{
|
|
88
|
+
"hooks": [
|
|
89
|
+
{
|
|
90
|
+
"type": "command",
|
|
91
|
+
"command": "node \"$CLAUDE_PROJECT_DIR/.claude/helpers/hook-handler.cjs\" agent-terminate",
|
|
92
|
+
"timeout": 5000,
|
|
81
93
|
"continueOnError": true
|
|
82
94
|
}
|
|
83
95
|
]
|
|
@@ -88,7 +100,7 @@
|
|
|
88
100
|
"hooks": [
|
|
89
101
|
{
|
|
90
102
|
"type": "command",
|
|
91
|
-
"command": "node "$CLAUDE_PROJECT_DIR/.claude/helpers/auto-memory-hook.mjs" sync",
|
|
103
|
+
"command": "node \"$CLAUDE_PROJECT_DIR/.claude/helpers/auto-memory-hook.mjs\" sync",
|
|
92
104
|
"timeout": 10000,
|
|
93
105
|
"continueOnError": true
|
|
94
106
|
}
|
|
@@ -98,7 +110,7 @@
|
|
|
98
110
|
},
|
|
99
111
|
"statusLine": {
|
|
100
112
|
"type": "command",
|
|
101
|
-
"command": "node "$CLAUDE_PROJECT_DIR/.claude/helpers/statusline.cjs"",
|
|
113
|
+
"command": "node \"$CLAUDE_PROJECT_DIR/.claude/helpers/statusline.cjs\"",
|
|
102
114
|
"refreshMs": 5000,
|
|
103
115
|
"enabled": true
|
|
104
116
|
},
|
|
@@ -408,11 +408,34 @@ function generateHooksConfig(config) {
|
|
|
408
408
|
},
|
|
409
409
|
];
|
|
410
410
|
}
|
|
411
|
-
//
|
|
412
|
-
//
|
|
413
|
-
//
|
|
414
|
-
//
|
|
415
|
-
//
|
|
411
|
+
// SubagentStart — bind each spawned Claude Code subagent into Swarmdo's
|
|
412
|
+
// canonical agent registry (#108). Registering auto-forms the swarm too, so
|
|
413
|
+
// this one hook is what makes the statusline's `🐝 Swarms N 🤖 Agents M`
|
|
414
|
+
// move at all.
|
|
415
|
+
//
|
|
416
|
+
// HISTORY — read before deleting this block again. A SubagentStart block used
|
|
417
|
+
// to ship here. It was removed as "dead config" on the belief that
|
|
418
|
+
// SubagentStart is not a Claude Code hook event; `config lint` (v1.4.6)
|
|
419
|
+
// flagged it against a HOOK_EVENTS list that was then missing it. The list in
|
|
420
|
+
// config-lint/lint.ts has since been corrected against
|
|
421
|
+
// code.claude.com/docs/en/hooks and lists SubagentStart as valid — it fires
|
|
422
|
+
// "when a subagent is spawned", matches on agent type, and carries
|
|
423
|
+
// `agent_id` + `agent_type`. The removal was a false positive, and it took
|
|
424
|
+
// the only spawn-side registration path with it, which is why the agent
|
|
425
|
+
// count sat at 0 through #105 and its follow-up.
|
|
426
|
+
hooks.SubagentStart = [
|
|
427
|
+
{
|
|
428
|
+
hooks: [
|
|
429
|
+
{
|
|
430
|
+
type: 'command',
|
|
431
|
+
command: hookHandlerCmd('agent-register'),
|
|
432
|
+
timeout: 5000,
|
|
433
|
+
},
|
|
434
|
+
],
|
|
435
|
+
},
|
|
436
|
+
];
|
|
437
|
+
// SubagentStop — track agent completion for metrics, and mark the bound
|
|
438
|
+
// record terminated so the Agents count decrements (#108).
|
|
416
439
|
// NOTE: The valid event is "SubagentStop" (not "SubagentEnd")
|
|
417
440
|
hooks.SubagentStop = [
|
|
418
441
|
{
|
|
@@ -422,6 +445,11 @@ function generateHooksConfig(config) {
|
|
|
422
445
|
command: hookHandlerCmd('post-task'),
|
|
423
446
|
timeout: 5000,
|
|
424
447
|
},
|
|
448
|
+
{
|
|
449
|
+
type: 'command',
|
|
450
|
+
command: hookHandlerCmd('agent-terminate'),
|
|
451
|
+
timeout: 5000,
|
|
452
|
+
},
|
|
425
453
|
],
|
|
426
454
|
},
|
|
427
455
|
];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@swarmdo/cli",
|
|
3
|
-
"version": "1.58.
|
|
3
|
+
"version": "1.58.18",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Swarmdo CLI - Enterprise AI agent orchestration with 60+ specialized agents, swarm coordination, MCP server, self-learning hooks, and vector memory for Claude Code",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
@@ -103,7 +103,7 @@ Storage:
|
|
|
103
103
|
Programmatic use:
|
|
104
104
|
import { JsonMemoryBackend, runMemoryCommand } from '@swarmdo/cli-core';
|
|
105
105
|
|
|
106
|
-
Track progress:
|
|
106
|
+
Track progress: https://github.com/ruvnet/swarmdo/issues/1760`);
|
|
107
107
|
process.exit(0);
|
|
108
108
|
}
|
|
109
109
|
console.error(`@swarmdo/cli-core: command "${args[0]}" not yet wired into cli-core.
|
|
File without changes
|
|
File without changes
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Provides real-time progress, metrics, and status information.
|
|
6
6
|
*
|
|
7
7
|
* Format matches the working .claude/statusline.sh output:
|
|
8
|
-
* ▊ Swarmdo V3 ●
|
|
8
|
+
* ▊ Swarmdo V3 ● ruvnet │ ⎇ v3 │ Opus 4.5
|
|
9
9
|
* ─────────────────────────────────────────────────────
|
|
10
10
|
* 🏗️ DDD Domains [●●●●●] 5/5 ⚡ 1.0x → 2.49x-7.47x
|
|
11
11
|
* 🤖 Swarm ◉ [58/15] 👥 0 🟢 CVE 3/3 💾 22282MB 📂 47% 🧠 10%
|
|
@@ -76,7 +76,7 @@ export declare class StatuslineGenerator {
|
|
|
76
76
|
* This avoids the multi-line collision bug where Claude Code's internal status
|
|
77
77
|
* (written at absolute terminal coordinates ~cols 15-25) bleeds into conversation
|
|
78
78
|
*
|
|
79
|
-
* @see
|
|
79
|
+
* @see https://github.com/ruvnet/claude-flow/issues/985
|
|
80
80
|
*/
|
|
81
81
|
generateSingleLine(): string;
|
|
82
82
|
/**
|
|
@@ -84,7 +84,7 @@ export declare class StatuslineGenerator {
|
|
|
84
84
|
* The collision zone is columns 15-25 on the SECOND-TO-LAST line
|
|
85
85
|
* We restructure output so that line has minimal/no content in that zone
|
|
86
86
|
*
|
|
87
|
-
* @see
|
|
87
|
+
* @see https://github.com/ruvnet/claude-flow/issues/985
|
|
88
88
|
*/
|
|
89
89
|
generateSafeStatusline(): string;
|
|
90
90
|
/**
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Provides real-time progress, metrics, and status information.
|
|
6
6
|
*
|
|
7
7
|
* Format matches the working .claude/statusline.sh output:
|
|
8
|
-
* ▊ Swarmdo V3 ●
|
|
8
|
+
* ▊ Swarmdo V3 ● ruvnet │ ⎇ v3 │ Opus 4.5
|
|
9
9
|
* ─────────────────────────────────────────────────────
|
|
10
10
|
* 🏗️ DDD Domains [●●●●●] 5/5 ⚡ 1.0x → 2.49x-7.47x
|
|
11
11
|
* 🤖 Swarm ◉ [58/15] 👥 0 🟢 CVE 3/3 💾 22282MB 📂 47% 🧠 10%
|
|
@@ -189,7 +189,7 @@ export class StatuslineGenerator {
|
|
|
189
189
|
* This avoids the multi-line collision bug where Claude Code's internal status
|
|
190
190
|
* (written at absolute terminal coordinates ~cols 15-25) bleeds into conversation
|
|
191
191
|
*
|
|
192
|
-
* @see
|
|
192
|
+
* @see https://github.com/ruvnet/claude-flow/issues/985
|
|
193
193
|
*/
|
|
194
194
|
generateSingleLine() {
|
|
195
195
|
if (!this.config.enabled) {
|
|
@@ -212,7 +212,7 @@ export class StatuslineGenerator {
|
|
|
212
212
|
* The collision zone is columns 15-25 on the SECOND-TO-LAST line
|
|
213
213
|
* We restructure output so that line has minimal/no content in that zone
|
|
214
214
|
*
|
|
215
|
-
* @see
|
|
215
|
+
* @see https://github.com/ruvnet/claude-flow/issues/985
|
|
216
216
|
*/
|
|
217
217
|
generateSafeStatusline() {
|
|
218
218
|
if (!this.config.enabled) {
|
|
@@ -55,10 +55,7 @@ describe('AgenticFlowAgent', () => {
|
|
|
55
55
|
});
|
|
56
56
|
expect(result.success).toBe(true);
|
|
57
57
|
expect(result.taskId).toBe('task-1');
|
|
58
|
-
|
|
59
|
-
// fast runners — the intent is "duration was measured", not "took time"
|
|
60
|
-
expect(result.duration).toBeGreaterThanOrEqual(0);
|
|
61
|
-
expect(typeof result.duration).toBe('number');
|
|
58
|
+
expect(result.duration).toBeGreaterThan(0);
|
|
62
59
|
expect(agent.metrics?.tasksCompleted).toBe(1);
|
|
63
60
|
});
|
|
64
61
|
it('should update status during task execution', async () => {
|
|
@@ -20,7 +20,7 @@ import { PolicyEngine } from './application/policy-engine.js';
|
|
|
20
20
|
import { getTrustLevelLabel } from './domain/entities/trust-level.js';
|
|
21
21
|
// ADR-104: real wire transport via agentic-flow loader pattern.
|
|
22
22
|
// ADR-120: midstream-aware loader wraps the agentic-flow loader so
|
|
23
|
-
// when `midstreamer` (
|
|
23
|
+
// when `midstreamer` (ruvnet/midstream) ships its production QUIC
|
|
24
24
|
// build (Step 1 of ADR-120) and operators opt in with
|
|
25
25
|
// MIDSTREAMER_QUIC_NATIVE=1, the federation transport auto-upgrades.
|
|
26
26
|
// Until then, the wrapper transparently defers to the agentic-flow
|
|
@@ -83,7 +83,7 @@ async function probeMidstreamerTransport(config) {
|
|
|
83
83
|
try {
|
|
84
84
|
// Lazy + indirect so bundlers don't try to resolve at compile time.
|
|
85
85
|
// Prefer the `midstreamer/quic` sub-path (added in midstreamer@0.3.1
|
|
86
|
-
// per upstream
|
|
86
|
+
// per upstream ruvnet/midstream#81) which exposes
|
|
87
87
|
// `loadQuicTransport` directly without WASM init. Fall back to the
|
|
88
88
|
// root `midstreamer` package for older versions that put the QUIC
|
|
89
89
|
// surface on the default export.
|
|
@@ -112,7 +112,7 @@ async function probeMidstreamerTransport(config) {
|
|
|
112
112
|
// QuicMultistream as a counter-tracking stub with no real UDP, TLS,
|
|
113
113
|
// or protocol — using it would silently downgrade the federation
|
|
114
114
|
// path. midstreamer@0.3.1+ ships a real QUIC transport via
|
|
115
|
-
// `midstreamer/quic` (ADR-120, Step 1 — upstream PR
|
|
115
|
+
// `midstreamer/quic` (ADR-120, Step 1 — upstream PR ruvnet/midstream#81)
|
|
116
116
|
// and reports `isNative() === true`. Older versions either expose
|
|
117
117
|
// `isStub()` returning true or omit both probes.
|
|
118
118
|
if (typeof surface.isStub === 'function' && surface.isStub()) {
|