macro-agent 0.0.10 → 0.0.12

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/.macro-agent/teams/self-driving/prompts/grinder.md +27 -0
  2. package/.macro-agent/teams/self-driving/prompts/judge.md +27 -0
  3. package/.macro-agent/teams/self-driving/prompts/planner.md +33 -0
  4. package/.macro-agent/teams/self-driving/roles/grinder.yaml +17 -0
  5. package/.macro-agent/teams/self-driving/roles/judge.yaml +24 -0
  6. package/.macro-agent/teams/self-driving/roles/planner.yaml +18 -0
  7. package/.macro-agent/teams/self-driving/team.yaml +103 -0
  8. package/.macro-agent/teams/structured/prompts/developer.md +26 -0
  9. package/.macro-agent/teams/structured/prompts/lead.md +25 -0
  10. package/.macro-agent/teams/structured/prompts/reviewer.md +24 -0
  11. package/.macro-agent/teams/structured/roles/developer.yaml +12 -0
  12. package/.macro-agent/teams/structured/roles/lead.yaml +11 -0
  13. package/.macro-agent/teams/structured/roles/reviewer.yaml +19 -0
  14. package/.macro-agent/teams/structured/team.yaml +89 -0
  15. package/.sudocode/issues.jsonl +56 -51
  16. package/.sudocode/specs.jsonl +8 -1
  17. package/CLAUDE.md +121 -30
  18. package/README.md +60 -3
  19. package/dist/acp/macro-agent.d.ts +4 -0
  20. package/dist/acp/macro-agent.d.ts.map +1 -1
  21. package/dist/acp/macro-agent.js +50 -4
  22. package/dist/acp/macro-agent.js.map +1 -1
  23. package/dist/acp/session-mapper.d.ts +20 -1
  24. package/dist/acp/session-mapper.d.ts.map +1 -1
  25. package/dist/acp/session-mapper.js +90 -1
  26. package/dist/acp/session-mapper.js.map +1 -1
  27. package/dist/acp/types.d.ts +24 -1
  28. package/dist/acp/types.d.ts.map +1 -1
  29. package/dist/acp/types.js.map +1 -1
  30. package/dist/agent/agent-manager.d.ts +40 -1
  31. package/dist/agent/agent-manager.d.ts.map +1 -1
  32. package/dist/agent/agent-manager.js +172 -8
  33. package/dist/agent/agent-manager.js.map +1 -1
  34. package/dist/agent/types.d.ts +22 -0
  35. package/dist/agent/types.d.ts.map +1 -1
  36. package/dist/agent/types.js.map +1 -1
  37. package/dist/agent/wake.d.ts +15 -0
  38. package/dist/agent/wake.d.ts.map +1 -1
  39. package/dist/agent/wake.js +15 -0
  40. package/dist/agent/wake.js.map +1 -1
  41. package/dist/agent-detection/command-builder.d.ts +30 -0
  42. package/dist/agent-detection/command-builder.d.ts.map +1 -0
  43. package/dist/agent-detection/command-builder.js +71 -0
  44. package/dist/agent-detection/command-builder.js.map +1 -0
  45. package/dist/agent-detection/detector.d.ts +84 -0
  46. package/dist/agent-detection/detector.d.ts.map +1 -0
  47. package/dist/agent-detection/detector.js +240 -0
  48. package/dist/agent-detection/detector.js.map +1 -0
  49. package/dist/agent-detection/index.d.ts +12 -0
  50. package/dist/agent-detection/index.d.ts.map +1 -0
  51. package/dist/agent-detection/index.js +14 -0
  52. package/dist/agent-detection/index.js.map +1 -0
  53. package/dist/agent-detection/registry.d.ts +53 -0
  54. package/dist/agent-detection/registry.d.ts.map +1 -0
  55. package/dist/agent-detection/registry.js +177 -0
  56. package/dist/agent-detection/registry.js.map +1 -0
  57. package/dist/agent-detection/types.d.ts +121 -0
  58. package/dist/agent-detection/types.d.ts.map +1 -0
  59. package/dist/agent-detection/types.js +20 -0
  60. package/dist/agent-detection/types.js.map +1 -0
  61. package/dist/api/server.d.ts +5 -1
  62. package/dist/api/server.d.ts.map +1 -1
  63. package/dist/api/server.js +362 -0
  64. package/dist/api/server.js.map +1 -1
  65. package/dist/api/types.d.ts +50 -1
  66. package/dist/api/types.d.ts.map +1 -1
  67. package/dist/cli/acp.d.ts +2 -0
  68. package/dist/cli/acp.d.ts.map +1 -1
  69. package/dist/cli/acp.js +8 -1
  70. package/dist/cli/acp.js.map +1 -1
  71. package/dist/cli/index.js +29 -0
  72. package/dist/cli/index.js.map +1 -1
  73. package/dist/cli/mcp.js +38 -0
  74. package/dist/cli/mcp.js.map +1 -1
  75. package/dist/config/index.d.ts +2 -0
  76. package/dist/config/index.d.ts.map +1 -0
  77. package/dist/config/index.js +2 -0
  78. package/dist/config/index.js.map +1 -0
  79. package/dist/config/project-config.d.ts +46 -0
  80. package/dist/config/project-config.d.ts.map +1 -0
  81. package/dist/config/project-config.js +68 -0
  82. package/dist/config/project-config.js.map +1 -0
  83. package/dist/lifecycle/cascade.d.ts +1 -1
  84. package/dist/lifecycle/cascade.d.ts.map +1 -1
  85. package/dist/lifecycle/handlers/index.d.ts +4 -0
  86. package/dist/lifecycle/handlers/index.d.ts.map +1 -1
  87. package/dist/lifecycle/handlers/index.js +2 -0
  88. package/dist/lifecycle/handlers/index.js.map +1 -1
  89. package/dist/lifecycle/handlers/worker.d.ts +4 -0
  90. package/dist/lifecycle/handlers/worker.d.ts.map +1 -1
  91. package/dist/lifecycle/handlers/worker.js +35 -3
  92. package/dist/lifecycle/handlers/worker.js.map +1 -1
  93. package/dist/mail/conversation-map.d.ts +33 -0
  94. package/dist/mail/conversation-map.d.ts.map +1 -0
  95. package/dist/mail/conversation-map.js +61 -0
  96. package/dist/mail/conversation-map.js.map +1 -0
  97. package/dist/mail/index.d.ts +11 -0
  98. package/dist/mail/index.d.ts.map +1 -0
  99. package/dist/mail/index.js +11 -0
  100. package/dist/mail/index.js.map +1 -0
  101. package/dist/mail/mail-service.d.ts +85 -0
  102. package/dist/mail/mail-service.d.ts.map +1 -0
  103. package/dist/mail/mail-service.js +121 -0
  104. package/dist/mail/mail-service.js.map +1 -0
  105. package/dist/mail/stores/eventstore-conversation-store.d.ts +40 -0
  106. package/dist/mail/stores/eventstore-conversation-store.d.ts.map +1 -0
  107. package/dist/mail/stores/eventstore-conversation-store.js +131 -0
  108. package/dist/mail/stores/eventstore-conversation-store.js.map +1 -0
  109. package/dist/mail/stores/eventstore-participant-store.d.ts +43 -0
  110. package/dist/mail/stores/eventstore-participant-store.d.ts.map +1 -0
  111. package/dist/mail/stores/eventstore-participant-store.js +145 -0
  112. package/dist/mail/stores/eventstore-participant-store.js.map +1 -0
  113. package/dist/mail/stores/eventstore-thread-store.d.ts +46 -0
  114. package/dist/mail/stores/eventstore-thread-store.d.ts.map +1 -0
  115. package/dist/mail/stores/eventstore-thread-store.js +118 -0
  116. package/dist/mail/stores/eventstore-thread-store.js.map +1 -0
  117. package/dist/mail/stores/eventstore-turn-store.d.ts +47 -0
  118. package/dist/mail/stores/eventstore-turn-store.d.ts.map +1 -0
  119. package/dist/mail/stores/eventstore-turn-store.js +153 -0
  120. package/dist/mail/stores/eventstore-turn-store.js.map +1 -0
  121. package/dist/mail/stores/index.d.ts +12 -0
  122. package/dist/mail/stores/index.d.ts.map +1 -0
  123. package/dist/mail/stores/index.js +12 -0
  124. package/dist/mail/stores/index.js.map +1 -0
  125. package/dist/mail/stores/types.d.ts +146 -0
  126. package/dist/mail/stores/types.d.ts.map +1 -0
  127. package/dist/mail/stores/types.js +13 -0
  128. package/dist/mail/stores/types.js.map +1 -0
  129. package/dist/mail/turn-recorder.d.ts +30 -0
  130. package/dist/mail/turn-recorder.d.ts.map +1 -0
  131. package/dist/mail/turn-recorder.js +98 -0
  132. package/dist/mail/turn-recorder.js.map +1 -0
  133. package/dist/map/adapter/acp-over-map.d.ts.map +1 -1
  134. package/dist/map/adapter/acp-over-map.js +32 -2
  135. package/dist/map/adapter/acp-over-map.js.map +1 -1
  136. package/dist/map/adapter/event-translator.d.ts.map +1 -1
  137. package/dist/map/adapter/event-translator.js +4 -0
  138. package/dist/map/adapter/event-translator.js.map +1 -1
  139. package/dist/map/adapter/extensions/agent-detection.d.ts +49 -0
  140. package/dist/map/adapter/extensions/agent-detection.d.ts.map +1 -0
  141. package/dist/map/adapter/extensions/agent-detection.js +91 -0
  142. package/dist/map/adapter/extensions/agent-detection.js.map +1 -0
  143. package/dist/map/adapter/extensions/index.d.ts +10 -1
  144. package/dist/map/adapter/extensions/index.d.ts.map +1 -1
  145. package/dist/map/adapter/extensions/index.js +39 -0
  146. package/dist/map/adapter/extensions/index.js.map +1 -1
  147. package/dist/map/adapter/extensions/resume.d.ts +47 -0
  148. package/dist/map/adapter/extensions/resume.d.ts.map +1 -0
  149. package/dist/map/adapter/extensions/resume.js +59 -0
  150. package/dist/map/adapter/extensions/resume.js.map +1 -0
  151. package/dist/map/adapter/extensions/workspace-files.d.ts +42 -0
  152. package/dist/map/adapter/extensions/workspace-files.d.ts.map +1 -0
  153. package/dist/map/adapter/extensions/workspace-files.js +338 -0
  154. package/dist/map/adapter/extensions/workspace-files.js.map +1 -0
  155. package/dist/map/adapter/mail-handler-adapter.d.ts +27 -0
  156. package/dist/map/adapter/mail-handler-adapter.d.ts.map +1 -0
  157. package/dist/map/adapter/mail-handler-adapter.js +292 -0
  158. package/dist/map/adapter/mail-handler-adapter.js.map +1 -0
  159. package/dist/map/adapter/map-adapter.d.ts +34 -10
  160. package/dist/map/adapter/map-adapter.d.ts.map +1 -1
  161. package/dist/map/adapter/map-adapter.js +110 -14
  162. package/dist/map/adapter/map-adapter.js.map +1 -1
  163. package/dist/map/adapter/rpc-handler.d.ts +4 -1
  164. package/dist/map/adapter/rpc-handler.d.ts.map +1 -1
  165. package/dist/map/adapter/rpc-handler.js +6 -0
  166. package/dist/map/adapter/rpc-handler.js.map +1 -1
  167. package/dist/map/index.d.ts +1 -0
  168. package/dist/map/index.d.ts.map +1 -1
  169. package/dist/map/index.js +2 -0
  170. package/dist/map/index.js.map +1 -1
  171. package/dist/map/types.d.ts +3 -1
  172. package/dist/map/types.d.ts.map +1 -1
  173. package/dist/map/types.js.map +1 -1
  174. package/dist/mcp/mcp-server.d.ts +6 -0
  175. package/dist/mcp/mcp-server.d.ts.map +1 -1
  176. package/dist/mcp/mcp-server.js +45 -0
  177. package/dist/mcp/mcp-server.js.map +1 -1
  178. package/dist/mcp/tools/claim_task.d.ts +35 -0
  179. package/dist/mcp/tools/claim_task.d.ts.map +1 -0
  180. package/dist/mcp/tools/claim_task.js +58 -0
  181. package/dist/mcp/tools/claim_task.js.map +1 -0
  182. package/dist/mcp/tools/done.d.ts +15 -2
  183. package/dist/mcp/tools/done.d.ts.map +1 -1
  184. package/dist/mcp/tools/done.js +45 -10
  185. package/dist/mcp/tools/done.js.map +1 -1
  186. package/dist/mcp/tools/list_claimable_tasks.d.ts +38 -0
  187. package/dist/mcp/tools/list_claimable_tasks.d.ts.map +1 -0
  188. package/dist/mcp/tools/list_claimable_tasks.js +63 -0
  189. package/dist/mcp/tools/list_claimable_tasks.js.map +1 -0
  190. package/dist/mcp/tools/unclaim_task.d.ts +31 -0
  191. package/dist/mcp/tools/unclaim_task.d.ts.map +1 -0
  192. package/dist/mcp/tools/unclaim_task.js +47 -0
  193. package/dist/mcp/tools/unclaim_task.js.map +1 -0
  194. package/dist/metrics/index.d.ts +2 -0
  195. package/dist/metrics/index.d.ts.map +1 -0
  196. package/dist/metrics/index.js +2 -0
  197. package/dist/metrics/index.js.map +1 -0
  198. package/dist/metrics/metrics.d.ts +79 -0
  199. package/dist/metrics/metrics.d.ts.map +1 -0
  200. package/dist/metrics/metrics.js +166 -0
  201. package/dist/metrics/metrics.js.map +1 -0
  202. package/dist/roles/capabilities.d.ts +1 -0
  203. package/dist/roles/capabilities.d.ts.map +1 -1
  204. package/dist/roles/capabilities.js +3 -0
  205. package/dist/roles/capabilities.js.map +1 -1
  206. package/dist/roles/types.d.ts +1 -1
  207. package/dist/roles/types.d.ts.map +1 -1
  208. package/dist/router/channels.d.ts +2 -4
  209. package/dist/router/channels.d.ts.map +1 -1
  210. package/dist/router/channels.js.map +1 -1
  211. package/dist/router/message-router.d.ts +85 -9
  212. package/dist/router/message-router.d.ts.map +1 -1
  213. package/dist/router/message-router.js +203 -14
  214. package/dist/router/message-router.js.map +1 -1
  215. package/dist/router/role-resolver.d.ts +10 -1
  216. package/dist/router/role-resolver.d.ts.map +1 -1
  217. package/dist/router/role-resolver.js +15 -1
  218. package/dist/router/role-resolver.js.map +1 -1
  219. package/dist/router/types.d.ts +30 -1
  220. package/dist/router/types.d.ts.map +1 -1
  221. package/dist/router/types.js.map +1 -1
  222. package/dist/server/combined-server.d.ts +6 -0
  223. package/dist/server/combined-server.d.ts.map +1 -1
  224. package/dist/server/combined-server.js +24 -2
  225. package/dist/server/combined-server.js.map +1 -1
  226. package/dist/store/event-store.d.ts +14 -1
  227. package/dist/store/event-store.d.ts.map +1 -1
  228. package/dist/store/event-store.js +456 -4
  229. package/dist/store/event-store.js.map +1 -1
  230. package/dist/store/types/agents.d.ts +1 -1
  231. package/dist/store/types/agents.d.ts.map +1 -1
  232. package/dist/store/types/conversations.d.ts +91 -0
  233. package/dist/store/types/conversations.d.ts.map +1 -0
  234. package/dist/store/types/conversations.js +8 -0
  235. package/dist/store/types/conversations.js.map +1 -0
  236. package/dist/store/types/events.d.ts +1 -1
  237. package/dist/store/types/events.d.ts.map +1 -1
  238. package/dist/store/types/events.js.map +1 -1
  239. package/dist/store/types/index.d.ts +2 -0
  240. package/dist/store/types/index.d.ts.map +1 -1
  241. package/dist/store/types/index.js +2 -0
  242. package/dist/store/types/index.js.map +1 -1
  243. package/dist/store/types/sessions.d.ts +44 -0
  244. package/dist/store/types/sessions.d.ts.map +1 -0
  245. package/dist/store/types/sessions.js +9 -0
  246. package/dist/store/types/sessions.js.map +1 -0
  247. package/dist/store/types/tasks.d.ts +2 -0
  248. package/dist/store/types/tasks.d.ts.map +1 -1
  249. package/dist/task/backend/memory.d.ts +4 -1
  250. package/dist/task/backend/memory.d.ts.map +1 -1
  251. package/dist/task/backend/memory.js +81 -0
  252. package/dist/task/backend/memory.js.map +1 -1
  253. package/dist/task/backend/types.d.ts +30 -0
  254. package/dist/task/backend/types.d.ts.map +1 -1
  255. package/dist/task/backend/types.js.map +1 -1
  256. package/dist/teams/index.d.ts +4 -0
  257. package/dist/teams/index.d.ts.map +1 -0
  258. package/dist/teams/index.js +4 -0
  259. package/dist/teams/index.js.map +1 -0
  260. package/dist/teams/team-loader.d.ts +20 -0
  261. package/dist/teams/team-loader.d.ts.map +1 -0
  262. package/dist/teams/team-loader.js +293 -0
  263. package/dist/teams/team-loader.js.map +1 -0
  264. package/dist/teams/team-runtime.d.ts +139 -0
  265. package/dist/teams/team-runtime.d.ts.map +1 -0
  266. package/dist/teams/team-runtime.js +613 -0
  267. package/dist/teams/team-runtime.js.map +1 -0
  268. package/dist/teams/types.d.ts +266 -0
  269. package/dist/teams/types.d.ts.map +1 -0
  270. package/dist/teams/types.js +20 -0
  271. package/dist/teams/types.js.map +1 -0
  272. package/dist/trigger/router/trigger-router.d.ts +30 -3
  273. package/dist/trigger/router/trigger-router.d.ts.map +1 -1
  274. package/dist/trigger/router/trigger-router.js +30 -3
  275. package/dist/trigger/router/trigger-router.js.map +1 -1
  276. package/dist/trigger/wake/types.d.ts +31 -5
  277. package/dist/trigger/wake/types.d.ts.map +1 -1
  278. package/dist/trigger/wake/types.js +19 -0
  279. package/dist/trigger/wake/types.js.map +1 -1
  280. package/dist/workspace/dataplane-adapter.d.ts +1 -1
  281. package/dist/workspace/dataplane-adapter.d.ts.map +1 -1
  282. package/dist/workspace/dataplane-adapter.js +1 -1
  283. package/dist/workspace/dataplane-adapter.js.map +1 -1
  284. package/dist/workspace/index.d.ts +1 -1
  285. package/dist/workspace/index.d.ts.map +1 -1
  286. package/dist/workspace/strategies/index.d.ts +6 -0
  287. package/dist/workspace/strategies/index.d.ts.map +1 -0
  288. package/dist/workspace/strategies/index.js +5 -0
  289. package/dist/workspace/strategies/index.js.map +1 -0
  290. package/dist/workspace/strategies/optimistic.d.ts +26 -0
  291. package/dist/workspace/strategies/optimistic.d.ts.map +1 -0
  292. package/dist/workspace/strategies/optimistic.js +121 -0
  293. package/dist/workspace/strategies/optimistic.js.map +1 -0
  294. package/dist/workspace/strategies/queue.d.ts +26 -0
  295. package/dist/workspace/strategies/queue.d.ts.map +1 -0
  296. package/dist/workspace/strategies/queue.js +67 -0
  297. package/dist/workspace/strategies/queue.js.map +1 -0
  298. package/dist/workspace/strategies/registry.d.ts +37 -0
  299. package/dist/workspace/strategies/registry.d.ts.map +1 -0
  300. package/dist/workspace/strategies/registry.js +63 -0
  301. package/dist/workspace/strategies/registry.js.map +1 -0
  302. package/dist/workspace/strategies/trunk.d.ts +20 -0
  303. package/dist/workspace/strategies/trunk.d.ts.map +1 -0
  304. package/dist/workspace/strategies/trunk.js +108 -0
  305. package/dist/workspace/strategies/trunk.js.map +1 -0
  306. package/dist/workspace/strategies/types.d.ts +104 -0
  307. package/dist/workspace/strategies/types.d.ts.map +1 -0
  308. package/dist/workspace/strategies/types.js +11 -0
  309. package/dist/workspace/strategies/types.js.map +1 -0
  310. package/dist/workspace/types.d.ts +1 -1
  311. package/dist/workspace/types.d.ts.map +1 -1
  312. package/dist/workspace/workspace-manager.d.ts +1 -1
  313. package/dist/workspace/workspace-manager.d.ts.map +1 -1
  314. package/docs/implementation-details.md +1127 -0
  315. package/docs/implementation-summary.md +448 -0
  316. package/docs/mail-integration.md +608 -0
  317. package/docs/plan-self-driving-support.md +433 -0
  318. package/docs/spec-self-driving-support.md +462 -0
  319. package/docs/team-templates.md +860 -0
  320. package/docs/teams.md +233 -0
  321. package/package.json +5 -3
  322. package/src/acp/__tests__/integration.test.ts +161 -1
  323. package/src/acp/__tests__/macro-agent.test.ts +95 -0
  324. package/src/acp/__tests__/session-persistence.test.ts +276 -0
  325. package/src/acp/macro-agent.ts +79 -7
  326. package/src/acp/session-mapper.ts +108 -1
  327. package/src/acp/types.ts +33 -1
  328. package/src/agent/agent-manager.ts +278 -6
  329. package/src/agent/types.ts +27 -0
  330. package/src/agent/wake.ts +15 -0
  331. package/src/agent-detection/__tests__/command-builder.test.ts +336 -0
  332. package/src/agent-detection/__tests__/detector.test.ts +768 -0
  333. package/src/agent-detection/__tests__/registry.test.ts +254 -0
  334. package/src/agent-detection/command-builder.ts +90 -0
  335. package/src/agent-detection/detector.ts +307 -0
  336. package/src/agent-detection/index.ts +36 -0
  337. package/src/agent-detection/registry.ts +200 -0
  338. package/src/agent-detection/types.ts +184 -0
  339. package/src/api/__tests__/conversation-api.test.ts +468 -0
  340. package/src/api/server.ts +425 -1
  341. package/src/api/types.ts +64 -1
  342. package/src/cli/acp.ts +9 -1
  343. package/src/cli/index.ts +44 -0
  344. package/src/cli/mcp.ts +47 -0
  345. package/src/config/index.ts +9 -0
  346. package/src/config/project-config.ts +107 -0
  347. package/src/lifecycle/cascade.ts +1 -1
  348. package/src/lifecycle/handlers/index.ts +8 -0
  349. package/src/lifecycle/handlers/worker.ts +48 -3
  350. package/src/mail/__tests__/conversation-lifecycle.test.ts +409 -0
  351. package/src/mail/__tests__/eventstore-stores.test.ts +1073 -0
  352. package/src/mail/__tests__/mail-full-agent.e2e.test.ts +575 -0
  353. package/src/mail/__tests__/mail-integration.test.ts +759 -0
  354. package/src/mail/__tests__/mail-map-protocol.e2e.test.ts +1068 -0
  355. package/src/mail/__tests__/mail-service.test.ts +506 -0
  356. package/src/mail/__tests__/turn-recorder.test.ts +328 -0
  357. package/src/mail/conversation-map.ts +107 -0
  358. package/src/mail/index.ts +25 -0
  359. package/src/mail/mail-service.ts +257 -0
  360. package/src/mail/stores/eventstore-conversation-store.ts +146 -0
  361. package/src/mail/stores/eventstore-participant-store.ts +172 -0
  362. package/src/mail/stores/eventstore-thread-store.ts +129 -0
  363. package/src/mail/stores/eventstore-turn-store.ts +173 -0
  364. package/src/mail/stores/index.ts +12 -0
  365. package/src/mail/stores/types.ts +160 -0
  366. package/src/mail/turn-recorder.ts +124 -0
  367. package/src/map/README.md +79 -0
  368. package/src/map/adapter/__tests__/extensions.test.ts +359 -0
  369. package/src/map/adapter/__tests__/map-adapter.test.ts +90 -0
  370. package/src/map/adapter/__tests__/workspace-files.test.ts +673 -0
  371. package/src/map/adapter/acp-over-map.ts +45 -2
  372. package/src/map/adapter/event-translator.ts +4 -0
  373. package/src/map/adapter/extensions/agent-detection.ts +201 -0
  374. package/src/map/adapter/extensions/index.ts +63 -0
  375. package/src/map/adapter/extensions/resume.ts +114 -0
  376. package/src/map/adapter/extensions/workspace-files.ts +449 -0
  377. package/src/map/adapter/mail-handler-adapter.ts +429 -0
  378. package/src/map/adapter/map-adapter.ts +173 -27
  379. package/src/map/adapter/rpc-handler.ts +8 -1
  380. package/src/map/index.ts +3 -0
  381. package/src/map/types.ts +3 -1
  382. package/src/mcp/mcp-server.ts +67 -0
  383. package/src/mcp/tools/claim_task.ts +86 -0
  384. package/src/mcp/tools/done.ts +59 -10
  385. package/src/mcp/tools/list_claimable_tasks.ts +93 -0
  386. package/src/mcp/tools/unclaim_task.ts +71 -0
  387. package/src/metrics/index.ts +9 -0
  388. package/src/metrics/metrics.ts +280 -0
  389. package/src/roles/capabilities.ts +3 -0
  390. package/src/roles/types.ts +2 -1
  391. package/src/router/README.md +120 -0
  392. package/src/router/__tests__/message-router.test.ts +561 -0
  393. package/src/router/channels.ts +3 -4
  394. package/src/router/message-router.ts +308 -22
  395. package/src/router/role-resolver.ts +22 -1
  396. package/src/router/types.ts +36 -1
  397. package/src/server/combined-server.ts +36 -2
  398. package/src/store/README.md +134 -0
  399. package/src/store/event-store.ts +546 -3
  400. package/src/store/types/agents.ts +1 -1
  401. package/src/store/types/conversations.ts +129 -0
  402. package/src/store/types/events.ts +5 -1
  403. package/src/store/types/index.ts +2 -0
  404. package/src/store/types/sessions.ts +53 -0
  405. package/src/store/types/tasks.ts +3 -0
  406. package/src/task/backend/memory.ts +116 -0
  407. package/src/task/backend/types.ts +43 -0
  408. package/src/teams/__tests__/cross-subsystem.integration.test.ts +983 -0
  409. package/src/teams/__tests__/e2e/team-runtime.e2e.test.ts +553 -0
  410. package/src/teams/__tests__/team-system.test.ts +1280 -0
  411. package/src/teams/index.ts +13 -0
  412. package/src/teams/team-loader.ts +434 -0
  413. package/src/teams/team-runtime.ts +727 -0
  414. package/src/teams/types.ts +377 -0
  415. package/src/trigger/router/trigger-router.ts +30 -3
  416. package/src/trigger/wake/types.ts +32 -5
  417. package/src/trigger/wake/wake-manager.ts +2 -2
  418. package/src/workspace/dataplane-adapter.ts +1 -1
  419. package/src/workspace/index.ts +1 -1
  420. package/src/workspace/strategies/index.ts +18 -0
  421. package/src/workspace/strategies/optimistic.ts +136 -0
  422. package/src/workspace/strategies/queue.ts +81 -0
  423. package/src/workspace/strategies/registry.ts +89 -0
  424. package/src/workspace/strategies/trunk.ts +123 -0
  425. package/src/workspace/strategies/types.ts +145 -0
  426. package/src/workspace/types.ts +1 -1
  427. package/src/workspace/workspace-manager.ts +1 -1
  428. package/.claude/settings.local.json +0 -59
  429. package/dist/map/utils/address-translation.d.ts +0 -99
  430. package/dist/map/utils/address-translation.d.ts.map +0 -1
  431. package/dist/map/utils/address-translation.js +0 -285
  432. package/dist/map/utils/address-translation.js.map +0 -1
  433. package/dist/map/utils/index.d.ts +0 -7
  434. package/dist/map/utils/index.d.ts.map +0 -1
  435. package/dist/map/utils/index.js +0 -7
  436. package/dist/map/utils/index.js.map +0 -1
  437. package/openspec/AGENTS.md +0 -456
  438. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/design.md +0 -128
  439. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/proposal.md +0 -49
  440. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/agent-manager/spec.md +0 -150
  441. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/cli-api/spec.md +0 -258
  442. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/event-store/spec.md +0 -160
  443. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/mcp-tools/spec.md +0 -224
  444. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/message-router/spec.md +0 -153
  445. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/task-manager/spec.md +0 -136
  446. package/openspec/changes/archive/2025-12-21-add-mvp-foundation/tasks.md +0 -147
  447. package/openspec/project.md +0 -31
  448. package/openspec/specs/agent-manager/spec.md +0 -154
  449. package/openspec/specs/cli-api/spec.md +0 -262
  450. package/openspec/specs/event-store/spec.md +0 -164
  451. package/openspec/specs/mcp-tools/spec.md +0 -228
  452. package/openspec/specs/message-router/spec.md +0 -157
  453. package/openspec/specs/task-manager/spec.md +0 -140
  454. package/references/acp-factory-ref/CHANGELOG.md +0 -33
  455. package/references/acp-factory-ref/LICENSE +0 -21
  456. package/references/acp-factory-ref/README.md +0 -341
  457. package/references/acp-factory-ref/package-lock.json +0 -3102
  458. package/references/acp-factory-ref/package.json +0 -96
  459. package/references/acp-factory-ref/python/CHANGELOG.md +0 -33
  460. package/references/acp-factory-ref/python/LICENSE +0 -21
  461. package/references/acp-factory-ref/python/Makefile +0 -57
  462. package/references/acp-factory-ref/python/README.md +0 -253
  463. package/references/acp-factory-ref/python/pyproject.toml +0 -73
  464. package/references/acp-factory-ref/python/tests/__init__.py +0 -0
  465. package/references/acp-factory-ref/python/tests/e2e/__init__.py +0 -1
  466. package/references/acp-factory-ref/python/tests/e2e/test_codex_e2e.py +0 -349
  467. package/references/acp-factory-ref/python/tests/e2e/test_gemini_e2e.py +0 -165
  468. package/references/acp-factory-ref/python/tests/e2e/test_opencode_e2e.py +0 -296
  469. package/references/acp-factory-ref/python/tests/test_client_handler.py +0 -543
  470. package/references/acp-factory-ref/python/tests/test_pushable.py +0 -199
  471. package/references/claude-code-acp/.github/workflows/ci.yml +0 -45
  472. package/references/claude-code-acp/.github/workflows/publish.yml +0 -34
  473. package/references/claude-code-acp/.prettierrc.json +0 -4
  474. package/references/claude-code-acp/CHANGELOG.md +0 -249
  475. package/references/claude-code-acp/LICENSE +0 -222
  476. package/references/claude-code-acp/README.md +0 -53
  477. package/references/claude-code-acp/docs/RELEASES.md +0 -24
  478. package/references/claude-code-acp/eslint.config.js +0 -48
  479. package/references/claude-code-acp/package-lock.json +0 -4570
  480. package/references/claude-code-acp/package.json +0 -88
  481. package/references/claude-code-acp/scripts/release.sh +0 -119
  482. package/references/claude-code-acp/src/acp-agent.ts +0 -2065
  483. package/references/claude-code-acp/src/index.ts +0 -26
  484. package/references/claude-code-acp/src/lib.ts +0 -38
  485. package/references/claude-code-acp/src/mcp-server.ts +0 -911
  486. package/references/claude-code-acp/src/settings.ts +0 -522
  487. package/references/claude-code-acp/src/tests/.claude/commands/quick-math.md +0 -5
  488. package/references/claude-code-acp/src/tests/.claude/commands/say-hello.md +0 -6
  489. package/references/claude-code-acp/src/tests/acp-agent-fork.test.ts +0 -479
  490. package/references/claude-code-acp/src/tests/acp-agent.test.ts +0 -1502
  491. package/references/claude-code-acp/src/tests/extract-lines.test.ts +0 -103
  492. package/references/claude-code-acp/src/tests/fork-session.test.ts +0 -335
  493. package/references/claude-code-acp/src/tests/replace-and-calculate-location.test.ts +0 -334
  494. package/references/claude-code-acp/src/tests/settings.test.ts +0 -617
  495. package/references/claude-code-acp/src/tests/skills-options.test.ts +0 -187
  496. package/references/claude-code-acp/src/tests/tools.test.ts +0 -318
  497. package/references/claude-code-acp/src/tests/typescript-declarations.test.ts +0 -558
  498. package/references/claude-code-acp/src/tools.ts +0 -819
  499. package/references/claude-code-acp/src/utils.ts +0 -171
  500. package/references/claude-code-acp/tsconfig.json +0 -18
  501. package/references/claude-code-acp/vitest.config.ts +0 -19
  502. package/references/multi-agent-protocol/.sudocode/issues.jsonl +0 -82
  503. package/references/multi-agent-protocol/.sudocode/specs.jsonl +0 -9
  504. package/references/multi-agent-protocol/LICENSE +0 -21
  505. package/references/multi-agent-protocol/README.md +0 -113
  506. package/references/multi-agent-protocol/docs/00-design-specification.md +0 -460
  507. package/references/multi-agent-protocol/docs/01-open-questions.md +0 -1050
  508. package/references/multi-agent-protocol/docs/02-wire-protocol.md +0 -296
  509. package/references/multi-agent-protocol/docs/03-streaming-semantics.md +0 -252
  510. package/references/multi-agent-protocol/docs/04-error-handling.md +0 -231
  511. package/references/multi-agent-protocol/docs/05-connection-model.md +0 -244
  512. package/references/multi-agent-protocol/docs/06-visibility-permissions.md +0 -243
  513. package/references/multi-agent-protocol/docs/07-federation.md +0 -259
  514. package/references/multi-agent-protocol/docs/08-macro-agent-migration.md +0 -253
  515. package/references/multi-agent-protocol/package-lock.json +0 -3239
  516. package/references/multi-agent-protocol/package.json +0 -56
  517. package/references/multi-agent-protocol/schema/meta.json +0 -337
  518. package/references/multi-agent-protocol/schema/schema.json +0 -1828
