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.
Files changed (174) hide show
  1. package/.claude/helpers/agent-bridge-hook.cjs +174 -0
  2. package/.claude/helpers/hook-handler.cjs +23 -1
  3. package/.claude/settings.json +16 -0
  4. package/.claude/settings.local.json +7 -0
  5. package/README.md +2 -2
  6. package/package.json +1 -1
  7. package/v3/@swarmdo/cli/.claude/settings.json +22 -10
  8. package/v3/@swarmdo/cli/dist/src/init/settings-generator.js +33 -5
  9. package/v3/@swarmdo/cli/package.json +1 -1
  10. package/v3/@swarmdo/cli-core/dist/src/index.js +1 -1
  11. package/v3/@swarmdo/codex/dist/cli.js +0 -0
  12. package/v3/@swarmdo/hooks/dist/cli/guidance-cli.js +0 -0
  13. package/v3/@swarmdo/hooks/dist/statusline/index.d.ts +3 -3
  14. package/v3/@swarmdo/hooks/dist/statusline/index.js +3 -3
  15. package/v3/@swarmdo/integration/dist/__tests__/agentic-flow-agent.test.js +1 -4
  16. package/v3/@swarmdo/neural/dist/flash-attention.d.ts +1 -1
  17. package/v3/@swarmdo/neural/dist/flash-attention.js +1 -1
  18. package/v3/@swarmdo/plugin-agent-federation/dist/plugin.js +1 -1
  19. package/v3/@swarmdo/plugin-agent-federation/dist/transport/midstream-aware-loader.js +2 -2
  20. package/v3/@swarmdo/plugin-iot-cognitum/dist/application/index.d.ts +2 -0
  21. package/v3/@swarmdo/plugin-iot-cognitum/dist/application/index.js +2 -0
  22. package/v3/@swarmdo/plugin-iot-cognitum/dist/application/iot-coordinator.d.ts +138 -0
  23. package/v3/@swarmdo/plugin-iot-cognitum/dist/application/iot-coordinator.js +418 -0
  24. package/v3/@swarmdo/plugin-iot-cognitum/dist/bin.d.ts +15 -0
  25. package/v3/@swarmdo/plugin-iot-cognitum/dist/bin.js +240 -0
  26. package/v3/@swarmdo/plugin-iot-cognitum/dist/cli-commands.d.ts +7 -0
  27. package/v3/@swarmdo/plugin-iot-cognitum/dist/cli-commands.js +508 -0
  28. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-agent.d.ts +54 -0
  29. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-agent.js +2 -0
  30. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-fleet.d.ts +46 -0
  31. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-fleet.js +2 -0
  32. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-trust-level.d.ts +18 -0
  33. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/device-trust-level.js +28 -0
  34. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/index.d.ts +5 -0
  35. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/index.js +2 -0
  36. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/telemetry.d.ts +35 -0
  37. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/entities/telemetry.js +2 -0
  38. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/device-repository.d.ts +11 -0
  39. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/device-repository.js +2 -0
  40. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/fleet-repository.d.ts +9 -0
  41. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/fleet-repository.js +2 -0
  42. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/index.d.ts +5 -0
  43. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/index.js +2 -0
  44. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/telemetry-repository.d.ts +12 -0
  45. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/telemetry-repository.js +2 -0
  46. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/trust-history-repository.d.ts +19 -0
  47. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/repositories/trust-history-repository.js +2 -0
  48. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/anomaly-detection-service.d.ts +44 -0
  49. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/anomaly-detection-service.js +117 -0
  50. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/device-lifecycle-service.d.ts +70 -0
  51. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/device-lifecycle-service.js +194 -0
  52. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/firmware-orchestration-service.d.ts +69 -0
  53. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/firmware-orchestration-service.js +139 -0
  54. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/fleet-topology-service.d.ts +34 -0
  55. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/fleet-topology-service.js +101 -0
  56. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/index.d.ts +10 -0
  57. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/index.js +10 -0
  58. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/mesh-service.d.ts +64 -0
  59. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/mesh-service.js +70 -0
  60. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/sona-integration-service.d.ts +44 -0
  61. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/sona-integration-service.js +79 -0
  62. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-ingestion-service.d.ts +37 -0
  63. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-ingestion-service.js +39 -0
  64. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-service.d.ts +67 -0
  65. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/telemetry-service.js +58 -0
  66. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/witness-verification-service.d.ts +45 -0
  67. package/v3/@swarmdo/plugin-iot-cognitum/dist/domain/services/witness-verification-service.js +63 -0
  68. package/v3/@swarmdo/plugin-iot-cognitum/dist/index.d.ts +26 -0
  69. package/v3/@swarmdo/plugin-iot-cognitum/dist/index.js +17 -0
  70. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/agentdb-telemetry-repository.d.ts +51 -0
  71. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/agentdb-telemetry-repository.js +110 -0
  72. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-device-repository.d.ts +13 -0
  73. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-device-repository.js +25 -0
  74. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-fleet-repository.d.ts +11 -0
  75. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-fleet-repository.js +19 -0
  76. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-trust-history-repository.d.ts +11 -0
  77. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/in-memory-trust-history-repository.js +27 -0
  78. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/index.d.ts +6 -0
  79. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/index.js +6 -0
  80. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/seed-client-factory.d.ts +41 -0
  81. package/v3/@swarmdo/plugin-iot-cognitum/dist/infrastructure/seed-client-factory.js +64 -0
  82. package/v3/@swarmdo/plugin-iot-cognitum/dist/mcp-tools.d.ts +8 -0
  83. package/v3/@swarmdo/plugin-iot-cognitum/dist/mcp-tools.js +703 -0
  84. package/v3/@swarmdo/plugin-iot-cognitum/dist/plugin.d.ts +23 -0
  85. package/v3/@swarmdo/plugin-iot-cognitum/dist/plugin.js +239 -0
  86. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/anomaly-scan-worker.d.ts +17 -0
  87. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/anomaly-scan-worker.js +42 -0
  88. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/firmware-watch-worker.d.ts +18 -0
  89. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/firmware-watch-worker.js +45 -0
  90. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/health-probe-worker.d.ts +19 -0
  91. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/health-probe-worker.js +50 -0
  92. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/mesh-sync-worker.d.ts +19 -0
  93. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/mesh-sync-worker.js +47 -0
  94. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/telemetry-ingest-worker.d.ts +17 -0
  95. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/telemetry-ingest-worker.js +40 -0
  96. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/witness-audit-worker.d.ts +18 -0
  97. package/v3/@swarmdo/plugin-iot-cognitum/dist/workers/witness-audit-worker.js +51 -0
  98. package/v3/@swarmdo/providers/dist/swarmvector-provider.d.ts +1 -1
  99. package/v3/@swarmdo/providers/dist/swarmvector-provider.js +1 -1
  100. package/v3/@swarmdo/security/dist/input-validator.d.ts +6 -6
  101. package/v3/@swarmdo/shared/dist/hooks/safety/git-commit.js +1 -1
  102. package/v3/@swarmdo/shared/dist/mcp/transport/http.js +1 -8
  103. package/v3/@swarmdo/testing/dist/fixtures/agent-fixtures.d.ts +214 -0
  104. package/v3/@swarmdo/testing/dist/fixtures/agent-fixtures.js +595 -0
  105. package/v3/@swarmdo/testing/dist/fixtures/agents.d.ts +76 -0
  106. package/v3/@swarmdo/testing/dist/fixtures/agents.js +158 -0
  107. package/v3/@swarmdo/testing/dist/fixtures/configurations.d.ts +157 -0
  108. package/v3/@swarmdo/testing/dist/fixtures/configurations.js +337 -0
  109. package/v3/@swarmdo/testing/dist/fixtures/index.d.ts +10 -0
  110. package/v3/@swarmdo/testing/dist/fixtures/index.js +17 -0
  111. package/v3/@swarmdo/testing/dist/fixtures/mcp-fixtures.d.ts +329 -0
  112. package/v3/@swarmdo/testing/dist/fixtures/mcp-fixtures.js +714 -0
  113. package/v3/@swarmdo/testing/dist/fixtures/memory-entries.d.ts +159 -0
  114. package/v3/@swarmdo/testing/dist/fixtures/memory-entries.js +262 -0
  115. package/v3/@swarmdo/testing/dist/fixtures/memory-fixtures.d.ts +290 -0
  116. package/v3/@swarmdo/testing/dist/fixtures/memory-fixtures.js +547 -0
  117. package/v3/@swarmdo/testing/dist/fixtures/swarm-fixtures.d.ts +289 -0
  118. package/v3/@swarmdo/testing/dist/fixtures/swarm-fixtures.js +534 -0
  119. package/v3/@swarmdo/testing/dist/fixtures/tasks.d.ts +106 -0
  120. package/v3/@swarmdo/testing/dist/fixtures/tasks.js +229 -0
  121. package/v3/@swarmdo/testing/dist/helpers/assertion-helpers.d.ts +213 -0
  122. package/v3/@swarmdo/testing/dist/helpers/assertion-helpers.js +435 -0
  123. package/v3/@swarmdo/testing/dist/helpers/assertions.d.ts +135 -0
  124. package/v3/@swarmdo/testing/dist/helpers/assertions.js +217 -0
  125. package/v3/@swarmdo/testing/dist/helpers/create-mock.d.ts +96 -0
  126. package/v3/@swarmdo/testing/dist/helpers/create-mock.js +164 -0
  127. package/v3/@swarmdo/testing/dist/helpers/index.d.ts +14 -0
  128. package/v3/@swarmdo/testing/dist/helpers/index.js +22 -0
  129. package/v3/@swarmdo/testing/dist/helpers/mock-factory.d.ts +323 -0
  130. package/v3/@swarmdo/testing/dist/helpers/mock-factory.js +350 -0
  131. package/v3/@swarmdo/testing/dist/helpers/setup-teardown.d.ts +271 -0
  132. package/v3/@swarmdo/testing/dist/helpers/setup-teardown.js +446 -0
  133. package/v3/@swarmdo/testing/dist/helpers/swarm-instance.d.ts +142 -0
  134. package/v3/@swarmdo/testing/dist/helpers/swarm-instance.js +205 -0
  135. package/v3/@swarmdo/testing/dist/helpers/test-application.d.ts +190 -0
  136. package/v3/@swarmdo/testing/dist/helpers/test-application.js +138 -0
  137. package/v3/@swarmdo/testing/dist/helpers/test-utils.d.ts +274 -0
  138. package/v3/@swarmdo/testing/dist/helpers/test-utils.js +456 -0
  139. package/v3/@swarmdo/testing/dist/index.d.ts +42 -0
  140. package/v3/@swarmdo/testing/dist/index.js +66 -0
  141. package/v3/@swarmdo/testing/dist/mocks/index.d.ts +8 -0
  142. package/v3/@swarmdo/testing/dist/mocks/index.js +10 -0
  143. package/v3/@swarmdo/testing/dist/mocks/mock-mcp-client.d.ts +206 -0
  144. package/v3/@swarmdo/testing/dist/mocks/mock-mcp-client.js +575 -0
  145. package/v3/@swarmdo/testing/dist/mocks/mock-services.d.ts +287 -0
  146. package/v3/@swarmdo/testing/dist/mocks/mock-services.js +563 -0
  147. package/v3/@swarmdo/testing/dist/regression/api-contract.d.ts +109 -0
  148. package/v3/@swarmdo/testing/dist/regression/api-contract.js +374 -0
  149. package/v3/@swarmdo/testing/dist/regression/index.d.ts +18 -0
  150. package/v3/@swarmdo/testing/dist/regression/index.js +18 -0
  151. package/v3/@swarmdo/testing/dist/regression/integration-regression.d.ts +67 -0
  152. package/v3/@swarmdo/testing/dist/regression/integration-regression.js +334 -0
  153. package/v3/@swarmdo/testing/dist/regression/performance-baseline.d.ts +106 -0
  154. package/v3/@swarmdo/testing/dist/regression/performance-baseline.js +268 -0
  155. package/v3/@swarmdo/testing/dist/regression/regression-runner.d.ts +124 -0
  156. package/v3/@swarmdo/testing/dist/regression/regression-runner.js +227 -0
  157. package/v3/@swarmdo/testing/dist/regression/security-regression.d.ts +73 -0
  158. package/v3/@swarmdo/testing/dist/regression/security-regression.js +258 -0
  159. package/v3/@swarmdo/testing/dist/setup.d.ts +43 -0
  160. package/v3/@swarmdo/testing/dist/setup.js +91 -0
  161. package/v3/@swarmdo/testing/dist/v2-compat/api-compat.test.d.ts +10 -0
  162. package/v3/@swarmdo/testing/dist/v2-compat/api-compat.test.js +433 -0
  163. package/v3/@swarmdo/testing/dist/v2-compat/cli-compat.test.d.ts +10 -0
  164. package/v3/@swarmdo/testing/dist/v2-compat/cli-compat.test.js +352 -0
  165. package/v3/@swarmdo/testing/dist/v2-compat/compatibility-validator.d.ts +206 -0
  166. package/v3/@swarmdo/testing/dist/v2-compat/compatibility-validator.js +839 -0
  167. package/v3/@swarmdo/testing/dist/v2-compat/hooks-compat.test.d.ts +10 -0
  168. package/v3/@swarmdo/testing/dist/v2-compat/hooks-compat.test.js +428 -0
  169. package/v3/@swarmdo/testing/dist/v2-compat/index.d.ts +38 -0
  170. package/v3/@swarmdo/testing/dist/v2-compat/index.js +41 -0
  171. package/v3/@swarmdo/testing/dist/v2-compat/mcp-compat.test.d.ts +10 -0
  172. package/v3/@swarmdo/testing/dist/v2-compat/mcp-compat.test.js +419 -0
  173. package/v3/@swarmdo/testing/dist/v2-compat/report-generator.d.ts +34 -0
  174. 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
 
