agent-bober 0.17.1 → 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 (355) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/CHANGELOG.md +15 -0
  3. package/README.md +158 -5
  4. package/dist/chat/answerer.d.ts +17 -0
  5. package/dist/chat/answerer.d.ts.map +1 -0
  6. package/dist/chat/answerer.js +52 -0
  7. package/dist/chat/answerer.js.map +1 -0
  8. package/dist/chat/approval-cursor.d.ts +25 -0
  9. package/dist/chat/approval-cursor.d.ts.map +1 -0
  10. package/dist/chat/approval-cursor.js +61 -0
  11. package/dist/chat/approval-cursor.js.map +1 -0
  12. package/dist/chat/approval-reader.d.ts +11 -0
  13. package/dist/chat/approval-reader.d.ts.map +1 -0
  14. package/dist/chat/approval-reader.js +20 -0
  15. package/dist/chat/approval-reader.js.map +1 -0
  16. package/dist/chat/careful-sidecar.d.ts +15 -0
  17. package/dist/chat/careful-sidecar.d.ts.map +1 -0
  18. package/dist/chat/careful-sidecar.js +39 -0
  19. package/dist/chat/careful-sidecar.js.map +1 -0
  20. package/dist/chat/chat-session.d.ts +129 -0
  21. package/dist/chat/chat-session.d.ts.map +1 -0
  22. package/dist/chat/chat-session.js +470 -0
  23. package/dist/chat/chat-session.js.map +1 -0
  24. package/dist/chat/completion-tailer.d.ts +27 -0
  25. package/dist/chat/completion-tailer.d.ts.map +1 -0
  26. package/dist/chat/completion-tailer.js +187 -0
  27. package/dist/chat/completion-tailer.js.map +1 -0
  28. package/dist/chat/conversation-store.d.ts +22 -0
  29. package/dist/chat/conversation-store.d.ts.map +1 -0
  30. package/dist/chat/conversation-store.js +66 -0
  31. package/dist/chat/conversation-store.js.map +1 -0
  32. package/dist/chat/cursor-store.d.ts +23 -0
  33. package/dist/chat/cursor-store.d.ts.map +1 -0
  34. package/dist/chat/cursor-store.js +42 -0
  35. package/dist/chat/cursor-store.js.map +1 -0
  36. package/dist/chat/pid-sidecar.d.ts +22 -0
  37. package/dist/chat/pid-sidecar.d.ts.map +1 -0
  38. package/dist/chat/pid-sidecar.js +42 -0
  39. package/dist/chat/pid-sidecar.js.map +1 -0
  40. package/dist/chat/roster-reader.d.ts +16 -0
  41. package/dist/chat/roster-reader.d.ts.map +1 -0
  42. package/dist/chat/roster-reader.js +39 -0
  43. package/dist/chat/roster-reader.js.map +1 -0
  44. package/dist/chat/run-spawner.d.ts +71 -0
  45. package/dist/chat/run-spawner.d.ts.map +1 -0
  46. package/dist/chat/run-spawner.js +121 -0
  47. package/dist/chat/run-spawner.js.map +1 -0
  48. package/dist/chat/slash-commands.d.ts +36 -0
  49. package/dist/chat/slash-commands.d.ts.map +1 -0
  50. package/dist/chat/slash-commands.js +133 -0
  51. package/dist/chat/slash-commands.js.map +1 -0
  52. package/dist/chat/steer-cleanup.d.ts +12 -0
  53. package/dist/chat/steer-cleanup.d.ts.map +1 -0
  54. package/dist/chat/steer-cleanup.js +60 -0
  55. package/dist/chat/steer-cleanup.js.map +1 -0
  56. package/dist/chat/turn-classifier.d.ts +43 -0
  57. package/dist/chat/turn-classifier.d.ts.map +1 -0
  58. package/dist/chat/turn-classifier.js +150 -0
  59. package/dist/chat/turn-classifier.js.map +1 -0
  60. package/dist/cli/commands/blackboard.d.ts +33 -0
  61. package/dist/cli/commands/blackboard.d.ts.map +1 -0
  62. package/dist/cli/commands/blackboard.js +114 -0
  63. package/dist/cli/commands/blackboard.js.map +1 -0
  64. package/dist/cli/commands/chat.d.ts +13 -0
  65. package/dist/cli/commands/chat.d.ts.map +1 -0
  66. package/dist/cli/commands/chat.js +43 -0
  67. package/dist/cli/commands/chat.js.map +1 -0
  68. package/dist/cli/commands/evolve.d.ts +18 -0
  69. package/dist/cli/commands/evolve.d.ts.map +1 -0
  70. package/dist/cli/commands/evolve.js +72 -0
  71. package/dist/cli/commands/evolve.js.map +1 -0
  72. package/dist/cli/commands/facts.d.ts +15 -0
  73. package/dist/cli/commands/facts.d.ts.map +1 -0
  74. package/dist/cli/commands/facts.js +213 -0
  75. package/dist/cli/commands/facts.js.map +1 -0
  76. package/dist/cli/commands/medical.d.ts +24 -0
  77. package/dist/cli/commands/medical.d.ts.map +1 -0
  78. package/dist/cli/commands/medical.js +132 -0
  79. package/dist/cli/commands/medical.js.map +1 -0
  80. package/dist/cli/commands/memory.d.ts +2 -1
  81. package/dist/cli/commands/memory.d.ts.map +1 -1
  82. package/dist/cli/commands/memory.js +94 -7
  83. package/dist/cli/commands/memory.js.map +1 -1
  84. package/dist/cli/commands/plan.d.ts.map +1 -1
  85. package/dist/cli/commands/plan.js +29 -3
  86. package/dist/cli/commands/plan.js.map +1 -1
  87. package/dist/cli/commands/replay.d.ts +17 -0
  88. package/dist/cli/commands/replay.d.ts.map +1 -0
  89. package/dist/cli/commands/replay.js +261 -0
  90. package/dist/cli/commands/replay.js.map +1 -0
  91. package/dist/cli/commands/run.d.ts +9 -0
  92. package/dist/cli/commands/run.d.ts.map +1 -1
  93. package/dist/cli/commands/run.js +27 -1
  94. package/dist/cli/commands/run.js.map +1 -1
  95. package/dist/cli/commands/sprint.d.ts.map +1 -1
  96. package/dist/cli/commands/sprint.js +17 -3
  97. package/dist/cli/commands/sprint.js.map +1 -1
  98. package/dist/cli/index.js +12 -0
  99. package/dist/cli/index.js.map +1 -1
  100. package/dist/config/defaults.d.ts.map +1 -1
  101. package/dist/config/defaults.js +8 -0
  102. package/dist/config/defaults.js.map +1 -1
  103. package/dist/config/role-providers.d.ts +1 -1
  104. package/dist/config/role-providers.d.ts.map +1 -1
  105. package/dist/config/role-providers.js +6 -1
  106. package/dist/config/role-providers.js.map +1 -1
  107. package/dist/config/schema.d.ts +467 -222
  108. package/dist/config/schema.d.ts.map +1 -1
  109. package/dist/config/schema.js +25 -0
  110. package/dist/config/schema.js.map +1 -1
  111. package/dist/contracts/eval-result.d.ts +84 -84
  112. package/dist/contracts/spec.d.ts +28 -28
  113. package/dist/contracts/sprint-contract.d.ts +4 -4
  114. package/dist/fleet/critic-deep.d.ts +53 -0
  115. package/dist/fleet/critic-deep.d.ts.map +1 -0
  116. package/dist/fleet/critic-deep.js +199 -0
  117. package/dist/fleet/critic-deep.js.map +1 -0
  118. package/dist/fleet/decomposer-deep-constants.d.ts +4 -0
  119. package/dist/fleet/decomposer-deep-constants.d.ts.map +1 -0
  120. package/dist/fleet/decomposer-deep-constants.js +14 -0
  121. package/dist/fleet/decomposer-deep-constants.js.map +1 -0
  122. package/dist/fleet/decomposer-deep-types.d.ts +8 -0
  123. package/dist/fleet/decomposer-deep-types.d.ts.map +1 -0
  124. package/dist/fleet/decomposer-deep-types.js +9 -0
  125. package/dist/fleet/decomposer-deep-types.js.map +1 -0
  126. package/dist/fleet/decomposer-deep.d.ts +51 -0
  127. package/dist/fleet/decomposer-deep.d.ts.map +1 -0
  128. package/dist/fleet/decomposer-deep.js +261 -0
  129. package/dist/fleet/decomposer-deep.js.map +1 -0
  130. package/dist/fleet/decomposer.d.ts +22 -0
  131. package/dist/fleet/decomposer.d.ts.map +1 -0
  132. package/dist/fleet/decomposer.js +144 -0
  133. package/dist/fleet/decomposer.js.map +1 -0
  134. package/dist/fleet/index.d.ts +93 -0
  135. package/dist/fleet/index.d.ts.map +1 -1
  136. package/dist/fleet/index.js +230 -2
  137. package/dist/fleet/index.js.map +1 -1
  138. package/dist/fleet/manifest-write.d.ts +30 -0
  139. package/dist/fleet/manifest-write.d.ts.map +1 -0
  140. package/dist/fleet/manifest-write.js +90 -0
  141. package/dist/fleet/manifest-write.js.map +1 -0
  142. package/dist/fleet/manifest.d.ts +6 -6
  143. package/dist/fleet/shared-blackboard.d.ts +51 -0
  144. package/dist/fleet/shared-blackboard.d.ts.map +1 -0
  145. package/dist/fleet/shared-blackboard.js +79 -0
  146. package/dist/fleet/shared-blackboard.js.map +1 -0
  147. package/dist/fleet/synthesis.d.ts +16 -0
  148. package/dist/fleet/synthesis.d.ts.map +1 -0
  149. package/dist/fleet/synthesis.js +22 -0
  150. package/dist/fleet/synthesis.js.map +1 -0
  151. package/dist/fleet/tier-policy.d.ts +18 -0
  152. package/dist/fleet/tier-policy.d.ts.map +1 -0
  153. package/dist/fleet/tier-policy.js +53 -0
  154. package/dist/fleet/tier-policy.js.map +1 -0
  155. package/dist/fleet/tool-role-guard.d.ts +24 -0
  156. package/dist/fleet/tool-role-guard.d.ts.map +1 -0
  157. package/dist/fleet/tool-role-guard.js +55 -0
  158. package/dist/fleet/tool-role-guard.js.map +1 -0
  159. package/dist/incident/resolution-verify.d.ts +4 -4
  160. package/dist/incident/types.d.ts +8 -8
  161. package/dist/mcp/run-manager.d.ts +9 -1
  162. package/dist/mcp/run-manager.d.ts.map +1 -1
  163. package/dist/mcp/run-manager.js.map +1 -1
  164. package/dist/medical/adapters/apple-health.d.ts +32 -0
  165. package/dist/medical/adapters/apple-health.d.ts.map +1 -0
  166. package/dist/medical/adapters/apple-health.js +100 -0
  167. package/dist/medical/adapters/apple-health.js.map +1 -0
  168. package/dist/medical/audit.d.ts +31 -0
  169. package/dist/medical/audit.d.ts.map +1 -0
  170. package/dist/medical/audit.js +56 -0
  171. package/dist/medical/audit.js.map +1 -0
  172. package/dist/medical/consent.d.ts +37 -0
  173. package/dist/medical/consent.d.ts.map +1 -0
  174. package/dist/medical/consent.js +73 -0
  175. package/dist/medical/consent.js.map +1 -0
  176. package/dist/medical/disclaimer.d.ts +11 -0
  177. package/dist/medical/disclaimer.d.ts.map +1 -0
  178. package/dist/medical/disclaimer.js +21 -0
  179. package/dist/medical/disclaimer.js.map +1 -0
  180. package/dist/medical/egress.d.ts +30 -0
  181. package/dist/medical/egress.d.ts.map +1 -0
  182. package/dist/medical/egress.js +50 -0
  183. package/dist/medical/egress.js.map +1 -0
  184. package/dist/medical/engine.d.ts +73 -0
  185. package/dist/medical/engine.d.ts.map +1 -0
  186. package/dist/medical/engine.js +333 -0
  187. package/dist/medical/engine.js.map +1 -0
  188. package/dist/medical/guardrails.d.ts +47 -0
  189. package/dist/medical/guardrails.d.ts.map +1 -0
  190. package/dist/medical/guardrails.js +92 -0
  191. package/dist/medical/guardrails.js.map +1 -0
  192. package/dist/medical/health-store.d.ts +80 -0
  193. package/dist/medical/health-store.d.ts.map +1 -0
  194. package/dist/medical/health-store.js +204 -0
  195. package/dist/medical/health-store.js.map +1 -0
  196. package/dist/medical/inference.d.ts +22 -0
  197. package/dist/medical/inference.d.ts.map +1 -0
  198. package/dist/medical/inference.js +39 -0
  199. package/dist/medical/inference.js.map +1 -0
  200. package/dist/medical/ingestion.d.ts +33 -0
  201. package/dist/medical/ingestion.d.ts.map +1 -0
  202. package/dist/medical/ingestion.js +52 -0
  203. package/dist/medical/ingestion.js.map +1 -0
  204. package/dist/medical/numerics.d.ts +66 -0
  205. package/dist/medical/numerics.d.ts.map +1 -0
  206. package/dist/medical/numerics.js +216 -0
  207. package/dist/medical/numerics.js.map +1 -0
  208. package/dist/medical/red-flag.d.ts +42 -0
  209. package/dist/medical/red-flag.d.ts.map +1 -0
  210. package/dist/medical/red-flag.js +161 -0
  211. package/dist/medical/red-flag.js.map +1 -0
  212. package/dist/medical/refusal.d.ts +46 -0
  213. package/dist/medical/refusal.d.ts.map +1 -0
  214. package/dist/medical/refusal.js +131 -0
  215. package/dist/medical/refusal.js.map +1 -0
  216. package/dist/medical/retrieval/grounding-critic.d.ts +34 -0
  217. package/dist/medical/retrieval/grounding-critic.d.ts.map +1 -0
  218. package/dist/medical/retrieval/grounding-critic.js +153 -0
  219. package/dist/medical/retrieval/grounding-critic.js.map +1 -0
  220. package/dist/medical/retrieval/literature.d.ts +78 -0
  221. package/dist/medical/retrieval/literature.d.ts.map +1 -0
  222. package/dist/medical/retrieval/literature.js +292 -0
  223. package/dist/medical/retrieval/literature.js.map +1 -0
  224. package/dist/medical/retrieval/medline-source.d.ts +72 -0
  225. package/dist/medical/retrieval/medline-source.d.ts.map +1 -0
  226. package/dist/medical/retrieval/medline-source.js +120 -0
  227. package/dist/medical/retrieval/medline-source.js.map +1 -0
  228. package/dist/medical/team.d.ts +15 -0
  229. package/dist/medical/team.d.ts.map +1 -0
  230. package/dist/medical/team.js +44 -0
  231. package/dist/medical/team.js.map +1 -0
  232. package/dist/medical/types.d.ts +175 -0
  233. package/dist/medical/types.d.ts.map +1 -0
  234. package/dist/medical/types.js +8 -0
  235. package/dist/medical/types.js.map +1 -0
  236. package/dist/medical/whoop/whoop-client.d.ts +114 -0
  237. package/dist/medical/whoop/whoop-client.d.ts.map +1 -0
  238. package/dist/medical/whoop/whoop-client.js +226 -0
  239. package/dist/medical/whoop/whoop-client.js.map +1 -0
  240. package/dist/medical/whoop/whoop-sync.d.ts +25 -0
  241. package/dist/medical/whoop/whoop-sync.d.ts.map +1 -0
  242. package/dist/medical/whoop/whoop-sync.js +97 -0
  243. package/dist/medical/whoop/whoop-sync.js.map +1 -0
  244. package/dist/medical/whoop/whoop-token.d.ts +44 -0
  245. package/dist/medical/whoop/whoop-token.d.ts.map +1 -0
  246. package/dist/medical/whoop/whoop-token.js +66 -0
  247. package/dist/medical/whoop/whoop-token.js.map +1 -0
  248. package/dist/orchestrator/context-handoff.d.ts +60 -60
  249. package/dist/orchestrator/contract-materialization.d.ts +33 -0
  250. package/dist/orchestrator/contract-materialization.d.ts.map +1 -0
  251. package/dist/orchestrator/contract-materialization.js +113 -0
  252. package/dist/orchestrator/contract-materialization.js.map +1 -0
  253. package/dist/orchestrator/memory/distill.d.ts +4 -1
  254. package/dist/orchestrator/memory/distill.d.ts.map +1 -1
  255. package/dist/orchestrator/memory/distill.js +41 -1
  256. package/dist/orchestrator/memory/distill.js.map +1 -1
  257. package/dist/orchestrator/memory/fact-detector.d.ts +61 -0
  258. package/dist/orchestrator/memory/fact-detector.d.ts.map +1 -0
  259. package/dist/orchestrator/memory/fact-detector.js +153 -0
  260. package/dist/orchestrator/memory/fact-detector.js.map +1 -0
  261. package/dist/orchestrator/memory/fact-judge.d.ts +19 -0
  262. package/dist/orchestrator/memory/fact-judge.d.ts.map +1 -0
  263. package/dist/orchestrator/memory/fact-judge.js +121 -0
  264. package/dist/orchestrator/memory/fact-judge.js.map +1 -0
  265. package/dist/orchestrator/memory/fact-retrieve.d.ts +52 -0
  266. package/dist/orchestrator/memory/fact-retrieve.d.ts.map +1 -0
  267. package/dist/orchestrator/memory/fact-retrieve.js +117 -0
  268. package/dist/orchestrator/memory/fact-retrieve.js.map +1 -0
  269. package/dist/orchestrator/memory/hygiene.d.ts +66 -0
  270. package/dist/orchestrator/memory/hygiene.d.ts.map +1 -0
  271. package/dist/orchestrator/memory/hygiene.js +153 -0
  272. package/dist/orchestrator/memory/hygiene.js.map +1 -0
  273. package/dist/orchestrator/memory/reconcile.d.ts +47 -0
  274. package/dist/orchestrator/memory/reconcile.d.ts.map +1 -0
  275. package/dist/orchestrator/memory/reconcile.js +116 -0
  276. package/dist/orchestrator/memory/reconcile.js.map +1 -0
  277. package/dist/orchestrator/memory/retrieve.d.ts +5 -3
  278. package/dist/orchestrator/memory/retrieve.d.ts.map +1 -1
  279. package/dist/orchestrator/memory/retrieve.js +9 -6
  280. package/dist/orchestrator/memory/retrieve.js.map +1 -1
  281. package/dist/orchestrator/pipeline.d.ts +19 -3
  282. package/dist/orchestrator/pipeline.d.ts.map +1 -1
  283. package/dist/orchestrator/pipeline.js +63 -52
  284. package/dist/orchestrator/pipeline.js.map +1 -1
  285. package/dist/orchestrator/planner-agent.d.ts.map +1 -1
  286. package/dist/orchestrator/planner-agent.js +16 -1
  287. package/dist/orchestrator/planner-agent.js.map +1 -1
  288. package/dist/orchestrator/selfimprove/eval-guards.d.ts +51 -0
  289. package/dist/orchestrator/selfimprove/eval-guards.d.ts.map +1 -0
  290. package/dist/orchestrator/selfimprove/eval-guards.js +120 -0
  291. package/dist/orchestrator/selfimprove/eval-guards.js.map +1 -0
  292. package/dist/orchestrator/selfimprove/gepa.d.ts +74 -0
  293. package/dist/orchestrator/selfimprove/gepa.d.ts.map +1 -0
  294. package/dist/orchestrator/selfimprove/gepa.js +227 -0
  295. package/dist/orchestrator/selfimprove/gepa.js.map +1 -0
  296. package/dist/orchestrator/selfimprove/replay-harness.d.ts +65 -0
  297. package/dist/orchestrator/selfimprove/replay-harness.d.ts.map +1 -0
  298. package/dist/orchestrator/selfimprove/replay-harness.js +134 -0
  299. package/dist/orchestrator/selfimprove/replay-harness.js.map +1 -0
  300. package/dist/orchestrator/selfimprove/replay-store.d.ts +45 -0
  301. package/dist/orchestrator/selfimprove/replay-store.d.ts.map +1 -0
  302. package/dist/orchestrator/selfimprove/replay-store.js +119 -0
  303. package/dist/orchestrator/selfimprove/replay-store.js.map +1 -0
  304. package/dist/orchestrator/selfimprove/replay-types.d.ts +32 -0
  305. package/dist/orchestrator/selfimprove/replay-types.d.ts.map +1 -0
  306. package/dist/orchestrator/selfimprove/replay-types.js +15 -0
  307. package/dist/orchestrator/selfimprove/replay-types.js.map +1 -0
  308. package/dist/orchestrator/workflow/engine.d.ts +3 -1
  309. package/dist/orchestrator/workflow/engine.d.ts.map +1 -1
  310. package/dist/orchestrator/workflow/selector.d.ts +18 -0
  311. package/dist/orchestrator/workflow/selector.d.ts.map +1 -1
  312. package/dist/orchestrator/workflow/selector.js +41 -0
  313. package/dist/orchestrator/workflow/selector.js.map +1 -1
  314. package/dist/orchestrator/workflow/ts-engine.d.ts +3 -1
  315. package/dist/orchestrator/workflow/ts-engine.d.ts.map +1 -1
  316. package/dist/orchestrator/workflow/ts-engine.js +2 -2
  317. package/dist/orchestrator/workflow/ts-engine.js.map +1 -1
  318. package/dist/orchestrator/workflow/workflow-engine.d.ts +3 -1
  319. package/dist/orchestrator/workflow/workflow-engine.d.ts.map +1 -1
  320. package/dist/orchestrator/workflow/workflow-engine.js +3 -3
  321. package/dist/orchestrator/workflow/workflow-engine.js.map +1 -1
  322. package/dist/state/facts.d.ts +110 -0
  323. package/dist/state/facts.d.ts.map +1 -0
  324. package/dist/state/facts.js +208 -0
  325. package/dist/state/facts.js.map +1 -0
  326. package/dist/state/guidance.d.ts +37 -0
  327. package/dist/state/guidance.d.ts.map +1 -0
  328. package/dist/state/guidance.js +144 -0
  329. package/dist/state/guidance.js.map +1 -0
  330. package/dist/state/history.d.ts +2 -2
  331. package/dist/state/index.d.ts +1 -1
  332. package/dist/state/index.d.ts.map +1 -1
  333. package/dist/state/index.js +1 -1
  334. package/dist/state/index.js.map +1 -1
  335. package/dist/state/memory.d.ts +43 -11
  336. package/dist/state/memory.d.ts.map +1 -1
  337. package/dist/state/memory.js +93 -15
  338. package/dist/state/memory.js.map +1 -1
  339. package/dist/state/pause.d.ts +47 -0
  340. package/dist/state/pause.d.ts.map +1 -0
  341. package/dist/state/pause.js +146 -0
  342. package/dist/state/pause.js.map +1 -0
  343. package/dist/state/sprint-state.d.ts +8 -0
  344. package/dist/state/sprint-state.d.ts.map +1 -1
  345. package/dist/state/sprint-state.js +32 -1
  346. package/dist/state/sprint-state.js.map +1 -1
  347. package/dist/teams/registry.d.ts +16 -0
  348. package/dist/teams/registry.d.ts.map +1 -0
  349. package/dist/teams/registry.js +53 -0
  350. package/dist/teams/registry.js.map +1 -0
  351. package/dist/teams/types.d.ts +25 -0
  352. package/dist/teams/types.d.ts.map +1 -0
  353. package/dist/teams/types.js +2 -0
  354. package/dist/teams/types.js.map +1 -0
  355. package/package.json +3 -1
