agent-bober 0.17.0 → 0.18.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 (364) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +25 -0
  4. package/README.md +169 -6
  5. package/dist/chat/answerer.d.ts +17 -0
  6. package/dist/chat/answerer.d.ts.map +1 -0
  7. package/dist/chat/answerer.js +52 -0
  8. package/dist/chat/answerer.js.map +1 -0
  9. package/dist/chat/approval-cursor.d.ts +25 -0
  10. package/dist/chat/approval-cursor.d.ts.map +1 -0
  11. package/dist/chat/approval-cursor.js +61 -0
  12. package/dist/chat/approval-cursor.js.map +1 -0
  13. package/dist/chat/approval-reader.d.ts +11 -0
  14. package/dist/chat/approval-reader.d.ts.map +1 -0
  15. package/dist/chat/approval-reader.js +20 -0
  16. package/dist/chat/approval-reader.js.map +1 -0
  17. package/dist/chat/careful-sidecar.d.ts +15 -0
  18. package/dist/chat/careful-sidecar.d.ts.map +1 -0
  19. package/dist/chat/careful-sidecar.js +39 -0
  20. package/dist/chat/careful-sidecar.js.map +1 -0
  21. package/dist/chat/chat-session.d.ts +129 -0
  22. package/dist/chat/chat-session.d.ts.map +1 -0
  23. package/dist/chat/chat-session.js +470 -0
  24. package/dist/chat/chat-session.js.map +1 -0
  25. package/dist/chat/completion-tailer.d.ts +27 -0
  26. package/dist/chat/completion-tailer.d.ts.map +1 -0
  27. package/dist/chat/completion-tailer.js +187 -0
  28. package/dist/chat/completion-tailer.js.map +1 -0
  29. package/dist/chat/conversation-store.d.ts +22 -0
  30. package/dist/chat/conversation-store.d.ts.map +1 -0
  31. package/dist/chat/conversation-store.js +66 -0
  32. package/dist/chat/conversation-store.js.map +1 -0
  33. package/dist/chat/cursor-store.d.ts +23 -0
  34. package/dist/chat/cursor-store.d.ts.map +1 -0
  35. package/dist/chat/cursor-store.js +42 -0
  36. package/dist/chat/cursor-store.js.map +1 -0
  37. package/dist/chat/pid-sidecar.d.ts +22 -0
  38. package/dist/chat/pid-sidecar.d.ts.map +1 -0
  39. package/dist/chat/pid-sidecar.js +42 -0
  40. package/dist/chat/pid-sidecar.js.map +1 -0
  41. package/dist/chat/roster-reader.d.ts +16 -0
  42. package/dist/chat/roster-reader.d.ts.map +1 -0
  43. package/dist/chat/roster-reader.js +39 -0
  44. package/dist/chat/roster-reader.js.map +1 -0
  45. package/dist/chat/run-spawner.d.ts +71 -0
  46. package/dist/chat/run-spawner.d.ts.map +1 -0
  47. package/dist/chat/run-spawner.js +121 -0
  48. package/dist/chat/run-spawner.js.map +1 -0
  49. package/dist/chat/slash-commands.d.ts +36 -0
  50. package/dist/chat/slash-commands.d.ts.map +1 -0
  51. package/dist/chat/slash-commands.js +133 -0
  52. package/dist/chat/slash-commands.js.map +1 -0
  53. package/dist/chat/steer-cleanup.d.ts +12 -0
  54. package/dist/chat/steer-cleanup.d.ts.map +1 -0
  55. package/dist/chat/steer-cleanup.js +60 -0
  56. package/dist/chat/steer-cleanup.js.map +1 -0
  57. package/dist/chat/turn-classifier.d.ts +43 -0
  58. package/dist/chat/turn-classifier.d.ts.map +1 -0
  59. package/dist/chat/turn-classifier.js +150 -0
  60. package/dist/chat/turn-classifier.js.map +1 -0
  61. package/dist/cli/commands/blackboard.d.ts +33 -0
  62. package/dist/cli/commands/blackboard.d.ts.map +1 -0
  63. package/dist/cli/commands/blackboard.js +114 -0
  64. package/dist/cli/commands/blackboard.js.map +1 -0
  65. package/dist/cli/commands/chat.d.ts +13 -0
  66. package/dist/cli/commands/chat.d.ts.map +1 -0
  67. package/dist/cli/commands/chat.js +43 -0
  68. package/dist/cli/commands/chat.js.map +1 -0
  69. package/dist/cli/commands/evolve.d.ts +18 -0
  70. package/dist/cli/commands/evolve.d.ts.map +1 -0
  71. package/dist/cli/commands/evolve.js +72 -0
  72. package/dist/cli/commands/evolve.js.map +1 -0
  73. package/dist/cli/commands/facts.d.ts +15 -0
  74. package/dist/cli/commands/facts.d.ts.map +1 -0
  75. package/dist/cli/commands/facts.js +213 -0
  76. package/dist/cli/commands/facts.js.map +1 -0
  77. package/dist/cli/commands/init.d.ts +9 -0
  78. package/dist/cli/commands/init.d.ts.map +1 -1
  79. package/dist/cli/commands/init.js +1 -1
  80. package/dist/cli/commands/init.js.map +1 -1
  81. package/dist/cli/commands/medical.d.ts +24 -0
  82. package/dist/cli/commands/medical.d.ts.map +1 -0
  83. package/dist/cli/commands/medical.js +132 -0
  84. package/dist/cli/commands/medical.js.map +1 -0
  85. package/dist/cli/commands/memory.d.ts +2 -1
  86. package/dist/cli/commands/memory.d.ts.map +1 -1
  87. package/dist/cli/commands/memory.js +94 -7
  88. package/dist/cli/commands/memory.js.map +1 -1
  89. package/dist/cli/commands/plan.d.ts.map +1 -1
  90. package/dist/cli/commands/plan.js +29 -3
  91. package/dist/cli/commands/plan.js.map +1 -1
  92. package/dist/cli/commands/replay.d.ts +17 -0
  93. package/dist/cli/commands/replay.d.ts.map +1 -0
  94. package/dist/cli/commands/replay.js +261 -0
  95. package/dist/cli/commands/replay.js.map +1 -0
  96. package/dist/cli/commands/run.d.ts +9 -0
  97. package/dist/cli/commands/run.d.ts.map +1 -1
  98. package/dist/cli/commands/run.js +27 -1
  99. package/dist/cli/commands/run.js.map +1 -1
  100. package/dist/cli/commands/sprint.d.ts.map +1 -1
  101. package/dist/cli/commands/sprint.js +17 -3
  102. package/dist/cli/commands/sprint.js.map +1 -1
  103. package/dist/cli/commands/update.d.ts +18 -0
  104. package/dist/cli/commands/update.d.ts.map +1 -0
  105. package/dist/cli/commands/update.js +81 -0
  106. package/dist/cli/commands/update.js.map +1 -0
  107. package/dist/cli/index.js +15 -0
  108. package/dist/cli/index.js.map +1 -1
  109. package/dist/config/defaults.d.ts.map +1 -1
  110. package/dist/config/defaults.js +8 -0
  111. package/dist/config/defaults.js.map +1 -1
  112. package/dist/config/role-providers.d.ts +1 -1
  113. package/dist/config/role-providers.d.ts.map +1 -1
  114. package/dist/config/role-providers.js +6 -1
  115. package/dist/config/role-providers.js.map +1 -1
  116. package/dist/config/schema.d.ts +467 -222
  117. package/dist/config/schema.d.ts.map +1 -1
  118. package/dist/config/schema.js +25 -0
  119. package/dist/config/schema.js.map +1 -1
  120. package/dist/contracts/eval-result.d.ts +84 -84
  121. package/dist/contracts/spec.d.ts +28 -28
  122. package/dist/contracts/sprint-contract.d.ts +4 -4
  123. package/dist/fleet/critic-deep.d.ts +53 -0
  124. package/dist/fleet/critic-deep.d.ts.map +1 -0
  125. package/dist/fleet/critic-deep.js +199 -0
  126. package/dist/fleet/critic-deep.js.map +1 -0
  127. package/dist/fleet/decomposer-deep-constants.d.ts +4 -0
  128. package/dist/fleet/decomposer-deep-constants.d.ts.map +1 -0
  129. package/dist/fleet/decomposer-deep-constants.js +14 -0
  130. package/dist/fleet/decomposer-deep-constants.js.map +1 -0
  131. package/dist/fleet/decomposer-deep-types.d.ts +8 -0
  132. package/dist/fleet/decomposer-deep-types.d.ts.map +1 -0
  133. package/dist/fleet/decomposer-deep-types.js +9 -0
  134. package/dist/fleet/decomposer-deep-types.js.map +1 -0
  135. package/dist/fleet/decomposer-deep.d.ts +51 -0
  136. package/dist/fleet/decomposer-deep.d.ts.map +1 -0
  137. package/dist/fleet/decomposer-deep.js +261 -0
  138. package/dist/fleet/decomposer-deep.js.map +1 -0
  139. package/dist/fleet/decomposer.d.ts +22 -0
  140. package/dist/fleet/decomposer.d.ts.map +1 -0
  141. package/dist/fleet/decomposer.js +144 -0
  142. package/dist/fleet/decomposer.js.map +1 -0
  143. package/dist/fleet/index.d.ts +93 -0
  144. package/dist/fleet/index.d.ts.map +1 -1
  145. package/dist/fleet/index.js +230 -2
  146. package/dist/fleet/index.js.map +1 -1
  147. package/dist/fleet/manifest-write.d.ts +30 -0
  148. package/dist/fleet/manifest-write.d.ts.map +1 -0
  149. package/dist/fleet/manifest-write.js +90 -0
  150. package/dist/fleet/manifest-write.js.map +1 -0
  151. package/dist/fleet/manifest.d.ts +6 -6
  152. package/dist/fleet/shared-blackboard.d.ts +51 -0
  153. package/dist/fleet/shared-blackboard.d.ts.map +1 -0
  154. package/dist/fleet/shared-blackboard.js +79 -0
  155. package/dist/fleet/shared-blackboard.js.map +1 -0
  156. package/dist/fleet/synthesis.d.ts +16 -0
  157. package/dist/fleet/synthesis.d.ts.map +1 -0
  158. package/dist/fleet/synthesis.js +22 -0
  159. package/dist/fleet/synthesis.js.map +1 -0
  160. package/dist/fleet/tier-policy.d.ts +18 -0
  161. package/dist/fleet/tier-policy.d.ts.map +1 -0
  162. package/dist/fleet/tier-policy.js +53 -0
  163. package/dist/fleet/tier-policy.js.map +1 -0
  164. package/dist/fleet/tool-role-guard.d.ts +24 -0
  165. package/dist/fleet/tool-role-guard.d.ts.map +1 -0
  166. package/dist/fleet/tool-role-guard.js +55 -0
  167. package/dist/fleet/tool-role-guard.js.map +1 -0
  168. package/dist/incident/resolution-verify.d.ts +4 -4
  169. package/dist/incident/types.d.ts +8 -8
  170. package/dist/mcp/run-manager.d.ts +9 -1
  171. package/dist/mcp/run-manager.d.ts.map +1 -1
  172. package/dist/mcp/run-manager.js.map +1 -1
  173. package/dist/medical/adapters/apple-health.d.ts +32 -0
  174. package/dist/medical/adapters/apple-health.d.ts.map +1 -0
  175. package/dist/medical/adapters/apple-health.js +100 -0
  176. package/dist/medical/adapters/apple-health.js.map +1 -0
  177. package/dist/medical/audit.d.ts +31 -0
  178. package/dist/medical/audit.d.ts.map +1 -0
  179. package/dist/medical/audit.js +56 -0
  180. package/dist/medical/audit.js.map +1 -0
  181. package/dist/medical/consent.d.ts +37 -0
  182. package/dist/medical/consent.d.ts.map +1 -0
  183. package/dist/medical/consent.js +73 -0
  184. package/dist/medical/consent.js.map +1 -0
  185. package/dist/medical/disclaimer.d.ts +11 -0
  186. package/dist/medical/disclaimer.d.ts.map +1 -0
  187. package/dist/medical/disclaimer.js +21 -0
  188. package/dist/medical/disclaimer.js.map +1 -0
  189. package/dist/medical/egress.d.ts +30 -0
  190. package/dist/medical/egress.d.ts.map +1 -0
  191. package/dist/medical/egress.js +50 -0
  192. package/dist/medical/egress.js.map +1 -0
  193. package/dist/medical/engine.d.ts +73 -0
  194. package/dist/medical/engine.d.ts.map +1 -0
  195. package/dist/medical/engine.js +333 -0
  196. package/dist/medical/engine.js.map +1 -0
  197. package/dist/medical/guardrails.d.ts +47 -0
  198. package/dist/medical/guardrails.d.ts.map +1 -0
  199. package/dist/medical/guardrails.js +92 -0
  200. package/dist/medical/guardrails.js.map +1 -0
  201. package/dist/medical/health-store.d.ts +80 -0
  202. package/dist/medical/health-store.d.ts.map +1 -0
  203. package/dist/medical/health-store.js +204 -0
  204. package/dist/medical/health-store.js.map +1 -0
  205. package/dist/medical/inference.d.ts +22 -0
  206. package/dist/medical/inference.d.ts.map +1 -0
  207. package/dist/medical/inference.js +39 -0
  208. package/dist/medical/inference.js.map +1 -0
  209. package/dist/medical/ingestion.d.ts +33 -0
  210. package/dist/medical/ingestion.d.ts.map +1 -0
  211. package/dist/medical/ingestion.js +52 -0
  212. package/dist/medical/ingestion.js.map +1 -0
  213. package/dist/medical/numerics.d.ts +66 -0
  214. package/dist/medical/numerics.d.ts.map +1 -0
  215. package/dist/medical/numerics.js +216 -0
  216. package/dist/medical/numerics.js.map +1 -0
  217. package/dist/medical/red-flag.d.ts +42 -0
  218. package/dist/medical/red-flag.d.ts.map +1 -0
  219. package/dist/medical/red-flag.js +161 -0
  220. package/dist/medical/red-flag.js.map +1 -0
  221. package/dist/medical/refusal.d.ts +46 -0
  222. package/dist/medical/refusal.d.ts.map +1 -0
  223. package/dist/medical/refusal.js +131 -0
  224. package/dist/medical/refusal.js.map +1 -0
  225. package/dist/medical/retrieval/grounding-critic.d.ts +34 -0
  226. package/dist/medical/retrieval/grounding-critic.d.ts.map +1 -0
  227. package/dist/medical/retrieval/grounding-critic.js +153 -0
  228. package/dist/medical/retrieval/grounding-critic.js.map +1 -0
  229. package/dist/medical/retrieval/literature.d.ts +78 -0
  230. package/dist/medical/retrieval/literature.d.ts.map +1 -0
  231. package/dist/medical/retrieval/literature.js +292 -0
  232. package/dist/medical/retrieval/literature.js.map +1 -0
  233. package/dist/medical/retrieval/medline-source.d.ts +72 -0
  234. package/dist/medical/retrieval/medline-source.d.ts.map +1 -0
  235. package/dist/medical/retrieval/medline-source.js +120 -0
  236. package/dist/medical/retrieval/medline-source.js.map +1 -0
  237. package/dist/medical/team.d.ts +15 -0
  238. package/dist/medical/team.d.ts.map +1 -0
  239. package/dist/medical/team.js +44 -0
  240. package/dist/medical/team.js.map +1 -0
  241. package/dist/medical/types.d.ts +175 -0
  242. package/dist/medical/types.d.ts.map +1 -0
  243. package/dist/medical/types.js +8 -0
  244. package/dist/medical/types.js.map +1 -0
  245. package/dist/medical/whoop/whoop-client.d.ts +114 -0
  246. package/dist/medical/whoop/whoop-client.d.ts.map +1 -0
  247. package/dist/medical/whoop/whoop-client.js +226 -0
  248. package/dist/medical/whoop/whoop-client.js.map +1 -0
  249. package/dist/medical/whoop/whoop-sync.d.ts +25 -0
  250. package/dist/medical/whoop/whoop-sync.d.ts.map +1 -0
  251. package/dist/medical/whoop/whoop-sync.js +97 -0
  252. package/dist/medical/whoop/whoop-sync.js.map +1 -0
  253. package/dist/medical/whoop/whoop-token.d.ts +44 -0
  254. package/dist/medical/whoop/whoop-token.d.ts.map +1 -0
  255. package/dist/medical/whoop/whoop-token.js +66 -0
  256. package/dist/medical/whoop/whoop-token.js.map +1 -0
  257. package/dist/orchestrator/context-handoff.d.ts +60 -60
  258. package/dist/orchestrator/contract-materialization.d.ts +33 -0
  259. package/dist/orchestrator/contract-materialization.d.ts.map +1 -0
  260. package/dist/orchestrator/contract-materialization.js +113 -0
  261. package/dist/orchestrator/contract-materialization.js.map +1 -0
  262. package/dist/orchestrator/memory/distill.d.ts +4 -1
  263. package/dist/orchestrator/memory/distill.d.ts.map +1 -1
  264. package/dist/orchestrator/memory/distill.js +41 -1
  265. package/dist/orchestrator/memory/distill.js.map +1 -1
  266. package/dist/orchestrator/memory/fact-detector.d.ts +61 -0
  267. package/dist/orchestrator/memory/fact-detector.d.ts.map +1 -0
  268. package/dist/orchestrator/memory/fact-detector.js +153 -0
  269. package/dist/orchestrator/memory/fact-detector.js.map +1 -0
  270. package/dist/orchestrator/memory/fact-judge.d.ts +19 -0
  271. package/dist/orchestrator/memory/fact-judge.d.ts.map +1 -0
  272. package/dist/orchestrator/memory/fact-judge.js +121 -0
  273. package/dist/orchestrator/memory/fact-judge.js.map +1 -0
  274. package/dist/orchestrator/memory/fact-retrieve.d.ts +52 -0
  275. package/dist/orchestrator/memory/fact-retrieve.d.ts.map +1 -0
  276. package/dist/orchestrator/memory/fact-retrieve.js +117 -0
  277. package/dist/orchestrator/memory/fact-retrieve.js.map +1 -0
  278. package/dist/orchestrator/memory/hygiene.d.ts +66 -0
  279. package/dist/orchestrator/memory/hygiene.d.ts.map +1 -0
  280. package/dist/orchestrator/memory/hygiene.js +153 -0
  281. package/dist/orchestrator/memory/hygiene.js.map +1 -0
  282. package/dist/orchestrator/memory/reconcile.d.ts +47 -0
  283. package/dist/orchestrator/memory/reconcile.d.ts.map +1 -0
  284. package/dist/orchestrator/memory/reconcile.js +116 -0
  285. package/dist/orchestrator/memory/reconcile.js.map +1 -0
  286. package/dist/orchestrator/memory/retrieve.d.ts +5 -3
  287. package/dist/orchestrator/memory/retrieve.d.ts.map +1 -1
  288. package/dist/orchestrator/memory/retrieve.js +9 -6
  289. package/dist/orchestrator/memory/retrieve.js.map +1 -1
  290. package/dist/orchestrator/pipeline.d.ts +19 -3
  291. package/dist/orchestrator/pipeline.d.ts.map +1 -1
  292. package/dist/orchestrator/pipeline.js +63 -52
  293. package/dist/orchestrator/pipeline.js.map +1 -1
  294. package/dist/orchestrator/planner-agent.d.ts.map +1 -1
  295. package/dist/orchestrator/planner-agent.js +16 -1
  296. package/dist/orchestrator/planner-agent.js.map +1 -1
  297. package/dist/orchestrator/selfimprove/eval-guards.d.ts +51 -0
  298. package/dist/orchestrator/selfimprove/eval-guards.d.ts.map +1 -0
  299. package/dist/orchestrator/selfimprove/eval-guards.js +120 -0
  300. package/dist/orchestrator/selfimprove/eval-guards.js.map +1 -0
  301. package/dist/orchestrator/selfimprove/gepa.d.ts +74 -0
  302. package/dist/orchestrator/selfimprove/gepa.d.ts.map +1 -0
  303. package/dist/orchestrator/selfimprove/gepa.js +227 -0
  304. package/dist/orchestrator/selfimprove/gepa.js.map +1 -0
  305. package/dist/orchestrator/selfimprove/replay-harness.d.ts +65 -0
  306. package/dist/orchestrator/selfimprove/replay-harness.d.ts.map +1 -0
  307. package/dist/orchestrator/selfimprove/replay-harness.js +134 -0
  308. package/dist/orchestrator/selfimprove/replay-harness.js.map +1 -0
  309. package/dist/orchestrator/selfimprove/replay-store.d.ts +45 -0
  310. package/dist/orchestrator/selfimprove/replay-store.d.ts.map +1 -0
  311. package/dist/orchestrator/selfimprove/replay-store.js +119 -0
  312. package/dist/orchestrator/selfimprove/replay-store.js.map +1 -0
  313. package/dist/orchestrator/selfimprove/replay-types.d.ts +32 -0
  314. package/dist/orchestrator/selfimprove/replay-types.d.ts.map +1 -0
  315. package/dist/orchestrator/selfimprove/replay-types.js +15 -0
  316. package/dist/orchestrator/selfimprove/replay-types.js.map +1 -0
  317. package/dist/orchestrator/workflow/engine.d.ts +3 -1
  318. package/dist/orchestrator/workflow/engine.d.ts.map +1 -1
  319. package/dist/orchestrator/workflow/selector.d.ts +18 -0
  320. package/dist/orchestrator/workflow/selector.d.ts.map +1 -1
  321. package/dist/orchestrator/workflow/selector.js +41 -0
  322. package/dist/orchestrator/workflow/selector.js.map +1 -1
  323. package/dist/orchestrator/workflow/ts-engine.d.ts +3 -1
  324. package/dist/orchestrator/workflow/ts-engine.d.ts.map +1 -1
  325. package/dist/orchestrator/workflow/ts-engine.js +2 -2
  326. package/dist/orchestrator/workflow/ts-engine.js.map +1 -1
  327. package/dist/orchestrator/workflow/workflow-engine.d.ts +3 -1
  328. package/dist/orchestrator/workflow/workflow-engine.d.ts.map +1 -1
  329. package/dist/orchestrator/workflow/workflow-engine.js +3 -3
  330. package/dist/orchestrator/workflow/workflow-engine.js.map +1 -1
  331. package/dist/state/facts.d.ts +110 -0
  332. package/dist/state/facts.d.ts.map +1 -0
  333. package/dist/state/facts.js +208 -0
  334. package/dist/state/facts.js.map +1 -0
  335. package/dist/state/guidance.d.ts +37 -0
  336. package/dist/state/guidance.d.ts.map +1 -0
  337. package/dist/state/guidance.js +144 -0
  338. package/dist/state/guidance.js.map +1 -0
  339. package/dist/state/history.d.ts +2 -2
  340. package/dist/state/index.d.ts +1 -1
  341. package/dist/state/index.d.ts.map +1 -1
  342. package/dist/state/index.js +1 -1
  343. package/dist/state/index.js.map +1 -1
  344. package/dist/state/memory.d.ts +43 -11
  345. package/dist/state/memory.d.ts.map +1 -1
  346. package/dist/state/memory.js +93 -15
  347. package/dist/state/memory.js.map +1 -1
  348. package/dist/state/pause.d.ts +47 -0
  349. package/dist/state/pause.d.ts.map +1 -0
  350. package/dist/state/pause.js +146 -0
  351. package/dist/state/pause.js.map +1 -0
  352. package/dist/state/sprint-state.d.ts +8 -0
  353. package/dist/state/sprint-state.d.ts.map +1 -1
  354. package/dist/state/sprint-state.js +32 -1
  355. package/dist/state/sprint-state.js.map +1 -1
  356. package/dist/teams/registry.d.ts +16 -0
  357. package/dist/teams/registry.d.ts.map +1 -0
  358. package/dist/teams/registry.js +53 -0
  359. package/dist/teams/registry.js.map +1 -0
  360. package/dist/teams/types.d.ts +25 -0
  361. package/dist/teams/types.d.ts.map +1 -0
  362. package/dist/teams/types.js +2 -0
  363. package/dist/teams/types.js.map +1 -0
  364. package/package.json +3 -1