@@ -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
  }
@@ -0,0 +1,7 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(gh run *)"
5
+ ]
6
+ }
7
+ }
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![swarmdo](swarmdo/assets/brand/logo-full.svg)](https://swarmdo.com)
4
4
 
5
- [![npm version (swarmdo)](https://img.shields.io/badge/npx%20swarmdo-v1.58.15-cb3837?style=for-the-badge&logo=npm&logoColor=white)](https://github.com/SwarmDo/swarmdo/releases)
5
+ [![npm version (swarmdo)](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
  [![MIT License](https://img.shields.io/badge/License-MIT-yellow?style=for-the-badge)](https://github.com/SwarmDo/swarmdo/blob/main/LICENSE)
7
7
  [![Website](https://img.shields.io/badge/swarmdo.com-e2a33c?style=for-the-badge&logoColor=black)](https://swarmdo.com)
8
8
  [![Star on GitHub](https://img.shields.io/github/stars/SwarmDo/swarmdo?style=for-the-badge&logo=github&color=gold)](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.15",
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" status",
80
- "timeout": 3000,
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
- // NOTE: "SubagentStart" is NOT a Claude Code hook event — a block for it
412
- // shipped in every generated settings.json as dead config until
413
- // `config lint` (v1.4.6) caught it. Spawn-side status pings have no valid
414
- // event; SubagentStop below covers completion.
415
- // SubagentStop — track agent completion for metrics
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.15",
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: the upstream project (see NOTICE)`);
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 ● upstream │ ⎇ v3 │ Opus 4.5
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 the upstream project (see NOTICE)
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 the upstream project (see NOTICE)
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 ● upstream │ ⎇ v3 │ Opus 4.5
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 the upstream project (see NOTICE)
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 the upstream project (see NOTICE)
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
- // ≥0, not >0: a mocked task can complete inside one Date.now() tick on
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 () => {
@@ -12,7 +12,7 @@
12
12
  *
13
13
  * Target: 2-5x speedup on CPU vs naive attention
14
14
  *
15
- * Created with love by swarmdo.com
15
+ * Created with love by ruv.io
16
16
  */
17
17
  export interface FlashAttentionConfig {
18
18
  /** Block size for tiling (32-64 optimal for CPU L1 cache) */
@@ -12,7 +12,7 @@
12
12
  *
13
13
  * Target: 2-5x speedup on CPU vs naive attention
14
14
  *
15
- * Created with love by swarmdo.com
15
+ * Created with love by ruv.io
16
16
  */
17
17
  // ============================================================================
18
18
  // Flash Attention Implementation
@@ -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` (upstream/midstream) ships its production QUIC
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 upstream/midstream#81) which exposes
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 upstream/midstream#81)
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()) {
@@ -0,0 +1,2 @@
1
+ export { IoTCoordinator, type IoTCoordinatorConfig, type IoTCoordinatorCallbacks, } from './iot-coordinator.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,2 @@
1
+ export { IoTCoordinator, } from './iot-coordinator.js';
2
+ //# sourceMappingURL=index.js.map