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,377 @@
1
+ /**
2
+ * Team Template Types
3
+ *
4
+ * TypeScript types for the team manifest schema. Generic multi-agent fields
5
+ * (name, roles, topology, communication) are separated from macro-agent
6
+ * specific extensions under the `macro_agent` namespace for interoperability.
7
+ *
8
+ * @module teams/types
9
+ */
10
+
11
+ import type { RoleDefinition, Capability } from "../roles/types.js";
12
+
13
+ // =============================================================================
14
+ // Core Manifest
15
+ // =============================================================================
16
+
17
+ /**
18
+ * Fully resolved team manifest.
19
+ *
20
+ * Returned by TeamLoader.load() with all inheritance resolved,
21
+ * capabilities computed, and prompts loaded.
22
+ */
23
+ export interface TeamManifest {
24
+ /** Team name (directory name) */
25
+ name: string;
26
+
27
+ /** Human-readable description */
28
+ description: string;
29
+
30
+ /** Schema version */
31
+ version: number;
32
+
33
+ /** Role names used by this team */
34
+ roles: string[];
35
+
36
+ /** Agent spawn topology */
37
+ topology: TeamTopology;
38
+
39
+ /** Communication topology */
40
+ communication: TeamCommunication;
41
+
42
+ /** macro-agent specific extensions */
43
+ macro_agent: MacroAgentExtensions;
44
+
45
+ // ─────────────────────────────────────────────────────────────
46
+ // Resolved state (populated by TeamLoader, not in YAML)
47
+ // ─────────────────────────────────────────────────────────────
48
+
49
+ /** Resolved role definitions keyed by role name */
50
+ _resolvedRoles: Map<string, ResolvedTeamRole>;
51
+
52
+ /** Loaded prompt contents keyed by file path */
53
+ _loadedPrompts: Map<string, string>;
54
+
55
+ /** Loaded MCP server configs keyed by role name */
56
+ _mcpServers: Map<string, McpServerEntry[]>;
57
+ }
58
+
59
+ // =============================================================================
60
+ // Topology
61
+ // =============================================================================
62
+
63
+ /**
64
+ * Defines the agent spawn graph for the team.
65
+ */
66
+ export interface TeamTopology {
67
+ /** The initial agent spawned when the team starts */
68
+ root: TopologyNode;
69
+
70
+ /** Agents spawned alongside root (peers, not children) */
71
+ companions?: TopologyNode[];
72
+
73
+ /**
74
+ * Which roles can spawn which other roles.
75
+ * Translated into capability additions by TeamLoader (RD3).
76
+ */
77
+ spawn_rules?: Record<string, string[]>;
78
+ }
79
+
80
+ /**
81
+ * A node in the team's spawn topology.
82
+ */
83
+ export interface TopologyNode {
84
+ /** Role name (must be in manifest.roles) */
85
+ role: string;
86
+
87
+ /** Path to prompt file relative to team directory */
88
+ prompt?: string;
89
+
90
+ /** Agent configuration */
91
+ config?: TopologyNodeConfig;
92
+ }
93
+
94
+ export interface TopologyNodeConfig {
95
+ /** Model to use (e.g., "sonnet", "haiku", "opus") */
96
+ model?: string;
97
+
98
+ /** Additional key-value config passed to agent */
99
+ [key: string]: unknown;
100
+ }
101
+
102
+ // =============================================================================
103
+ // Communication
104
+ // =============================================================================
105
+
106
+ /**
107
+ * Communication topology for the team.
108
+ *
109
+ * Declares channels (signal groups), per-role subscriptions,
110
+ * emission restrictions, and routing rules.
111
+ */
112
+ export interface TeamCommunication {
113
+ /** Named signal channels */
114
+ channels?: Record<string, ChannelDefinition>;
115
+
116
+ /** Per-role subscription declarations */
117
+ subscriptions?: Record<string, ChannelSubscription[]>;
118
+
119
+ /** Per-role emission declarations (which signals a role can emit) */
120
+ emissions?: Record<string, string[]>;
121
+
122
+ /** Routing configuration */
123
+ routing?: CommunicationRouting;
124
+
125
+ /** Enforcement level for communication rules */
126
+ enforcement?: CommunicationEnforcement;
127
+ }
128
+
129
+ export type CommunicationEnforcement = "strict" | "permissive" | "audit";
130
+
131
+ /**
132
+ * A named channel grouping related signals.
133
+ */
134
+ export interface ChannelDefinition {
135
+ /** Human-readable description */
136
+ description?: string;
137
+
138
+ /** Signals in this channel */
139
+ signals: string[];
140
+ }
141
+
142
+ /**
143
+ * A role's subscription to a channel.
144
+ */
145
+ export interface ChannelSubscription {
146
+ /** Channel name (must exist in communication.channels) */
147
+ channel: string;
148
+
149
+ /** Specific signals to receive. If omitted, receives all signals in the channel */
150
+ signals?: string[];
151
+ }
152
+
153
+ /**
154
+ * Communication routing configuration.
155
+ */
156
+ export interface CommunicationRouting {
157
+ /** Status flow direction */
158
+ status?: "upstream";
159
+
160
+ /** Explicit peer connections (non-hierarchical) */
161
+ peers?: PeerConnection[];
162
+ }
163
+
164
+ /**
165
+ * A peer-to-peer connection between two roles.
166
+ */
167
+ export interface PeerConnection {
168
+ /** Source role name */
169
+ from: string;
170
+
171
+ /** Target role name */
172
+ to: string;
173
+
174
+ /** Routing mechanism */
175
+ via: "direct" | "topic" | "scope";
176
+
177
+ /** Signals allowed on this connection */
178
+ signals?: string[];
179
+ }
180
+
181
+ // =============================================================================
182
+ // macro-agent Extensions
183
+ // =============================================================================
184
+
185
+ /**
186
+ * macro-agent specific team configuration.
187
+ *
188
+ * Namespaced under `macro_agent` in team.yaml for interoperability.
189
+ */
190
+ export interface MacroAgentExtensions {
191
+ /** Task assignment configuration */
192
+ task_assignment?: TaskAssignmentConfig;
193
+
194
+ /** Integration strategy configuration */
195
+ integration?: IntegrationConfig;
196
+
197
+ /** Agent lifecycle configuration */
198
+ lifecycle?: LifecycleConfig;
199
+
200
+ /** Observability configuration */
201
+ observability?: ObservabilityConfig;
202
+ }
203
+
204
+ export interface TaskAssignmentConfig {
205
+ /** Assignment mode */
206
+ mode: "push" | "pull";
207
+
208
+ /** Pull-mode specific settings */
209
+ pull?: {
210
+ /** Seconds before idle worker self-terminates */
211
+ idle_timeout_s?: number;
212
+ /** Milliseconds between claim retries */
213
+ claim_retry_delay_ms?: number;
214
+ /** Max concurrent task claims per agent */
215
+ max_concurrent_per_agent?: number;
216
+ };
217
+ }
218
+
219
+ export interface IntegrationConfig {
220
+ /** Strategy name: 'queue' | 'trunk' | 'optimistic' | custom name */
221
+ strategy: string;
222
+
223
+ /** Strategy-specific configuration passed to strategy.initialize() */
224
+ config?: Record<string, unknown>;
225
+ }
226
+
227
+ export interface LifecycleConfig {
228
+ /** Session continuation settings */
229
+ continuations?: {
230
+ enabled: boolean;
231
+ max_history_messages?: number;
232
+ checkpoint_interval?: "round_trip" | "none";
233
+ };
234
+
235
+ /** Worker scaling settings */
236
+ scaling?: {
237
+ min_workers?: number;
238
+ max_workers?: number;
239
+ scale_on?: "task_queue_depth" | "manual";
240
+ idle_drain?: boolean;
241
+ };
242
+ }
243
+
244
+ export interface ObservabilityConfig {
245
+ /** Sliding window for metric computation (seconds) */
246
+ metrics_window_s?: number;
247
+ /** Interval between metric snapshots (seconds) */
248
+ snapshot_interval_s?: number;
249
+ }
250
+
251
+ // =============================================================================
252
+ // Team Role Definition
253
+ // =============================================================================
254
+
255
+ /**
256
+ * Role definition as declared in a team template's roles/*.yaml file.
257
+ *
258
+ * Supports both full replacement and additive/subtractive capability composition.
259
+ */
260
+ export interface TeamRoleDefinition {
261
+ /** Role name */
262
+ name: string;
263
+
264
+ /** Built-in role to extend */
265
+ extends?: string;
266
+
267
+ /** Display name for UI/logs */
268
+ display_name?: string;
269
+
270
+ /** Human-readable description */
271
+ description?: string;
272
+
273
+ /**
274
+ * Full replacement capability list.
275
+ * Mutually exclusive with add/remove.
276
+ */
277
+ capabilities?: string[];
278
+
279
+ /**
280
+ * Capabilities to add to the parent role's set.
281
+ * Only valid when `extends` is set.
282
+ */
283
+ capabilities_add?: string[];
284
+
285
+ /**
286
+ * Capabilities to remove from the parent role's set.
287
+ * Only valid when `extends` is set.
288
+ */
289
+ capabilities_remove?: string[];
290
+
291
+ /** Path to prompt file relative to team directory */
292
+ prompt?: string;
293
+
294
+ /** macro-agent specific role configuration */
295
+ macro_agent?: TeamRoleMacroAgent;
296
+ }
297
+
298
+ export interface TeamRoleMacroAgent {
299
+ /** Workspace configuration */
300
+ workspace?: {
301
+ type?: string;
302
+ branch_pattern?: string;
303
+ cleanup_on_terminate?: boolean;
304
+ };
305
+
306
+ /** Lifecycle configuration */
307
+ lifecycle?: {
308
+ type?: "ephemeral" | "persistent" | "daemon" | "event-driven";
309
+ cascade_terminate?: boolean;
310
+ self_cleanup?: boolean;
311
+ task_bound?: boolean;
312
+ parent_bound?: boolean;
313
+ max_duration_ms?: number;
314
+ };
315
+ }
316
+
317
+ // =============================================================================
318
+ // Resolved Types
319
+ // =============================================================================
320
+
321
+ /**
322
+ * A team role with inheritance resolved and capabilities computed.
323
+ */
324
+ export interface ResolvedTeamRole {
325
+ /** Role name */
326
+ name: string;
327
+
328
+ /** The built-in role this extends */
329
+ baseRole: string;
330
+
331
+ /** Final computed capability set */
332
+ capabilities: Capability[];
333
+
334
+ /** Loaded prompt content (if prompt file specified) */
335
+ prompt?: string;
336
+
337
+ /** Full RoleDefinition for RoleRegistry registration */
338
+ roleDefinition: RoleDefinition;
339
+ }
340
+
341
+ // =============================================================================
342
+ // MCP Server Config
343
+ // =============================================================================
344
+
345
+ /**
346
+ * MCP server entry from tools/mcp-servers.json.
347
+ * Follows Claude Code's native format.
348
+ */
349
+ export interface McpServerEntry {
350
+ name: string;
351
+ command: string;
352
+ args?: string[];
353
+ env?: Record<string, string>;
354
+ }
355
+
356
+ // =============================================================================
357
+ // Team Loading Errors
358
+ // =============================================================================
359
+
360
+ export type TeamLoadErrorCode =
361
+ | "MANIFEST_NOT_FOUND"
362
+ | "INVALID_MANIFEST"
363
+ | "ROLE_NOT_FOUND"
364
+ | "PROMPT_NOT_FOUND"
365
+ | "INVALID_COMMUNICATION"
366
+ | "INVALID_ROLE";
367
+
368
+ export class TeamLoadError extends Error {
369
+ constructor(
370
+ message: string,
371
+ public readonly code: TeamLoadErrorCode,
372
+ public readonly teamName?: string
373
+ ) {
374
+ super(message);
375
+ this.name = "TeamLoadError";
376
+ }
377
+ }
@@ -1,8 +1,35 @@
1
1
  /**
2
- * Trigger Router Implementation
2
+ * TriggerRouter - External Event Routing
3
3
  *
4
- * Routes trigger events to appropriate agents using pluggable
5
- * routing strategies. Manages strategy registration and selection.
4
+ * ## Routing Architecture Role
5
+ *
6
+ * TriggerRouter handles **external system events** (webhooks, cron, etc.)
7
+ * and routes them to appropriate agents using pluggable strategies.
8
+ *
9
+ * ```
10
+ * External Events → TriggerRouter → SystemEventQueue → WakeManager → Agent
11
+ * (webhooks, cron) (this) (queueing) (delivery)
12
+ * ```
13
+ *
14
+ * **Responsibilities:**
15
+ * - Route external events to target agents via configurable strategies
16
+ * - Queue events for deferred delivery (SystemEventQueue)
17
+ * - Support multiple routing strategies (direct, head, role-based, etc.)
18
+ * - Trigger wake cycles for sleeping agents
19
+ *
20
+ * **Routing Strategies:**
21
+ * - direct: Route to specific agent ID
22
+ * - head: Route to coordinator/head of hierarchy
23
+ * - role: Route to agents by role
24
+ * - broadcast: Fan-out to multiple agents
25
+ *
26
+ * **Differs from MessageRouter:**
27
+ * - TriggerRouter: External events → agents (one-way, queued)
28
+ * - MessageRouter: Agent ↔ agent communication (bidirectional, immediate)
29
+ *
30
+ * **Differs from MAPAdapter:**
31
+ * - TriggerRouter: System events (webhooks, cron, internal signals)
32
+ * - MAPAdapter: MAP protocol clients (external agents, UIs)
6
33
  *
7
34
  * @module trigger/router/trigger-router
8
35
  */