@@ -7,13 +7,17 @@
7
7
  // registerFleetCommand: wires `agent-bober fleet <manifest>` into the
8
8
  // commander program (mirrors registerWorktreeCommand pattern).
9
9
  import chalk from "chalk";
10
+ import { join } from "node:path";
10
11
  import { load } from "./manifest.js";
11
12
  import { buildChildConfig } from "./child-config.js";
12
13
  import { FleetCoordinator } from "./coordinator.js";
13
14
  import { OutcomeAggregator } from "./aggregator.js";
14
15
  import { PortfolioReporter } from "./reporter.js";
15
- import { validateApiKey } from "../providers/factory.js";
16
+ import { validateApiKey, createClient } from "../providers/factory.js";
16
17
  import { logger } from "../utils/logger.js";
18
+ import { decomposeGoal } from "./decomposer.js";
19
+ import { decomposeGoalDeep } from "./decomposer-deep.js";
20
+ import { writeManifestWithProvenance } from "./manifest-write.js";
17
21
  // ── Credential fail-fast ──────────────────────────────────────────────
18
22
  /**
19
23
  * Validate DeepSeek credentials for every child BEFORE spawning anything.
@@ -73,6 +77,228 @@ export async function runFleet(manifestPath, options, deps) {
73
77
  await reporter.write(effectiveManifest.rootDir, report);
74
78
  return report;
75
79
  }
80
+ /**
81
+ * Core logic for `fleet expand <goal>`:
82
+ *
83
+ * 1. Build the DeepSeek LLMClient (credential fail-fast BEFORE any IO).
84
+ * 2. Call decomposeGoal to get a children-only FleetManifest.
85
+ * 3. Assemble { rootDir, concurrency, children }.
86
+ * 4. Atomically write the manifest to outPath (overwrite with notice).
87
+ * 5. Print the manifest + a review hint.
88
+ * 6. If --yes, chain into runFleet(outPath) and print Fleet Summary.
89
+ * Otherwise stop (exit 0).
90
+ *
91
+ * @param goal - The high-level goal to decompose into children.
92
+ * @param opts - Parsed Commander options.
93
+ * @param deps - Optional DI seams for testing (decompose, runFleet, createClient).
94
+ */
95
+ export async function runFleetExpand(goal, opts, deps) {
96
+ // ── Step 1: build the decomposer LLM client (credential fail-fast) ──
97
+ // This MUST run before any filesystem write. createClient/validateApiKey
98
+ // throws synchronously when DEEPSEEK_API_KEY is missing for api.deepseek.com.
99
+ const model = opts.model ?? "deepseek-v4-pro";
100
+ const clientBuilder = deps?.createClient ?? createClient;
101
+ const client = clientBuilder(opts.provider ?? "openai-compat", "https://api.deepseek.com", undefined, model, "FleetDecomposer");
102
+ // ── Step 2: decompose the goal ────────────────────────────────────
103
+ // Fold --count hint into the goal as a soft target for the decomposer.
104
+ const goalWithHint = opts.count !== undefined
105
+ ? `${goal}\n\n(Decompose into approximately ${opts.count} independent sub-projects.)`
106
+ : goal;
107
+ const decomposeFn = deps?.decompose ?? decomposeGoal;
108
+ const decomposed = await decomposeFn({ goal: goalWithHint, client, model, maxRetries: 1 });
109
+ // ── Step 3: assemble the manifest ────────────────────────────────
110
+ const root = opts.root ?? ".";
111
+ const concurrency = opts.concurrency ? Number(opts.concurrency) : 3;
112
+ const manifest = {
113
+ rootDir: root,
114
+ concurrency,
115
+ children: decomposed.children,
116
+ };
117
+ // ── Step 4: atomic write with provenance + recoverable overwrite ──
118
+ const outPath = opts.out ?? join(root, ".bober", "fleet-expand.json");
119
+ await writeManifestWithProvenance({
120
+ outPath,
121
+ manifest,
122
+ provenance: {
123
+ command: "fleet expand",
124
+ goal,
125
+ critique: false,
126
+ childCount: manifest.children.length,
127
+ },
128
+ });
129
+ // ── Step 5: print the manifest + review hint ──────────────────────
130
+ console.log();
131
+ console.log(chalk.bold("═══ Fleet Expand Manifest ═══"));
132
+ console.log();
133
+ console.log(JSON.stringify(manifest, null, 2));
134
+ console.log();
135
+ console.log(`Manifest written to: ${outPath}`);
136
+ console.log(`Review then run: agent-bober fleet "${outPath}"`);
137
+ console.log();
138
+ // ── Step 6: --yes gate ────────────────────────────────────────────
139
+ // runFleet is ONLY reachable when opts.yes is true. Default exits 0.
140
+ if (opts.yes) {
141
+ const runFleetFn = deps?.runFleet ?? runFleet;
142
+ const report = await runFleetFn(outPath);
143
+ console.log();
144
+ console.log(chalk.bold("═══ Fleet Summary ═══"));
145
+ console.log();
146
+ console.log(` Total: ${chalk.cyan(String(report.total))} children`);
147
+ console.log(` Completed: ${chalk.green(String(report.completed))}`);
148
+ if (report.failed > 0) {
149
+ console.log(` Failed: ${chalk.red(String(report.failed))}`);
150
+ }
151
+ if (report.other > 0) {
152
+ console.log(` Other: ${chalk.yellow(String(report.other))}`);
153
+ }
154
+ console.log();
155
+ }
156
+ else {
157
+ process.exitCode = 0;
158
+ }
159
+ }
160
+ /**
161
+ * Core logic for `fleet expand-deep <goal>`:
162
+ *
163
+ * 1. Build the DeepSeek LLMClient (credential fail-fast BEFORE any IO).
164
+ * 2. Call decomposeGoalDeep to get a children-only FleetManifest (two-stage plan→expand).
165
+ * 3. Assemble { rootDir, concurrency, children }.
166
+ * 4. Atomically write the manifest to outPath (overwrite with notice).
167
+ * 5. Print the manifest + a review hint.
168
+ * 6. If --yes, chain into runFleet(outPath) and print Fleet Summary.
169
+ * Otherwise stop (exit 0).
170
+ *
171
+ * @param goal - The high-level goal to decompose into children.
172
+ * @param opts - Parsed Commander options.
173
+ * @param deps - Optional DI seams for testing (decomposeDeep, runFleet, createClient).
174
+ */
175
+ export async function runFleetExpandDeep(goal, opts, deps) {
176
+ // ── Step 1: build the decomposer LLM client (credential fail-fast) ──
177
+ // This MUST run before any filesystem write. createClient/validateApiKey
178
+ // throws synchronously when DEEPSEEK_API_KEY is missing for api.deepseek.com.
179
+ const model = opts.model ?? "deepseek-v4-pro";
180
+ const clientBuilder = deps?.createClient ?? createClient;
181
+ const client = clientBuilder(opts.provider ?? "openai-compat", "https://api.deepseek.com", undefined, model, "FleetDecomposer");
182
+ // ── Step 2: decompose the goal ────────────────────────────────────
183
+ // Fold --count hint into the goal as a soft target for the decomposer.
184
+ const goalWithHint = opts.count !== undefined
185
+ ? `${goal}\n\n(Decompose into approximately ${opts.count} independent sub-projects.)`
186
+ : goal;
187
+ const decomposeDeepFn = deps?.decomposeDeep ?? decomposeGoalDeep;
188
+ const decomposed = await decomposeDeepFn({
189
+ goal: goalWithHint,
190
+ client,
191
+ model,
192
+ ...(opts.critique ? { critique: true } : {}),
193
+ });
194
+ // ── Step 3: assemble the manifest ────────────────────────────────
195
+ const root = opts.root ?? ".";
196
+ const concurrency = opts.concurrency ? Number(opts.concurrency) : 3;
197
+ const manifest = {
198
+ rootDir: root,
199
+ concurrency,
200
+ children: decomposed.children,
201
+ };
202
+ // ── Step 4: atomic write with provenance + recoverable overwrite ──
203
+ const outPath = opts.out ?? join(root, ".bober", "fleet-expand.json");
204
+ await writeManifestWithProvenance({
205
+ outPath,
206
+ manifest,
207
+ provenance: {
208
+ command: "fleet expand-deep",
209
+ goal,
210
+ critique: opts.critique === true,
211
+ childCount: manifest.children.length,
212
+ },
213
+ });
214
+ // ── Step 5: print the manifest + review hint ──────────────────────
215
+ console.log();
216
+ console.log(chalk.bold("═══ Fleet Expand-Deep Manifest ═══"));
217
+ console.log();
218
+ console.log(JSON.stringify(manifest, null, 2));
219
+ console.log();
220
+ console.log(`Manifest written to: ${outPath}`);
221
+ console.log(`Review then run: agent-bober fleet "${outPath}"`);
222
+ console.log();
223
+ // ── Step 6: --yes gate ────────────────────────────────────────────
224
+ // runFleet is ONLY reachable when opts.yes is true. Default exits 0.
225
+ if (opts.yes) {
226
+ const runFleetFn = deps?.runFleet ?? runFleet;
227
+ const report = await runFleetFn(outPath);
228
+ console.log();
229
+ console.log(chalk.bold("═══ Fleet Summary ═══"));
230
+ console.log();
231
+ console.log(` Total: ${chalk.cyan(String(report.total))} children`);
232
+ console.log(` Completed: ${chalk.green(String(report.completed))}`);
233
+ if (report.failed > 0) {
234
+ console.log(` Failed: ${chalk.red(String(report.failed))}`);
235
+ }
236
+ if (report.other > 0) {
237
+ console.log(` Other: ${chalk.yellow(String(report.other))}`);
238
+ }
239
+ console.log();
240
+ }
241
+ else {
242
+ process.exitCode = 0;
243
+ }
244
+ }
245
+ // ── registerFleetExpandDeepSubcommand ─────────────────────────────────
246
+ /**
247
+ * Attach `expand-deep <goal>` as a child subcommand of the existing `fleet` command.
248
+ * Options: --count, --provider, --model, --root, --concurrency, --out, --yes.
249
+ *
250
+ * The action body is a thin wrapper around runFleetExpandDeep for testability.
251
+ */
252
+ export function registerFleetExpandDeepSubcommand(fleet) {
253
+ fleet
254
+ .command("expand-deep <goal>")
255
+ .description("Robustly decompose a large/ambiguous goal (two-stage plan-then-expand) into a fleet manifest and optionally run it")
256
+ .option("--count <n>", "Soft target for number of sub-projects")
257
+ .option("--provider <p>", "Override the decomposer LLM provider (default: openai-compat)")
258
+ .option("--model <m>", "Override the decomposer LLM model (default: deepseek-v4-pro)")
259
+ .option("--root <dir>", "Override the manifest rootDir (default: .)")
260
+ .option("--concurrency <c>", "Override manifest concurrency (default: 3)")
261
+ .option("--out <path>", "Override the output path for the written manifest")
262
+ .option("--yes", "Chain into fleet run after writing the manifest")
263
+ .option("--critique", "Run a fresh-context critic gate that re-expands degenerate manifests")
264
+ .action(async (goal, opts) => {
265
+ try {
266
+ await runFleetExpandDeep(goal, opts);
267
+ }
268
+ catch (err) {
269
+ logger.error(`Fleet expand-deep failed: ${err instanceof Error ? err.message : String(err)}`);
270
+ process.exitCode = 1;
271
+ }
272
+ });
273
+ }
274
+ // ── registerFleetExpandSubcommand ─────────────────────────────────────
275
+ /**
276
+ * Attach `expand <goal>` as a child subcommand of the existing `fleet` command.
277
+ * Options: --count, --provider, --model, --root, --concurrency, --out, --yes.
278
+ *
279
+ * The action body is a thin wrapper around runFleetExpand for testability.
280
+ */
281
+ export function registerFleetExpandSubcommand(fleet) {
282
+ fleet
283
+ .command("expand <goal>")
284
+ .description("Decompose a goal into a fleet manifest and optionally run it")
285
+ .option("--count <n>", "Soft target for number of sub-projects")
286
+ .option("--provider <p>", "Override the decomposer LLM provider (default: openai-compat)")
287
+ .option("--model <m>", "Override the decomposer LLM model (default: deepseek-v4-pro)")
288
+ .option("--root <dir>", "Override the manifest rootDir (default: .)")
289
+ .option("--concurrency <c>", "Override manifest concurrency (default: 3)")
290
+ .option("--out <path>", "Override the output path for the written manifest")
291
+ .option("--yes", "Chain into fleet run after writing the manifest")
292
+ .action(async (goal, opts) => {
293
+ try {
294
+ await runFleetExpand(goal, opts);
295
+ }
296
+ catch (err) {
297
+ logger.error(`Fleet expand failed: ${err instanceof Error ? err.message : String(err)}`);
298
+ process.exitCode = 1;
299
+ }
300
+ });
301
+ }
76
302
  // ── registerFleetCommand ──────────────────────────────────────────────