@@ -0,0 +1,121 @@
1
+ /**
2
+ * CLI Agent Auto-Detection Types
3
+ *
4
+ * Type definitions for detecting installed CLI coding agents
5
+ * and constructing headless invocation commands.
6
+ */
7
+ /**
8
+ * Headless invocation configuration for a CLI agent.
9
+ */
10
+ export interface HeadlessConfig {
11
+ /** Subcommand before prompt (e.g., "exec" for codex, "run" for goose) */
12
+ subcommand?: string;
13
+ /** Flag to pass the prompt. Empty string means prompt is positional. */
14
+ promptFlag: string;
15
+ /** Default flags always included in headless mode */
16
+ defaultFlags?: string[];
17
+ }
18
+ /**
19
+ * Definition of a known CLI coding agent.
20
+ * Describes how to detect and invoke the agent in headless mode.
21
+ */
22
+ export interface CLIAgentDefinition {
23
+ /** Unique identifier (e.g., "claude-code", "codex") */
24
+ id: string;
25
+ /** Human-readable display name */
26
+ name: string;
27
+ /** Short description */
28
+ description: string;
29
+ /** The binary/command name to invoke */
30
+ binary: string;
31
+ /** Arguments to check version (typically ["--version"]) */
32
+ versionArgs: string[];
33
+ /** Headless invocation configuration */
34
+ headless: HeadlessConfig;
35
+ /** Flag for model selection (e.g., "--model") */
36
+ modelFlag?: string;
37
+ /** Flag for working directory (e.g., "--cwd", "--path") */
38
+ cwdFlag?: string;
39
+ /** Provider/vendor name */
40
+ vendor: string;
41
+ }
42
+ /**
43
+ * Result of detecting a single CLI agent on the system.
44
+ */
45
+ export interface DetectedAgent {
46
+ /** Agent definition ID */
47
+ id: string;
48
+ /** Human-readable name */
49
+ name: string;
50
+ /** Whether the binary was found on PATH */
51
+ installed: boolean;
52
+ /** Parsed version string (e.g., "1.2.3") */
53
+ version?: string;
54
+ /** Absolute path to binary */
55
+ path?: string;
56
+ /** The full agent definition (for client display) */
57
+ definition: CLIAgentDefinition;
58
+ /** When detection was performed (epoch ms) */
59
+ detectedAt: number;
60
+ }
61
+ /**
62
+ * Result of a full detection scan across all known agents.
63
+ */
64
+ export interface DetectionResult {
65
+ /** All agents (installed and not installed) */
66
+ agents: DetectedAgent[];
67
+ /** Number of agents scanned */
68
+ scanned: number;
69
+ /** Detection duration in milliseconds */
70
+ durationMs: number;
71
+ /** Whether detection is still in progress */
72
+ pending?: boolean;
73
+ }
74
+ /**
75
+ * Options for building a spawn command.
76
+ */
77
+ export interface SpawnCommandOptions {
78
+ /** Model to use (passed via modelFlag) */
79
+ model?: string;
80
+ /** Working directory (passed via cwdFlag) */
81
+ cwd?: string;
82
+ }
83
+ /**
84
+ * Result of building a spawn command.
85
+ */
86
+ export interface SpawnCommand {
87
+ /** The binary/command to execute */
88
+ command: string;
89
+ /** Arguments to pass to the command */
90
+ args: string[];
91
+ }
92
+ /**
93
+ * Configuration for the agent detection system.
94
+ */
95
+ export interface AgentDetectionConfig {
96
+ /** Whether agent detection is enabled (default: true) */
97
+ enabled?: boolean;
98
+ /** Cache TTL in milliseconds (default: 60000) */
99
+ cacheTtlMs?: number;
100
+ /** Timeout for `which` calls in milliseconds (default: 5000) */
101
+ whichTimeoutMs?: number;
102
+ /** Timeout for version checks in milliseconds (default: 10000) */
103
+ versionTimeoutMs?: number;
104
+ /** Additional custom agent definitions to include */
105
+ additionalAgents?: CLIAgentDefinition[];
106
+ /** Agent IDs to exclude from detection */
107
+ disabledAgents?: string[];
108
+ }
109
+ /**
110
+ * Error codes for agent detection operations.
111
+ */
112
+ export type AgentDetectionErrorCode = "UNKNOWN_AGENT" | "AGENT_NOT_INSTALLED" | "DETECTION_FAILED" | "DETECTION_TIMEOUT";
113
+ /**
114
+ * Error thrown by agent detection operations.
115
+ */
116
+ export declare class AgentDetectionError extends Error {
117
+ readonly code: AgentDetectionErrorCode;
118
+ readonly agentId?: string | undefined;
119
+ constructor(message: string, code: AgentDetectionErrorCode, agentId?: string | undefined);
120
+ }
121
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agent-detection/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;IAEnB,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,EAAE,EAAE,MAAM,CAAC;IAEX,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IAEb,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IAEpB,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IAEf,2DAA2D;IAC3D,WAAW,EAAE,MAAM,EAAE,CAAC;IAEtB,wCAAwC;IACxC,QAAQ,EAAE,cAAc,CAAC;IAEzB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,0BAA0B;IAC1B,EAAE,EAAE,MAAM,CAAC;IAEX,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IAEb,2CAA2C;IAC3C,SAAS,EAAE,OAAO,CAAC;IAEnB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,qDAAqD;IACrD,UAAU,EAAE,kBAAkB,CAAC;IAE/B,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,+CAA+C;IAC/C,MAAM,EAAE,aAAa,EAAE,CAAC;IAExB,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC;IAEhB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IAEnB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAMD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,6CAA6C;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAEhB,uCAAuC;IACvC,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAMD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,gEAAgE;IAChE,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,kEAAkE;IAClE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAExC,0CAA0C;IAC1C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAMD;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAC/B,eAAe,GACf,qBAAqB,GACrB,kBAAkB,GAClB,mBAAmB,CAAC;AAExB;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAG1B,IAAI,EAAE,uBAAuB;aAC7B,OAAO,CAAC,EAAE,MAAM;gBAFhC,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,uBAAuB,EAC7B,OAAO,CAAC,EAAE,MAAM,YAAA;CAKnC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * CLI Agent Auto-Detection Types
3
+ *
4
+ * Type definitions for detecting installed CLI coding agents
5
+ * and constructing headless invocation commands.
6
+ */
7
+ /**
8
+ * Error thrown by agent detection operations.
9
+ */
10
+ export class AgentDetectionError extends Error {
11
+ code;
12
+ agentId;
13
+ constructor(message, code, agentId) {
14
+ super(message);
15
+ this.code = code;
16
+ this.agentId = agentId;
17
+ this.name = "AgentDetectionError";
18
+ }
19
+ }
20
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agent-detection/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsKH;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAG1B;IACA;IAHlB,YACE,OAAe,EACC,IAA6B,EAC7B,OAAgB;QAEhC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAyB;QAC7B,YAAO,GAAP,OAAO,CAAS;QAGhC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF"}
@@ -30,6 +30,10 @@ export interface APIServices {
30
30
  agentManager: AgentManager;
31
31
  taskManager: TaskManager;
32
32
  messageRouter: MessageRouter;
33
+ /** Optional mail service for conversation tracking */
34
+ mailService?: import("../mail/mail-service.js").MailService;
35
+ /** Optional conversation map for agent-to-conversation tracking */
36
+ conversationMap?: import("../mail/conversation-map.js").ConversationMap;
33
37
  }