@@ -6,15 +6,93 @@ import { ensureDir } from "./helpers.js";
6
6
  const BOBER_DIR = ".bober";
7
7
  const MEMORY_DIR = "memory";
8
8
  const INDEX_FILE = "INDEX.md";
9
+ const QUARANTINE_FILE = "QUARANTINE.md";
10
+ // ── Namespace ────────────────────────────────────────────────────────
11
+ /**
12
+ * Resolve the memory directory path for the given namespace.
13
+ *
14
+ * Mapping rule (centralized here — do NOT duplicate in callers):
15
+ * namespace undefined | "" | "programming" → .bober/memory/ (current path, no subdir)
16
+ * any other value → .bober/memory/<ns>/
17
+ *
18
+ * The programming sentinel ("") comes from Sprint 1's built-in team (registry.ts:66).
19
+ * Values are constrained to ^[a-z0-9_-]+$ by the Sprint 1 schema regex, so no
20
+ * path-traversal sanitization is needed here (schema already guards config inputs).
21
+ */
22
+ export function memoryDir(projectRoot, namespace) {
23
+ const ns = namespace && namespace !== "programming" ? namespace : undefined;
24
+ return ns
25
+ ? join(projectRoot, BOBER_DIR, MEMORY_DIR, ns)
26
+ : join(projectRoot, BOBER_DIR, MEMORY_DIR);
27
+ }
9
28
  // ── Path Helpers ─────────────────────────────────────────────────────