77
303
  /**
78
304
  * Register `agent-bober fleet <manifest>` with the commander program.
@@ -83,7 +309,7 @@ export async function runFleet(manifestPath, options, deps) {
83
309
  * report IO failure)
84
310
  */
85
311
  export function registerFleetCommand(program) {
86
- program
312
+ const fleet = program
87
313
  .command("fleet <manifest>")
88
314
  .description("Run a fleet of agent-bober children from a manifest")
89
315
  .option("--concurrency <n>", "Override manifest concurrency")
@@ -113,5 +339,7 @@ export function registerFleetCommand(program) {
113
339
  process.exitCode = 1;
114
340
  }
115
341
  });
342
+ registerFleetExpandSubcommand(fleet);
343
+ registerFleetExpandDeepSubcommand(fleet);
116
344
  }
117
345
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fleet/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fleet/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { FleetManifest } from "./manifest.js";
2
+ export interface ManifestProvenance {
3
+ command: string;
4
+ goal: string;
5
+ critique: boolean;
6
+ childCount: number;
7
+ timestamp: string;
8
+ }
9
+ export interface WriteManifestArgs {
10
+ outPath: string;
11
+ manifest: FleetManifest;
12
+ provenance: Omit<ManifestProvenance, "timestamp">;
13
+ log?: (msg: string) => void;
14
+ now?: () => number;
15
+ }
16
+ /**
17
+ * Atomically write a fleet manifest to outPath, emit a provenance sidecar,
18
+ * and (on overwrite) preserve the prior manifest as <outPath>.bak and log
19
+ * an informative notice.
20
+ *
21
+ * Steps:
22
+ * 1. ensureDir(dirname(outPath))
23
+ * 2. Check if outPath already exists
24
+ * 3. If exists: tolerantly read+parse <outPath>.meta.json (missing/corrupt → null),
25
+ * rename outPath to <outPath>.bak, log notice
26
+ * 4. Atomically write new manifest via tmp+rename
27
+ * 5. Write provenance sidecar to <outPath>.meta.json
28
+ */
29
+ export declare function writeManifestWithProvenance(args: WriteManifestArgs): Promise<void>;
30
+ //# sourceMappingURL=manifest-write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-write.d.ts","sourceRoot":"","sources":["../../src/fleet/manifest-write.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAInD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;IACxB,UAAU,EAAE,IAAI,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC;IAClD,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAyBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,2BAA2B,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0DxF"}
@@ -0,0 +1,90 @@
1
+ // ── fleet/manifest-write.ts ───────────────────────────────────────────
2
+ //
3
+ // writeManifestWithProvenance: shared helper for fleet expand and
4
+ // fleet expand-deep Step-4 writes. Emits a provenance sidecar,
5
+ // preserves the prior manifest as .bak on overwrite, and prints an
6
+ // informative non-blocking notice.
7
+ import { writeFile, rename, access, readFile } from "node:fs/promises";
8
+ import { randomBytes } from "node:crypto";
9
+ import { dirname, basename } from "node:path";
10
+ import { ensureDir } from "../state/helpers.js";
11
+ // ── Relative-age formatter ────────────────────────────────────────────
12
+ // bober: simple string bucketing; upgrade to a full humanize lib if sub-minute
13
+ // precision is needed for UI display.
14
+ function formatRelativeAge(deltaMs) {
15
+ const totalSeconds = Math.floor(deltaMs / 1000);
16
+ if (totalSeconds < 60) {
17
+ return "just now";
18
+ }
19
+ const totalMinutes = Math.floor(totalSeconds / 60);
20
+ if (totalMinutes < 60) {
21
+ return `${totalMinutes}m ago`;
22
+ }
23
+ const totalHours = Math.floor(totalMinutes / 60);
24
+ if (totalHours < 24) {
25
+ return `${totalHours}h ago`;
26
+ }
27
+ const totalDays = Math.floor(totalHours / 24);
28
+ return `${totalDays}d ago`;
29
+ }
30
+ // ── Helper ────────────────────────────────────────────────────────────
31
+ /**
32
+ * Atomically write a fleet manifest to outPath, emit a provenance sidecar,
33
+ * and (on overwrite) preserve the prior manifest as <outPath>.bak and log
34
+ * an informative notice.
35
+ *
36
+ * Steps:
37
+ * 1. ensureDir(dirname(outPath))
38
+ * 2. Check if outPath already exists
39
+ * 3. If exists: tolerantly read+parse <outPath>.meta.json (missing/corrupt → null),
40
+ * rename outPath to <outPath>.bak, log notice
41
+ * 4. Atomically write new manifest via tmp+rename
42
+ * 5. Write provenance sidecar to <outPath>.meta.json
43
+ */
44
+ export async function writeManifestWithProvenance(args) {
45
+ const { outPath, manifest, provenance } = args;
46
+ const log = args.log ?? console.log;
47
+ const now = args.now ?? Date.now;
48
+ const sidecarPath = `${outPath}.meta.json`;
49
+ const bakPath = `${outPath}.bak`;
50
+ const { command } = provenance;
51
+ // Step 1: ensure output directory exists
52
+ await ensureDir(dirname(outPath));
53
+ // Step 2: check if the manifest already exists
54
+ const alreadyExisted = await access(outPath).then(() => true, () => false);
55
+ // Step 3: if it exists, back it up and log a notice
56
+ if (alreadyExisted) {
57
+ // Tolerantly read prior sidecar — missing or corrupt must never abort the write
58
+ let prior;
59
+ try {
60
+ const raw = await readFile(sidecarPath, "utf-8");
61
+ prior = JSON.parse(raw);
62
+ }
63
+ catch {
64
+ prior = null;
65
+ }
66
+ // Move prior manifest to .bak BEFORE writing the new one
67
+ await rename(outPath, bakPath);
68
+ // Log informative notice
69
+ if (prior !== null) {
70
+ const ageMs = now() - Date.parse(prior.timestamp);
71
+ const relAge = formatRelativeAge(ageMs);
72
+ log(`[${command}] Replacing manifest from \`${prior.command}\` for goal "${prior.goal}" (${prior.childCount} children, ${relAge}) → kept as ${basename(outPath)}.bak`);
73
+ }
74
+ else {
75
+ log(`[${command}] Overwriting existing manifest at ${outPath} → kept as ${basename(outPath)}.bak`);
76
+ }
77
+ }
78
+ // Step 4: atomically write the new manifest via tmp+rename
79
+ const rnd = randomBytes(4).toString("hex");
80
+ const tmp = `${outPath}.${process.pid}.${Date.now()}.${rnd}.tmp`;
81
+ await writeFile(tmp, JSON.stringify(manifest, null, 2), { encoding: "utf-8" });
82
+ await rename(tmp, outPath);
83
+ // Step 5: write provenance sidecar
84
+ const sidecar = {
85
+ ...provenance,
86
+ timestamp: new Date(now()).toISOString(),
87
+ };
88
+ await writeFile(sidecarPath, JSON.stringify(sidecar, null, 2), { encoding: "utf-8" });
89
+ }
90
+ //# sourceMappingURL=manifest-write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-write.js","sourceRoot":"","sources":["../../src/fleet/manifest-write.ts"],"names":[],"mappings":"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"}
@@ -4,12 +4,12 @@ export declare const FleetChildSchema: z.ZodObject<{
4
4
  task: z.ZodString;
5
5
  config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
6
6
  }, "strip", z.ZodTypeAny, {
7
- folder: string;
8
7
  task: string;
8
+ folder: string;
9
9
  config?: Record<string, unknown> | undefined;
10
10
  }, {
11
- folder: string;
12
11
  task: string;
12
+ folder: string;
13
13
  config?: Record<string, unknown> | undefined;
14
14
  }>;
