agent-bober 0.12.0 → 0.15.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 (518) hide show
  1. package/CHANGELOG.md +213 -0
  2. package/README.md +112 -3
  3. package/agents/bober-architect.md +38 -0
  4. package/agents/bober-code-reviewer.md +236 -0
  5. package/agents/bober-curator.md +37 -0
  6. package/agents/bober-deployer.md +267 -0
  7. package/agents/bober-diagnoser.md +289 -0
  8. package/agents/bober-evaluator.md +89 -1
  9. package/agents/bober-generator.md +68 -3
  10. package/agents/bober-planner.md +39 -0
  11. package/agents/bober-postmortemer.md +185 -0
  12. package/agents/bober-researcher.md +38 -0
  13. package/dist/cli/commands/approve.d.ts +17 -0
  14. package/dist/cli/commands/approve.d.ts.map +1 -0
  15. package/dist/cli/commands/approve.js +64 -0
  16. package/dist/cli/commands/approve.js.map +1 -0
  17. package/dist/cli/commands/audit-show.d.ts +14 -0
  18. package/dist/cli/commands/audit-show.d.ts.map +1 -0
  19. package/dist/cli/commands/audit-show.js +85 -0
  20. package/dist/cli/commands/audit-show.js.map +1 -0
  21. package/dist/cli/commands/config.d.ts +10 -0
  22. package/dist/cli/commands/config.d.ts.map +1 -0
  23. package/dist/cli/commands/config.js +73 -0
  24. package/dist/cli/commands/config.js.map +1 -0
  25. package/dist/cli/commands/graph.d.ts +8 -0
  26. package/dist/cli/commands/graph.d.ts.map +1 -0
  27. package/dist/cli/commands/graph.js +219 -0
  28. package/dist/cli/commands/graph.js.map +1 -0
  29. package/dist/cli/commands/impact.d.ts +19 -0
  30. package/dist/cli/commands/impact.d.ts.map +1 -0
  31. package/dist/cli/commands/impact.js +191 -0
  32. package/dist/cli/commands/impact.js.map +1 -0
  33. package/dist/cli/commands/incident.d.ts +19 -0
  34. package/dist/cli/commands/incident.d.ts.map +1 -0
  35. package/dist/cli/commands/incident.js +324 -0
  36. package/dist/cli/commands/incident.js.map +1 -0
  37. package/dist/cli/commands/init.js +36 -1
  38. package/dist/cli/commands/init.js.map +1 -1
  39. package/dist/cli/commands/list-approvals.d.ts +16 -0
  40. package/dist/cli/commands/list-approvals.d.ts.map +1 -0
  41. package/dist/cli/commands/list-approvals.js +57 -0
  42. package/dist/cli/commands/list-approvals.js.map +1 -0
  43. package/dist/cli/commands/onboard.d.ts +3 -0
  44. package/dist/cli/commands/onboard.d.ts.map +1 -0
  45. package/dist/cli/commands/onboard.js +190 -0
  46. package/dist/cli/commands/onboard.js.map +1 -0
  47. package/dist/cli/commands/playbook.d.ts +17 -0
  48. package/dist/cli/commands/playbook.d.ts.map +1 -0
  49. package/dist/cli/commands/playbook.js +123 -0
  50. package/dist/cli/commands/playbook.js.map +1 -0
  51. package/dist/cli/commands/postmortem.d.ts +12 -0
  52. package/dist/cli/commands/postmortem.d.ts.map +1 -0
  53. package/dist/cli/commands/postmortem.js +67 -0
  54. package/dist/cli/commands/postmortem.js.map +1 -0
  55. package/dist/cli/commands/reject.d.ts +17 -0
  56. package/dist/cli/commands/reject.d.ts.map +1 -0
  57. package/dist/cli/commands/reject.js +52 -0
  58. package/dist/cli/commands/reject.js.map +1 -0
  59. package/dist/cli/commands/rollback.d.ts +21 -0
  60. package/dist/cli/commands/rollback.d.ts.map +1 -0
  61. package/dist/cli/commands/rollback.js +90 -0
  62. package/dist/cli/commands/rollback.js.map +1 -0
  63. package/dist/cli/commands/run.d.ts +9 -0
  64. package/dist/cli/commands/run.d.ts.map +1 -1
  65. package/dist/cli/commands/run.js +29 -0
  66. package/dist/cli/commands/run.js.map +1 -1
  67. package/dist/cli/commands/telemetry.d.ts +16 -0
  68. package/dist/cli/commands/telemetry.d.ts.map +1 -0
  69. package/dist/cli/commands/telemetry.js +152 -0
  70. package/dist/cli/commands/telemetry.js.map +1 -0
  71. package/dist/cli/commands/worktree.d.ts +12 -0
  72. package/dist/cli/commands/worktree.d.ts.map +1 -0
  73. package/dist/cli/commands/worktree.js +57 -0
  74. package/dist/cli/commands/worktree.js.map +1 -0
  75. package/dist/cli/index.js +50 -0
  76. package/dist/cli/index.js.map +1 -1
  77. package/dist/config/defaults.d.ts.map +1 -1
  78. package/dist/config/defaults.js +27 -0
  79. package/dist/config/defaults.js.map +1 -1
  80. package/dist/config/index.d.ts +1 -1
  81. package/dist/config/index.d.ts.map +1 -1
  82. package/dist/config/index.js +4 -0
  83. package/dist/config/index.js.map +1 -1
  84. package/dist/config/loader.d.ts.map +1 -1
  85. package/dist/config/loader.js +18 -1
  86. package/dist/config/loader.js.map +1 -1
  87. package/dist/config/schema.d.ts +976 -56
  88. package/dist/config/schema.d.ts.map +1 -1
  89. package/dist/config/schema.js +147 -0
  90. package/dist/config/schema.js.map +1 -1
  91. package/dist/graph/artifact-store.d.ts +14 -0
  92. package/dist/graph/artifact-store.d.ts.map +1 -0
  93. package/dist/graph/artifact-store.js +100 -0
  94. package/dist/graph/artifact-store.js.map +1 -0
  95. package/dist/graph/cli.d.ts +49 -0
  96. package/dist/graph/cli.d.ts.map +1 -0
  97. package/dist/graph/cli.js +140 -0
  98. package/dist/graph/cli.js.map +1 -0
  99. package/dist/graph/client.d.ts +64 -0
  100. package/dist/graph/client.d.ts.map +1 -0
  101. package/dist/graph/client.js +216 -0
  102. package/dist/graph/client.js.map +1 -0
  103. package/dist/graph/fallback.d.ts +13 -0
  104. package/dist/graph/fallback.d.ts.map +1 -0
  105. package/dist/graph/fallback.js +57 -0
  106. package/dist/graph/fallback.js.map +1 -0
  107. package/dist/graph/hook-handler.d.ts +50 -0
  108. package/dist/graph/hook-handler.d.ts.map +1 -0
  109. package/dist/graph/hook-handler.js +217 -0
  110. package/dist/graph/hook-handler.js.map +1 -0
  111. package/dist/graph/incidents.d.ts +59 -0
  112. package/dist/graph/incidents.d.ts.map +1 -0
  113. package/dist/graph/incidents.js +22 -0
  114. package/dist/graph/incidents.js.map +1 -0
  115. package/dist/graph/mcp-client.d.ts +51 -0
  116. package/dist/graph/mcp-client.d.ts.map +1 -0
  117. package/dist/graph/mcp-client.js +285 -0
  118. package/dist/graph/mcp-client.js.map +1 -0
  119. package/dist/graph/onboarding-composer.d.ts +30 -0
  120. package/dist/graph/onboarding-composer.d.ts.map +1 -0
  121. package/dist/graph/onboarding-composer.js +275 -0
  122. package/dist/graph/onboarding-composer.js.map +1 -0
  123. package/dist/graph/pipeline-lifecycle.d.ts +86 -0
  124. package/dist/graph/pipeline-lifecycle.d.ts.map +1 -0
  125. package/dist/graph/pipeline-lifecycle.js +329 -0
  126. package/dist/graph/pipeline-lifecycle.js.map +1 -0
  127. package/dist/graph/preflight-budgets.d.ts +52 -0
  128. package/dist/graph/preflight-budgets.d.ts.map +1 -0
  129. package/dist/graph/preflight-budgets.js +78 -0
  130. package/dist/graph/preflight-budgets.js.map +1 -0
  131. package/dist/graph/preflight-injector.d.ts +116 -0
  132. package/dist/graph/preflight-injector.d.ts.map +1 -0
  133. package/dist/graph/preflight-injector.js +538 -0
  134. package/dist/graph/preflight-injector.js.map +1 -0
  135. package/dist/graph/prereq.d.ts +12 -0
  136. package/dist/graph/prereq.d.ts.map +1 -0
  137. package/dist/graph/prereq.js +61 -0
  138. package/dist/graph/prereq.js.map +1 -0
  139. package/dist/graph/prompts.d.ts +42 -0
  140. package/dist/graph/prompts.d.ts.map +1 -0
  141. package/dist/graph/prompts.js +80 -0
  142. package/dist/graph/prompts.js.map +1 -0
  143. package/dist/graph/sandbox.d.ts +19 -0
  144. package/dist/graph/sandbox.d.ts.map +1 -0
  145. package/dist/graph/sandbox.js +25 -0
  146. package/dist/graph/sandbox.js.map +1 -0
  147. package/dist/graph/token-usage.d.ts +21 -0
  148. package/dist/graph/token-usage.d.ts.map +1 -0
  149. package/dist/graph/token-usage.js +22 -0
  150. package/dist/graph/token-usage.js.map +1 -0
  151. package/dist/graph/types.d.ts +129 -0
  152. package/dist/graph/types.d.ts.map +1 -0
  153. package/dist/graph/types.js +12 -0
  154. package/dist/graph/types.js.map +1 -0
  155. package/dist/incident/orchestrator.d.ts +168 -0
  156. package/dist/incident/orchestrator.d.ts.map +1 -0
  157. package/dist/incident/orchestrator.js +279 -0
  158. package/dist/incident/orchestrator.js.map +1 -0
  159. package/dist/incident/playbook-search.d.ts +67 -0
  160. package/dist/incident/playbook-search.d.ts.map +1 -0
  161. package/dist/incident/playbook-search.js +288 -0
  162. package/dist/incident/playbook-search.js.map +1 -0
  163. package/dist/incident/postmortem.d.ts +44 -0
  164. package/dist/incident/postmortem.d.ts.map +1 -0
  165. package/dist/incident/postmortem.js +486 -0
  166. package/dist/incident/postmortem.js.map +1 -0
  167. package/dist/incident/resolution-verify.d.ts +186 -0
  168. package/dist/incident/resolution-verify.d.ts.map +1 -0
  169. package/dist/incident/resolution-verify.js +210 -0
  170. package/dist/incident/resolution-verify.js.map +1 -0
  171. package/dist/incident/rollback.d.ts +137 -0
  172. package/dist/incident/rollback.d.ts.map +1 -0
  173. package/dist/incident/rollback.js +328 -0
  174. package/dist/incident/rollback.js.map +1 -0
  175. package/dist/incident/timeline.d.ts +147 -0
  176. package/dist/incident/timeline.d.ts.map +1 -0
  177. package/dist/incident/timeline.js +452 -0
  178. package/dist/incident/timeline.js.map +1 -0
  179. package/dist/incident/types.d.ts +335 -0
  180. package/dist/incident/types.d.ts.map +1 -0
  181. package/dist/incident/types.js +158 -0
  182. package/dist/incident/types.js.map +1 -0
  183. package/dist/index.d.ts +1 -1
  184. package/dist/index.d.ts.map +1 -1
  185. package/dist/index.js +1 -1
  186. package/dist/index.js.map +1 -1
  187. package/dist/mcp/event-stream.d.ts +46 -0
  188. package/dist/mcp/event-stream.d.ts.map +1 -0
  189. package/dist/mcp/event-stream.js +421 -0
  190. package/dist/mcp/event-stream.js.map +1 -0
  191. package/dist/mcp/external-client.d.ts +38 -0
  192. package/dist/mcp/external-client.d.ts.map +1 -0
  193. package/dist/mcp/external-client.js +121 -0
  194. package/dist/mcp/external-client.js.map +1 -0
  195. package/dist/mcp/run-manager.d.ts +74 -9
  196. package/dist/mcp/run-manager.d.ts.map +1 -1
  197. package/dist/mcp/run-manager.js +127 -31
  198. package/dist/mcp/run-manager.js.map +1 -1
  199. package/dist/mcp/server.d.ts.map +1 -1
  200. package/dist/mcp/server.js +56 -0
  201. package/dist/mcp/server.js.map +1 -1
  202. package/dist/mcp/tools/abort-run.d.ts +2 -0
  203. package/dist/mcp/tools/abort-run.d.ts.map +1 -0
  204. package/dist/mcp/tools/abort-run.js +62 -0
  205. package/dist/mcp/tools/abort-run.js.map +1 -0
  206. package/dist/mcp/tools/anchor.js +1 -1
  207. package/dist/mcp/tools/anchor.js.map +1 -1
  208. package/dist/mcp/tools/approve-checkpoint.d.ts +2 -0
  209. package/dist/mcp/tools/approve-checkpoint.d.ts.map +1 -0
  210. package/dist/mcp/tools/approve-checkpoint.js +70 -0
  211. package/dist/mcp/tools/approve-checkpoint.js.map +1 -0
  212. package/dist/mcp/tools/brownfield.js +1 -1
  213. package/dist/mcp/tools/brownfield.js.map +1 -1
  214. package/dist/mcp/tools/get-project-state.d.ts +2 -0
  215. package/dist/mcp/tools/get-project-state.d.ts.map +1 -0
  216. package/dist/mcp/tools/get-project-state.js +107 -0
  217. package/dist/mcp/tools/get-project-state.js.map +1 -0
  218. package/dist/mcp/tools/get-run-status.d.ts +2 -0
  219. package/dist/mcp/tools/get-run-status.d.ts.map +1 -0
  220. package/dist/mcp/tools/get-run-status.js +40 -0
  221. package/dist/mcp/tools/get-run-status.js.map +1 -0
  222. package/dist/mcp/tools/graph-schemas.d.ts +100 -0
  223. package/dist/mcp/tools/graph-schemas.d.ts.map +1 -0
  224. package/dist/mcp/tools/graph-schemas.js +39 -0
  225. package/dist/mcp/tools/graph-schemas.js.map +1 -0
  226. package/dist/mcp/tools/graph.d.ts +19 -0
  227. package/dist/mcp/tools/graph.d.ts.map +1 -0
  228. package/dist/mcp/tools/graph.js +263 -0
  229. package/dist/mcp/tools/graph.js.map +1 -0
  230. package/dist/mcp/tools/incident.d.ts +2 -0
  231. package/dist/mcp/tools/incident.d.ts.map +1 -0
  232. package/dist/mcp/tools/incident.js +246 -0
  233. package/dist/mcp/tools/incident.js.map +1 -0
  234. package/dist/mcp/tools/index.d.ts +38 -18
  235. package/dist/mcp/tools/index.d.ts.map +1 -1
  236. package/dist/mcp/tools/index.js +74 -18
  237. package/dist/mcp/tools/index.js.map +1 -1
  238. package/dist/mcp/tools/list-active-runs.d.ts +2 -0
  239. package/dist/mcp/tools/list-active-runs.d.ts.map +1 -0
  240. package/dist/mcp/tools/list-active-runs.js +35 -0
  241. package/dist/mcp/tools/list-active-runs.js.map +1 -0
  242. package/dist/mcp/tools/list-pending-approvals.d.ts +2 -0
  243. package/dist/mcp/tools/list-pending-approvals.d.ts.map +1 -0
  244. package/dist/mcp/tools/list-pending-approvals.js +40 -0
  245. package/dist/mcp/tools/list-pending-approvals.js.map +1 -0
  246. package/dist/mcp/tools/list-projects.d.ts +2 -0
  247. package/dist/mcp/tools/list-projects.d.ts.map +1 -0
  248. package/dist/mcp/tools/list-projects.js +101 -0
  249. package/dist/mcp/tools/list-projects.js.map +1 -0
  250. package/dist/mcp/tools/list-specs.d.ts +2 -0
  251. package/dist/mcp/tools/list-specs.d.ts.map +1 -0
  252. package/dist/mcp/tools/list-specs.js +48 -0
  253. package/dist/mcp/tools/list-specs.js.map +1 -0
  254. package/dist/mcp/tools/playbook.d.ts +2 -0
  255. package/dist/mcp/tools/playbook.d.ts.map +1 -0
  256. package/dist/mcp/tools/playbook.js +104 -0
  257. package/dist/mcp/tools/playbook.js.map +1 -0
  258. package/dist/mcp/tools/postmortem.d.ts +2 -0
  259. package/dist/mcp/tools/postmortem.d.ts.map +1 -0
  260. package/dist/mcp/tools/postmortem.js +75 -0
  261. package/dist/mcp/tools/postmortem.js.map +1 -0
  262. package/dist/mcp/tools/react.js +1 -1
  263. package/dist/mcp/tools/react.js.map +1 -1
  264. package/dist/mcp/tools/reject-checkpoint.d.ts +2 -0
  265. package/dist/mcp/tools/reject-checkpoint.d.ts.map +1 -0
  266. package/dist/mcp/tools/reject-checkpoint.js +79 -0
  267. package/dist/mcp/tools/reject-checkpoint.js.map +1 -0
  268. package/dist/mcp/tools/rollback.d.ts +2 -0
  269. package/dist/mcp/tools/rollback.d.ts.map +1 -0
  270. package/dist/mcp/tools/rollback.js +78 -0
  271. package/dist/mcp/tools/rollback.js.map +1 -0
  272. package/dist/mcp/tools/run-in-worktree.d.ts +2 -0
  273. package/dist/mcp/tools/run-in-worktree.d.ts.map +1 -0
  274. package/dist/mcp/tools/run-in-worktree.js +90 -0
  275. package/dist/mcp/tools/run-in-worktree.js.map +1 -0
  276. package/dist/mcp/tools/run.js +1 -1
  277. package/dist/mcp/tools/run.js.map +1 -1
  278. package/dist/mcp/tools/solidity.js +1 -1
  279. package/dist/mcp/tools/solidity.js.map +1 -1
  280. package/dist/mcp/tools/status.d.ts.map +1 -1
  281. package/dist/mcp/tools/status.js +11 -0
  282. package/dist/mcp/tools/status.js.map +1 -1
  283. package/dist/mcp/tools/subscribe-events.d.ts +2 -0
  284. package/dist/mcp/tools/subscribe-events.d.ts.map +1 -0
  285. package/dist/mcp/tools/subscribe-events.js +48 -0
  286. package/dist/mcp/tools/subscribe-events.js.map +1 -0
  287. package/dist/mcp/tools/unsubscribe-events.d.ts +2 -0
  288. package/dist/mcp/tools/unsubscribe-events.d.ts.map +1 -0
  289. package/dist/mcp/tools/unsubscribe-events.js +45 -0
  290. package/dist/mcp/tools/unsubscribe-events.js.map +1 -0
  291. package/dist/orchestrator/agent-loader.d.ts +16 -0
  292. package/dist/orchestrator/agent-loader.d.ts.map +1 -1
  293. package/dist/orchestrator/agent-loader.js +16 -0
  294. package/dist/orchestrator/agent-loader.js.map +1 -1
  295. package/dist/orchestrator/architect-agent.d.ts.map +1 -1
  296. package/dist/orchestrator/architect-agent.js +37 -8
  297. package/dist/orchestrator/architect-agent.js.map +1 -1
  298. package/dist/orchestrator/checkpoints/audit.d.ts +128 -0
  299. package/dist/orchestrator/checkpoints/audit.d.ts.map +1 -0
  300. package/dist/orchestrator/checkpoints/audit.js +272 -0
  301. package/dist/orchestrator/checkpoints/audit.js.map +1 -0
  302. package/dist/orchestrator/checkpoints/feedback-router.d.ts +213 -0
  303. package/dist/orchestrator/checkpoints/feedback-router.d.ts.map +1 -0
  304. package/dist/orchestrator/checkpoints/feedback-router.js +438 -0
  305. package/dist/orchestrator/checkpoints/feedback-router.js.map +1 -0
  306. package/dist/orchestrator/checkpoints/index.d.ts +11 -0
  307. package/dist/orchestrator/checkpoints/index.d.ts.map +1 -0
  308. package/dist/orchestrator/checkpoints/index.js +12 -0
  309. package/dist/orchestrator/checkpoints/index.js.map +1 -0
  310. package/dist/orchestrator/checkpoints/mechanisms/cli.d.ts +35 -0
  311. package/dist/orchestrator/checkpoints/mechanisms/cli.d.ts.map +1 -0
  312. package/dist/orchestrator/checkpoints/mechanisms/cli.js +153 -0
  313. package/dist/orchestrator/checkpoints/mechanisms/cli.js.map +1 -0
  314. package/dist/orchestrator/checkpoints/mechanisms/disk.d.ts +34 -0
  315. package/dist/orchestrator/checkpoints/mechanisms/disk.d.ts.map +1 -0
  316. package/dist/orchestrator/checkpoints/mechanisms/disk.js +139 -0
  317. package/dist/orchestrator/checkpoints/mechanisms/disk.js.map +1 -0
  318. package/dist/orchestrator/checkpoints/mechanisms/pr.d.ts +141 -0
  319. package/dist/orchestrator/checkpoints/mechanisms/pr.d.ts.map +1 -0
  320. package/dist/orchestrator/checkpoints/mechanisms/pr.js +445 -0
  321. package/dist/orchestrator/checkpoints/mechanisms/pr.js.map +1 -0
  322. package/dist/orchestrator/checkpoints/noop.d.ts +12 -0
  323. package/dist/orchestrator/checkpoints/noop.d.ts.map +1 -0
  324. package/dist/orchestrator/checkpoints/noop.js +13 -0
  325. package/dist/orchestrator/checkpoints/noop.js.map +1 -0
  326. package/dist/orchestrator/checkpoints/registry.d.ts +48 -0
  327. package/dist/orchestrator/checkpoints/registry.d.ts.map +1 -0
  328. package/dist/orchestrator/checkpoints/registry.js +89 -0
  329. package/dist/orchestrator/checkpoints/registry.js.map +1 -0
  330. package/dist/orchestrator/checkpoints/renderers/_util.d.ts +50 -0
  331. package/dist/orchestrator/checkpoints/renderers/_util.d.ts.map +1 -0
  332. package/dist/orchestrator/checkpoints/renderers/_util.js +137 -0
  333. package/dist/orchestrator/checkpoints/renderers/_util.js.map +1 -0
  334. package/dist/orchestrator/checkpoints/renderers/code-review.d.ts +15 -0
  335. package/dist/orchestrator/checkpoints/renderers/code-review.d.ts.map +1 -0
  336. package/dist/orchestrator/checkpoints/renderers/code-review.js +66 -0
  337. package/dist/orchestrator/checkpoints/renderers/code-review.js.map +1 -0
  338. package/dist/orchestrator/checkpoints/renderers/curator-briefing.d.ts +15 -0
  339. package/dist/orchestrator/checkpoints/renderers/curator-briefing.d.ts.map +1 -0
  340. package/dist/orchestrator/checkpoints/renderers/curator-briefing.js +40 -0
  341. package/dist/orchestrator/checkpoints/renderers/curator-briefing.js.map +1 -0
  342. package/dist/orchestrator/checkpoints/renderers/eval-result.d.ts +15 -0
  343. package/dist/orchestrator/checkpoints/renderers/eval-result.d.ts.map +1 -0
  344. package/dist/orchestrator/checkpoints/renderers/eval-result.js +54 -0
  345. package/dist/orchestrator/checkpoints/renderers/eval-result.js.map +1 -0
  346. package/dist/orchestrator/checkpoints/renderers/generator-diff.d.ts +49 -0
  347. package/dist/orchestrator/checkpoints/renderers/generator-diff.d.ts.map +1 -0
  348. package/dist/orchestrator/checkpoints/renderers/generator-diff.js +154 -0
  349. package/dist/orchestrator/checkpoints/renderers/generator-diff.js.map +1 -0
  350. package/dist/orchestrator/checkpoints/renderers/pipeline-summary.d.ts +15 -0
  351. package/dist/orchestrator/checkpoints/renderers/pipeline-summary.d.ts.map +1 -0
  352. package/dist/orchestrator/checkpoints/renderers/pipeline-summary.js +59 -0
  353. package/dist/orchestrator/checkpoints/renderers/pipeline-summary.js.map +1 -0
  354. package/dist/orchestrator/checkpoints/renderers/plan.d.ts +15 -0
  355. package/dist/orchestrator/checkpoints/renderers/plan.d.ts.map +1 -0
  356. package/dist/orchestrator/checkpoints/renderers/plan.js +34 -0
  357. package/dist/orchestrator/checkpoints/renderers/plan.js.map +1 -0
  358. package/dist/orchestrator/checkpoints/renderers/registry.d.ts +43 -0
  359. package/dist/orchestrator/checkpoints/renderers/registry.d.ts.map +1 -0
  360. package/dist/orchestrator/checkpoints/renderers/registry.js +83 -0
  361. package/dist/orchestrator/checkpoints/renderers/registry.js.map +1 -0
  362. package/dist/orchestrator/checkpoints/renderers/research.d.ts +15 -0
  363. package/dist/orchestrator/checkpoints/renderers/research.d.ts.map +1 -0
  364. package/dist/orchestrator/checkpoints/renderers/research.js +39 -0
  365. package/dist/orchestrator/checkpoints/renderers/research.js.map +1 -0
  366. package/dist/orchestrator/checkpoints/renderers/sprint-contract.d.ts +20 -0
  367. package/dist/orchestrator/checkpoints/renderers/sprint-contract.d.ts.map +1 -0
  368. package/dist/orchestrator/checkpoints/renderers/sprint-contract.js +57 -0
  369. package/dist/orchestrator/checkpoints/renderers/sprint-contract.js.map +1 -0
  370. package/dist/orchestrator/checkpoints/renderers/sprint-summary.d.ts +15 -0
  371. package/dist/orchestrator/checkpoints/renderers/sprint-summary.d.ts.map +1 -0
  372. package/dist/orchestrator/checkpoints/renderers/sprint-summary.js +38 -0
  373. package/dist/orchestrator/checkpoints/renderers/sprint-summary.js.map +1 -0
  374. package/dist/orchestrator/checkpoints/sites.d.ts +22 -0
  375. package/dist/orchestrator/checkpoints/sites.d.ts.map +1 -0
  376. package/dist/orchestrator/checkpoints/sites.js +57 -0
  377. package/dist/orchestrator/checkpoints/sites.js.map +1 -0
  378. package/dist/orchestrator/checkpoints/types.d.ts +51 -0
  379. package/dist/orchestrator/checkpoints/types.d.ts.map +1 -0
  380. package/dist/orchestrator/checkpoints/types.js +9 -0
  381. package/dist/orchestrator/checkpoints/types.js.map +1 -0
  382. package/dist/orchestrator/code-reviewer-agent.d.ts +50 -0
  383. package/dist/orchestrator/code-reviewer-agent.d.ts.map +1 -0
  384. package/dist/orchestrator/code-reviewer-agent.js +283 -0
  385. package/dist/orchestrator/code-reviewer-agent.js.map +1 -0
  386. package/dist/orchestrator/curator-agent.d.ts.map +1 -1
  387. package/dist/orchestrator/curator-agent.js +59 -8
  388. package/dist/orchestrator/curator-agent.js.map +1 -1
  389. package/dist/orchestrator/deploy/classify.d.ts +31 -0
  390. package/dist/orchestrator/deploy/classify.d.ts.map +1 -0
  391. package/dist/orchestrator/deploy/classify.js +109 -0
  392. package/dist/orchestrator/deploy/classify.js.map +1 -0
  393. package/dist/orchestrator/deploy/execute.d.ts +45 -0
  394. package/dist/orchestrator/deploy/execute.d.ts.map +1 -0
  395. package/dist/orchestrator/deploy/execute.js +146 -0
  396. package/dist/orchestrator/deploy/execute.js.map +1 -0
  397. package/dist/orchestrator/deploy/executor.d.ts +22 -0
  398. package/dist/orchestrator/deploy/executor.d.ts.map +1 -0
  399. package/dist/orchestrator/deploy/executor.js +31 -0
  400. package/dist/orchestrator/deploy/executor.js.map +1 -0
  401. package/dist/orchestrator/deploy/index.d.ts +21 -0
  402. package/dist/orchestrator/deploy/index.d.ts.map +1 -0
  403. package/dist/orchestrator/deploy/index.js +21 -0
  404. package/dist/orchestrator/deploy/index.js.map +1 -0
  405. package/dist/orchestrator/deploy/resolve.d.ts +51 -0
  406. package/dist/orchestrator/deploy/resolve.d.ts.map +1 -0
  407. package/dist/orchestrator/deploy/resolve.js +53 -0
  408. package/dist/orchestrator/deploy/resolve.js.map +1 -0
  409. package/dist/orchestrator/deploy/spawn.d.ts +60 -0
  410. package/dist/orchestrator/deploy/spawn.d.ts.map +1 -0
  411. package/dist/orchestrator/deploy/spawn.js +62 -0
  412. package/dist/orchestrator/deploy/spawn.js.map +1 -0
  413. package/dist/orchestrator/deploy/types.d.ts +98 -0
  414. package/dist/orchestrator/deploy/types.d.ts.map +1 -0
  415. package/dist/orchestrator/deploy/types.js +39 -0
  416. package/dist/orchestrator/deploy/types.js.map +1 -0
  417. package/dist/orchestrator/evaluator-agent.d.ts.map +1 -1
  418. package/dist/orchestrator/evaluator-agent.js +21 -8
  419. package/dist/orchestrator/evaluator-agent.js.map +1 -1
  420. package/dist/orchestrator/generator-agent.d.ts.map +1 -1
  421. package/dist/orchestrator/generator-agent.js +21 -8
  422. package/dist/orchestrator/generator-agent.js.map +1 -1
  423. package/dist/orchestrator/model-resolver.d.ts.map +1 -1
  424. package/dist/orchestrator/model-resolver.js +3 -1
  425. package/dist/orchestrator/model-resolver.js.map +1 -1
  426. package/dist/orchestrator/observability/index.d.ts +12 -0
  427. package/dist/orchestrator/observability/index.d.ts.map +1 -0
  428. package/dist/orchestrator/observability/index.js +12 -0
  429. package/dist/orchestrator/observability/index.js.map +1 -0
  430. package/dist/orchestrator/observability/merge.d.ts +73 -0
  431. package/dist/orchestrator/observability/merge.d.ts.map +1 -0
  432. package/dist/orchestrator/observability/merge.js +110 -0
  433. package/dist/orchestrator/observability/merge.js.map +1 -0
  434. package/dist/orchestrator/pipeline.d.ts +21 -0
  435. package/dist/orchestrator/pipeline.d.ts.map +1 -1
  436. package/dist/orchestrator/pipeline.js +156 -2
  437. package/dist/orchestrator/pipeline.js.map +1 -1
  438. package/dist/orchestrator/planner-agent.d.ts.map +1 -1
  439. package/dist/orchestrator/planner-agent.js +5 -4
  440. package/dist/orchestrator/planner-agent.js.map +1 -1
  441. package/dist/orchestrator/research-agent.d.ts.map +1 -1
  442. package/dist/orchestrator/research-agent.js +46 -9
  443. package/dist/orchestrator/research-agent.js.map +1 -1
  444. package/dist/orchestrator/tools/handlers.d.ts +2 -0
  445. package/dist/orchestrator/tools/handlers.d.ts.map +1 -1
  446. package/dist/orchestrator/tools/handlers.js +1 -1
  447. package/dist/orchestrator/tools/handlers.js.map +1 -1
  448. package/dist/orchestrator/tools/index.d.ts +84 -1
  449. package/dist/orchestrator/tools/index.d.ts.map +1 -1
  450. package/dist/orchestrator/tools/index.js +164 -1
  451. package/dist/orchestrator/tools/index.js.map +1 -1
  452. package/dist/orchestrator/worktree.d.ts +18 -0
  453. package/dist/orchestrator/worktree.d.ts.map +1 -0
  454. package/dist/orchestrator/worktree.js +129 -0
  455. package/dist/orchestrator/worktree.js.map +1 -0
  456. package/dist/providers/anthropic.d.ts +8 -1
  457. package/dist/providers/anthropic.d.ts.map +1 -1
  458. package/dist/providers/anthropic.js +86 -5
  459. package/dist/providers/anthropic.js.map +1 -1
  460. package/dist/providers/factory.d.ts.map +1 -1
  461. package/dist/providers/factory.js +35 -2
  462. package/dist/providers/factory.js.map +1 -1
  463. package/dist/providers/google.d.ts.map +1 -1
  464. package/dist/providers/google.js +5 -0
  465. package/dist/providers/google.js.map +1 -1
  466. package/dist/providers/index.d.ts +1 -1
  467. package/dist/providers/index.d.ts.map +1 -1
  468. package/dist/providers/index.js.map +1 -1
  469. package/dist/providers/openai.d.ts.map +1 -1
  470. package/dist/providers/openai.js +4 -0
  471. package/dist/providers/openai.js.map +1 -1
  472. package/dist/providers/types.d.ts +25 -2
  473. package/dist/providers/types.d.ts.map +1 -1
  474. package/dist/state/approval-state.d.ts +74 -0
  475. package/dist/state/approval-state.d.ts.map +1 -0
  476. package/dist/state/approval-state.js +127 -0
  477. package/dist/state/approval-state.js.map +1 -0
  478. package/dist/state/index.d.ts +3 -0
  479. package/dist/state/index.d.ts.map +1 -1
  480. package/dist/state/index.js +4 -1
  481. package/dist/state/index.js.map +1 -1
  482. package/dist/state/review-state.d.ts +15 -0
  483. package/dist/state/review-state.d.ts.map +1 -0
  484. package/dist/state/review-state.js +51 -0
  485. package/dist/state/review-state.js.map +1 -0
  486. package/dist/state/run-state.d.ts +39 -0
  487. package/dist/state/run-state.d.ts.map +1 -0
  488. package/dist/state/run-state.js +101 -0
  489. package/dist/state/run-state.js.map +1 -0
  490. package/dist/telemetry/emit.d.ts +41 -0
  491. package/dist/telemetry/emit.d.ts.map +1 -0
  492. package/dist/telemetry/emit.js +65 -0
  493. package/dist/telemetry/emit.js.map +1 -0
  494. package/dist/utils/git.d.ts +27 -0
  495. package/dist/utils/git.d.ts.map +1 -1
  496. package/dist/utils/git.js +50 -0
  497. package/dist/utils/git.js.map +1 -1
  498. package/hooks/hooks.json +17 -1
  499. package/hooks/session-start +42 -0
  500. package/package.json +5 -2
  501. package/scripts/check-prereqs.sh +12 -0
  502. package/scripts/e2e-graph-smoke.sh +167 -0
  503. package/scripts/graph-hook.mjs +151 -0
  504. package/scripts/run-kpi-gate.mjs +245 -0
  505. package/scripts/sync-skills.mjs +4 -1
  506. package/skills/bober.code-review/SKILL.md +186 -0
  507. package/skills/bober.debug/SKILL.md +300 -0
  508. package/skills/bober.deploy/SKILL.md +262 -0
  509. package/skills/bober.diagnose/SKILL.md +254 -0
  510. package/skills/bober.graph/SKILL.md +85 -0
  511. package/skills/bober.impact/SKILL.md +101 -0
  512. package/skills/bober.incident/SKILL.md +245 -0
  513. package/skills/bober.onboard/SKILL.md +84 -0
  514. package/skills/bober.plan/SKILL.md +10 -0
  515. package/skills/bober.postmortem/SKILL.md +231 -0
  516. package/skills/bober.runbook/SKILL.md +335 -0
  517. package/skills/bober.using-bober/SKILL.md +133 -0
  518. package/skills/bober.verify/SKILL.md +143 -0