34
38
  export interface StopOptions {
35
39
  /** Force immediate shutdown, skipping grace period */
@@ -103,7 +107,7 @@ export declare function createAPIServer(services: APIServices, config?: APIServe
103
107
  * @param config - Configuration options
104
108
  * @returns Express app
105
109
  */
106
- export declare function createAPIApp(services: Pick<APIServices, "eventStore" | "agentManager" | "taskManager" | "messageRouter">, config?: {
110
+ export declare function createAPIApp(services: Pick<APIServices, "eventStore" | "agentManager" | "taskManager" | "messageRouter"> & Pick<Partial<APIServices>, "mailService" | "conversationMap">, config?: {
107
111
  cors?: boolean;
108
112
  }): Express;
109
113
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAgB,EAAE,OAAO,EAAmC,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAChD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,OAAO,KAAK,EACV,YAAY,EAmBZ,SAAS,EAcV,MAAM,YAAY,CAAC;AAWpB,MAAM,WAAW,eAAe;IAC9B,wBAAwB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,sBAAsB;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,kBAAkB;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf,sFAAsF;IACtF,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,UAAU,CAAC;IACvB,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,EAAE,aAAa,CAAC;IAC7B,sDAAsD;IACtD,WAAW,CAAC,EAAE,OAAO,yBAAyB,EAAE,WAAW,CAAC;IAC5D,mEAAmE;IACnE,eAAe,CAAC,EAAE,OAAO,6BAA6B,EAAE,eAAe,CAAC;CACzE;AAMD,MAAM,WAAW,WAAW;IAC1B,sDAAsD;IACtD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,8BAA8B;IAC9B,GAAG,EAAE,OAAO,CAAC;IAEb,kBAAkB;IAClB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IAEpB,uBAAuB;IACvB,GAAG,EAAE,eAAe,CAAC;IAErB,uBAAuB;IACvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;;;;;;OAOG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3C,yBAAyB;IACzB,SAAS,IAAI,YAAY,CAAC;IAE1B,qDAAqD;IACrD,sBAAsB,IAAI,IAAI,CAAC;CAChC;AA0BD,UAAU,QAAQ;IAChB,EAAE,EAAE,SAAS,CAAC;IACd,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,2CAA2C;IAC3C,kBAAkB,IAAI,MAAM,CAAC;IAE7B,uCAAuC;IACvC,QAAQ,IAAI,IAAI,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,KAAK,CAAC;QACzB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;QAC3B,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IACH,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,cAAc,EAAE,OAAO,CAAC;IACxB,SAAS,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;IACzB,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,KAAK,IAAI,CAAC;CAC1D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,cAAc,CAoBrD;AA4ID,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,WAAW,EACrB,MAAM,GAAE,eAAoB,GAC3B,SAAS,CA02BX;AAMD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,YAAY,GAAG,cAAc,GAAG,aAAa,GAAG,eAAe,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,aAAa,GAAG,iBAAiB,CAAC,EAC5J,MAAM,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAC9B,OAAO,CAoiBT;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,eAAe,EACpB,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,YAAY,GAAG,cAAc,GAAG,aAAa,CAAC,EAC1E,GAAG,CAAC,EAAE,OAAO,GACZ,mBAAmB,CAmIrB"}
@@ -33,6 +33,115 @@ export function createAPISharedState() {
33
33
  broadcast,
34
34
  };
35
35
  }
36
+ function conversationToSummary(conv) {
37
+ return {
38
+ id: conv.id,
39
+ type: conv.type,
40
+ status: conv.status,
41
+ subject: conv.subject ?? "",
42
+ created_by: conv.createdBy,
43
+ created_at: conv.createdAt,
44
+ updated_at: conv.updatedAt,
45
+ participant_count: conv.participantCount,
46
+ parent_conversation_id: conv.parentConversationId || undefined,
47
+ };
48
+ }
49
+ function conversationToDetail(conv) {
50
+ return {
51
+ ...conversationToSummary(conv),
52
+ closed_at: conv.closedAt || undefined,
53
+ closed_by: conv.closedBy || undefined,
54
+ close_reason: conv.closeReason || undefined,
55
+ };
56
+ }
57
+ function turnToSummary(turn) {
58
+ return {
59
+ id: turn.id,
60
+ conversation_id: turn.conversationId,
61
+ participant: turn.participant,
62
+ content_type: turn.contentType,
63
+ content: turn.content,
64
+ timestamp: turn.timestamp,
65
+ source_type: turn.sourceType || undefined,
66
+ source_message_id: turn.sourceMessageId || undefined,
67
+ };
68
+ }
69
+ /**
70
+ * Register conversation API routes on an Express app.
71
+ * Used by both standalone and shared server modes.
72
+ */
73
+ function registerConversationRoutes(app, services, sendError) {
74
+ if (!services.mailService)
75
+ return;
76
+ const { mailService } = services;
77
+ // GET /api/conversations - List conversations
78
+ app.get("/api/conversations", (req, res) => {
79
+ const params = req.query;
80
+ let conversations = mailService.listConversations({
81
+ type: params.type,
82
+ status: params.status,
83
+ });
84
+ const total = conversations.length;
85
+ const offset = parseInt(params.offset) || 0;
86
+ const limit = parseInt(params.limit) || 50;
87
+ conversations = conversations.slice(offset, offset + limit);
88
+ const response = {
89
+ conversations: conversations.map(conversationToSummary),
90
+ total,
91
+ };
92
+ res.json(response);
93
+ });
94
+ // GET /api/conversations/:id - Get conversation detail
95
+ app.get("/api/conversations/:id", (req, res) => {
96
+ const conv = mailService.getConversation(req.params.id);
97
+ if (!conv) {
98
+ return sendError(res, 404, "CONVERSATION_NOT_FOUND", `Conversation not found: ${req.params.id}`);
99
+ }
100
+ res.json(conversationToDetail(conv));
101
+ });
102
+ // GET /api/conversations/:id/turns - List turns for a conversation
103
+ app.get("/api/conversations/:id/turns", (req, res) => {
104
+ const conv = mailService.getConversation(req.params.id);
105
+ if (!conv) {
106
+ return sendError(res, 404, "CONVERSATION_NOT_FOUND", `Conversation not found: ${req.params.id}`);
107
+ }
108
+ const turns = mailService.listTurns({ conversationId: req.params.id });
109
+ const limit = parseInt(req.query.limit) || 50;
110
+ const offset = parseInt(req.query.offset) || 0;
111
+ const paged = turns.slice(offset, offset + limit);
112
+ const response = {
113
+ turns: paged.map(turnToSummary),
114
+ total: turns.length,
115
+ };
116
+ res.json(response);
117
+ });
118
+ // POST /api/conversations/:id/close - Close a conversation
119
+ app.post("/api/conversations/:id/close", (req, res) => {
120
+ const conv = mailService.getConversation(req.params.id);
121
+ if (!conv) {
122
+ return sendError(res, 404, "CONVERSATION_NOT_FOUND", `Conversation not found: ${req.params.id}`);
123
+ }
124
+ if (conv.status !== "active") {
125
+ return sendError(res, 400, "ALREADY_CLOSED", `Conversation already ${conv.status}`);
126
+ }
127
+ const body = req.body;
128
+ mailService.closeConversation({
129
+ conversationId: req.params.id,
130
+ closedBy: "api",
131
+ reason: body.reason ?? "completed",
132
+ });
133
+ res.json({ success: true });
134
+ });
135
+ // GET /api/conversations/:id/participants - List participants
136
+ app.get("/api/conversations/:id/participants", (req, res) => {
137
+ const conv = mailService.getConversation(req.params.id);
138
+ if (!conv) {
139
+ return sendError(res, 404, "CONVERSATION_NOT_FOUND", `Conversation not found: ${req.params.id}`);
140
+ }
141
+ const participants = mailService.listParticipants(req.params.id);
142
+ res.json({ participants, total: participants.length });
143
+ });
144
+ }
36
145
  // ─────────────────────────────────────────────────────────────────
37
146
  // Create API Server
38
147
  // ─────────────────────────────────────────────────────────────────
@@ -177,6 +286,25 @@ export function createAPIServer(services, config = {}) {
177
286
  state.initialized = true;
178
287
  state.headManagerId = headManager.id;
179
288
  state.startedAt = Date.now();
289
+ // Create session conversation for mail tracking
290
+ if (services.mailService && services.conversationMap) {
291
+ try {
292
+ const { conversationId } = services.mailService.createConversation({
293
+ type: "session",
294
+ subject: "User session",
295
+ createdBy: "user",
296
+ });
297
+ services.mailService.joinConversation({
298
+ conversationId,
299
+ participantId: headManager.id,
300
+ role: "worker",
301
+ });
302
+ services.conversationMap.setSessionConversation(headManager.id, conversationId);
303
+ }
304
+ catch {
305
+ // Never fail init due to mail errors
306
+ }
307
+ }
180
308
  const response = {
181
309
  success: true,
182
310
  head_manager_id: headManager.id,
@@ -193,6 +321,101 @@ export function createAPIServer(services, config = {}) {
193
321
  const status = getStatus();
194
322
  res.json(status);
195
323
  });
324
+ // GET /api/team - Get active team info
325
+ app.get("/api/team", (_req, res) => {
326
+ // Check for team config in EventStore
327
+ const statusEvents = eventStore.query({ type: "status", limit: 50 });
328
+ const teamConfigEvent = statusEvents.find((e) => e.payload?.team_config != null);
329
+ if (!teamConfigEvent?.payload?.team_config) {
330
+ res.json({ active: false });
331
+ return;
332
+ }
333
+ const tc = teamConfigEvent.payload.team_config;
334
+ res.json({
335
+ active: true,
336
+ name: tc.teamName,
337
+ strategy: tc.strategy,
338
+ taskMode: tc.taskMode,
339
+ enforcement: tc.enforcement,
340
+ });
341
+ });
342
+ // ─────────────────────────────────────────────────────────────────
343
+ // Metrics Endpoints (Phase 5)
344
+ // ─────────────────────────────────────────────────────────────────
345
+ // GET /api/metrics/throughput - Task throughput metrics
346
+ app.get("/api/metrics/throughput", (req, res) => {
347
+ const windowMs = req.query.window_ms
348
+ ? Number(req.query.window_ms)
349
+ : 5 * 60 * 1000;
350
+ const after = Date.now() - windowMs;
351
+ const taskEvents = eventStore.query({ type: "task", after });
352
+ let completed = 0, failed = 0, created = 0;
353
+ for (const e of taskEvents) {
354
+ const action = e.payload?.action;
355
+ if (action === "created")
356
+ created++;
357
+ else if (action === "completed")
358
+ completed++;
359
+ else if (action === "failed")
360
+ failed++;
361
+ }
362
+ const windowMin = windowMs / 60000;
363
+ res.json({
364
+ tasksCompleted: completed,
365
+ tasksFailed: failed,
366
+ tasksCreated: created,
367
+ completedPerMinute: windowMin > 0 ? Math.round((completed / windowMin) * 100) / 100 : 0,
368
+ windowMs,
369
+ });
370
+ });
371
+ // GET /api/metrics/utilization - Agent utilization metrics
372
+ app.get("/api/metrics/utilization", (_req, res) => {
373
+ const allAgents = eventStore.listAgents();
374
+ const active = allAgents.filter((a) => a.state === "running" || a.state === "spawning");
375
+ const byRole = {};
376
+ const byState = {};
377
+ for (const a of active) {
378
+ const role = a.role ?? "unknown";
379
+ byRole[role] = (byRole[role] ?? 0) + 1;
380
+ }
381
+ for (const a of allAgents) {
382
+ byState[a.state] = (byState[a.state] ?? 0) + 1;
383
+ }
384
+ res.json({
385
+ activeAgents: active.length,
386
+ totalAgents: allAgents.length,
387
+ agentsByRole: byRole,
388
+ agentsByState: byState,
389
+ });
390
+ });
391
+ // GET /api/metrics/errors - Error metrics
392
+ app.get("/api/metrics/errors", (req, res) => {
393
+ const windowMs = req.query.window_ms
394
+ ? Number(req.query.window_ms)
395
+ : 30 * 60 * 1000;
396
+ const limit = req.query.limit ? Number(req.query.limit) : 20;
397
+ const statusEvents = eventStore.query({
398
+ type: "status",
399
+ after: Date.now() - windowMs,
400
+ });
401
+ const errors = [];
402
+ const byType = {};
403
+ for (const e of statusEvents) {
404
+ if (e.payload?.status_type !== "failed")
405
+ continue;
406
+ const agentId = e.source?.agent_id ?? "unknown";
407
+ const summary = e.payload?.summary ?? "Unknown error";
408
+ const errorType = e.payload?.details?.signal ?? "agent_failed";
409
+ errors.push({ timestamp: e.timestamp, agentId, type: errorType, summary });
410
+ byType[errorType] = (byType[errorType] ?? 0) + 1;
411
+ }
412
+ errors.sort((a, b) => b.timestamp - a.timestamp);
413
+ res.json({
414
+ totalErrors: errors.length,
415
+ errorsByType: byType,
416
+ recentErrors: errors.slice(0, limit),
417
+ });
418
+ });
196
419
  // POST /api/conversation/message - Send message to head manager
197
420
  app.post("/api/conversation/message", async (req, res) => {
198
421
  // Reject new messages during shutdown
@@ -214,6 +437,23 @@ export function createAPIServer(services, config = {}) {
214
437
  content: body.message,
215
438
  timestamp: Date.now(),
216
439
  });
440
+ // Record user turn in session conversation
441
+ if (services.mailService && services.conversationMap && state.headManagerId) {
442
+ try {
443
+ const sessionConvId = services.conversationMap.getSessionConversation(state.headManagerId);
444
+ if (sessionConvId) {
445
+ services.mailService.recordTurn({
446
+ conversationId: sessionConvId,
447
+ participant: "user",
448
+ contentType: "text",
449
+ content: body.message,
450
+ });
451
+ }
452
+ }
453
+ catch {
454
+ // Never fail message handling due to mail errors
455
+ }
456
+ }
217
457
  // Broadcast to conversation channel
218
458
  broadcastToChannel("conversation", {
219
459
  type: "message",
@@ -253,6 +493,23 @@ export function createAPIServer(services, config = {}) {
253
493
  agent_id: state.headManagerId,
254
494
  timestamp: Date.now(),
255
495
  });
496
+ // Record assistant turn in session conversation
497
+ if (services.mailService && services.conversationMap && state.headManagerId) {
498
+ try {
499
+ const sessionConvId = services.conversationMap.getSessionConversation(state.headManagerId);
500
+ if (sessionConvId) {
501
+ services.mailService.recordTurn({
502
+ conversationId: sessionConvId,
503
+ participant: state.headManagerId,
504
+ contentType: "text",
505
+ content: responseContent,
506
+ });
507
+ }
508
+ }
509
+ catch {
510
+ // Never fail message handling due to mail errors
511
+ }
512
+ }
256
513
  // Broadcast response
257
514
  broadcastToChannel("conversation", {
258
515
  type: "message",
@@ -450,6 +707,8 @@ export function createAPIServer(services, config = {}) {
450
707
  sendError(res, 500, "INJECTION_FAILED", `Failed to inject context: ${error}`);
451
708
  }
452
709
  });
710
+ // Register conversation API routes (if mail service available)
711
+ registerConversationRoutes(app, services, sendError);
453
712
  // ─────────────────────────────────────────────────────────────────
454
713
  // HTTP Server
455
714
  // ─────────────────────────────────────────────────────────────────
@@ -509,6 +768,30 @@ export function createAPIServer(services, config = {}) {
509
768
  };
510
769
  broadcastToChannel("tasks", update);
511
770
  });
771
+ // Listen for conversation changes (if available)
772
+ if (eventStore.onConversationChange) {
773
+ eventStore.onConversationChange((conversationId, conversation) => {
774
+ if (!conversation)
775
+ return;
776
+ const update = {
777
+ type: "conversation_update",
778
+ conversation: conversationToSummary(conversation),
779
+ };
780
+ broadcastToChannel("conversations", update);
781
+ broadcastToChannel(`conversation:${conversationId}`, update);
782
+ });
783
+ }
784
+ // Listen for turn changes (if available)
785
+ if (eventStore.onTurnChange) {
786
+ eventStore.onTurnChange((conversationId, turn) => {
787
+ const update = {
788
+ type: "turn_added",
789
+ conversation_id: conversationId,
790
+ turn: turnToSummary(turn),
791
+ };
792
+ broadcastToChannel(`conversation:${conversationId}`, update);
793
+ });
794
+ }
512
795
  // ─────────────────────────────────────────────────────────────────
513
796
  // Server Lifecycle
514
797
  // ─────────────────────────────────────────────────────────────────
@@ -762,6 +1045,25 @@ export function createAPIApp(services, config = {}) {
762
1045
  state.initialized = true;
763
1046
  state.headManagerId = headManager.id;
764
1047
  state.startedAt = Date.now();
1048
+ // Create session conversation for mail tracking
1049
+ if (services.mailService && services.conversationMap) {
1050
+ try {
1051
+ const { conversationId } = services.mailService.createConversation({
1052
+ type: "session",
1053
+ subject: "User session",
1054
+ createdBy: "user",
1055
+ });
1056
+ services.mailService.joinConversation({
1057
+ conversationId,
1058
+ participantId: headManager.id,
1059
+ role: "worker",
1060
+ });
1061
+ services.conversationMap.setSessionConversation(headManager.id, conversationId);
1062
+ }
1063
+ catch {
1064
+ // Never fail init due to mail errors
1065
+ }
1066
+ }
765
1067
  const response = {
766
1068
  success: true,
767
1069
  head_manager_id: headManager.id,
@@ -818,6 +1120,23 @@ export function createAPIApp(services, config = {}) {
818
1120
  content: body.message,
819
1121
  timestamp: Date.now(),
820
1122
  });
1123
+ // Record user turn in session conversation
1124
+ if (services.mailService && services.conversationMap && state.headManagerId) {
1125
+ try {
1126
+ const sessionConvId = services.conversationMap.getSessionConversation(state.headManagerId);
1127
+ if (sessionConvId) {
1128
+ services.mailService.recordTurn({
1129
+ conversationId: sessionConvId,
1130
+ participant: "user",
1131
+ contentType: "text",
1132
+ content: body.message,
1133
+ });
1134
+ }
1135
+ }
1136
+ catch {
1137
+ // Never fail message handling due to mail errors
1138
+ }
1139
+ }
821
1140
  // Broadcast to conversation channel
822
1141
  state.broadcast("conversation", {
823
1142
  type: "message",
@@ -857,6 +1176,23 @@ export function createAPIApp(services, config = {}) {
857
1176
  agent_id: state.headManagerId,
858
1177
  timestamp: Date.now(),
859
1178
  });
1179
+ // Record assistant turn in session conversation
1180
+ if (services.mailService && services.conversationMap && state.headManagerId) {
1181
+ try {
1182
+ const sessionConvId = services.conversationMap.getSessionConversation(state.headManagerId);
1183
+ if (sessionConvId) {
1184
+ services.mailService.recordTurn({
1185
+ conversationId: sessionConvId,
1186
+ participant: state.headManagerId,
1187
+ contentType: "text",
1188
+ content: responseContent,
1189
+ });
1190
+ }
1191
+ }
1192
+ catch {
1193
+ // Never fail message handling due to mail errors
1194
+ }
1195
+ }
860
1196
  // Broadcast response
861
1197
  state.broadcast("conversation", {
862
1198
  type: "message",
@@ -1055,6 +1391,8 @@ export function createAPIApp(services, config = {}) {
1055
1391
  sendError(res, 500, "INJECTION_FAILED", `Failed to inject context: ${error}`);
1056
1392
  }
1057
1393
  });
1394
+ // Register conversation API routes (if mail service available)
1395
+ registerConversationRoutes(app, services, sendError);
1058
1396
  return app;
1059
1397
  }
1060
1398
  /**
@@ -1144,6 +1482,30 @@ export function setupAPIWebSocket(wss, services, app) {
1144
1482
  };
1145
1483
  broadcast("tasks", update);
1146
1484
  });
1485
+ // Listen for conversation changes (if available)
1486
+ if (eventStore.onConversationChange) {
1487
+ eventStore.onConversationChange((conversationId, conversation) => {
1488
+ if (!conversation)
1489
+ return;
1490
+ const update = {
1491
+ type: "conversation_update",
1492
+ conversation: conversationToSummary(conversation),
1493
+ };
1494
+ broadcast("conversations", update);
1495
+ broadcast(`conversation:${conversationId}`, update);
1496
+ });
1497
+ }
1498
+ // Listen for turn changes (if available)
1499
+ if (eventStore.onTurnChange) {
1500
+ eventStore.onTurnChange((conversationId, turn) => {
1501
+ const update = {
1502
+ type: "turn_added",
1503
+ conversation_id: conversationId,
1504
+ turn: turnToSummary(turn),
1505
+ };
1506
+ broadcast(`conversation:${conversationId}`, update);
1507
+ });
1508
+ }
1147
1509
  return {
1148
1510
  getConnectionCount() {
1149
1511
  return wsClients.size;