15
15
  export type FleetChild = z.infer<typeof FleetChildSchema>;
@@ -21,26 +21,26 @@ export declare const FleetManifestSchema: z.ZodObject<{
21
21
  task: z.ZodString;
22
22
  config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
23
23
  }, "strip", z.ZodTypeAny, {
24
- folder: string;
25
24
  task: string;
25
+ folder: string;
26
26
  config?: Record<string, unknown> | undefined;
27
27
  }, {
28
- folder: string;
29
28
  task: string;
29
+ folder: string;
30
30
  config?: Record<string, unknown> | undefined;
31
31
  }>, "many">;
32
32
  }, "strip", z.ZodTypeAny, {
33
33
  rootDir: string;
34
34
  concurrency: number;
35
35
  children: {
36
- folder: string;
37
36
  task: string;
37
+ folder: string;
38
38
  config?: Record<string, unknown> | undefined;
39
39
  }[];
40
40
  }, {
41
41
  children: {
42
- folder: string;
43
42
  task: string;
43
+ folder: string;
44
44
  config?: Record<string, unknown> | undefined;
45
45
  }[];
46
46
  rootDir?: string | undefined;
@@ -0,0 +1,51 @@
1
+ import type { FactRecord } from "../state/facts.js";
2
+ export declare const BLACKBOARD_MAX_ROUNDS = 3;
3
+ export interface BlackboardFinding {
4
+ childFolder: string;
5
+ round: number;
6
+ payload: string;
7
+ confidence?: number;
8
+ }
9
+ export interface SharedBlackboardOpts {
10
+ dbPath: string;
11
+ namespace: string;
12
+ busyTimeoutMs?: number;
13
+ maxRounds?: number;
14
+ }
15
+ /**
16
+ * Bounded inter-agent exchange wrapper over one shared facts.db.
17
+ * Opens the db in WAL mode with a busy_timeout so concurrent fleet
18
+ * children can publish findings without SQLITE_BUSY deadlocks.
19
+ *
20
+ * bober: single-file SQLite WAL (better-sqlite3 synchronous writes);
21
+ * swap for a network WAL (e.g. Turso/libSQL) if fleet grows beyond
22
+ * one host or requires cross-machine exchange.
23
+ */
24
+ export declare class SharedBlackboard {
25
+ private store;
26
+ private namespace;
27
+ private maxRounds;
28
+ private constructor();
29
+ /**
30
+ * Open (or create) a shared WAL facts.db at dbPath.
31
+ * Ensures the parent directory exists before opening.
32
+ * Returns a ready-to-use SharedBlackboard instance.
33
+ */
34
+ static open(opts: SharedBlackboardOpts): Promise<SharedBlackboard>;
35
+ /**
36
+ * Publish a finding from one fleet child.
37
+ * Throws when finding.round exceeds the effective maxRounds cap.
38
+ * Returns the persisted FactRecord.
39
+ */
40
+ publish(finding: BlackboardFinding, now: string): FactRecord;
41
+ /**
42
+ * Return all active 'finding' facts in this namespace published by
43
+ * children OTHER than selfFolder.
44
+ */
45
+ readSiblings(selfFolder: string): FactRecord[];
46
+ /** Return ALL active 'finding' facts in this namespace. */
47
+ readAll(): FactRecord[];
48
+ /** Close the underlying database connection. */
49
+ close(): void;
50
+ }
51
+ //# sourceMappingURL=shared-blackboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-blackboard.d.ts","sourceRoot":"","sources":["../../src/fleet/shared-blackboard.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIpD,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAIvC,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID;;;;;;;;GAQG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO;IAMP;;;;OAIG;WACU,IAAI,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAexE;;;;OAIG;IACH,OAAO,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU;IAkB5D;;;OAGG;IACH,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,EAAE;IAM9C,2DAA2D;IAC3D,OAAO,IAAI,UAAU,EAAE;IAIvB,gDAAgD;IAChD,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,79 @@
1
+ import { dirname } from "node:path";
2
+ import { ensureDir } from "../state/helpers.js";
3
+ import { FactStore } from "../state/facts.js";
4
+ // ── Constants ────────────────────────────────────────────────────────
5
+ export const BLACKBOARD_MAX_ROUNDS = 3;
6
+ // ── SharedBlackboard ─────────────────────────────────────────────────
7
+ /**
8
+ * Bounded inter-agent exchange wrapper over one shared facts.db.
9
+ * Opens the db in WAL mode with a busy_timeout so concurrent fleet
10
+ * children can publish findings without SQLITE_BUSY deadlocks.
11
+ *
12
+ * bober: single-file SQLite WAL (better-sqlite3 synchronous writes);
13
+ * swap for a network WAL (e.g. Turso/libSQL) if fleet grows beyond
14
+ * one host or requires cross-machine exchange.
15
+ */
16
+ export class SharedBlackboard {
17
+ store;
18
+ namespace;
19
+ maxRounds;
20
+ constructor(store, namespace, maxRounds) {
21
+ this.store = store;
22
+ this.namespace = namespace;
23
+ this.maxRounds = maxRounds;
24
+ }
25
+ /**
26
+ * Open (or create) a shared WAL facts.db at dbPath.
27
+ * Ensures the parent directory exists before opening.
28
+ * Returns a ready-to-use SharedBlackboard instance.
29
+ */
30
+ static async open(opts) {
31
+ if (opts.dbPath !== ":memory:") {
32
+ await ensureDir(dirname(opts.dbPath));
33
+ }
34
+ const store = new FactStore(opts.dbPath, {
35
+ journalModeWal: opts.dbPath !== ":memory:",
36
+ busyTimeoutMs: opts.busyTimeoutMs ?? 5000,
37
+ });
38
+ const maxRounds = Math.min(opts.maxRounds ?? BLACKBOARD_MAX_ROUNDS, BLACKBOARD_MAX_ROUNDS);
39
+ return new SharedBlackboard(store, opts.namespace, maxRounds);
40
+ }
41
+ /**
42
+ * Publish a finding from one fleet child.
43
+ * Throws when finding.round exceeds the effective maxRounds cap.
44
+ * Returns the persisted FactRecord.
45
+ */
46
+ publish(finding, now) {
47
+ if (finding.round > this.maxRounds) {
48
+ throw new Error(`blackboard round ${finding.round} exceeds cap ${this.maxRounds}`);
49
+ }
50
+ return this.store.insertFact({
51
+ scope: this.namespace,
52
+ subject: finding.childFolder,
53
+ predicate: "finding",
54
+ value: finding.payload,
55
+ confidence: finding.confidence ?? 1,
56
+ sourceRunId: null,
57
+ tValid: now,
58
+ tCreated: now,
59
+ });
60
+ }
61
+ /**
62
+ * Return all active 'finding' facts in this namespace published by
63
+ * children OTHER than selfFolder.
64
+ */
65
+ readSiblings(selfFolder) {
66
+ return this.store
67
+ .getActiveFacts(this.namespace, undefined, "finding")
68
+ .filter((f) => f.subject !== selfFolder);
69
+ }
70
+ /** Return ALL active 'finding' facts in this namespace. */
71
+ readAll() {
72
+ return this.store.getActiveFacts(this.namespace, undefined, "finding");
73
+ }
74
+ /** Close the underlying database connection. */
75
+ close() {
76
+ this.store.close();
77
+ }
78
+ }
79
+ //# sourceMappingURL=shared-blackboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-blackboard.js","sourceRoot":"","sources":["../../src/fleet/shared-blackboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG9C,wEAAwE;AAExE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAkBvC,wEAAwE;AAExE;;;;;;;;GAQG;AACH,MAAM,OAAO,gBAAgB;IACnB,KAAK,CAAY;IACjB,SAAS,CAAS;IAClB,SAAS,CAAS;IAE1B,YAAoB,KAAgB,EAAE,SAAiB,EAAE,SAAiB;QACxE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAA0B;QAC1C,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC/B,MAAM,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE;YACvC,cAAc,EAAE,IAAI,CAAC,MAAM,KAAK,UAAU;YAC1C,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,IAAI;SAC1C,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,IAAI,CAAC,SAAS,IAAI,qBAAqB,EACvC,qBAAqB,CACtB,CAAC;QACF,OAAO,IAAI,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAChE,CAAC;IAED;;;;OAIG;IACH,OAAO,CAAC,OAA0B,EAAE,GAAW;QAC7C,IAAI,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CACb,oBAAoB,OAAO,CAAC,KAAK,gBAAgB,IAAI,CAAC,SAAS,EAAE,CAClE,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;YAC3B,KAAK,EAAE,IAAI,CAAC,SAAS;YACrB,OAAO,EAAE,OAAO,CAAC,WAAW;YAC5B,SAAS,EAAE,SAAS;YACpB,KAAK,EAAE,OAAO,CAAC,OAAO;YACtB,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,CAAC;YACnC,WAAW,EAAE,IAAI;YACjB,MAAM,EAAE,GAAG;YACX,QAAQ,EAAE,GAAG;SACd,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,UAAkB;QAC7B,OAAO,IAAI,CAAC,KAAK;aACd,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;aACpD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC;IAC7C,CAAC;IAED,2DAA2D;IAC3D,OAAO;QACL,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACzE,CAAC;IAED,gDAAgD;IAChD,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ import type { SharedBlackboard } from "./shared-blackboard.js";
2
+ import type { PortfolioReport } from "./reporter.js";
3
+ import type { FactRecord } from "../state/facts.js";
4
+ export interface SynthesisBundle {
5
+ rounds: number;
6
+ childResults: PortfolioReport;
7
+ findings: FactRecord[];
8
+ }
9
+ /**
10
+ * Assemble a SynthesisBundle from the final-round child results, the round
11
+ * count, and (if a blackboard was used) all of its findings.
12
+ * PURE: no LLM, no network, no IO — just shapes existing data into JSON.
13
+ * When blackboard is null, findings is [].
14
+ */
15
+ export declare function collect(blackboard: SharedBlackboard | null, childResults: PortfolioReport, rounds: number): SynthesisBundle;
16
+ //# sourceMappingURL=synthesis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synthesis.d.ts","sourceRoot":"","sources":["../../src/fleet/synthesis.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIpD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,eAAe,CAAC;IAC9B,QAAQ,EAAE,UAAU,EAAE,CAAC;CACxB;AAID;;;;;GAKG;AACH,wBAAgB,OAAO,CACrB,UAAU,EAAE,gBAAgB,GAAG,IAAI,EACnC,YAAY,EAAE,eAAe,EAC7B,MAAM,EAAE,MAAM,GACb,eAAe,CAMjB"}