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
@@ -131,7 +131,10 @@ export async function createEventStore(config = {}) {
131
131
  const agentListeners = new Set();
132
132
  const agentIdListeners = new Map();
133
133
  const taskListeners = new Set();
134
+ const sessionListeners = new Set();
134
135
  const messageListeners = new Map();
136
+ const conversationListeners = new Set();
137
+ const turnListeners = new Set();
135
138
  /**
136
139
  * Emit a new event to the store
137
140
  */
@@ -155,7 +158,7 @@ export async function createEventStore(config = {}) {
155
158
  metadata: event.metadata ? JSON.stringify(event.metadata) : '',
156
159
  });
157
160
  // Update materialized views
158
- applyEventToViews(store, event, notifyAgentChange, notifyTaskChange, notifyMessageChange);
161
+ applyEventToViews(store, event, notifyAgentChange, notifyTaskChange, notifyMessageChange, notifySessionChange, notifyConversationChange, notifyTurnChange);
159
162
  return event;
160
163
  }
161
164
  /**
@@ -429,6 +432,157 @@ export async function createEventStore(config = {}) {
429
432
  messageListeners.get(agentId).add(callback);
430
433
  return () => messageListeners.get(agentId)?.delete(callback);
431
434
  }
435
+ /**
436
+ * Notify conversation change listeners
437
+ */
438
+ function notifyConversationChange(conversationId, conversation) {
439
+ for (const callback of conversationListeners) {
440
+ callback(conversationId, conversation);
441
+ }
442
+ }
443
+ /**
444
+ * Notify turn change listeners
445
+ */
446
+ function notifyTurnChange(conversationId, turn) {
447
+ for (const callback of turnListeners) {
448
+ callback(conversationId, turn);
449
+ }
450
+ }
451
+ /**
452
+ * Subscribe to conversation changes
453
+ */
454
+ function onConversationChange(callback) {
455
+ conversationListeners.add(callback);
456
+ return () => conversationListeners.delete(callback);
457
+ }
458
+ /**
459
+ * Subscribe to turn changes
460
+ */
461
+ function onTurnChange(callback) {
462
+ turnListeners.add(callback);
463
+ return () => turnListeners.delete(callback);
464
+ }
465
+ // ─── Session View Queries ───
466
+ function getSession(sessionId) {
467
+ const row = store.getRow('sessions', sessionId);
468
+ if (!row.id)
469
+ return null;
470
+ return rowToSession(row);
471
+ }
472
+ function listSessions(filter) {
473
+ const sessions = [];
474
+ const rowIds = store.getRowIds('sessions');
475
+ for (const rowId of rowIds) {
476
+ const row = store.getRow('sessions', rowId);
477
+ if (!row.id)
478
+ continue;
479
+ const session = rowToSession(row);
480
+ if (filter) {
481
+ if (filter.state && session.state !== filter.state)
482
+ continue;
483
+ if (filter.agent_id && session.current_agent_id !== filter.agent_id && session.head_manager_id !== filter.agent_id)
484
+ continue;
485
+ }
486
+ sessions.push(session);
487
+ }
488
+ return sessions;
489
+ }
490
+ /**
491
+ * Notify session change listeners
492
+ */
493
+ function notifySessionChange(sessionId, session) {
494
+ for (const callback of sessionListeners) {
495
+ callback(sessionId, session);
496
+ }
497
+ }
498
+ /**
499
+ * Subscribe to session changes
500
+ */
501
+ function onSessionChange(callback) {
502
+ sessionListeners.add(callback);
503
+ return () => sessionListeners.delete(callback);
504
+ }
505
+ // ─── Conversation View Queries ───
506
+ function getConversation(conversationId) {
507
+ const row = store.getRow('conversations', conversationId);
508
+ if (!row.id)
509
+ return null;
510
+ return rowToConversation(row);
511
+ }
512
+ function listConversations(filter) {
513
+ const conversations = [];
514
+ const rowIds = store.getRowIds('conversations');
515
+ for (const rowId of rowIds) {
516
+ const row = store.getRow('conversations', rowId);
517
+ if (!row.id)
518
+ continue;
519
+ const conversation = rowToConversation(row);
520
+ if (filter) {
521
+ if (filter.type && conversation.type !== filter.type)
522
+ continue;
523
+ if (filter.status && conversation.status !== filter.status)
524
+ continue;
525
+ if (filter.parentConversationId && conversation.parentConversationId !== filter.parentConversationId)
526
+ continue;
527
+ if (filter.participantId) {
528
+ // Check participants table for membership
529
+ const partRow = store.getRow('participants', `${conversation.id}:${filter.participantId}`);
530
+ if (!partRow.id)
531
+ continue;
532
+ // Skip if participant has left
533
+ if (partRow.left_at && partRow.left_at > 0)
534
+ continue;
535
+ }
536
+ }
537
+ conversations.push(conversation);
538
+ }
539
+ return conversations;
540
+ }
541
+ function listTurns(filter) {
542
+ const turns = [];
543
+ const rowIds = store.getRowIds('turns');
544
+ for (const rowId of rowIds) {
545
+ const row = store.getRow('turns', rowId);
546
+ if (!row.id)
547
+ continue;
548
+ const turn = rowToTurn(row);
549
+ // Filter by conversation (required)
550
+ if (turn.conversationId !== filter.conversationId)
551
+ continue;
552
+ // Optional filters
553
+ if (filter.threadId && turn.threadId !== filter.threadId)
554
+ continue;
555
+ if (filter.contentType && turn.contentType !== filter.contentType)
556
+ continue;
557
+ if (filter.participantId && turn.participant !== filter.participantId)
558
+ continue;
559
+ turns.push(turn);
560
+ }
561
+ // Sort
562
+ const order = filter.order ?? 'asc';
563
+ turns.sort((a, b) => order === 'asc' ? a.timestamp - b.timestamp : b.timestamp - a.timestamp);
564
+ // Limit
565
+ if (filter.limit) {
566
+ return turns.slice(0, filter.limit);
567
+ }
568
+ return turns;
569
+ }
570
+ function listParticipants(conversationId, active) {
571
+ const participants = [];
572
+ const rowIds = store.getRowIds('participants');
573
+ for (const rowId of rowIds) {
574
+ const row = store.getRow('participants', rowId);
575
+ if (!row.id)
576
+ continue;
577
+ if (row.conversation_id !== conversationId)
578
+ continue;
579
+ const participant = rowToParticipant(row);
580
+ if (active && participant.leftAt)
581
+ continue;
582
+ participants.push(participant);
583
+ }
584
+ return participants;
585
+ }
432
586
  /**
433
587
  * Persist store to disk
434
588
  */