10
- function memoryDir(projectRoot) {
11
- return join(projectRoot, BOBER_DIR, MEMORY_DIR);
29
+ export function lessonPath(projectRoot, lessonId, namespace) {
30
+ return join(memoryDir(projectRoot, namespace), `${lessonId}.md`);
12
31
  }
13
- function lessonPath(projectRoot, lessonId) {
14
- return join(memoryDir(projectRoot), `${lessonId}.md`);
32
+ export function indexPath(projectRoot, namespace) {
33
+ return join(memoryDir(projectRoot, namespace), INDEX_FILE);
15
34
  }
16
- function indexPath(projectRoot) {
17
- return join(memoryDir(projectRoot), INDEX_FILE);
35
+ export function quarantinePath(projectRoot, namespace) {
36
+ return join(memoryDir(projectRoot, namespace), QUARANTINE_FILE);
37
+ }
38
+ // ── Quarantine helpers ───────────────────────────────────────────────
39
+ /**
40
+ * Move lessonId lines from INDEX.md to QUARANTINE.md (line-level rewrite).
41
+ *
42
+ * - Reads INDEX.md and partitions non-blank lines: those whose second token
43
+ * (the lessonId) is in `quarantinedIds` are moved; the rest stay.
44
+ * - Rewrites INDEX.md with the kept lines.
45
+ * - Appends the moved lines to QUARANTINE.md (creating it if absent) with a
46
+ * deterministic provenance block: `<!-- quarantined: <reason> @ <now> -->`.
47
+ * - NEVER touches per-lesson <lessonId>.md files.
48
+ *
49
+ * @param projectRoot - Absolute project root containing .bober/
50
+ * @param quarantinedIds - Set of lessonIds to move out of INDEX.md
51
+ * @param reason - Human-readable reason (e.g. "decay" | "conflict")
52
+ * @param now - ISO 8601 wall-clock, injected by the CLI handler
53
+ * @param namespace - Optional memory namespace
54
+ */
55
+ export async function rewriteIndexForQuarantine(projectRoot, quarantinedIds, reason, now, namespace) {
56
+ const idxPath = indexPath(projectRoot, namespace);
57
+ const qPath = quarantinePath(projectRoot, namespace);
58
+ let indexContent;
59
+ try {
60
+ indexContent = await readFile(idxPath, "utf-8");
61
+ }
62
+ catch {
63
+ // INDEX.md absent — nothing to rewrite
64
+ return;
65
+ }
66
+ const allLines = indexContent.split("\n").filter((l) => l.trim().length > 0);
67
+ const keptLines = [];
68
+ const movedLines = [];
69
+ for (const line of allLines) {
70
+ const parts = line.split(" ");
71
+ // parts[0] = "-", parts[1] = lessonId
72
+ if (parts[0] === "-" && quarantinedIds.has(parts[1] ?? "")) {
73
+ movedLines.push(line);
74
+ }
75
+ else {
76
+ keptLines.push(line);
77
+ }
78
+ }
79
+ if (movedLines.length === 0) {
80
+ return;
81
+ }
82
+ // Rewrite INDEX.md with only the kept lines
83
+ await writeFile(idxPath, keptLines.length > 0 ? keptLines.join("\n") + "\n" : "", "utf-8");
84
+ // Append moved lines to QUARANTINE.md with provenance
85
+ await ensureDir(memoryDir(projectRoot, namespace));
86
+ let quarantineContent = "";
87
+ try {
88
+ quarantineContent = await readFile(qPath, "utf-8");
89
+ }
90
+ catch {
91
+ // QUARANTINE.md does not exist yet — start fresh
92
+ }
93
+ const provenance = `<!-- quarantined: ${reason} @ ${now} -->`;
94
+ const appendBlock = [provenance, ...movedLines].join("\n") + "\n";
95
+ await writeFile(qPath, quarantineContent + appendBlock, "utf-8");
18
96
  }
19
97
  // ── Schema ───────────────────────────────────────────────────────────
20
98
  export const LessonEntrySchema = z.object({
@@ -146,7 +224,7 @@ function parseLessonFrontMatter(raw) {
146
224
  * Upserts exactly one INDEX.md line for this lessonId (replace if exists, else append).
147
225
  * Throws if the lesson fails schema validation (sourceEntryRefs must be non-empty).
148
226
  */
149
- export async function appendLesson(projectRoot, lesson) {
227
+ export async function appendLesson(projectRoot, lesson, namespace) {
150
228
  const validation = LessonEntrySchema.safeParse(lesson);
151
229
  if (!validation.success) {
152
230
  const issues = validation.error.issues
@@ -154,12 +232,12 @@ export async function appendLesson(projectRoot, lesson) {
154
232
  .join("\n");
155
233
  throw new Error(`Invalid lesson entry:\n${issues}`);
156
234
  }
157
- const dir = memoryDir(projectRoot);
235
+ const dir = memoryDir(projectRoot, namespace);
158
236
  await ensureDir(dir);
159
237
  // Write the lesson markdown file
160
- await writeFile(lessonPath(projectRoot, lesson.lessonId), serializeLesson(lesson), "utf-8");
238
+ await writeFile(lessonPath(projectRoot, lesson.lessonId, namespace), serializeLesson(lesson), "utf-8");
161
239
  // Upsert one INDEX.md line for this lessonId
162
- const idxPath = indexPath(projectRoot);
240
+ const idxPath = indexPath(projectRoot, namespace);
163
241
  let existingContent = "";
164
242
  try {
165
243
  existingContent = await readFile(idxPath, "utf-8");
@@ -183,10 +261,10 @@ export async function appendLesson(projectRoot, lesson) {
183
261
  * Never opens individual lesson files — parses only INDEX.md.
184
262
  * Returns an empty array if INDEX.md does not exist.
185
263
  */
186
- export async function loadLessonIndex(projectRoot, { limit }) {
264
+ export async function loadLessonIndex(projectRoot, { limit }, namespace) {
187
265
  let content;
188
266
  try {
189
- content = await readFile(indexPath(projectRoot), "utf-8");
267
+ content = await readFile(indexPath(projectRoot, namespace), "utf-8");
190
268
  }
191
269
  catch {
192
270
  // INDEX.md does not exist yet
@@ -207,13 +285,13 @@ export async function loadLessonIndex(projectRoot, { limit }) {
207
285
  * Parses front-matter and validates against LessonEntrySchema.
208
286
  * Throws a descriptive error if the file does not exist or fails validation.
209
287
  */
210
- export async function loadLesson(projectRoot, lessonId) {
288
+ export async function loadLesson(projectRoot, lessonId, namespace) {
211
289
  let raw;
212
290
  try {
213
- raw = await readFile(lessonPath(projectRoot, lessonId), "utf-8");
291
+ raw = await readFile(lessonPath(projectRoot, lessonId, namespace), "utf-8");
214
292
  }
215
293
  catch {
216
- throw new Error(`Lesson not found: ${lessonId} (path: ${lessonPath(projectRoot, lessonId)})`);
294
+ throw new Error(`Lesson not found: ${lessonId} (path: ${lessonPath(projectRoot, lessonId, namespace)})`);
217
295
  }
218
296
  const meta = parseLessonFrontMatter(raw);
219
297
  if (meta === null) {
@@ -1 +1 @@
1
- {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/state/memory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/state/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Write a paused.json marker for the given runId.
3
+ *
4
+ * Security: validates runId is a safe path segment BEFORE building any path.
5
+ * Throws with a clear message if runId is unsafe (caller should surface to user).
6
+ *
7
+ * Write is atomic via temp-file + rename (mirrors run-state.ts:41-52).
8
+ */
9
+ export declare function setPaused(projectRoot: string, runId: string): Promise<void>;
10
+ /**
11
+ * Remove the paused.json marker for the given runId.
12
+ *
13
+ * Best-effort: never throws (idempotent — no-op if already gone).
14
+ * Mirrors approval-state.ts:deletePending.
15
+ */
16
+ export declare function clearPaused(projectRoot: string, runId: string): Promise<void>;
17
+ /**
18
+ * Return true if paused.json exists for the given runId.
19
+ *
20
+ * Returns false for missing file or unsafe runId — never throws.
21
+ * Mirrors guidance.ts:hasRunDir shape.
22
+ */
23
+ export declare function isPaused(projectRoot: string, runId: string): Promise<boolean>;
24
+ export interface WaitWhilePausedOptions {
25
+ /** Poll interval in ms. Defaults to 2000. Inject a low value in tests. */
26
+ pollMs?: number;
27
+ /** Maximum wait before resolving (continuing). Capped at MAX_TIMEOUT_MS (7d). */
28
+ timeoutMs?: number;
29
+ /** Clock injection for deterministic tests. Defaults to () => Date.now(). */
30
+ now?: () => number;
31
+ }
32
+ /**
33
+ * Block at a checkpoint boundary while paused.json is present for the runId.
34
+ *
35
+ * - First check is INLINE before any setTimeout so the no-marker path
36
+ * resolves immediately with zero scheduled ticks (sc-5-7 additive no-op).
37
+ * - While the marker is present, polls every pollMs ms (clock-injected so
38
+ * tests never wait real time — models disk.ts:104-176).
39
+ * - Resolves (continues) on timeout rather than rejecting — a forgotten
40
+ * paused.json must not hang the pipeline forever.
41
+ *
42
+ * bober: bounded poll; if paused.json is never removed the gate resolves
43
+ * after timeoutMs (capped at 7d) — upgrade path: expose a resume
44
+ * event channel instead of polling if sub-second responsiveness needed.
45
+ */
46
+ export declare function waitWhilePaused(projectRoot: string, runId: string, opts?: WaitWhilePausedOptions): Promise<void>;
47
+ //# sourceMappingURL=pause.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pause.d.ts","sourceRoot":"","sources":["../../src/state/pause.ts"],"names":[],"mappings":"AA2CA;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBjF;AAID;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGnF;AAID;;;;;GAKG;AACH,wBAAsB,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQnF;AAID,MAAM,WAAW,sBAAsB;IACrC,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAID;;;;;;;;;;;;;GAaG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,sBAA2B,GAChC,OAAO,CAAC,IAAI,CAAC,CAgDf"}
@@ -0,0 +1,146 @@
1
+ // ── pause.ts ───────────────────────────────────────────────────────────
2
+ //
3
+ // Disk-marker helpers for the runId-keyed SOFT-PAUSE channel.
4
+ //
5
+ // Layout: .bober/runs/<runId>/paused.json → { pausedAt: string }
6
+ //
7
+ // Every write is atomic via temp-file + rename
8
+ // (mirrors src/state/run-state.ts:41-52 atomic write pattern).
9
+ //
10
+ // The cooperative poll helper waitWhilePaused models the bounded poll loop
11
+ // from DiskCheckpointMechanism.request (disk.ts:104-176) with an injected
12
+ // clock so tests never sleep.
13
+ import { writeFile, unlink, rename, access } from "node:fs/promises";
14
+ import { constants } from "node:fs";
15
+ import { randomBytes } from "node:crypto";
16
+ import { join } from "node:path";
17
+ import { ensureDir } from "./helpers.js";
18
+ import { safeSegment } from "./guidance.js";
19
+ // ── Constants ─────────────────────────────────────────────────────────
20
+ const DEFAULT_POLL_MS = 2000;
21
+ const DEFAULT_TIMEOUT_MS = 24 * 60 * 60 * 1000; // 24 hours
22
+ const MAX_TIMEOUT_MS = 7 * 24 * 60 * 60 * 1000; // 7 days cap
23
+ // ── Path helpers ──────────────────────────────────────────────────────
24
+ function runsRoot(projectRoot) {
25
+ return join(projectRoot, ".bober", "runs");
26
+ }
27
+ function runDir(projectRoot, runId) {
28
+ return join(runsRoot(projectRoot), runId);
29
+ }
30
+ function pausePath(projectRoot, runId) {
31
+ return join(runDir(projectRoot, runId), "paused.json");
32
+ }
33
+ // ── Marker write (atomic) ─────────────────────────────────────────────
34
+ /**
35
+ * Write a paused.json marker for the given runId.
36
+ *
37
+ * Security: validates runId is a safe path segment BEFORE building any path.
38
+ * Throws with a clear message if runId is unsafe (caller should surface to user).
39
+ *
40
+ * Write is atomic via temp-file + rename (mirrors run-state.ts:41-52).
41
+ */
42
+ export async function setPaused(projectRoot, runId) {
43
+ if (!safeSegment(runId)) {
44
+ throw new Error(`Invalid runId "${runId}": must be a safe path segment (no path separators, no '..').`);
45
+ }
46
+ await ensureDir(runDir(projectRoot, runId));
47
+ const filePath = pausePath(projectRoot, runId);
48
+ const rnd = randomBytes(4).toString("hex");
49
+ const tmp = `${filePath}.${process.pid}.${Date.now()}.${rnd}.tmp`;
50
+ await writeFile(tmp, JSON.stringify({ pausedAt: new Date().toISOString() }) + "\n", { encoding: "utf-8", mode: 0o600 });
51
+ await rename(tmp, filePath);
52
+ }
53
+ // ── Marker clear (best-effort) ─────────────────────────────────────────
54
+ /**
55
+ * Remove the paused.json marker for the given runId.
56
+ *
57
+ * Best-effort: never throws (idempotent — no-op if already gone).
58
+ * Mirrors approval-state.ts:deletePending.
59
+ */
60
+ export async function clearPaused(projectRoot, runId) {
61
+ if (!safeSegment(runId))
62
+ return; // best-effort — unsafe id → skip silently
63
+ await unlink(pausePath(projectRoot, runId)).catch(() => { });
64
+ }
65
+ // ── Existence check ───────────────────────────────────────────────────
66
+ /**
67
+ * Return true if paused.json exists for the given runId.
68
+ *
69
+ * Returns false for missing file or unsafe runId — never throws.
70
+ * Mirrors guidance.ts:hasRunDir shape.
71
+ */
72
+ export async function isPaused(projectRoot, runId) {
73
+ if (!safeSegment(runId))
74
+ return false;
75
+ try {
76
+ await access(pausePath(projectRoot, runId), constants.R_OK);
77
+ return true;
78
+ }
79
+ catch {
80
+ return false;
81
+ }
82
+ }
83
+ // ── Cooperative pause gate ────────────────────────────────────────────
84
+ /**
85
+ * Block at a checkpoint boundary while paused.json is present for the runId.
86
+ *
87
+ * - First check is INLINE before any setTimeout so the no-marker path
88
+ * resolves immediately with zero scheduled ticks (sc-5-7 additive no-op).
89
+ * - While the marker is present, polls every pollMs ms (clock-injected so
90
+ * tests never wait real time — models disk.ts:104-176).
91
+ * - Resolves (continues) on timeout rather than rejecting — a forgotten
92
+ * paused.json must not hang the pipeline forever.
93
+ *
94
+ * bober: bounded poll; if paused.json is never removed the gate resolves
95
+ * after timeoutMs (capped at 7d) — upgrade path: expose a resume
96
+ * event channel instead of polling if sub-second responsiveness needed.
97
+ */
98
+ export async function waitWhilePaused(projectRoot, runId, opts = {}) {
99
+ const pollMs = opts.pollMs ?? DEFAULT_POLL_MS;
100
+ const timeoutMs = Math.min(opts.timeoutMs ?? DEFAULT_TIMEOUT_MS, MAX_TIMEOUT_MS);
101
+ const now = opts.now ?? (() => Date.now());
102
+ // ── Inline first check (sc-5-7: no-marker → immediate return, zero ticks) ─
103
+ const paused = await isPaused(projectRoot, runId);
104
+ if (!paused)
105
+ return;
106
+ // ── Poll until the marker is gone or we time out ──────────────────────
107
+ const startedAt = now();
108
+ let pollHandle;
109
+ try {
110
+ await new Promise((resolve, reject) => {
111
+ const tick = async () => {
112
+ try {
113
+ const stillPaused = await isPaused(projectRoot, runId);
114
+ if (!stillPaused) {
115
+ resolve();
116
+ return;
117
+ }
118
+ // Check timeout (clock-injected — deterministic in tests)
119
+ if (now() - startedAt >= timeoutMs) {
120
+ // Resolve rather than reject — a timed-out pause must not crash the pipeline
121
+ resolve();
122
+ return;
123
+ }
124
+ // Schedule next tick
125
+ pollHandle = setTimeout(() => {
126
+ tick().catch(reject);
127
+ }, pollMs);
128
+ }
129
+ catch (err) {
130
+ reject(err);
131
+ }
132
+ };
133
+ // Start polling
134
+ pollHandle = setTimeout(() => {
135
+ tick().catch(reject);
136
+ }, pollMs);
137
+ });
138
+ }
139
+ finally {
140
+ // Never leak timers
141
+ if (pollHandle !== undefined) {
142
+ clearTimeout(pollHandle);
143
+ }
144
+ }
145
+ }
146
+ //# sourceMappingURL=pause.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pause.js","sourceRoot":"","sources":["../../src/state/pause.ts"],"names":[],"mappings":"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"}
@@ -24,4 +24,12 @@ export declare function listContracts(projectRoot: string): Promise<SprintContra
24
24
  * Update an existing contract (save with the same contractId).
25
25
  */
26
26
  export declare function updateContract(projectRoot: string, contract: SprintContract): Promise<void>;
27
+ /**
28
+ * Delete all contract files in `.bober/contracts/` whose parsed `specId`
29
+ * matches the given specId. Other specs' contracts are left untouched.
30
+ *
31
+ * Silently ignores missing directories, unreadable files, and non-JSON
32
+ * files so that a partial state never aborts a re-plan.
33
+ */
34
+ export declare function clearContractsForSpec(projectRoot: string, specId: string): Promise<void>;
27
35
  //# sourceMappingURL=sprint-state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sprint-state.d.ts","sourceRoot":"","sources":["../../src/state/sprint-state.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,iCAAiC,CAAC;AAqBzC;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,cAAc,CAAC,CA+BzB;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,cAAc,EAAE,CAAC,CAgC3B;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC,CAEf"}
1
+ {"version":3,"file":"sprint-state.d.ts","sourceRoot":"","sources":["../../src/state/sprint-state.ts"],"names":[],"mappings":"AAKA,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,iCAAiC,CAAC;AAqBzC;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,cAAc,CAAC,CA+BzB;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,cAAc,EAAE,CAAC,CAgC3B;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAsBf"}
@@ -1,4 +1,4 @@
1
- import { readFile, writeFile, readdir } from "node:fs/promises";
1
+ import { readFile, writeFile, readdir, unlink } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
3
  import { SprintContractSchema, findPrecisionIssues, } from "../contracts/sprint-contract.js";
4
4
  import { ensureDir } from "./helpers.js";
@@ -109,4 +109,35 @@ export async function listContracts(projectRoot) {
109
109
  export async function updateContract(projectRoot, contract) {
110
110
  await saveContract(projectRoot, contract);
111
111
  }
112
+ /**
113
+ * Delete all contract files in `.bober/contracts/` whose parsed `specId`
114
+ * matches the given specId. Other specs' contracts are left untouched.
115
+ *
116
+ * Silently ignores missing directories, unreadable files, and non-JSON
117
+ * files so that a partial state never aborts a re-plan.
118
+ */
119
+ export async function clearContractsForSpec(projectRoot, specId) {
120
+ const dir = contractsDir(projectRoot);
121
+ let entries;
122
+ try {
123
+ entries = await readdir(dir);
124
+ }
125
+ catch {
126
+ // Directory absent — nothing to clear.
127
+ return;
128
+ }
129
+ for (const file of entries.filter((f) => f.endsWith(".json"))) {
130
+ const filePath = join(dir, file);
131
+ try {
132
+ const raw = await readFile(filePath, "utf-8");
133
+ const body = JSON.parse(raw);
134
+ if (body.specId === specId) {
135
+ await unlink(filePath).catch(() => { });
136
+ }
137
+ }
138
+ catch {
139
+ // Skip unreadable or non-JSON files.
140
+ }
141
+ }
142
+ }
112
143
  //# sourceMappingURL=sprint-state.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sprint-state.js","sourceRoot":"","sources":["../../src/state/sprint-state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sprint-state.js","sourceRoot":"","sources":["../../src/state/sprint-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Team registry + resolver (Phase 4, Sprint 1).
3
+ *
4
+ * loadTeam(config, teamId?) returns a resolved Team. With no id (or 'programming')
5
+ * it returns the built-in programming team, reproducing today's provider routing
6
+ * (resolveRoleProviders), engine (resolveEngineName), and memory path (sentinel '').
7
+ */
8
+ import type { BoberConfig } from "../config/schema.js";
9
+ import type { Team } from "./types.js";
10
+ /**
11
+ * Resolve a Team from config. With no id (or id === 'programming') returns the
12
+ * built-in programming team. A config-declared team is built from its entry with
13
+ * partial provider overrides merged over the resolved defaults. An unknown id throws.
14
+ */
15
+ export declare function loadTeam(config: BoberConfig, teamId?: string): Team;
16
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/teams/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIvD,OAAO,KAAK,EAAQ,IAAI,EAAE,MAAM,YAAY,CAAC;AAiB7C;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAwBnE"}
@@ -0,0 +1,53 @@
1
+ import { resolveRoleProviders } from "../config/role-providers.js";
2
+ import { resolveEngineName } from "../orchestrator/workflow/selector.js";
3
+ // ── Role descriptors ─────────────────────────────────────────────────
4
+ /** The 7 RoleName values as descriptors. Order mirrors ALL_ROLES (role-providers.ts:38). */
5
+ const DEFAULT_ROLES = [
6
+ { name: "planner", displayName: "Planner" },
7
+ { name: "researcher", displayName: "Researcher" },
8
+ { name: "chat", displayName: "Chat" },
9
+ { name: "curator", displayName: "Curator" },
10
+ { name: "generator", displayName: "Generator" },
11
+ { name: "evaluator", displayName: "Evaluator" },
12
+ { name: "codeReview", displayName: "Code Reviewer" },
13
+ ];
14
+ // ── Resolver ─────────────────────────────────────────────────────────
15
+ /**
16
+ * Resolve a Team from config. With no id (or id === 'programming') returns the
17
+ * built-in programming team. A config-declared team is built from its entry with
18
+ * partial provider overrides merged over the resolved defaults. An unknown id throws.
19
+ */
20
+ export function loadTeam(config, teamId) {
21
+ // Built-in default path: no id or 'programming' -> programming team
22
+ if (teamId === undefined || teamId === "programming") {
23
+ return buildProgrammingTeam(config);
24
+ }
25
+ const entry = config.teams?.[teamId];
26
+ if (!entry) {
27
+ throw new Error(`Unknown team '${teamId}'. Declare it under config.teams or use the built-in 'programming' team.`);
28
+ }
29
+ const resolvedDefaults = resolveRoleProviders(config);
30
+ return {
31
+ id: teamId,
32
+ displayName: entry.displayName ?? teamId,
33
+ memoryNamespace: entry.memoryNamespace ?? teamId,
34
+ // partial override: unspecified roles keep the resolved default
35
+ providers: { ...resolvedDefaults, ...(entry.providers ?? {}) },
36
+ pipelineShape: entry.pipelineShape ?? resolveEngineName(config),
37
+ roles: DEFAULT_ROLES,
38
+ guardrails: entry.guardrails,
39
+ };
40
+ }
41
+ // ── Built-in teams ───────────────────────────────────────────────────
42
+ function buildProgrammingTeam(config) {
43
+ return {
44
+ id: "programming",
45
+ displayName: "Programming team",
46
+ memoryNamespace: "", // bober: sentinel for current .bober/memory/ path; Sprint 2 maps '' -> that path
47
+ providers: resolveRoleProviders(config),
48
+ pipelineShape: resolveEngineName(config),
49
+ roles: DEFAULT_ROLES,
50
+ guardrails: undefined,
51
+ };
52
+ }
53
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/teams/registry.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAGzE,wEAAwE;AAExE,4FAA4F;AAC5F,MAAM,aAAa,GAAW;IAC5B,EAAE,IAAI,EAAE,SAAS,EAAK,WAAW,EAAE,SAAS,EAAE;IAC9C,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE;IACjD,EAAE,IAAI,EAAE,MAAM,EAAQ,WAAW,EAAE,MAAM,EAAE;IAC3C,EAAE,IAAI,EAAE,SAAS,EAAK,WAAW,EAAE,SAAS,EAAE;IAC9C,EAAE,IAAI,EAAE,WAAW,EAAG,WAAW,EAAE,WAAW,EAAE;IAChD,EAAE,IAAI,EAAE,WAAW,EAAG,WAAW,EAAE,WAAW,EAAE;IAChD,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE;CACrD,CAAC;AAEF,wEAAwE;AAExE;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAmB,EAAE,MAAe;IAC3D,oEAAoE;IACpE,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;QACrD,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,iBAAiB,MAAM,0EAA0E,CAClG,CAAC;IACJ,CAAC;IAED,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACtD,OAAO;QACL,EAAE,EAAE,MAAM;QACV,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,MAAM;QACxC,eAAe,EAAE,KAAK,CAAC,eAAe,IAAI,MAAM;QAChD,gEAAgE;QAChE,SAAS,EAAE,EAAE,GAAG,gBAAgB,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,EAA8B;QAC1F,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,iBAAiB,CAAC,MAAM,CAAC;QAC/D,KAAK,EAAE,aAAa;QACpB,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAC;AACJ,CAAC;AAED,wEAAwE;AAExE,SAAS,oBAAoB,CAAC,MAAmB;IAC/C,OAAO;QACL,EAAE,EAAE,aAAa;QACjB,WAAW,EAAE,kBAAkB;QAC/B,eAAe,EAAE,EAAE,EAAE,iFAAiF;QACtG,SAAS,EAAE,oBAAoB,CAAC,MAAM,CAAC;QACvC,aAAa,EAAE,iBAAiB,CAAC,MAAM,CAAC;QACxC,KAAK,EAAE,aAAa;QACpB,UAAU,EAAE,SAAS;KACtB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Team data model for the domain-agnostic team abstraction (Phase 4).
3
+ *
4
+ * Sprint 1: pure data types only. A Team is the resolved shape the pipeline
5
+ * needs; loadTeam (registry.ts) builds it from a BoberConfig. No execution
6
+ * logic lives here.
7
+ */
8
+ import type { RoleName, RoleProviderMap } from "../config/role-providers.js";
9
+ import type { PipelineEngineName } from "../orchestrator/workflow/engine.js";
10
+ /** Descriptor metadata for one of the 7 RoleName values. Does NOT drive execution this sprint. */
11
+ export interface Role {
12
+ name: RoleName;
13
+ displayName: string;
14
+ }
15
+ export interface Team {
16
+ id: string;
17
+ displayName: string;
18
+ /** Sentinel ('' for the built-in programming team) that Sprint 2 maps to .bober/memory/. */
19
+ memoryNamespace: string;
20
+ providers: RoleProviderMap;
21
+ pipelineShape: PipelineEngineName;
22
+ roles: Role[];
23
+ guardrails?: unknown;
24
+ }
25
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/teams/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAI7E,kGAAkG;AAClG,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAID,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,4FAA4F;IAC5F,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,eAAe,CAAC;IAC3B,aAAa,EAAE,kBAAkB,CAAC;IAClC,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/teams/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-bober",
3
- "version": "0.17.1",
3
+ "version": "0.18.0",
4
4
  "description": "Multi-agent harness for building applications autonomously with any LLM. Researcher, Planner, Curator, Generator, Evaluator, Documenter pipeline. Supports Claude, GPT, Gemini, DeepSeek, Ollama, and Claude Code subscriptions. MCP server for Cursor/Windsurf.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -62,6 +62,7 @@
62
62
  "dependencies": {
63
63
  "@anthropic-ai/sdk": "^0.100.1",
64
64
  "@modelcontextprotocol/sdk": "^1.28.0",
65
+ "better-sqlite3": "^11.9.1",
65
66
  "chalk": "^5.4.1",
66
67
  "commander": "^13.1.0",
67
68
  "execa": "^9.5.2",
@@ -86,6 +87,7 @@
86
87
  },
87
88
  "devDependencies": {
88
89
  "@eslint/js": "^10.0.1",
90
+ "@types/better-sqlite3": "^7.6.13",
89
91
  "@types/node": "^22.13.0",
90
92
  "@types/prompts": "^2.4.9",
91
93
  "@types/semver": "^7.7.1",