@@ -0,0 +1,421 @@
1
+ // ── EventStreamManager ──────────────────────────────────────────────
2
+ //
3
+ // Tails .bober/history.jsonl + .bober/telemetry/<date>.jsonl for matching
4
+ // runIds and forwards events as server-initiated MCP notifications.
5
+ //
6
+ // stdout-safety: all diagnostic output MUST go to process.stderr.
7
+ // The MCP stdio transport owns stdout; writing to stdout here would
8
+ // corrupt the JSON-RPC stream.
9
+ import { open as fsOpen, read as fsRead, close as fsClose, watch } from "node:fs";
10
+ import { readFile, stat, mkdir } from "node:fs/promises";
11
+ import { randomUUID } from "node:crypto";
12
+ import { join, dirname } from "node:path";
13
+ import { Buffer } from "node:buffer";
14
+ // ── Constants ────────────────────────────────────────────────────────
15
+ const NOTIF_EVENT = "bober/events";
16
+ const NOTIF_DROPPED = "bober/events.dropped";
17
+ // ── Helper: extract runId from a parsed JSONL record ────────────────
18
+ function extractRunId(rec) {
19
+ if (typeof rec !== "object" || rec === null)
20
+ return undefined;
21
+ const r = rec;
22
+ // Top-level runId field (telemetry events carry it here)
23
+ if (typeof r.runId === "string")
24
+ return r.runId;
25
+ // Nested under details (future history.jsonl writers may use this)
26
+ if (typeof r.details === "object" && r.details !== null) {
27
+ const d = r.details;
28
+ if (typeof d.runId === "string")
29
+ return d.runId;
30
+ }
31
+ return undefined;
32
+ }
33
+ // ── Helper: get today's telemetry file path ──────────────────────────
34
+ function todayTelemetryPath(projectRoot) {
35
+ const date = new Date().toISOString().slice(0, 10); // YYYY-MM-DD
36
+ return join(projectRoot, ".bober", "telemetry", `${date}.jsonl`);
37
+ }
38
+ // ── EventStreamManager ───────────────────────────────────────────────
39
+ export class EventStreamManager {
40
+ server;
41
+ projectRoot;
42
+ defaultQueueBound;
43
+ subscriptions = new Map();
44
+ /** FileWatch entries keyed by absolute path. */
45
+ fileWatches = new Map();
46
+ /**
47
+ * Map from subscriptionId → set of watched file paths.
48
+ * Used to release watches on unsubscribe.
49
+ */
50
+ subFiles = new Map();
51
+ /** Telemetry date-poll interval (detects date roll-overs). */
52
+ telemetryPollTimer = null;
53
+ /** Current date string (YYYY-MM-DD) used to detect roll-over. */
54
+ currentTelemetryDate = new Date().toISOString().slice(0, 10);
55
+ constructor(server, projectRoot, defaultQueueBound = 1000) {
56
+ this.server = server;
57
+ this.projectRoot = projectRoot;
58
+ this.defaultQueueBound = defaultQueueBound;
59
+ }
60
+ // ── Public API ───────────────────────────────────────────────────
61
+ async subscribe(runId, opts = {}) {
62
+ const subscriptionId = randomUUID();
63
+ const startedAt = new Date().toISOString();
64
+ const queueBound = opts.queueBound ?? this.defaultQueueBound;
65
+ const sub = {
66
+ subscriptionId,
67
+ runId,
68
+ startedAt,
69
+ queue: [],
70
+ queueBound,
71
+ droppedSinceLastDelivery: 0,
72
+ flushing: false,
73
+ };
74
+ this.subscriptions.set(subscriptionId, sub);
75
+ this.subFiles.set(subscriptionId, new Set());
76
+ // Watch history.jsonl
77
+ const historyPath = join(this.projectRoot, ".bober", "history.jsonl");
78
+ await this.openWatch(historyPath, subscriptionId);
79
+ // Watch telemetry/<today>.jsonl (may not exist yet — openWatch handles this)
80
+ const telemetryPath = todayTelemetryPath(this.projectRoot);
81
+ await this.openWatch(telemetryPath, subscriptionId);
82
+ // Start telemetry poll timer if not already running
83
+ this.ensureTelemetryPoller();
84
+ // Backfill: if `since` is provided, deliver pre-existing events
85
+ if (opts.since !== undefined) {
86
+ await this.backfill(sub, historyPath, opts.since);
87
+ await this.backfill(sub, telemetryPath, opts.since);
88
+ }
89
+ return { subscriptionId, status: "subscribed", startedAt };
90
+ }
91
+ unsubscribe(subscriptionId) {
92
+ const sub = this.subscriptions.get(subscriptionId);
93
+ if (!sub)
94
+ return { ok: false };
95
+ this.subscriptions.delete(subscriptionId);
96
+ const files = this.subFiles.get(subscriptionId) ?? new Set();
97
+ this.subFiles.delete(subscriptionId);
98
+ for (const filePath of files) {
99
+ this.releaseWatch(filePath);
100
+ }
101
+ return { ok: true };
102
+ }
103
+ shutdown() {
104
+ // Cancel telemetry poller
105
+ if (this.telemetryPollTimer !== null) {
106
+ clearInterval(this.telemetryPollTimer);
107
+ this.telemetryPollTimer = null;
108
+ }
109
+ // Close all watchers
110
+ for (const fw of this.fileWatches.values()) {
111
+ try {
112
+ fw.watcher.close();
113
+ }
114
+ catch { /* ignore */ }
115
+ }
116
+ this.fileWatches.clear();
117
+ this.subscriptions.clear();
118
+ this.subFiles.clear();
119
+ }
120
+ // ── Watcher management ──────────────────────────────────────────
121
+ async openWatch(filePath, subscriptionId) {
122
+ const subFileSet = this.subFiles.get(subscriptionId);
123
+ if (!subFileSet)
124
+ return; // subscription was already removed
125
+ subFileSet.add(filePath);
126
+ if (this.fileWatches.has(filePath)) {
127
+ // Already watching — just increment refCount
128
+ this.fileWatches.get(filePath).refCount++;
129
+ return;
130
+ }
131
+ // Determine the initial offset (end of file, so we only see NEW appends)
132
+ let initialOffset = 0;
133
+ try {
134
+ const s = await stat(filePath);
135
+ initialOffset = s.size;
136
+ }
137
+ catch {
138
+ // File doesn't exist yet; start at 0 so we catch it when it's created
139
+ }
140
+ // Ensure parent directory exists so fs.watch doesn't throw
141
+ const parentDir = dirname(filePath);
142
+ try {
143
+ await mkdir(parentDir, { recursive: true });
144
+ }
145
+ catch {
146
+ // ignore
147
+ }
148
+ // Attempt to watch. If the file doesn't exist, watch the parent directory
149
+ // for creation, then switch to watching the file once it appears.
150
+ const fw = {
151
+ path: filePath,
152
+ watcher: null, // assigned below
153
+ offset: initialOffset,
154
+ refCount: 1,
155
+ partialLine: "",
156
+ chain: Promise.resolve(),
157
+ };
158
+ this.fileWatches.set(filePath, fw);
159
+ try {
160
+ // Try watching the file directly first (works if file exists)
161
+ const fileExists = await this.fileExists(filePath);
162
+ if (fileExists) {
163
+ fw.watcher = this.createWatcher(filePath, fw);
164
+ }
165
+ else {
166
+ // Watch parent directory for file creation
167
+ fw.watcher = this.createParentWatcher(filePath, parentDir, fw);
168
+ }
169
+ }
170
+ catch (err) {
171
+ process.stderr.write(`[event-stream] Failed to watch ${filePath}: ${err instanceof Error ? err.message : String(err)}\n`);
172
+ // Remove the broken watch entry
173
+ this.fileWatches.delete(filePath);
174
+ subFileSet.delete(filePath);
175
+ }
176
+ }
177
+ createWatcher(filePath, fw) {
178
+ const watcher = watch(filePath, { persistent: false }, (_eventType) => {
179
+ fw.chain = fw.chain.then(() => this.onFileEvent(filePath)).catch(() => { });
180
+ });
181
+ watcher.unref?.();
182
+ return watcher;
183
+ }
184
+ createParentWatcher(filePath, parentDir, fw) {
185
+ const filename = filePath.slice(parentDir.length + 1);
186
+ const watcher = watch(parentDir, { persistent: false }, (_eventType, changedFile) => {
187
+ if (changedFile === filename) {
188
+ // File appeared — switch to file watcher
189
+ fw.chain = fw.chain.then(async () => {
190
+ const exists = await this.fileExists(filePath);
191
+ if (exists && this.fileWatches.has(filePath)) {
192
+ try {
193
+ fw.watcher.close();
194
+ }
195
+ catch { /* ignore */ }
196
+ fw.watcher = this.createWatcher(filePath, fw);
197
+ // Also read any content that appeared
198
+ await this.onFileEvent(filePath);
199
+ }
200
+ }).catch(() => { });
201
+ }
202
+ });
203
+ watcher.unref?.();
204
+ return watcher;
205
+ }
206
+ releaseWatch(filePath) {
207
+ const fw = this.fileWatches.get(filePath);
208
+ if (!fw)
209
+ return;
210
+ fw.refCount--;
211
+ if (fw.refCount <= 0) {
212
+ try {
213
+ fw.watcher.close();
214
+ }
215
+ catch { /* ignore */ }
216
+ this.fileWatches.delete(filePath);
217
+ }
218
+ }
219
+ // ── File reading ────────────────────────────────────────────────
220
+ async fileExists(filePath) {
221
+ try {
222
+ await stat(filePath);
223
+ return true;
224
+ }
225
+ catch {
226
+ return false;
227
+ }
228
+ }
229
+ async onFileEvent(filePath) {
230
+ const fw = this.fileWatches.get(filePath);
231
+ if (!fw)
232
+ return;
233
+ let fileStat;
234
+ try {
235
+ fileStat = await stat(filePath);
236
+ }
237
+ catch {
238
+ return; // file gone or not yet created
239
+ }
240
+ const fileSize = fileStat.size;
241
+ if (fileSize <= fw.offset)
242
+ return; // no new data (or truncated — ignore)
243
+ // Read only the new bytes
244
+ let newBytes;
245
+ try {
246
+ newBytes = await this.readFromOffset(filePath, fw.offset, fileSize - fw.offset);
247
+ }
248
+ catch {
249
+ return;
250
+ }
251
+ fw.offset = fileSize;
252
+ const rawText = fw.partialLine + newBytes.toString("utf-8");
253
+ const lines = rawText.split("\n");
254
+ // The last element may be incomplete (mid-append) — hold it back
255
+ fw.partialLine = lines.pop() ?? "";
256
+ for (const line of lines) {
257
+ const trimmed = line.trim();
258
+ if (!trimmed)
259
+ continue;
260
+ let rec;
261
+ try {
262
+ rec = JSON.parse(trimmed);
263
+ }
264
+ catch {
265
+ continue; // skip malformed lines
266
+ }
267
+ const runId = extractRunId(rec);
268
+ if (!runId)
269
+ continue; // sc-3-6: skip lines without runId
270
+ // Fan-out to matching subscriptions
271
+ for (const sub of this.subscriptions.values()) {
272
+ if (sub.runId === runId) {
273
+ this.deliver(sub, rec);
274
+ }
275
+ }
276
+ }
277
+ }
278
+ readFromOffset(filePath, offset, length) {
279
+ return new Promise((resolve, reject) => {
280
+ fsOpen(filePath, "r", (openErr, fd) => {
281
+ if (openErr) {
282
+ reject(openErr);
283
+ return;
284
+ }
285
+ const buf = Buffer.alloc(length);
286
+ fsRead(fd, buf, 0, length, offset, (readErr, bytesRead) => {
287
+ fsClose(fd, (closeErr) => {
288
+ if (readErr) {
289
+ reject(readErr);
290
+ return;
291
+ }
292
+ if (closeErr) {
293
+ // Non-fatal; just log and resolve
294
+ process.stderr.write(`[event-stream] close fd error: ${closeErr.message}\n`);
295
+ }
296
+ resolve(buf.subarray(0, bytesRead));
297
+ });
298
+ });
299
+ });
300
+ });
301
+ }
302
+ // ── Backfill ────────────────────────────────────────────────────
303
+ async backfill(sub, filePath, since) {
304
+ let content;
305
+ try {
306
+ content = await readFile(filePath, "utf-8");
307
+ }
308
+ catch {
309
+ return; // file may not exist yet
310
+ }
311
+ const lines = content.split("\n");
312
+ for (const line of lines) {
313
+ const trimmed = line.trim();
314
+ if (!trimmed)
315
+ continue;
316
+ let rec;
317
+ try {
318
+ rec = JSON.parse(trimmed);
319
+ }
320
+ catch {
321
+ continue;
322
+ }
323
+ const runId = extractRunId(rec);
324
+ if (!runId || runId !== sub.runId)
325
+ continue;
326
+ // Check timestamp > since
327
+ if (typeof rec === "object" && rec !== null) {
328
+ const r = rec;
329
+ if (typeof r.timestamp === "string" && r.timestamp > since) {
330
+ this.deliver(sub, rec);
331
+ }
332
+ }
333
+ }
334
+ }
335
+ // ── Delivery / backpressure ─────────────────────────────────────
336
+ deliver(sub, event) {
337
+ sub.queue.push(event);
338
+ if (sub.queue.length > sub.queueBound) {
339
+ const overflow = sub.queue.length - sub.queueBound;
340
+ sub.queue.splice(0, overflow); // drop oldest
341
+ sub.droppedSinceLastDelivery += overflow;
342
+ }
343
+ // Defer flush via a resolved Promise microtask so that flush() does not start
344
+ // consuming events until the current synchronous batch of deliver() calls has
345
+ // fully completed. This ensures all overflow tracking is accurate before any
346
+ // notifications are sent (sc-3-3: exactly 1 dropped notification per overflow window).
347
+ void Promise.resolve().then(() => this.flush(sub));
348
+ }
349
+ async flush(sub) {
350
+ if (sub.flushing)
351
+ return;
352
+ sub.flushing = true;
353
+ try {
354
+ while (sub.queue.length > 0) {
355
+ const event = sub.queue.shift();
356
+ if (!this.subscriptions.has(sub.subscriptionId))
357
+ break; // unsubscribed
358
+ await this.server.notification({
359
+ method: NOTIF_EVENT,
360
+ params: { subscriptionId: sub.subscriptionId, event },
361
+ });
362
+ }
363
+ if (sub.droppedSinceLastDelivery > 0) {
364
+ const count = sub.droppedSinceLastDelivery;
365
+ sub.droppedSinceLastDelivery = 0;
366
+ if (this.subscriptions.has(sub.subscriptionId)) {
367
+ await this.server.notification({
368
+ method: NOTIF_DROPPED,
369
+ params: { subscriptionId: sub.subscriptionId, dropped: count },
370
+ });
371
+ }
372
+ }
373
+ }
374
+ catch (err) {
375
+ process.stderr.write(`[event-stream] notification error: ${err instanceof Error ? err.message : String(err)}\n`);
376
+ }
377
+ finally {
378
+ sub.flushing = false;
379
+ }
380
+ }
381
+ // ── Telemetry date poller ───────────────────────────────────────
382
+ ensureTelemetryPoller() {
383
+ if (this.telemetryPollTimer !== null)
384
+ return;
385
+ this.telemetryPollTimer = setInterval(() => {
386
+ this.checkTelemetryDateRollover();
387
+ }, 5_000);
388
+ this.telemetryPollTimer.unref?.();
389
+ }
390
+ checkTelemetryDateRollover() {
391
+ const today = new Date().toISOString().slice(0, 10);
392
+ if (today === this.currentTelemetryDate)
393
+ return;
394
+ // Date rolled over — update watcher for all subscriptions
395
+ const oldPath = join(this.projectRoot, ".bober", "telemetry", `${this.currentTelemetryDate}.jsonl`);
396
+ const newPath = join(this.projectRoot, ".bober", "telemetry", `${today}.jsonl`);
397
+ this.currentTelemetryDate = today;
398
+ // Release old telemetry watchers and open new ones
399
+ for (const [subId, fileSet] of this.subFiles.entries()) {
400
+ if (fileSet.has(oldPath)) {
401
+ this.releaseWatch(oldPath);
402
+ fileSet.delete(oldPath);
403
+ // Open watch for the new date file
404
+ this.openWatch(newPath, subId).catch(() => { });
405
+ }
406
+ }
407
+ }
408
+ }
409
+ // ── Late-bound module singleton ──────────────────────────────────────
410
+ let _manager = null;
411
+ export function initEventStream(server, projectRoot, queueBound) {
412
+ _manager = new EventStreamManager(server, projectRoot, queueBound);
413
+ return _manager;
414
+ }
415
+ export function getEventStream() {
416
+ if (!_manager) {
417
+ throw new Error("EventStreamManager not initialized; call initEventStream(server, projectRoot) after server.connect().");
418
+ }
419
+ return _manager;
420
+ }
421
+ //# sourceMappingURL=event-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-stream.js","sourceRoot":"","sources":["../../src/mcp/event-stream.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,EAAE;AACF,0EAA0E;AAC1E,oEAAoE;AACpE,EAAE;AACF,kEAAkE;AAClE,oEAAoE;AACpE,+BAA+B;AAE/B,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,IAAI,IAAI,MAAM,EAAE,KAAK,IAAI,OAAO,EAAE,KAAK,EAAkB,MAAM,SAAS,CAAC;AAClG,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAIrC,wEAAwE;AAExE,MAAM,WAAW,GAAG,cAAc,CAAC;AACnC,MAAM,aAAa,GAAG,sBAAsB,CAAC;AAwB7C,uEAAuE;AAEvE,SAAS,YAAY,CAAC,GAAY;IAChC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC9D,MAAM,CAAC,GAAG,GAA8B,CAAC;IACzC,yDAAyD;IACzD,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,KAAK,CAAC;IAChD,mEAAmE;IACnE,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACxD,MAAM,CAAC,GAAG,CAAC,CAAC,OAAkC,CAAC;QAC/C,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC,KAAK,CAAC;IAClD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,wEAAwE;AAExE,SAAS,kBAAkB,CAAC,WAAmB;IAC7C,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa;IACjE,OAAO,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,QAAQ,CAAC,CAAC;AACnE,CAAC;AAED,wEAAwE;AAExE,MAAM,OAAO,kBAAkB;IAeV;IACA;IACA;IAhBX,aAAa,GAAG,IAAI,GAAG,EAAwB,CAAC;IACxD,gDAAgD;IACxC,WAAW,GAAG,IAAI,GAAG,EAAqB,CAAC;IACnD;;;OAGG;IACK,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IAClD,8DAA8D;IACtD,kBAAkB,GAA0C,IAAI,CAAC;IACzE,iEAAiE;IACzD,oBAAoB,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAErE,YACmB,MAAc,EACd,WAAmB,EACnB,oBAAoB,IAAI;QAFxB,WAAM,GAAN,MAAM,CAAQ;QACd,gBAAW,GAAX,WAAW,CAAQ;QACnB,sBAAiB,GAAjB,iBAAiB,CAAO;IACxC,CAAC;IAEJ,oEAAoE;IAEpE,KAAK,CAAC,SAAS,CACb,KAAa,EACb,OAAgD,EAAE;QAElD,MAAM,cAAc,GAAG,UAAU,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,iBAAiB,CAAC;QAE7D,MAAM,GAAG,GAAiB;YACxB,cAAc;YACd,KAAK;YACL,SAAS;YACT,KAAK,EAAE,EAAE;YACT,UAAU;YACV,wBAAwB,EAAE,CAAC;YAC3B,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAE7C,sBAAsB;QACtB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;QACtE,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAElD,6EAA6E;QAC7E,MAAM,aAAa,GAAG,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3D,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QAEpD,oDAAoD;QACpD,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAE7B,gEAAgE;QAChE,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAClD,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;IAC7D,CAAC;IAED,WAAW,CAAC,cAAsB;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACnD,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;QAE/B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;QAC7D,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAErC,KAAK,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;YAC7B,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAED,QAAQ;QACN,0BAA0B;QAC1B,IAAI,IAAI,CAAC,kBAAkB,KAAK,IAAI,EAAE,CAAC;YACrC,aAAa,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACvC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC;QACD,qBAAqB;QACrB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC;gBAAC,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,mEAAmE;IAE3D,KAAK,CAAC,SAAS,CAAC,QAAgB,EAAE,cAAsB;QAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACrD,IAAI,CAAC,UAAU;YAAE,OAAO,CAAC,mCAAmC;QAE5D,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEzB,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,6CAA6C;YAC7C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,QAAQ,EAAE,CAAC;YAC3C,OAAO;QACT,CAAC;QAED,yEAAyE;QACzE,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/B,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,sEAAsE;QACxE,CAAC;QAED,2DAA2D;QAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,0EAA0E;QAC1E,kEAAkE;QAClE,MAAM,EAAE,GAAc;YACpB,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,IAA4B,EAAE,iBAAiB;YACxD,MAAM,EAAE,aAAa;YACrB,QAAQ,EAAE,CAAC;YACX,WAAW,EAAE,EAAE;YACf,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE;SACzB,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAEnC,IAAI,CAAC;YACH,8DAA8D;YAC9D,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACnD,IAAI,UAAU,EAAE,CAAC;gBACf,EAAE,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,2CAA2C;gBAC3C,EAAE,CAAC,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,kCAAkC,QAAQ,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CACpG,CAAC;YACF,gCAAgC;YAChC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAClC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,QAAgB,EAAE,EAAa;QACnD,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,EAAE,EAAE;YACpE,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QAClB,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,mBAAmB,CAAC,QAAgB,EAAE,SAAiB,EAAE,EAAa;QAC5E,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,EAAE;YAClF,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;gBAC7B,yCAAyC;gBACzC,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;oBAClC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;oBAC/C,IAAI,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC7C,IAAI,CAAC;4BACH,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;wBACrB,CAAC;wBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;wBACxB,EAAE,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;wBAC9C,sCAAsC;wBACtC,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;oBACnC,CAAC;gBACH,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACrB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QAClB,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,YAAY,CAAC,QAAgB;QACnC,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,EAAE,CAAC,QAAQ,EAAE,CAAC;QACd,IAAI,EAAE,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC;gBAAC,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAClD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,mEAAmE;IAE3D,KAAK,CAAC,UAAU,CAAC,QAAgB;QACvC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,QAAgB;QACxC,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE;YAAE,OAAO;QAEhB,IAAI,QAAQ,CAAC;QACb,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,+BAA+B;QACzC,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC/B,IAAI,QAAQ,IAAI,EAAE,CAAC,MAAM;YAAE,OAAO,CAAC,sCAAsC;QAEzE,0BAA0B;QAC1B,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,EAAE,CAAC,MAAM,EAAE,QAAQ,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC;QAClF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,EAAE,CAAC,MAAM,GAAG,QAAQ,CAAC;QAErB,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAElC,iEAAiE;QACjE,EAAE,CAAC,WAAW,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAEnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvB,IAAI,GAAY,CAAC;YACjB,IAAI,CAAC;gBACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS,CAAC,uBAAuB;YACnC,CAAC;YAED,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,CAAC,KAAK;gBAAE,SAAS,CAAC,mCAAmC;YAEzD,oCAAoC;YACpC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC9C,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;oBACxB,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,QAAgB,EAAE,MAAc,EAAE,MAAc;QACrE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE;gBACpC,IAAI,OAAO,EAAE,CAAC;oBAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBAAC,OAAO;gBAAC,CAAC;gBACzC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACjC,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE;oBACxD,OAAO,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE;wBACvB,IAAI,OAAO,EAAE,CAAC;4BAAC,MAAM,CAAC,OAAO,CAAC,CAAC;4BAAC,OAAO;wBAAC,CAAC;wBACzC,IAAI,QAAQ,EAAE,CAAC;4BACb,kCAAkC;4BAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;wBAC/E,CAAC;wBACD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;oBACtC,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,mEAAmE;IAE3D,KAAK,CAAC,QAAQ,CAAC,GAAiB,EAAE,QAAgB,EAAE,KAAa;QACvE,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,yBAAyB;QACnC,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvB,IAAI,GAAY,CAAC;YACjB,IAAI,CAAC;gBACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YAED,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,GAAG,CAAC,KAAK;gBAAE,SAAS;YAE5C,0BAA0B;YAC1B,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBAC5C,MAAM,CAAC,GAAG,GAA8B,CAAC;gBACzC,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,GAAG,KAAK,EAAE,CAAC;oBAC3D,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,mEAAmE;IAE3D,OAAO,CAAC,GAAiB,EAAE,KAAc;QAC/C,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC;YACnD,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,cAAc;YAC7C,GAAG,CAAC,wBAAwB,IAAI,QAAQ,CAAC;QAC3C,CAAC;QACD,8EAA8E;QAC9E,8EAA8E;QAC9E,6EAA6E;QAC7E,uFAAuF;QACvF,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,CAAC;IAEO,KAAK,CAAC,KAAK,CAAC,GAAiB;QACnC,IAAI,GAAG,CAAC,QAAQ;YAAE,OAAO;QACzB,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,EAAG,CAAC;gBACjC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC;oBAAE,MAAM,CAAC,eAAe;gBACvE,MAAO,IAAI,CAAC,MAEV,CAAC,YAAY,CAAC;oBACd,MAAM,EAAE,WAAW;oBACnB,MAAM,EAAE,EAAE,cAAc,EAAE,GAAG,CAAC,cAAc,EAAE,KAAK,EAAE;iBACtD,CAAC,CAAC;YACL,CAAC;YACD,IAAI,GAAG,CAAC,wBAAwB,GAAG,CAAC,EAAE,CAAC;gBACrC,MAAM,KAAK,GAAG,GAAG,CAAC,wBAAwB,CAAC;gBAC3C,GAAG,CAAC,wBAAwB,GAAG,CAAC,CAAC;gBACjC,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;oBAC/C,MAAO,IAAI,CAAC,MAEV,CAAC,YAAY,CAAC;wBACd,MAAM,EAAE,aAAa;wBACrB,MAAM,EAAE,EAAE,cAAc,EAAE,GAAG,CAAC,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE;qBAC/D,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,sCAAsC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAC3F,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,GAAG,CAAC,QAAQ,GAAG,KAAK,CAAC;QACvB,CAAC;IACH,CAAC;IAED,mEAAmE;IAE3D,qBAAqB;QAC3B,IAAI,IAAI,CAAC,kBAAkB,KAAK,IAAI;YAAE,OAAO;QAC7C,IAAI,CAAC,kBAAkB,GAAG,WAAW,CAAC,GAAG,EAAE;YACzC,IAAI,CAAC,0BAA0B,EAAE,CAAC;QACpC,CAAC,EAAE,KAAK,CAAC,CAAC;QACV,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,EAAE,CAAC;IACpC,CAAC;IAEO,0BAA0B;QAChC,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpD,IAAI,KAAK,KAAK,IAAI,CAAC,oBAAoB;YAAE,OAAO;QAEhD,0DAA0D;QAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,oBAAoB,QAAQ,CAAC,CAAC;QACpG,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC;QAChF,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;QAElC,mDAAmD;QACnD,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YACvD,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBAC3B,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACxB,mCAAmC;gBACnC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,wEAAwE;AAExE,IAAI,QAAQ,GAA8B,IAAI,CAAC;AAE/C,MAAM,UAAU,eAAe,CAC7B,MAAc,EACd,WAAmB,EACnB,UAAmB;IAEnB,QAAQ,GAAG,IAAI,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IACnE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,uGAAuG,CACxG,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * ExternalMcpServer — manages one externally-spawned MCP server subprocess.
3
+ *
4
+ * Lifecycle:
5
+ * - start(): spawn child via SDK StdioClientTransport, perform MCP handshake.
6
+ * - listTools(): return tool descriptors from the server (cached after first call).
7
+ * - callTool(name, args): invoke a tool, return its result.
8
+ * - stop(): SIGTERM the child, wait up to 5s, SIGKILL if still alive.
9
+ *
10
+ * SECURITY: providerConfig.mcpEnv may contain API tokens. NEVER include the
11
+ * env contents in error messages, log lines, or returned errors. Only the
12
+ * provider NAME is safe to expose externally.
13
+ *
14
+ * Error isolation: ExternalMcpServer does NOT implement circuit-breaker or
15
+ * restart-on-crash logic. Observability MCPs are best-effort — a crashed
16
+ * provider is simply absent from the diagnoser's tool list for that spawn.
17
+ * The caller (mergeObsTools) uses Promise.allSettled to handle partial failure.
18
+ */
19
+ import type { ObservabilityProvider } from "../config/schema.js";
20
+ export interface ToolDescriptor {
21
+ name: string;
22
+ description?: string;
23
+ inputSchema?: unknown;
24
+ }
25
+ export declare class ExternalMcpServer {
26
+ private readonly provider;
27
+ private client;
28
+ private transport;
29
+ private toolsCache;
30
+ private stopping;
31
+ constructor(provider: ObservabilityProvider);
32
+ get name(): string;
33
+ start(): Promise<void>;
34
+ listTools(): Promise<ToolDescriptor[]>;
35
+ callTool(name: string, args: unknown): Promise<unknown>;
36
+ stop(): Promise<void>;
37
+ }
38
+ //# sourceMappingURL=external-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-client.d.ts","sourceRoot":"","sources":["../../src/mcp/external-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEjE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,qBAAa,iBAAiB;IAMhB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IALrC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,QAAQ,CAAS;gBAEI,QAAQ,EAAE,qBAAqB;IAE5D,IAAI,IAAI,IAAI,MAAM,CAEjB;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuCtB,SAAS,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IActC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAUvD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAmC5B"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * ExternalMcpServer — manages one externally-spawned MCP server subprocess.
3
+ *
4
+ * Lifecycle:
5
+ * - start(): spawn child via SDK StdioClientTransport, perform MCP handshake.
6
+ * - listTools(): return tool descriptors from the server (cached after first call).
7
+ * - callTool(name, args): invoke a tool, return its result.
8
+ * - stop(): SIGTERM the child, wait up to 5s, SIGKILL if still alive.
9
+ *
10
+ * SECURITY: providerConfig.mcpEnv may contain API tokens. NEVER include the
11
+ * env contents in error messages, log lines, or returned errors. Only the
12
+ * provider NAME is safe to expose externally.
13
+ *
14
+ * Error isolation: ExternalMcpServer does NOT implement circuit-breaker or
15
+ * restart-on-crash logic. Observability MCPs are best-effort — a crashed
16
+ * provider is simply absent from the diagnoser's tool list for that spawn.
17
+ * The caller (mergeObsTools) uses Promise.allSettled to handle partial failure.
18
+ */
19
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
20
+ import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
21
+ export class ExternalMcpServer {
22
+ provider;
23
+ client = null;
24
+ transport = null;
25
+ toolsCache = null;
26
+ stopping = false;
27
+ constructor(provider) {
28
+ this.provider = provider;
29
+ }
30
+ get name() {
31
+ return this.provider.name;
32
+ }
33
+ async start() {
34
+ if (this.client)
35
+ return; // idempotent
36
+ // SECURITY: merge process.env FIRST so the child inherits PATH and other
37
+ // essentials; then overlay provider.mcpEnv. The merged object is passed to
38
+ // the child only — it is never logged or included in error messages.
39
+ this.transport = new StdioClientTransport({
40
+ command: this.provider.mcpCommand,
41
+ args: this.provider.mcpArgs ?? [],
42
+ env: {
43
+ ...process.env,
44
+ ...(this.provider.mcpEnv ?? {}),
45
+ },
46
+ stderr: "pipe",
47
+ });
48
+ this.client = new Client({ name: "agent-bober-obs-client", version: "0.13.0" }, { capabilities: {} });
49
+ try {
50
+ await this.client.connect(this.transport);
51
+ }
52
+ catch (err) {
53
+ // SECURITY: do NOT include provider.mcpEnv in the rethrown error.
54
+ const msg = err instanceof Error ? err.message : String(err);
55
+ // Strip anything that looks like an env var assignment (KEY=VALUE).
56
+ const sanitized = msg.replace(/\b[A-Z_][A-Z0-9_]*=\S+/g, "[redacted]");
57
+ this.client = null;
58
+ this.transport = null;
59
+ // SECURITY: message is sanitized; the original error is attached as cause
60
+ // for debug-time stack traces but must NOT be logged externally.
61
+ throw new Error(`ExternalMcpServer "${this.provider.name}" failed to connect: ${sanitized}`, { cause: err });
62
+ }
63
+ }
64
+ async listTools() {
65
+ if (!this.client) {
66
+ throw new Error(`provider "${this.provider.name}" not started`);
67
+ }
68
+ if (this.toolsCache)
69
+ return this.toolsCache;
70
+ const res = await this.client.listTools();
71
+ this.toolsCache = res.tools.map((t) => ({
72
+ name: t.name,
73
+ description: t.description,
74
+ inputSchema: t.inputSchema,
75
+ }));
76
+ return this.toolsCache;
77
+ }
78
+ async callTool(name, args) {
79
+ if (!this.client) {
80
+ throw new Error(`provider "${this.provider.name}" not started`);
81
+ }
82
+ return await this.client.callTool({
83
+ name,
84
+ arguments: args ?? {},
85
+ });
86
+ }
87
+ async stop() {
88
+ if (this.stopping)
89
+ return;
90
+ this.stopping = true;
91
+ // SDK Client.close() closes the transport which sends SIGTERM to the child.
92
+ // Wrap with a 5s timeout + SIGKILL fallback as required by s16-c3.
93
+ const clientRef = this.client;
94
+ const transportRef = this.transport;
95
+ this.client = null;
96
+ this.transport = null;
97
+ if (!clientRef)
98
+ return;
99
+ await new Promise((resolve) => {
100
+ const timer = setTimeout(() => {
101
+ // The SDK transport exposes the child's pid via the `pid` getter.
102
+ // Use process.kill() as the SIGKILL fallback.
103
+ const pid = transportRef?.pid;
104
+ if (pid != null) {
105
+ try {
106
+ process.kill(pid, "SIGKILL");
107
+ }
108
+ catch {
109
+ // already dead — ignore
110
+ }
111
+ }
112
+ resolve();
113
+ }, 5_000);
114
+ void clientRef.close().catch(() => { }).then(() => {
115
+ clearTimeout(timer);
116
+ resolve();
117
+ });
118
+ });
119
+ }
120
+ }
121
+ //# sourceMappingURL=external-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-client.js","sourceRoot":"","sources":["../../src/mcp/external-client.ts"],"names":[],"mappings":"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"}