@honeybee-ai/incubator 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. package/README.md +586 -0
  2. package/dashboard/dist/assets/index-DFb8p7xI.js +9 -0
  3. package/dashboard/dist/assets/index-RKiEoHEo.css +1 -0
  4. package/dashboard/dist/index.html +13 -0
  5. package/dist/agent/acp/claim-manager.d.ts +24 -0
  6. package/dist/agent/acp/claim-manager.js +64 -0
  7. package/dist/agent/acp/claim-manager.js.map +1 -0
  8. package/dist/agent/acp/direct-runtime.d.ts +90 -0
  9. package/dist/agent/acp/direct-runtime.js +364 -0
  10. package/dist/agent/acp/direct-runtime.js.map +1 -0
  11. package/dist/agent/acp/event-client.d.ts +20 -0
  12. package/dist/agent/acp/event-client.js +60 -0
  13. package/dist/agent/acp/event-client.js.map +1 -0
  14. package/dist/agent/acp/event-matcher.d.ts +13 -0
  15. package/dist/agent/acp/event-matcher.js +31 -0
  16. package/dist/agent/acp/event-matcher.js.map +1 -0
  17. package/dist/agent/acp/progress.d.ts +23 -0
  18. package/dist/agent/acp/progress.js +54 -0
  19. package/dist/agent/acp/progress.js.map +1 -0
  20. package/dist/agent/acp/runtime.d.ts +156 -0
  21. package/dist/agent/acp/runtime.js +337 -0
  22. package/dist/agent/acp/runtime.js.map +1 -0
  23. package/dist/agent/acp/ws-event-client.d.ts +64 -0
  24. package/dist/agent/acp/ws-event-client.js +263 -0
  25. package/dist/agent/acp/ws-event-client.js.map +1 -0
  26. package/dist/agent/agent.d.ts +60 -0
  27. package/dist/agent/agent.js +121 -0
  28. package/dist/agent/agent.js.map +1 -0
  29. package/dist/agent/cli.d.ts +2 -0
  30. package/dist/agent/cli.js +311 -0
  31. package/dist/agent/cli.js.map +1 -0
  32. package/dist/agent/mcp-client.d.ts +37 -0
  33. package/dist/agent/mcp-client.js +92 -0
  34. package/dist/agent/mcp-client.js.map +1 -0
  35. package/dist/agent/mock-runner.d.ts +14 -0
  36. package/dist/agent/mock-runner.js +159 -0
  37. package/dist/agent/mock-runner.js.map +1 -0
  38. package/dist/agent/native-client.d.ts +18 -0
  39. package/dist/agent/native-client.js +42 -0
  40. package/dist/agent/native-client.js.map +1 -0
  41. package/dist/agent/prompt.d.ts +45 -0
  42. package/dist/agent/prompt.js +115 -0
  43. package/dist/agent/prompt.js.map +1 -0
  44. package/dist/agent/providers.d.ts +25 -0
  45. package/dist/agent/providers.js +696 -0
  46. package/dist/agent/providers.js.map +1 -0
  47. package/dist/agent/runner.d.ts +15 -0
  48. package/dist/agent/runner.js +625 -0
  49. package/dist/agent/runner.js.map +1 -0
  50. package/dist/agent/tool-client.d.ts +12 -0
  51. package/dist/agent/tool-client.js +2 -0
  52. package/dist/agent/tool-client.js.map +1 -0
  53. package/dist/agent/types.d.ts +116 -0
  54. package/dist/agent/types.js +2 -0
  55. package/dist/agent/types.js.map +1 -0
  56. package/dist/agent-pool.d.ts +44 -0
  57. package/dist/agent-pool.js +228 -0
  58. package/dist/agent-pool.js.map +1 -0
  59. package/dist/bin.d.ts +2 -0
  60. package/dist/bin.js +7 -0
  61. package/dist/bin.js.map +1 -0
  62. package/dist/bus.d.ts +24 -0
  63. package/dist/bus.js +79 -0
  64. package/dist/bus.js.map +1 -0
  65. package/dist/dances.d.ts +73 -0
  66. package/dist/dances.js +122 -0
  67. package/dist/dances.js.map +1 -0
  68. package/dist/guard.d.ts +52 -0
  69. package/dist/guard.js +210 -0
  70. package/dist/guard.js.map +1 -0
  71. package/dist/heartbeat.d.ts +41 -0
  72. package/dist/heartbeat.js +104 -0
  73. package/dist/heartbeat.js.map +1 -0
  74. package/dist/honeycomb.d.ts +63 -0
  75. package/dist/honeycomb.js +222 -0
  76. package/dist/honeycomb.js.map +1 -0
  77. package/dist/index.d.ts +2 -0
  78. package/dist/index.js +601 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/integrations/config.d.ts +15 -0
  81. package/dist/integrations/config.js +62 -0
  82. package/dist/integrations/config.js.map +1 -0
  83. package/dist/integrations/index.d.ts +4 -0
  84. package/dist/integrations/index.js +4 -0
  85. package/dist/integrations/index.js.map +1 -0
  86. package/dist/integrations/loader.d.ts +8 -0
  87. package/dist/integrations/loader.js +27 -0
  88. package/dist/integrations/loader.js.map +1 -0
  89. package/dist/integrations/manager.d.ts +29 -0
  90. package/dist/integrations/manager.js +108 -0
  91. package/dist/integrations/manager.js.map +1 -0
  92. package/dist/log.d.ts +25 -0
  93. package/dist/log.js +67 -0
  94. package/dist/log.js.map +1 -0
  95. package/dist/namespaces.d.ts +28 -0
  96. package/dist/namespaces.js +100 -0
  97. package/dist/namespaces.js.map +1 -0
  98. package/dist/orchestrator.d.ts +119 -0
  99. package/dist/orchestrator.js +463 -0
  100. package/dist/orchestrator.js.map +1 -0
  101. package/dist/persistence.d.ts +7 -0
  102. package/dist/persistence.js +62 -0
  103. package/dist/persistence.js.map +1 -0
  104. package/dist/plugins/index.d.ts +2 -0
  105. package/dist/plugins/index.js +3 -0
  106. package/dist/plugins/index.js.map +1 -0
  107. package/dist/plugins/loader.d.ts +12 -0
  108. package/dist/plugins/loader.js +122 -0
  109. package/dist/plugins/loader.js.map +1 -0
  110. package/dist/plugins/manager.d.ts +76 -0
  111. package/dist/plugins/manager.js +238 -0
  112. package/dist/plugins/manager.js.map +1 -0
  113. package/dist/propolis/guard.d.ts +23 -0
  114. package/dist/propolis/guard.js +49 -0
  115. package/dist/propolis/guard.js.map +1 -0
  116. package/dist/propolis/tools/types.d.ts +9 -0
  117. package/dist/propolis/tools/types.js +9 -0
  118. package/dist/propolis/tools/types.js.map +1 -0
  119. package/dist/rest.d.ts +4 -0
  120. package/dist/rest.js +962 -0
  121. package/dist/rest.js.map +1 -0
  122. package/dist/run-watcher.d.ts +20 -0
  123. package/dist/run-watcher.js +74 -0
  124. package/dist/run-watcher.js.map +1 -0
  125. package/dist/server.d.ts +17 -0
  126. package/dist/server.js +412 -0
  127. package/dist/server.js.map +1 -0
  128. package/dist/stores/backend.d.ts +15 -0
  129. package/dist/stores/backend.js +28 -0
  130. package/dist/stores/backend.js.map +1 -0
  131. package/dist/stores/claims.d.ts +14 -0
  132. package/dist/stores/claims.js +77 -0
  133. package/dist/stores/claims.js.map +1 -0
  134. package/dist/stores/conflicts.d.ts +10 -0
  135. package/dist/stores/conflicts.js +39 -0
  136. package/dist/stores/conflicts.js.map +1 -0
  137. package/dist/stores/control.d.ts +37 -0
  138. package/dist/stores/control.js +105 -0
  139. package/dist/stores/control.js.map +1 -0
  140. package/dist/stores/discoveries.d.ts +11 -0
  141. package/dist/stores/discoveries.js +45 -0
  142. package/dist/stores/discoveries.js.map +1 -0
  143. package/dist/stores/events.d.ts +14 -0
  144. package/dist/stores/events.js +42 -0
  145. package/dist/stores/events.js.map +1 -0
  146. package/dist/stores/help.d.ts +11 -0
  147. package/dist/stores/help.js +46 -0
  148. package/dist/stores/help.js.map +1 -0
  149. package/dist/stores/interfaces.d.ts +125 -0
  150. package/dist/stores/interfaces.js +2 -0
  151. package/dist/stores/interfaces.js.map +1 -0
  152. package/dist/stores/messages.d.ts +8 -0
  153. package/dist/stores/messages.js +29 -0
  154. package/dist/stores/messages.js.map +1 -0
  155. package/dist/stores/progress.d.ts +8 -0
  156. package/dist/stores/progress.js +21 -0
  157. package/dist/stores/progress.js.map +1 -0
  158. package/dist/stores/proposals.d.ts +11 -0
  159. package/dist/stores/proposals.js +46 -0
  160. package/dist/stores/proposals.js.map +1 -0
  161. package/dist/stores/redis/claims.d.ts +16 -0
  162. package/dist/stores/redis/claims.js +126 -0
  163. package/dist/stores/redis/claims.js.map +1 -0
  164. package/dist/stores/redis/db.d.ts +39 -0
  165. package/dist/stores/redis/db.js +34 -0
  166. package/dist/stores/redis/db.js.map +1 -0
  167. package/dist/stores/redis/discoveries.d.ts +13 -0
  168. package/dist/stores/redis/discoveries.js +54 -0
  169. package/dist/stores/redis/discoveries.js.map +1 -0
  170. package/dist/stores/redis/events.d.ts +17 -0
  171. package/dist/stores/redis/events.js +57 -0
  172. package/dist/stores/redis/events.js.map +1 -0
  173. package/dist/stores/redis/index.d.ts +3 -0
  174. package/dist/stores/redis/index.js +31 -0
  175. package/dist/stores/redis/index.js.map +1 -0
  176. package/dist/stores/redis/state.d.ts +14 -0
  177. package/dist/stores/redis/state.js +83 -0
  178. package/dist/stores/redis/state.js.map +1 -0
  179. package/dist/stores/reinforcements.d.ts +11 -0
  180. package/dist/stores/reinforcements.js +42 -0
  181. package/dist/stores/reinforcements.js.map +1 -0
  182. package/dist/stores/roles.d.ts +9 -0
  183. package/dist/stores/roles.js +22 -0
  184. package/dist/stores/roles.js.map +1 -0
  185. package/dist/stores/runs.d.ts +15 -0
  186. package/dist/stores/runs.js +50 -0
  187. package/dist/stores/runs.js.map +1 -0
  188. package/dist/stores/sqlite/claims.d.ts +17 -0
  189. package/dist/stores/sqlite/claims.js +121 -0
  190. package/dist/stores/sqlite/claims.js.map +1 -0
  191. package/dist/stores/sqlite/db.d.ts +16 -0
  192. package/dist/stores/sqlite/db.js +77 -0
  193. package/dist/stores/sqlite/db.js.map +1 -0
  194. package/dist/stores/sqlite/discoveries.d.ts +14 -0
  195. package/dist/stores/sqlite/discoveries.js +66 -0
  196. package/dist/stores/sqlite/discoveries.js.map +1 -0
  197. package/dist/stores/sqlite/events.d.ts +16 -0
  198. package/dist/stores/sqlite/events.js +75 -0
  199. package/dist/stores/sqlite/events.js.map +1 -0
  200. package/dist/stores/sqlite/index.d.ts +2 -0
  201. package/dist/stores/sqlite/index.js +33 -0
  202. package/dist/stores/sqlite/index.js.map +1 -0
  203. package/dist/stores/sqlite/state.d.ts +15 -0
  204. package/dist/stores/sqlite/state.js +99 -0
  205. package/dist/stores/sqlite/state.js.map +1 -0
  206. package/dist/stores/state.d.ts +11 -0
  207. package/dist/stores/state.js +67 -0
  208. package/dist/stores/state.js.map +1 -0
  209. package/dist/transports/broker.d.ts +20 -0
  210. package/dist/transports/broker.js +102 -0
  211. package/dist/transports/broker.js.map +1 -0
  212. package/dist/transports/index.d.ts +3 -0
  213. package/dist/transports/index.js +3 -0
  214. package/dist/transports/index.js.map +1 -0
  215. package/dist/transports/ipc.d.ts +26 -0
  216. package/dist/transports/ipc.js +93 -0
  217. package/dist/transports/ipc.js.map +1 -0
  218. package/dist/transports/types.d.ts +39 -0
  219. package/dist/transports/types.js +8 -0
  220. package/dist/transports/types.js.map +1 -0
  221. package/dist/types.d.ts +45 -0
  222. package/dist/types.js +2 -0
  223. package/dist/types.js.map +1 -0
  224. package/dist/utils.d.ts +3 -0
  225. package/dist/utils.js +36 -0
  226. package/dist/utils.js.map +1 -0
  227. package/dist/waggle/client.d.ts +16 -0
  228. package/dist/waggle/client.js +28 -0
  229. package/dist/waggle/client.js.map +1 -0
  230. package/dist/waggle/compound.d.ts +22 -0
  231. package/dist/waggle/compound.js +194 -0
  232. package/dist/waggle/compound.js.map +1 -0
  233. package/dist/waggle/index.d.ts +25 -0
  234. package/dist/waggle/index.js +77 -0
  235. package/dist/waggle/index.js.map +1 -0
  236. package/dist/waggle/types.d.ts +54 -0
  237. package/dist/waggle/types.js +2 -0
  238. package/dist/waggle/types.js.map +1 -0
  239. package/dist/webhooks.d.ts +26 -0
  240. package/dist/webhooks.js +79 -0
  241. package/dist/webhooks.js.map +1 -0
  242. package/dist/ws.d.ts +33 -0
  243. package/dist/ws.js +195 -0
  244. package/dist/ws.js.map +1 -0
  245. package/package.json +122 -0