@@ -662,7 +816,7 @@ export async function createEventStore(config = {}) {
662
816
  metadata: event.metadata ? JSON.stringify(event.metadata) : '',
663
817
  });
664
818
  // Update materialized views
665
- applyEventToViews(store, event, notifyAgentChange, notifyTaskChange, notifyMessageChange);
819
+ applyEventToViews(store, event, notifyAgentChange, notifyTaskChange, notifyMessageChange, notifySessionChange, notifyConversationChange, notifyTurnChange);
666
820
  }
667
821
  }
668
822
  /**
@@ -704,6 +858,12 @@ export async function createEventStore(config = {}) {
704
858
  listTasks,
705
859
  getMessages,
706
860
  getFullMessage,
861
+ getSession,
862
+ listSessions,
863
+ getConversation,
864
+ listConversations,
865
+ listTurns,
866
+ listParticipants,
707
867
  // Subscriptions
708
868
  addSubscription,
709
869
  removeSubscription,
@@ -713,6 +873,9 @@ export async function createEventStore(config = {}) {
713
873
  onAgentChange,
714
874
  onTaskChange,
715
875
  onMessageChange,
876
+ onSessionChange,
877
+ onConversationChange,
878
+ onTurnChange,
716
879
  // Lifecycle
717
880
  persist,
718
881
  reload,
@@ -739,6 +902,11 @@ function initializeTables(store) {
739
902
  store.getRowIds('tasks');
740
903
  store.getRowIds('messages');
741
904
  store.getRowIds('subscriptions');
905
+ store.getRowIds('sessions');
906
+ store.getRowIds('conversations');
907
+ store.getRowIds('turns');
908
+ store.getRowIds('threads');
909
+ store.getRowIds('participants');
742
910
  }
743
911
  /**
744
912
  * Rebuild materialized views from the event log
@@ -754,6 +922,21 @@ function rebuildViews(store) {
754
922
  for (const rowId of store.getRowIds('messages')) {
755
923
  store.delRow('messages', rowId);
756
924
  }
925
+ for (const rowId of store.getRowIds('sessions')) {
926
+ store.delRow('sessions', rowId);
927
+ }
928
+ for (const rowId of store.getRowIds('conversations')) {
929
+ store.delRow('conversations', rowId);
930
+ }
931
+ for (const rowId of store.getRowIds('turns')) {
932
+ store.delRow('turns', rowId);
933
+ }
934
+ for (const rowId of store.getRowIds('threads')) {
935
+ store.delRow('threads', rowId);
936
+ }
937
+ for (const rowId of store.getRowIds('participants')) {
938
+ store.delRow('participants', rowId);
939
+ }
757
940
  // Replay all events to rebuild views
758
941
  const events = [];
759
942
  for (const rowId of store.getRowIds('events')) {
@@ -778,13 +961,13 @@ function rebuildViews(store) {
778
961
  // Apply each event (no-op callbacks since we're rebuilding)
779
962
  const noop = () => { };
780
963
  for (const event of events) {
781
- applyEventToViews(store, event, noop, noop, noop);
964
+ applyEventToViews(store, event, noop, noop, noop, noop, noop, noop);
782
965
  }
783
966
  }
784
967
  /**
785
968
  * Apply a single event to materialized views
786
969
  */