@@ -4,6 +4,25 @@
4
4
  * Types for the wake manager that handles polling agents
5
5
  * with pending events and delivering them.
6
6
  *
7
+ * ## Wake System Architecture
8
+ *
9
+ * There are two wake mechanisms in macro-agent:
10
+ *
11
+ * 1. **Single-Agent Wake** (agent/wake.ts, activity/types.ts)
12
+ * - For immediately waking a single agent with an Activity
13
+ * - Priority-driven (urgent/high/normal/low)
14
+ * - Uses inject/interrupt fallback chain
15
+ * - Returns `WakeResult` (success: boolean, method: WakeMethod)
16
+ *
17
+ * 2. **Batch Wake Cycles** (trigger/wake/*)
18
+ * - For periodic delivery of queued system events
19
+ * - Heartbeat-based polling with coalescing
20
+ * - Processes all agents with pending events
21
+ * - Returns `WakeCycleStatus` (status: ran/skipped/failed)
22
+ *
23
+ * Use single-agent wake for: Immediate message delivery, activity notifications
24
+ * Use batch wake cycles for: Scheduled event delivery, system-wide polling
25
+ *
7
26
  * @module trigger/wake/types
8
27
  */
9
28
 
@@ -28,9 +47,12 @@ export interface WakeRequest {
28
47
  }
29
48
 
30
49
  /**
31
- * Result of a wake operation
50
+ * Status of a batch wake cycle.
51
+ *
52
+ * Note: This is different from `WakeResult` in activity/types.ts which
53
+ * represents the outcome of waking a single agent.
32
54
  */
33
- export interface WakeResult {
55
+ export interface WakeCycleStatus {
34
56
  status: "ran" | "skipped" | "failed";
35
57
  /** Duration if ran */
36
58
  durationMs?: number;
@@ -40,10 +62,15 @@ export interface WakeResult {
40
62
  wokenAgents?: AgentId[];
41
63
  }
42
64
 
65
+ /**
66
+ * @deprecated Use WakeCycleStatus instead. Renamed for clarity.
67
+ */
68
+ export type WakeResult = WakeCycleStatus;
69
+
43
70
  /**
44
71
  * Wake handler function type
45
72
  */
46
- export type WakeHandler = (opts: { reason?: string }) => Promise<WakeResult>;
73
+ export type WakeHandler = (opts: { reason?: string }) => Promise<WakeCycleStatus>;
47
74
 
48
75
  /**
49
76
  * Wake manager configuration
@@ -80,9 +107,9 @@ export interface TriggerWakeManager {
80
107
  /**
81
108
  * Run a single wake cycle immediately
82
109
  * @param opts - Optional reason for the cycle
83
- * @returns Wake result
110
+ * @returns Wake cycle status
84
111
  */
85
- runWakeCycle(opts?: { reason?: string }): Promise<WakeResult>;
112
+ runWakeCycle(opts?: { reason?: string }): Promise<WakeCycleStatus>;
86
113
 
87
114
  /**
88
115
  * Start the wake manager (enables heartbeat if configured)
@@ -18,7 +18,7 @@ import type {
18
18
  TriggerWakeManager,
19
19
  WakeManagerConfig,
20
20
  WakeRequest,
21
- WakeResult,
21
+ WakeCycleStatus,
22
22
  WakeCycleResult,
23
23
  AgentDrainResult,
24
24
  } from "./types.js";
@@ -325,7 +325,7 @@ export function createWakeManager(
325
325
  return pendingReason !== null || Boolean(coalesceTimer) || scheduled;
326
326
  },
327
327
 
328
- async runWakeCycle(opts?: { reason?: string }): Promise<WakeResult> {
328
+ async runWakeCycle(opts?: { reason?: string }): Promise<WakeCycleStatus> {
329
329
  if (wakingInProgress) {
330
330
  return { status: "skipped", reason: "wake-in-progress" };
331
331
  }
@@ -29,7 +29,7 @@ import {
29
29
  type Checkpoint,
30
30
  workerTasks,
31
31
  diffStacks,
32
- } from 'dataplane';
32
+ } from 'git-cascade';
33
33
  import type { DataplaneConfig } from './config.js';
34
34
  import { DEFAULT_DATAPLANE_CONFIG } from './config.js';
35
35
 
@@ -107,4 +107,4 @@ export type {
107
107
  ListTasksOptions,
108
108
  CleanupWorkerBranchesOptions,
109
109
  CleanupResult,
110
- } from 'dataplane';
110
+ } from 'git-cascade';
@@ -0,0 +1,18 @@
1
+ export type {
2
+ IntegrationStrategy,
3
+ IntegrationStrategyFactory,
4
+ LandRequest,
5
+ LandResult,
6
+ LandResultStatus,
7
+ QueueStrategyConfig,
8
+ TrunkStrategyConfig,
9
+ OptimisticStrategyConfig,
10
+ } from "./types.js";
11
+ export { QueueIntegrationStrategy } from "./queue.js";
12
+ export { TrunkIntegrationStrategy } from "./trunk.js";
13
+ export { OptimisticIntegrationStrategy } from "./optimistic.js";
14
+ export {
15
+ IntegrationStrategyRegistry,
16
+ createDefaultStrategyRegistry,
17
+ defaultStrategyRegistry,
18
+ } from "./registry.js";
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Optimistic Integration Strategy
3
+ *
4
+ * Push immediately and emit a validation event. Does NOT run build/test —
5
+ * validation is the judge agent's responsibility (RD5).
6
+ *
7
+ * Uses the same rebase-and-retry logic as trunk for handling push conflicts.
8
+ *
9
+ * @module workspace/strategies/optimistic
10
+ */
11
+
12
+ import { execSync } from "child_process";
13
+ import type {
14
+ IntegrationStrategy,
15
+ LandRequest,
16
+ LandResult,
17
+ OptimisticStrategyConfig,
18
+ } from "./types.js";
19
+ import type { EventStore } from "../../store/event-store.js";
20
+
21
+ export class OptimisticIntegrationStrategy implements IntegrationStrategy {
22
+ readonly name = "optimistic";
23
+ private maxRetries: number;
24
+ private eventStore?: EventStore;
25
+
26
+ constructor(config?: Record<string, unknown>) {
27
+ const typedConfig = config as OptimisticStrategyConfig | undefined;
28
+ this.maxRetries = typedConfig?.maxRetries ?? 3;
29
+ }
30
+
31
+ /**
32
+ * Set the EventStore for emitting validation events.
33
+ * Called after construction since EventStore may not be available at strategy creation time.
34
+ */
35
+ setEventStore(store: EventStore): void {
36
+ this.eventStore = store;
37
+ }
38
+
39
+ async land(request: LandRequest): Promise<LandResult> {
40
+ const { workspacePath, targetBranch } = request;
41
+ let retryCount = 0;
42
+
43
+ while (retryCount <= this.maxRetries) {
44
+ try {
45
+ // Fetch latest
46
+ this.git(workspacePath, `fetch origin ${targetBranch}`);
47
+
48
+ // Rebase onto latest
49
+ try {
50
+ this.git(workspacePath, `rebase origin/${targetBranch}`);
51
+ } catch {
52
+ try {
53
+ this.git(workspacePath, "rebase --abort");
54
+ } catch {
55
+ /* already clean */
56
+ }
57
+
58
+ if (retryCount >= this.maxRetries) {
59
+ return {
60
+ status: "conflict",
61
+ retryCount,
62
+ error: `Rebase conflict after ${retryCount + 1} attempts`,
63
+ };
64
+ }
65
+ retryCount++;
66
+ continue;
67
+ }
68
+
69
+ // Push optimistically
70
+ try {
71
+ this.git(workspacePath, `push origin HEAD:${targetBranch}`);
72
+ } catch {
73
+ if (retryCount >= this.maxRetries) {
74
+ return {
75
+ status: "conflict",
76
+ retryCount,
77
+ error: `Push rejected after ${retryCount + 1} attempts`,
78
+ };
79
+ }
80
+ retryCount++;
81
+ continue;
82
+ }
83
+
84
+ const commitHash = this.git(workspacePath, "rev-parse HEAD").trim();
85
+
86
+ // Emit validation:requested event (RD5 — judge handles validation)
87
+ if (this.eventStore) {
88
+ try {
89
+ this.eventStore.emit({
90
+ type: "status",
91
+ source: { agent_id: request.agentId },
92
+ payload: {
93
+ status_type: "checkpoint",
94
+ summary: `Validation requested for ${commitHash.slice(0, 8)}`,
95
+ validation_requested: true,
96
+ commitHash,
97
+ sourceBranch: request.sourceBranch,
98
+ targetBranch,
99
+ taskId: request.taskId,
100
+ agentId: request.agentId,
101
+ },
102
+ });
103
+ } catch {
104
+ // Never fail land() due to event emission failure
105
+ }
106
+ }
107
+
108
+ return {
109
+ status: "landed",
110
+ commitHash,
111
+ retryCount,
112
+ };
113
+ } catch (error) {
114
+ return {
115
+ status: "failed",
116
+ retryCount,
117
+ error: `Unexpected error: ${error instanceof Error ? error.message : String(error)}`,
118
+ };
119
+ }
120
+ }
121
+
122
+ return {
123
+ status: "failed",
124
+ retryCount,
125
+ error: "Exceeded maximum retries",
126
+ };
127
+ }
128
+
129
+ private git(cwd: string, args: string): string {
130
+ return execSync(`git ${args}`, {
131
+ cwd,
132
+ encoding: "utf-8",
133
+ timeout: 30000,
134
+ });
135
+ }
136
+ }