@@ -0,0 +1,463 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { randomBytes } from 'node:crypto';
3
+ import { dirname, join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { AgentPool } from './agent-pool.js';
6
+ const __dirname = dirname(fileURLToPath(import.meta.url));
7
+ /** Path to the bundled Claude Code ACP plugin (shipped with incubator). */
8
+ const PLUGIN_DIR = join(__dirname, '..', 'plugin');
9
+ /**
10
+ * Spawns and manages agent child processes within a single hive.
11
+ *
12
+ * Worker agents: run in-process via AgentPool (no child process).
13
+ * Drone agents: propolis process + drone processes (MCP tools over HTTP).
14
+ * Claude agents: Claude Code instances as child processes.
15
+ */
16
+ export class BroodOrchestrator {
17
+ config;
18
+ incubatorPort;
19
+ bus;
20
+ runs;
21
+ verbose;
22
+ stores;
23
+ registry;
24
+ danceModule;
25
+ telemetry;
26
+ pluginManager;
27
+ children = new Map();
28
+ childInfo = [];
29
+ propolisPid;
30
+ pool;
31
+ constructor(config, incubatorPort, bus, runs, verbose = false, stores, registry, danceModule, telemetry, pluginManager) {
32
+ this.config = config;
33
+ this.incubatorPort = incubatorPort;
34
+ this.bus = bus;
35
+ this.runs = runs;
36
+ this.verbose = verbose;
37
+ this.stores = stores;
38
+ this.registry = registry;
39
+ this.danceModule = danceModule;
40
+ this.telemetry = telemetry;
41
+ this.pluginManager = pluginManager;
42
+ }
43
+ log(msg) {
44
+ if (this.verbose) {
45
+ console.error(`[orchestrator] ${msg}`);
46
+ }
47
+ }
48
+ /** Resolve hive entry point (supports old droneEntry/propolisEntry for backwards compat) */
49
+ get hiveEntry() {
50
+ return this.config.hiveEntry ?? this.config.droneEntry ?? '';
51
+ }
52
+ /** Resolve propolis entry (from hive package or legacy propolisEntry) */
53
+ get propolisEntry() {
54
+ if (this.config.propolisEntry)
55
+ return this.config.propolisEntry;
56
+ // Hive package: propolis entry is at the propolis subpath
57
+ // The CLI resolves this, but we can derive it from hiveEntry
58
+ return this.config.hiveEntry ?? '';
59
+ }
60
+ async start() {
61
+ this.telemetry?.record('protocol_start', {
62
+ agentCount: this.config.agents.reduce((n, a) => n + (a.count ?? 1), 0),
63
+ provider: this.config.provider,
64
+ });
65
+ const hasDrones = this.config.agents.some(a => a.type === 'drone');
66
+ // 1. Spawn propolis only if there are drone agents
67
+ if (hasDrones) {
68
+ await this.spawnPropolis();
69
+ await sleep(1500);
70
+ }
71
+ // 2. Spawn agents with stagger
72
+ await this.spawnAgents();
73
+ }
74
+ async spawnPropolis() {
75
+ const entry = this.propolisEntry;
76
+ const { propolisPort, worktree, env } = this.config;
77
+ const args = ['--http', `--port=${propolisPort}`, `--work-dir=${worktree}`, '--no-guard'];
78
+ const childEnv = {
79
+ ...process.env,
80
+ ...env,
81
+ };
82
+ const child = spawn(process.execPath, [entry, ...args], {
83
+ env: childEnv,
84
+ cwd: worktree,
85
+ stdio: ['ignore', 'pipe', 'pipe'],
86
+ });
87
+ child.stderr?.on('data', (data) => {
88
+ const line = data.toString().trim();
89
+ if (line)
90
+ this.log(`[propolis] ${line}`);
91
+ });
92
+ child.on('exit', (code) => {
93
+ this.children.delete('propolis');
94
+ if (code !== null && code !== 0) {
95
+ this.log(`Propolis exited with code ${code}`);
96
+ }
97
+ });
98
+ if (child.pid) {
99
+ this.children.set('propolis', child);
100
+ this.propolisPid = child.pid;
101
+ this.log(`Propolis started on port ${propolisPort} (pid ${child.pid})`);
102
+ }
103
+ }
104
+ /** Check if in-process mode is available (stores injected). */
105
+ get canRunInProcess() {
106
+ return !!(this.stores && this.bus && this.registry);
107
+ }
108
+ async spawnAgents() {
109
+ const { propolisPort, worktree } = this.config;
110
+ const config = this.config;
111
+ let agentIndex = 0;
112
+ // Build pool context if we can run workers in-process
113
+ let poolCtx;
114
+ if (this.canRunInProcess) {
115
+ this.pool = new AgentPool();
116
+ poolCtx = {
117
+ stores: this.stores,
118
+ bus: this.bus,
119
+ registry: this.registry,
120
+ namespace: 'default',
121
+ workDir: worktree,
122
+ guard: null,
123
+ verbose: this.verbose,
124
+ danceModule: this.danceModule,
125
+ provider: config.provider,
126
+ models: config.models,
127
+ telemetry: this.telemetry,
128
+ pluginManager: this.pluginManager,
129
+ };
130
+ }
131
+ for (const agent of config.agents) {
132
+ const count = agent.count ?? 1;
133
+ const agentType = agent.type ?? 'worker';
134
+ for (let i = 0; i < count; i++) {
135
+ const staggerMs = config.stagger * 1000;
136
+ if (agentIndex > 0 && staggerMs > 0) {
137
+ await sleep(staggerMs);
138
+ }
139
+ agentIndex++;
140
+ if (agentType === 'mock') {
141
+ if (this.pool && poolCtx) {
142
+ const agentId = await this.pool.startMockAgent(agent, agent.mock ?? { actions: [] }, poolCtx);
143
+ this.childInfo.push({ agentId, role: agent.role, type: 'worker', inProcess: true });
144
+ this.telemetry?.record('agent_spawn', {
145
+ agentId, role: agent.role, type: 'mock', inProcess: true,
146
+ });
147
+ this.log(`Mock ${agentId} (${agent.role}) started in-process`);
148
+ }
149
+ else {
150
+ this.log(`Mock agent ${agent.role} skipped — no in-process pool available`);
151
+ }
152
+ continue;
153
+ }
154
+ if (agentType === 'claude') {
155
+ const suffix = randomBytes(3).toString('hex');
156
+ const agentId = `${agent.role}_${suffix}`;
157
+ // Try Agent SDK first (programmatic), fall back to subprocess
158
+ const usedSdk = await this.startClaudeAgent(agent, agentId, config);
159
+ if (!usedSdk) {
160
+ this.spawnClaude(agent, agentId, config);
161
+ }
162
+ continue;
163
+ }
164
+ // Workers run in-process when pool is available
165
+ if (agentType === 'worker' && this.pool && poolCtx) {
166
+ const agentId = await this.pool.startAgent(agent, poolCtx);
167
+ this.childInfo.push({ agentId, role: agent.role, type: 'worker', inProcess: true });
168
+ const providerShorthand = (agent.modelHint && config.models?.[agent.modelHint])
169
+ ?? config.models?.[agent.role]
170
+ ?? config.provider
171
+ ?? 'ollama/qwen3:8b';
172
+ this.telemetry?.record('agent_spawn', {
173
+ agentId, role: agent.role, provider: providerShorthand, type: 'worker', inProcess: true,
174
+ });
175
+ this.log(`Worker ${agentId} (${agent.role}) started in-process → ${providerShorthand}`);
176
+ continue;
177
+ }
178
+ // Spawn as child process (drone, or worker when pool unavailable)
179
+ const suffix = randomBytes(3).toString('hex');
180
+ const agentId = `${agent.role}_${suffix}`;
181
+ // Provider resolution chain: modelHint → models[role] → provider → default
182
+ const providerShorthand = (agent.modelHint && config.models?.[agent.modelHint])
183
+ ?? config.models?.[agent.role]
184
+ ?? config.provider
185
+ ?? 'ollama/qwen3:8b';
186
+ const serverProto = config.tls ? 'https' : 'http';
187
+ const agentArgs = [
188
+ `--server=${serverProto}://localhost:${this.incubatorPort}`,
189
+ `--namespace=default`,
190
+ `--agent-id=${agentId}`,
191
+ `--role=${agent.role}`,
192
+ `--provider=${providerShorthand}`,
193
+ '--verbose',
194
+ ];
195
+ if (agentType === 'worker') {
196
+ agentArgs.push(`--mode=worker`);
197
+ agentArgs.push(`--work-dir=${worktree}`);
198
+ }
199
+ else {
200
+ agentArgs.push(`--mode=drone`);
201
+ agentArgs.push(`--propolis=http://localhost:${propolisPort}`);
202
+ }
203
+ if (config.protocolPath) {
204
+ agentArgs.push(`--protocol=${config.protocolPath}`);
205
+ }
206
+ if (config.noAcp) {
207
+ agentArgs.push('--no-acp');
208
+ }
209
+ if (agent.tools && agent.tools !== 'all') {
210
+ agentArgs.push(`--tools=${agent.tools.join(',')}`);
211
+ }
212
+ if (agent.coordination) {
213
+ const val = Array.isArray(agent.coordination)
214
+ ? agent.coordination.join(',')
215
+ : agent.coordination;
216
+ agentArgs.push(`--coordination=${val}`);
217
+ }
218
+ if (agent.startOn) {
219
+ agentArgs.push(`--start-on=${JSON.stringify(agent.startOn)}`);
220
+ }
221
+ if (agent.wakeOn) {
222
+ agentArgs.push(`--wake-on=${JSON.stringify(agent.wakeOn)}`);
223
+ }
224
+ const childEnv = {
225
+ ...process.env,
226
+ ...config.env,
227
+ ...(config.tls ? { NODE_TLS_REJECT_UNAUTHORIZED: '0' } : {}),
228
+ };
229
+ // Pass custom prompt via env var (avoids shell escaping for multi-line prompts)
230
+ if (agent.prompt) {
231
+ childEnv['AGENT_PROMPT'] = agent.prompt;
232
+ }
233
+ const child = spawn(process.execPath, [this.hiveEntry, ...agentArgs], {
234
+ env: childEnv,
235
+ cwd: worktree,
236
+ stdio: ['ignore', 'pipe', 'pipe'],
237
+ });
238
+ child.stderr?.on('data', (data) => {
239
+ const line = data.toString().trim();
240
+ if (line)
241
+ this.log(`[${agentId}] ${line}`);
242
+ });
243
+ child.on('exit', (code, signal) => {
244
+ this.children.delete(`${agentType}:${agentId}`);
245
+ const status = code === 0 ? 'completed' : `exited with code ${code}`;
246
+ this.log(`[${agentId}] ${status}`);
247
+ this.telemetry?.record('agent_exit', {
248
+ agentId, role: agent.role, type: agentType, exitCode: code, signal,
249
+ });
250
+ });
251
+ if (child.pid) {
252
+ this.children.set(`${agentType}:${agentId}`, child);
253
+ this.childInfo.push({ pid: child.pid, agentId, role: agent.role, type: agentType });
254
+ this.telemetry?.record('agent_spawn', {
255
+ agentId, role: agent.role, provider: providerShorthand, type: agentType, pid: child.pid,
256
+ });
257
+ this.log(`${agentType === 'worker' ? 'Worker' : 'Drone'} ${agentId} (${agent.role}) started → ${providerShorthand} (pid ${child.pid})`);
258
+ }
259
+ }
260
+ }
261
+ }
262
+ /**
263
+ * Start a Claude agent using the Agent SDK (programmatic, no subprocess).
264
+ * Returns true if SDK was available and agent was started, false to fall back.
265
+ */
266
+ async startClaudeAgent(agent, agentId, config) {
267
+ let queryFn;
268
+ try {
269
+ const sdk = await import('@anthropic-ai/claude-agent-sdk');
270
+ queryFn = sdk.query;
271
+ }
272
+ catch {
273
+ // Agent SDK not installed — fall back to subprocess
274
+ return false;
275
+ }
276
+ const prompt = agent.prompt
277
+ ?? `You are assigned the role "${agent.role}" in an ACP coordination protocol. Use the acp MCP tool to coordinate with other agents. Follow the protocol instructions injected at session start.`;
278
+ const pluginDir = agent.pluginDir ?? PLUGIN_DIR;
279
+ // Model hint resolution
280
+ const modelHint = (agent.modelHint && config.models?.[agent.modelHint])
281
+ ?? config.models?.[agent.role]
282
+ ?? agent.modelHint
283
+ ?? undefined;
284
+ const agentPromise = (async () => {
285
+ try {
286
+ for await (const message of queryFn({
287
+ prompt,
288
+ options: {
289
+ allowedTools: ['Read', 'Write', 'Edit', 'Bash', 'Glob', 'Grep'],
290
+ permissionMode: 'bypassPermissions',
291
+ maxTurns: 100,
292
+ cwd: config.worktree,
293
+ model: modelHint ?? undefined,
294
+ env: {
295
+ INCUBATOR_URL: `${config.tls ? 'https' : 'http'}://localhost:${this.incubatorPort}`,
296
+ ACP_NAMESPACE: 'default',
297
+ ACP_AGENT_ID: agentId,
298
+ ACP_ROLE: agent.role,
299
+ ...(agent.wakeOn?.types ? { ACP_WAKE_ON: agent.wakeOn.types.join(',') } : {}),
300
+ ...config.env,
301
+ },
302
+ mcpServers: {
303
+ acp: { command: 'node', args: [join(pluginDir, 'mcp-server.js')] },
304
+ },
305
+ },
306
+ })) {
307
+ // Structured message handling
308
+ if (message.type === 'assistant' && message.message?.content) {
309
+ for (const block of message.message.content) {
310
+ if ('text' in block) {
311
+ this.log(`[${agentId}] ${block.text.slice(0, 200)}`);
312
+ }
313
+ }
314
+ }
315
+ }
316
+ }
317
+ catch (err) {
318
+ this.log(`[${agentId}] Agent SDK error: ${err instanceof Error ? err.message : 'Unknown error'}`);
319
+ }
320
+ this.telemetry?.record('agent_exit', {
321
+ agentId, role: agent.role, type: 'claude', exitCode: 0, signal: null,
322
+ });
323
+ })();
324
+ this.childInfo.push({ agentId, role: agent.role, type: 'claude', inProcess: true });
325
+ this.telemetry?.record('agent_spawn', {
326
+ agentId, role: agent.role, type: 'claude', inProcess: true, sdk: true,
327
+ });
328
+ this.log(`Claude ${agentId} (${agent.role}) started via Agent SDK`);
329
+ return true;
330
+ }
331
+ /**
332
+ * Spawn a Claude Code instance with ACP coordination env vars.
333
+ * Claude Code's native tools handle the env side; the ACP plugin handles coordination.
334
+ */
335
+ spawnClaude(agent, agentId, config) {
336
+ const { worktree } = config;
337
+ // Model hint for Claude: maps to --model flag
338
+ const modelHint = (agent.modelHint && config.models?.[agent.modelHint])
339
+ ?? config.models?.[agent.role]
340
+ ?? agent.modelHint
341
+ ?? undefined;
342
+ // Build prompt from role (custom prompt overrides default)
343
+ const prompt = agent.prompt
344
+ ?? `You are assigned the role "${agent.role}" in an ACP coordination protocol. Use the acp MCP tool to coordinate with other agents. Follow the protocol instructions injected at session start.`;
345
+ // Resolve plugin directory: explicit config > bundled default
346
+ const pluginDir = agent.pluginDir ?? PLUGIN_DIR;
347
+ const claudeArgs = ['--print', '--dangerously-skip-permissions', '-p', prompt, '--plugin-dir', pluginDir];
348
+ if (modelHint) {
349
+ claudeArgs.push('--model', modelHint);
350
+ }
351
+ // ACP coordination env vars — the claude-acp plugin reads these
352
+ const childEnv = {
353
+ ...process.env,
354
+ ...config.env,
355
+ INCUBATOR_URL: `${config.tls ? 'https' : 'http'}://localhost:${this.incubatorPort}`,
356
+ ...(config.tls ? { NODE_TLS_REJECT_UNAUTHORIZED: '0' } : {}),
357
+ ACP_NAMESPACE: 'default',
358
+ ACP_AGENT_ID: agentId,
359
+ ACP_ROLE: agent.role,
360
+ };
361
+ if (agent.wakeOn?.types) {
362
+ childEnv['ACP_WAKE_ON'] = agent.wakeOn.types.join(',');
363
+ }
364
+ const child = spawn('claude', claudeArgs, {
365
+ env: childEnv,
366
+ cwd: worktree,
367
+ stdio: ['ignore', 'pipe', 'pipe'],
368
+ });
369
+ child.stdout?.on('data', (data) => {
370
+ const line = data.toString().trim();
371
+ if (line)
372
+ this.log(`[${agentId}:out] ${line}`);
373
+ });
374
+ child.stderr?.on('data', (data) => {
375
+ const line = data.toString().trim();
376
+ if (line)
377
+ this.log(`[${agentId}:err] ${line}`);
378
+ });
379
+ child.on('exit', (code, signal) => {
380
+ this.children.delete(`claude:${agentId}`);
381
+ const status = code === 0 ? 'completed' : `exited with code ${code}`;
382
+ this.log(`[${agentId}] ${status}`);
383
+ this.telemetry?.record('agent_exit', {
384
+ agentId, role: agent.role, type: 'claude', exitCode: code, signal,
385
+ });
386
+ });
387
+ if (child.pid) {
388
+ this.children.set(`claude:${agentId}`, child);
389
+ this.childInfo.push({ pid: child.pid, agentId, role: agent.role, type: 'claude' });
390
+ this.telemetry?.record('agent_spawn', {
391
+ agentId, role: agent.role, type: 'claude', pid: child.pid,
392
+ });
393
+ this.log(`Claude ${agentId} (${agent.role}) started (pid ${child.pid})`);
394
+ }
395
+ }
396
+ /** Get info about all agents (in-process + child processes). */
397
+ getAgents() {
398
+ return [...this.childInfo];
399
+ }
400
+ /** Kill a specific agent. Pool agents: runner.stop(). Child processes: SIGTERM. */
401
+ async killAgent(agentId) {
402
+ // Check pool first
403
+ if (this.pool) {
404
+ const poolAgents = this.pool.getAgents();
405
+ if (poolAgents.some(a => a.agentId === agentId)) {
406
+ await this.pool.killAgent(agentId);
407
+ this.log(`Stopped pool agent ${agentId}`);
408
+ return;
409
+ }
410
+ }
411
+ // Fall back to child process
412
+ const child = this.children.get(`worker:${agentId}`) ?? this.children.get(`drone:${agentId}`) ?? this.children.get(`claude:${agentId}`);
413
+ if (!child)
414
+ return;
415
+ child.kill('SIGTERM');
416
+ this.telemetry?.record('agent_kill', { agentId, signal: 'SIGTERM' });
417
+ this.log(`Sent SIGTERM to ${agentId}`);
418
+ // Grace period — SIGKILL if still alive after 5s
419
+ setTimeout(() => {
420
+ if (!child.killed) {
421
+ child.kill('SIGKILL');
422
+ this.log(`Sent SIGKILL to ${agentId} (did not exit gracefully)`);
423
+ }
424
+ }, 5000);
425
+ }
426
+ /** Graceful shutdown: stop pool agents → SIGTERM child processes → propolis. */
427
+ async shutdown() {
428
+ this.telemetry?.record('protocol_end', {
429
+ agentCount: this.childInfo.length,
430
+ status: 'shutdown',
431
+ });
432
+ this.log('Shutting down agents...');
433
+ // Stop pool agents first
434
+ if (this.pool) {
435
+ await this.pool.shutdown();
436
+ this.log('Stopped all pool agents');
437
+ }
438
+ // Kill child process agents (drones, claude, legacy workers)
439
+ for (const [key, child] of this.children) {
440
+ if (key.startsWith('drone:') || key.startsWith('worker:') || key.startsWith('claude:')) {
441
+ child.kill('SIGTERM');
442
+ this.log(`Stopped ${key}`);
443
+ }
444
+ }
445
+ // Small delay for agents to clean up, then kill propolis
446
+ await sleep(500);
447
+ const propolisChild = this.children.get('propolis');
448
+ if (propolisChild) {
449
+ propolisChild.kill('SIGTERM');
450
+ this.log('Stopped propolis');
451
+ }
452
+ this.children.clear();
453
+ this.childInfo = [];
454
+ // Clean up plugin resources (PTY sessions, temp files, etc.)
455
+ if (this.pluginManager) {
456
+ await this.pluginManager.destroyAll();
457
+ }
458
+ }
459
+ }
460
+ function sleep(ms) {
461
+ return new Promise(resolve => setTimeout(resolve, ms));
462
+ }
463
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Snapshot } from './types.js';
2
+ import type { Stores } from './stores/interfaces.js';
3
+ import type { NamespaceRegistry } from './namespaces.js';
4
+ export declare function saveSnapshot(path: string, stores: Stores): Promise<void>;
5
+ export declare function loadSnapshot(path: string, stores: Stores, sanitize?: (snapshot: Snapshot) => void): Promise<boolean>;
6
+ export declare function saveAllSnapshots(basePath: string, registry: NamespaceRegistry): Promise<void>;
7
+ export declare function loadAllSnapshots(basePath: string, registry: NamespaceRegistry, sanitize?: (snapshot: Snapshot) => void): Promise<number>;
@@ -0,0 +1,62 @@
1
+ import { readFileSync, writeFileSync, mkdirSync, readdirSync } from 'node:fs';
2
+ import { dirname, basename, join } from 'node:path';
3
+ export async function saveSnapshot(path, stores) {
4
+ const snapshot = {
5
+ state: await stores.state.getAll(),
6
+ claims: await stores.claims.getAll(),
7
+ events: await stores.events.getAll(),
8
+ discoveries: await stores.discoveries.getAll(),
9
+ eventCursor: await stores.events.getCursor(),
10
+ savedAt: new Date().toISOString(),
11
+ };
12
+ mkdirSync(dirname(path), { recursive: true });
13
+ writeFileSync(path, JSON.stringify(snapshot, null, 2), { mode: 0o600 });
14
+ }
15
+ export async function loadSnapshot(path, stores, sanitize) {
16
+ try {
17
+ const raw = readFileSync(path, 'utf-8');
18
+ const snapshot = JSON.parse(raw);
19
+ if (sanitize)
20
+ sanitize(snapshot);
21
+ // Load events first since other stores may reference the event store
22
+ await stores.events.load(snapshot.events, snapshot.eventCursor);
23
+ await stores.state.load(snapshot.state);
24
+ await stores.claims.load(snapshot.claims);
25
+ await stores.discoveries.load(snapshot.discoveries);
26
+ return true;
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ }
32
+ export async function saveAllSnapshots(basePath, registry) {
33
+ for (const ns of registry.list()) {
34
+ const filePath = `${basePath}.${ns}.json`;
35
+ await saveSnapshot(filePath, registry.get(ns));
36
+ }
37
+ }
38
+ export async function loadAllSnapshots(basePath, registry, sanitize) {
39
+ const dir = dirname(basePath);
40
+ const prefix = basename(basePath) + '.';
41
+ const suffix = '.json';
42
+ let count = 0;
43
+ try {
44
+ const files = readdirSync(dir);
45
+ for (const file of files) {
46
+ if (!file.startsWith(prefix) || !file.endsWith(suffix))
47
+ continue;
48
+ const ns = file.slice(prefix.length, -suffix.length);
49
+ if (!ns)
50
+ continue;
51
+ const stores = registry.get(ns);
52
+ const loaded = await loadSnapshot(join(dir, file), stores, sanitize);
53
+ if (loaded)
54
+ count++;
55
+ }
56
+ }
57
+ catch {
58
+ // directory doesn't exist yet — no snapshots to load
59
+ }
60
+ return count;
61
+ }
62
+ //# sourceMappingURL=persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../src/persistence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { PluginManager, type BroodPluginEntry, type PluginManagerOptions } from './manager.js';
2
+ export { loadPlugin } from './loader.js';
@@ -0,0 +1,3 @@
1
+ export { PluginManager } from './manager.js';
2
+ export { loadPlugin } from './loader.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAoD,MAAM,cAAc,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Unified plugin/integration loader.
3
+ *
4
+ * Handles both new IncubatorPlugin and legacy IntegrationModule patterns.
5
+ * Detection order: createPlugin factory > default export factory > direct module.
6
+ */
7
+ import type { IncubatorPlugin } from '@honeybee-ai/hivemind-sdk/integrations';
8
+ /**
9
+ * Load a package and return an IncubatorPlugin.
10
+ * If the package exports a legacy IntegrationModule, wraps it automatically.
11
+ */
12
+ export declare function loadPlugin(packageName: string, config?: Record<string, string>): Promise<IncubatorPlugin>;