787
- function applyEventToViews(store, event, notifyAgentChange, notifyTaskChange, notifyMessageChange) {
970
+ function applyEventToViews(store, event, notifyAgentChange, notifyTaskChange, notifyMessageChange, notifySessionChange, notifyConversationChange, notifyTurnChange) {
788
971
  switch (event.type) {
789
972
  case 'spawn':
790
973
  applySpawnEvent(store, event, notifyAgentChange);
@@ -801,6 +984,18 @@ function applyEventToViews(store, event, notifyAgentChange, notifyTaskChange, no
801
984
  case 'task':
802
985
  applyTaskEvent(store, event, notifyTaskChange);
803
986
  break;
987
+ case 'session':
988
+ applySessionEvent(store, event, notifySessionChange);
989
+ break;
990
+ case 'conversation':
991
+ applyConversationEvent(store, event, notifyConversationChange);
992
+ break;
993
+ case 'turn':
994
+ applyTurnEvent(store, event, notifyTurnChange);
995
+ break;
996
+ case 'thread':
997
+ applyThreadEvent(store, event);
998
+ break;
804
999
  case 'peer_message':
805
1000
  case 'peer_request':
806
1001
  // Peer events are stored in the event log for audit trail
@@ -1155,4 +1350,261 @@ function rowToTask(row) {
1155
1350
  retryState: row.retry_state ? JSON.parse(row.retry_state) : undefined,
1156
1351
  };
1157
1352
  }
1353
+ // ─────────────────────────────────────────────────────────────────────────────
1354
+ // Session Event Handlers
1355
+ // ─────────────────────────────────────────────────────────────────────────────
1356
+ /**
1357
+ * Apply session event to sessions view
1358
+ */
1359
+ function applySessionEvent(store, event, notify) {
1360
+ const payload = event.payload;
1361
+ const sessionId = payload.session_id;
1362
+ switch (payload.action) {
1363
+ case 'created': {
1364
+ store.setRow('sessions', sessionId, {
1365
+ id: sessionId,
1366
+ head_manager_id: payload.head_manager_id ?? '',
1367
+ current_agent_id: payload.head_manager_id ?? '',
1368
+ state: 'active',
1369
+ created_at: event.timestamp,
1370
+ updated_at: event.timestamp,
1371
+ closed_at: 0,
1372
+ });
1373
+ break;
1374
+ }
1375
+ case 'mounted': {
1376
+ store.setPartialRow('sessions', sessionId, {
1377
+ current_agent_id: payload.target_agent_id ?? '',
1378
+ state: 'mounted',
1379
+ updated_at: event.timestamp,
1380
+ });
1381
+ break;
1382
+ }
1383
+ case 'unmounted': {
1384
+ const existing = store.getRow('sessions', sessionId);
1385
+ store.setPartialRow('sessions', sessionId, {
1386
+ current_agent_id: existing.head_manager_id,
1387
+ state: 'active',
1388
+ updated_at: event.timestamp,
1389
+ });
1390
+ break;
1391
+ }
1392
+ case 'closed': {
1393
+ store.setPartialRow('sessions', sessionId, {
1394
+ state: 'closed',
1395
+ updated_at: event.timestamp,
1396
+ closed_at: event.timestamp,
1397
+ });
1398
+ break;
1399
+ }
1400
+ }
1401
+ const session = rowToSession(store.getRow('sessions', sessionId));
1402
+ notify(sessionId, session);
1403
+ }
1404
+ /**
1405
+ * Convert a TinyBase row to a Session object
1406
+ */
1407
+ function rowToSession(row) {
1408
+ return {
1409
+ id: row.id,
1410
+ head_manager_id: row.head_manager_id,
1411
+ current_agent_id: row.current_agent_id,
1412
+ state: row.state,
1413
+ created_at: row.created_at,
1414
+ updated_at: row.updated_at,
1415
+ closed_at: row.closed_at || undefined,
1416
+ };
1417
+ }
1418
+ // ─────────────────────────────────────────────────────────────────────────────
1419
+ // Conversation Event Handlers
1420
+ // ─────────────────────────────────────────────────────────────────────────────
1421
+ /**
1422
+ * Apply conversation event to conversations view
1423
+ */
1424
+ function applyConversationEvent(store, event, notify) {
1425
+ const payload = event.payload;
1426
+ const conversationId = payload.conversation_id;
1427
+ switch (payload.action) {
1428
+ case 'created': {
1429
+ store.setRow('conversations', conversationId, {
1430
+ id: conversationId,
1431
+ type: payload.conversation_type,
1432
+ status: 'active',
1433
+ subject: payload.subject ?? '',
1434
+ parent_conversation_id: payload.parent_conversation_id ?? '',
1435
+ created_by: event.source.agent_id ?? 'unknown',
1436
+ created_at: event.timestamp,
1437
+ updated_at: event.timestamp,
1438
+ closed_at: 0,
1439
+ closed_by: '',
1440
+ close_reason: '',
1441
+ participant_count: 0,
1442
+ metadata: payload.metadata ? JSON.stringify(payload.metadata) : '',
1443
+ });
1444
+ break;
1445
+ }
1446
+ case 'closed': {
1447
+ const closeReason = payload.close_reason ?? '';
1448
+ // Map close_reason to valid ConversationStatus
1449
+ const validStatuses = new Set(['completed', 'failed', 'archived']);
1450
+ const closedStatus = validStatuses.has(closeReason) ? closeReason : 'completed';
1451
+ store.setPartialRow('conversations', conversationId, {
1452
+ status: closedStatus,
1453
+ closed_at: event.timestamp,
1454
+ updated_at: event.timestamp,
1455
+ closed_by: payload.closed_by ?? event.source.agent_id ?? '',
1456
+ close_reason: closeReason,
1457
+ });
1458
+ break;
1459
+ }
1460
+ case 'participant_joined': {
1461
+ const participantId = payload.participant_id;
1462
+ const partId = `${conversationId}:${participantId}`;
1463
+ store.setRow('participants', partId, {
1464
+ id: participantId,
1465
+ conversation_id: conversationId,
1466
+ type: payload.participant_type ?? 'agent',
1467
+ role: payload.participant_role ?? 'worker',
1468
+ joined_at: event.timestamp,
1469
+ left_at: 0,
1470
+ agent_id: payload.agent_id ?? '',
1471
+ });
1472
+ // Increment participant count
1473
+ const existing = store.getRow('conversations', conversationId);
1474
+ if (existing.id) {
1475
+ const count = existing.participant_count || 0;
1476
+ store.setPartialRow('conversations', conversationId, {
1477
+ participant_count: count + 1,
1478
+ updated_at: event.timestamp,
1479
+ });
1480
+ }
1481
+ break;
1482
+ }
1483
+ case 'participant_left': {
1484
+ const leftParticipantId = payload.participant_id;
1485
+ const partId = `${conversationId}:${leftParticipantId}`;
1486
+ store.setPartialRow('participants', partId, {
1487
+ left_at: event.timestamp,
1488
+ });
1489
+ // Decrement participant count
1490
+ const existing = store.getRow('conversations', conversationId);
1491
+ if (existing.id) {
1492
+ const count = existing.participant_count || 0;
1493
+ store.setPartialRow('conversations', conversationId, {
1494
+ participant_count: Math.max(0, count - 1),
1495
+ updated_at: event.timestamp,
1496
+ });
1497
+ }
1498
+ break;
1499
+ }
1500
+ }
1501
+ const conversation = rowToConversation(store.getRow('conversations', conversationId));
1502
+ notify(conversationId, conversation);
1503
+ }
1504
+ /**
1505
+ * Apply turn event to turns view
1506
+ */
1507
+ function applyTurnEvent(store, event, notify) {
1508
+ const payload = event.payload;
1509
+ if (payload.action !== 'recorded')
1510
+ return;
1511
+ const turnId = payload.turn_id;
1512
+ const conversationId = payload.conversation_id;
1513
+ const content = payload.content;
1514
+ store.setRow('turns', turnId, {
1515
+ id: turnId,
1516
+ conversation_id: conversationId,
1517
+ participant: payload.participant ?? event.source.agent_id ?? '',
1518
+ timestamp: event.timestamp,
1519
+ content_type: payload.content_type ?? 'text',
1520
+ content: typeof content === 'string' ? content : JSON.stringify(content),
1521
+ thread_id: payload.thread_id ?? '',
1522
+ in_reply_to: payload.in_reply_to ?? '',
1523
+ source_type: payload.source_type ?? 'explicit',
1524
+ source_message_id: payload.source_message_id ?? '',
1525
+ metadata: payload.metadata ? JSON.stringify(payload.metadata) : '',
1526
+ });
1527
+ // Update conversation's updatedAt
1528
+ const convRow = store.getRow('conversations', conversationId);
1529
+ if (convRow.id) {
1530
+ store.setPartialRow('conversations', conversationId, {
1531
+ updated_at: event.timestamp,
1532
+ });
1533
+ }
1534
+ const turn = rowToTurn(store.getRow('turns', turnId));
1535
+ notify(conversationId, turn);
1536
+ }
1537
+ /**
1538
+ * Apply thread event to threads view
1539
+ */
1540
+ function applyThreadEvent(store, event) {
1541
+ const payload = event.payload;
1542
+ if (payload.action !== 'created')
1543
+ return;
1544
+ const threadId = payload.thread_id;
1545
+ store.setRow('threads', threadId, {
1546
+ id: threadId,
1547
+ conversation_id: payload.conversation_id ?? '',
1548
+ root_turn_id: payload.root_turn_id ?? '',
1549
+ subject: payload.subject ?? '',
1550
+ parent_thread_id: payload.parent_thread_id ?? '',
1551
+ created_by: event.source.agent_id ?? 'unknown',
1552
+ created_at: event.timestamp,
1553
+ turn_count: 0,
1554
+ });
1555
+ }
1556
+ // ─────────────────────────────────────────────────────────────────────────────
1557
+ // Conversation Row Conversion Functions
1558
+ // ─────────────────────────────────────────────────────────────────────────────
1559
+ function rowToConversation(row) {
1560
+ return {
1561
+ id: row.id,
1562
+ type: row.type,
1563
+ status: row.status,
1564
+ subject: row.subject || undefined,
1565
+ parentConversationId: row.parent_conversation_id || undefined,
1566
+ createdBy: row.created_by,
1567
+ createdAt: row.created_at,
1568
+ updatedAt: row.updated_at,
1569
+ closedAt: row.closed_at || undefined,
1570
+ closedBy: row.closed_by || undefined,
1571
+ closeReason: row.close_reason || undefined,
1572
+ participantCount: row.participant_count || 0,
1573
+ metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
1574
+ };
1575
+ }
1576
+ function rowToTurn(row) {
1577
+ const rawContent = row.content;
1578
+ let content;
1579
+ try {
1580
+ content = JSON.parse(rawContent);
1581
+ }
1582
+ catch {
1583
+ content = rawContent;
1584
+ }
1585
+ return {
1586
+ id: row.id,
1587
+ conversationId: row.conversation_id,
1588
+ participant: row.participant,
1589
+ timestamp: row.timestamp,
1590
+ contentType: row.content_type,
1591
+ content,
1592
+ threadId: row.thread_id || undefined,
1593
+ inReplyTo: row.in_reply_to || undefined,
1594
+ sourceType: row.source_type,
1595
+ sourceMessageId: row.source_message_id || undefined,
1596
+ metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
1597
+ };
1598
+ }
1599
+ function rowToParticipant(row) {
1600
+ return {
1601
+ id: row.id,
1602
+ conversationId: row.conversation_id,
1603
+ type: row.type,
1604
+ role: row.role,
1605
+ joinedAt: row.joined_at,
1606
+ leftAt: row.left_at || undefined,
1607
+ agentId: row.agent_id || undefined,
1608
+ };
1609
+ }
1158
1610
  //# sourceMappingURL=event-store.js.map