macro-agent 0.0.11 → 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 (408) 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 +6 -0
  16. package/.sudocode/specs.jsonl +7 -0
  17. package/CLAUDE.md +110 -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 +25 -1
  31. package/dist/agent/agent-manager.d.ts.map +1 -1
  32. package/dist/agent/agent-manager.js +93 -7
  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-detection/command-builder.d.ts +30 -0
  38. package/dist/agent-detection/command-builder.d.ts.map +1 -0
  39. package/dist/agent-detection/command-builder.js +71 -0
  40. package/dist/agent-detection/command-builder.js.map +1 -0
  41. package/dist/agent-detection/detector.d.ts +84 -0
  42. package/dist/agent-detection/detector.d.ts.map +1 -0
  43. package/dist/agent-detection/detector.js +240 -0
  44. package/dist/agent-detection/detector.js.map +1 -0
  45. package/dist/agent-detection/index.d.ts +12 -0
  46. package/dist/agent-detection/index.d.ts.map +1 -0
  47. package/dist/agent-detection/index.js +14 -0
  48. package/dist/agent-detection/index.js.map +1 -0
  49. package/dist/agent-detection/registry.d.ts +53 -0
  50. package/dist/agent-detection/registry.d.ts.map +1 -0
  51. package/dist/agent-detection/registry.js +177 -0
  52. package/dist/agent-detection/registry.js.map +1 -0
  53. package/dist/agent-detection/types.d.ts +121 -0
  54. package/dist/agent-detection/types.d.ts.map +1 -0
  55. package/dist/agent-detection/types.js +20 -0
  56. package/dist/agent-detection/types.js.map +1 -0
  57. package/dist/api/server.d.ts.map +1 -1
  58. package/dist/api/server.js +95 -0
  59. package/dist/api/server.js.map +1 -1
  60. package/dist/cli/index.js +29 -0
  61. package/dist/cli/index.js.map +1 -1
  62. package/dist/cli/mcp.js +38 -0
  63. package/dist/cli/mcp.js.map +1 -1
  64. package/dist/config/index.d.ts +2 -0
  65. package/dist/config/index.d.ts.map +1 -0
  66. package/dist/config/index.js +2 -0
  67. package/dist/config/index.js.map +1 -0
  68. package/dist/config/project-config.d.ts +46 -0
  69. package/dist/config/project-config.d.ts.map +1 -0
  70. package/dist/config/project-config.js +68 -0
  71. package/dist/config/project-config.js.map +1 -0
  72. package/dist/lifecycle/cascade.d.ts +1 -1
  73. package/dist/lifecycle/cascade.d.ts.map +1 -1
  74. package/dist/lifecycle/handlers/index.d.ts +4 -0
  75. package/dist/lifecycle/handlers/index.d.ts.map +1 -1
  76. package/dist/lifecycle/handlers/index.js +2 -0
  77. package/dist/lifecycle/handlers/index.js.map +1 -1
  78. package/dist/lifecycle/handlers/worker.d.ts +4 -0
  79. package/dist/lifecycle/handlers/worker.d.ts.map +1 -1
  80. package/dist/lifecycle/handlers/worker.js +35 -3
  81. package/dist/lifecycle/handlers/worker.js.map +1 -1
  82. package/dist/map/adapter/acp-over-map.d.ts.map +1 -1
  83. package/dist/map/adapter/acp-over-map.js +32 -2
  84. package/dist/map/adapter/acp-over-map.js.map +1 -1
  85. package/dist/map/adapter/event-translator.d.ts.map +1 -1
  86. package/dist/map/adapter/event-translator.js +1 -0
  87. package/dist/map/adapter/event-translator.js.map +1 -1
  88. package/dist/map/adapter/extensions/agent-detection.d.ts +49 -0
  89. package/dist/map/adapter/extensions/agent-detection.d.ts.map +1 -0
  90. package/dist/map/adapter/extensions/agent-detection.js +91 -0
  91. package/dist/map/adapter/extensions/agent-detection.js.map +1 -0
  92. package/dist/map/adapter/extensions/index.d.ts +10 -1
  93. package/dist/map/adapter/extensions/index.d.ts.map +1 -1
  94. package/dist/map/adapter/extensions/index.js +39 -0
  95. package/dist/map/adapter/extensions/index.js.map +1 -1
  96. package/dist/map/adapter/extensions/resume.d.ts +47 -0
  97. package/dist/map/adapter/extensions/resume.d.ts.map +1 -0
  98. package/dist/map/adapter/extensions/resume.js +59 -0
  99. package/dist/map/adapter/extensions/resume.js.map +1 -0
  100. package/dist/map/adapter/extensions/workspace-files.d.ts +42 -0
  101. package/dist/map/adapter/extensions/workspace-files.d.ts.map +1 -0
  102. package/dist/map/adapter/extensions/workspace-files.js +338 -0
  103. package/dist/map/adapter/extensions/workspace-files.js.map +1 -0
  104. package/dist/mcp/mcp-server.d.ts +6 -0
  105. package/dist/mcp/mcp-server.d.ts.map +1 -1
  106. package/dist/mcp/mcp-server.js +45 -0
  107. package/dist/mcp/mcp-server.js.map +1 -1
  108. package/dist/mcp/tools/claim_task.d.ts +35 -0
  109. package/dist/mcp/tools/claim_task.d.ts.map +1 -0
  110. package/dist/mcp/tools/claim_task.js +58 -0
  111. package/dist/mcp/tools/claim_task.js.map +1 -0
  112. package/dist/mcp/tools/done.d.ts +11 -2
  113. package/dist/mcp/tools/done.d.ts.map +1 -1
  114. package/dist/mcp/tools/done.js +15 -10
  115. package/dist/mcp/tools/done.js.map +1 -1
  116. package/dist/mcp/tools/list_claimable_tasks.d.ts +38 -0
  117. package/dist/mcp/tools/list_claimable_tasks.d.ts.map +1 -0
  118. package/dist/mcp/tools/list_claimable_tasks.js +63 -0
  119. package/dist/mcp/tools/list_claimable_tasks.js.map +1 -0
  120. package/dist/mcp/tools/unclaim_task.d.ts +31 -0
  121. package/dist/mcp/tools/unclaim_task.d.ts.map +1 -0
  122. package/dist/mcp/tools/unclaim_task.js +47 -0
  123. package/dist/mcp/tools/unclaim_task.js.map +1 -0
  124. package/dist/metrics/index.d.ts +2 -0
  125. package/dist/metrics/index.d.ts.map +1 -0
  126. package/dist/metrics/index.js +2 -0
  127. package/dist/metrics/index.js.map +1 -0
  128. package/dist/metrics/metrics.d.ts +79 -0
  129. package/dist/metrics/metrics.d.ts.map +1 -0
  130. package/dist/metrics/metrics.js +166 -0
  131. package/dist/metrics/metrics.js.map +1 -0
  132. package/dist/roles/capabilities.d.ts +1 -0
  133. package/dist/roles/capabilities.d.ts.map +1 -1
  134. package/dist/roles/capabilities.js +3 -0
  135. package/dist/roles/capabilities.js.map +1 -1
  136. package/dist/roles/types.d.ts +1 -1
  137. package/dist/roles/types.d.ts.map +1 -1
  138. package/dist/router/message-router.d.ts +41 -0
  139. package/dist/router/message-router.d.ts.map +1 -1
  140. package/dist/router/message-router.js +136 -5
  141. package/dist/router/message-router.js.map +1 -1
  142. package/dist/store/event-store.d.ts +8 -1
  143. package/dist/store/event-store.d.ts.map +1 -1
  144. package/dist/store/event-store.js +120 -4
  145. package/dist/store/event-store.js.map +1 -1
  146. package/dist/store/types/agents.d.ts +1 -1
  147. package/dist/store/types/agents.d.ts.map +1 -1
  148. package/dist/store/types/events.d.ts +1 -1
  149. package/dist/store/types/events.d.ts.map +1 -1
  150. package/dist/store/types/events.js.map +1 -1
  151. package/dist/store/types/index.d.ts +1 -0
  152. package/dist/store/types/index.d.ts.map +1 -1
  153. package/dist/store/types/index.js +1 -0
  154. package/dist/store/types/index.js.map +1 -1
  155. package/dist/store/types/sessions.d.ts +44 -0
  156. package/dist/store/types/sessions.d.ts.map +1 -0
  157. package/dist/store/types/sessions.js +9 -0
  158. package/dist/store/types/sessions.js.map +1 -0
  159. package/dist/store/types/tasks.d.ts +2 -0
  160. package/dist/store/types/tasks.d.ts.map +1 -1
  161. package/dist/task/backend/memory.d.ts +4 -1
  162. package/dist/task/backend/memory.d.ts.map +1 -1
  163. package/dist/task/backend/memory.js +81 -0
  164. package/dist/task/backend/memory.js.map +1 -1
  165. package/dist/task/backend/types.d.ts +30 -0
  166. package/dist/task/backend/types.d.ts.map +1 -1
  167. package/dist/task/backend/types.js.map +1 -1
  168. package/dist/teams/index.d.ts +4 -0
  169. package/dist/teams/index.d.ts.map +1 -0
  170. package/dist/teams/index.js +4 -0
  171. package/dist/teams/index.js.map +1 -0
  172. package/dist/teams/team-loader.d.ts +20 -0
  173. package/dist/teams/team-loader.d.ts.map +1 -0
  174. package/dist/teams/team-loader.js +293 -0
  175. package/dist/teams/team-loader.js.map +1 -0
  176. package/dist/teams/team-runtime.d.ts +139 -0
  177. package/dist/teams/team-runtime.d.ts.map +1 -0
  178. package/dist/teams/team-runtime.js +613 -0
  179. package/dist/teams/team-runtime.js.map +1 -0
  180. package/dist/teams/types.d.ts +266 -0
  181. package/dist/teams/types.d.ts.map +1 -0
  182. package/dist/teams/types.js +20 -0
  183. package/dist/teams/types.js.map +1 -0
  184. package/dist/workspace/dataplane-adapter.d.ts +1 -1
  185. package/dist/workspace/dataplane-adapter.d.ts.map +1 -1
  186. package/dist/workspace/dataplane-adapter.js +1 -1
  187. package/dist/workspace/dataplane-adapter.js.map +1 -1
  188. package/dist/workspace/index.d.ts +1 -1
  189. package/dist/workspace/index.d.ts.map +1 -1
  190. package/dist/workspace/strategies/index.d.ts +6 -0
  191. package/dist/workspace/strategies/index.d.ts.map +1 -0
  192. package/dist/workspace/strategies/index.js +5 -0
  193. package/dist/workspace/strategies/index.js.map +1 -0
  194. package/dist/workspace/strategies/optimistic.d.ts +26 -0
  195. package/dist/workspace/strategies/optimistic.d.ts.map +1 -0
  196. package/dist/workspace/strategies/optimistic.js +121 -0
  197. package/dist/workspace/strategies/optimistic.js.map +1 -0
  198. package/dist/workspace/strategies/queue.d.ts +26 -0
  199. package/dist/workspace/strategies/queue.d.ts.map +1 -0
  200. package/dist/workspace/strategies/queue.js +67 -0
  201. package/dist/workspace/strategies/queue.js.map +1 -0
  202. package/dist/workspace/strategies/registry.d.ts +37 -0
  203. package/dist/workspace/strategies/registry.d.ts.map +1 -0
  204. package/dist/workspace/strategies/registry.js +63 -0
  205. package/dist/workspace/strategies/registry.js.map +1 -0
  206. package/dist/workspace/strategies/trunk.d.ts +20 -0
  207. package/dist/workspace/strategies/trunk.d.ts.map +1 -0
  208. package/dist/workspace/strategies/trunk.js +108 -0
  209. package/dist/workspace/strategies/trunk.js.map +1 -0
  210. package/dist/workspace/strategies/types.d.ts +104 -0
  211. package/dist/workspace/strategies/types.d.ts.map +1 -0
  212. package/dist/workspace/strategies/types.js +11 -0
  213. package/dist/workspace/strategies/types.js.map +1 -0
  214. package/dist/workspace/types.d.ts +1 -1
  215. package/dist/workspace/types.d.ts.map +1 -1
  216. package/dist/workspace/workspace-manager.d.ts +1 -1
  217. package/dist/workspace/workspace-manager.d.ts.map +1 -1
  218. package/docs/implementation-details.md +1127 -0
  219. package/docs/implementation-summary.md +448 -0
  220. package/docs/plan-self-driving-support.md +433 -0
  221. package/docs/spec-self-driving-support.md +462 -0
  222. package/docs/team-templates.md +860 -0
  223. package/docs/teams.md +233 -0
  224. package/package.json +4 -2
  225. package/src/acp/__tests__/integration.test.ts +161 -1
  226. package/src/acp/__tests__/macro-agent.test.ts +95 -0
  227. package/src/acp/__tests__/session-persistence.test.ts +276 -0
  228. package/src/acp/macro-agent.ts +79 -7
  229. package/src/acp/session-mapper.ts +108 -1
  230. package/src/acp/types.ts +33 -1
  231. package/src/agent/agent-manager.ts +158 -6
  232. package/src/agent/types.ts +27 -0
  233. package/src/agent-detection/__tests__/command-builder.test.ts +336 -0
  234. package/src/agent-detection/__tests__/detector.test.ts +768 -0
  235. package/src/agent-detection/__tests__/registry.test.ts +254 -0
  236. package/src/agent-detection/command-builder.ts +90 -0
  237. package/src/agent-detection/detector.ts +307 -0
  238. package/src/agent-detection/index.ts +36 -0
  239. package/src/agent-detection/registry.ts +200 -0
  240. package/src/agent-detection/types.ts +184 -0
  241. package/src/api/server.ts +110 -0
  242. package/src/cli/index.ts +44 -0
  243. package/src/cli/mcp.ts +47 -0
  244. package/src/config/index.ts +9 -0
  245. package/src/config/project-config.ts +107 -0
  246. package/src/lifecycle/cascade.ts +1 -1
  247. package/src/lifecycle/handlers/index.ts +8 -0
  248. package/src/lifecycle/handlers/worker.ts +48 -3
  249. package/src/map/adapter/__tests__/extensions.test.ts +359 -0
  250. package/src/map/adapter/__tests__/workspace-files.test.ts +673 -0
  251. package/src/map/adapter/acp-over-map.ts +45 -2
  252. package/src/map/adapter/event-translator.ts +1 -0
  253. package/src/map/adapter/extensions/agent-detection.ts +201 -0
  254. package/src/map/adapter/extensions/index.ts +63 -0
  255. package/src/map/adapter/extensions/resume.ts +114 -0
  256. package/src/map/adapter/extensions/workspace-files.ts +449 -0
  257. package/src/mcp/mcp-server.ts +67 -0
  258. package/src/mcp/tools/claim_task.ts +86 -0
  259. package/src/mcp/tools/done.ts +24 -10
  260. package/src/mcp/tools/list_claimable_tasks.ts +93 -0
  261. package/src/mcp/tools/unclaim_task.ts +71 -0
  262. package/src/metrics/index.ts +9 -0
  263. package/src/metrics/metrics.ts +280 -0
  264. package/src/roles/capabilities.ts +3 -0
  265. package/src/roles/types.ts +2 -1
  266. package/src/router/__tests__/message-router.test.ts +561 -0
  267. package/src/router/message-router.ts +223 -6
  268. package/src/store/event-store.ts +151 -3
  269. package/src/store/types/agents.ts +1 -1
  270. package/src/store/types/events.ts +2 -1
  271. package/src/store/types/index.ts +1 -0
  272. package/src/store/types/sessions.ts +53 -0
  273. package/src/store/types/tasks.ts +3 -0
  274. package/src/task/backend/memory.ts +116 -0
  275. package/src/task/backend/types.ts +43 -0
  276. package/src/teams/__tests__/cross-subsystem.integration.test.ts +983 -0
  277. package/src/teams/__tests__/e2e/team-runtime.e2e.test.ts +553 -0
  278. package/src/teams/__tests__/team-system.test.ts +1280 -0
  279. package/src/teams/index.ts +13 -0
  280. package/src/teams/team-loader.ts +434 -0
  281. package/src/teams/team-runtime.ts +727 -0
  282. package/src/teams/types.ts +377 -0
  283. package/src/workspace/dataplane-adapter.ts +1 -1
  284. package/src/workspace/index.ts +1 -1
  285. package/src/workspace/strategies/index.ts +18 -0
  286. package/src/workspace/strategies/optimistic.ts +136 -0
  287. package/src/workspace/strategies/queue.ts +81 -0
  288. package/src/workspace/strategies/registry.ts +89 -0
  289. package/src/workspace/strategies/trunk.ts +123 -0
  290. package/src/workspace/strategies/types.ts +145 -0
  291. package/src/workspace/types.ts +1 -1
  292. package/src/workspace/workspace-manager.ts +1 -1
  293. package/.claude/settings.local.json +0 -59
  294. package/dist/map/utils/address-translation.d.ts +0 -99
  295. package/dist/map/utils/address-translation.d.ts.map +0 -1
  296. package/dist/map/utils/address-translation.js +0 -285
  297. package/dist/map/utils/address-translation.js.map +0 -1
  298. package/dist/map/utils/index.d.ts +0 -7
  299. package/dist/map/utils/index.d.ts.map +0 -1
  300. package/dist/map/utils/index.js +0 -7
  301. package/dist/map/utils/index.js.map +0 -1
  302. package/references/acp-factory-ref/CHANGELOG.md +0 -33
  303. package/references/acp-factory-ref/LICENSE +0 -21
  304. package/references/acp-factory-ref/README.md +0 -341
  305. package/references/acp-factory-ref/package-lock.json +0 -3102
  306. package/references/acp-factory-ref/package.json +0 -96
  307. package/references/acp-factory-ref/python/CHANGELOG.md +0 -33
  308. package/references/acp-factory-ref/python/LICENSE +0 -21
  309. package/references/acp-factory-ref/python/Makefile +0 -57
  310. package/references/acp-factory-ref/python/README.md +0 -253
  311. package/references/acp-factory-ref/python/pyproject.toml +0 -73
  312. package/references/acp-factory-ref/python/tests/__init__.py +0 -0
  313. package/references/acp-factory-ref/python/tests/e2e/__init__.py +0 -1
  314. package/references/acp-factory-ref/python/tests/e2e/test_codex_e2e.py +0 -349
  315. package/references/acp-factory-ref/python/tests/e2e/test_gemini_e2e.py +0 -165
  316. package/references/acp-factory-ref/python/tests/e2e/test_opencode_e2e.py +0 -296
  317. package/references/acp-factory-ref/python/tests/test_client_handler.py +0 -543
  318. package/references/acp-factory-ref/python/tests/test_pushable.py +0 -199
  319. package/references/claude-code-acp/.github/workflows/ci.yml +0 -45
  320. package/references/claude-code-acp/.github/workflows/publish.yml +0 -34
  321. package/references/claude-code-acp/.prettierrc.json +0 -4
  322. package/references/claude-code-acp/CHANGELOG.md +0 -249
  323. package/references/claude-code-acp/LICENSE +0 -222
  324. package/references/claude-code-acp/README.md +0 -53
  325. package/references/claude-code-acp/docs/RELEASES.md +0 -24
  326. package/references/claude-code-acp/eslint.config.js +0 -48
  327. package/references/claude-code-acp/package-lock.json +0 -4570
  328. package/references/claude-code-acp/package.json +0 -88
  329. package/references/claude-code-acp/scripts/release.sh +0 -119
  330. package/references/claude-code-acp/src/acp-agent.ts +0 -2065
  331. package/references/claude-code-acp/src/index.ts +0 -26
  332. package/references/claude-code-acp/src/lib.ts +0 -38
  333. package/references/claude-code-acp/src/mcp-server.ts +0 -911
  334. package/references/claude-code-acp/src/settings.ts +0 -522
  335. package/references/claude-code-acp/src/tests/.claude/commands/quick-math.md +0 -5
  336. package/references/claude-code-acp/src/tests/.claude/commands/say-hello.md +0 -6
  337. package/references/claude-code-acp/src/tests/acp-agent-fork.test.ts +0 -479
  338. package/references/claude-code-acp/src/tests/acp-agent.test.ts +0 -1502
  339. package/references/claude-code-acp/src/tests/extract-lines.test.ts +0 -103
  340. package/references/claude-code-acp/src/tests/fork-session.test.ts +0 -335
  341. package/references/claude-code-acp/src/tests/replace-and-calculate-location.test.ts +0 -334
  342. package/references/claude-code-acp/src/tests/settings.test.ts +0 -617
  343. package/references/claude-code-acp/src/tests/skills-options.test.ts +0 -187
  344. package/references/claude-code-acp/src/tests/tools.test.ts +0 -318
  345. package/references/claude-code-acp/src/tests/typescript-declarations.test.ts +0 -558
  346. package/references/claude-code-acp/src/tools.ts +0 -819
  347. package/references/claude-code-acp/src/utils.ts +0 -171
  348. package/references/claude-code-acp/tsconfig.json +0 -18
  349. package/references/claude-code-acp/vitest.config.ts +0 -19
  350. package/references/multi-agent-protocol/.sudocode/issues.jsonl +0 -111
  351. package/references/multi-agent-protocol/.sudocode/specs.jsonl +0 -13
  352. package/references/multi-agent-protocol/LICENSE +0 -21
  353. package/references/multi-agent-protocol/README.md +0 -113
  354. package/references/multi-agent-protocol/docs/00-design-specification.md +0 -496
  355. package/references/multi-agent-protocol/docs/01-open-questions.md +0 -1050
  356. package/references/multi-agent-protocol/docs/02-wire-protocol.md +0 -296
  357. package/references/multi-agent-protocol/docs/03-streaming-semantics.md +0 -252
  358. package/references/multi-agent-protocol/docs/04-error-handling.md +0 -231
  359. package/references/multi-agent-protocol/docs/05-connection-model.md +0 -244
  360. package/references/multi-agent-protocol/docs/06-visibility-permissions.md +0 -243
  361. package/references/multi-agent-protocol/docs/07-federation.md +0 -259
  362. package/references/multi-agent-protocol/docs/08-macro-agent-migration.md +0 -253
  363. package/references/multi-agent-protocol/docs/09-authentication.md +0 -680
  364. package/references/multi-agent-protocol/docs/10-mail-protocol.md +0 -553
  365. package/references/multi-agent-protocol/docs/agent-iam-integration.md +0 -877
  366. package/references/multi-agent-protocol/docs/agentic-mesh-integration-draft.md +0 -459
  367. package/references/multi-agent-protocol/docs/git-transport-draft.md +0 -251
  368. package/references/multi-agent-protocol/docs-site/Gemfile +0 -22
  369. package/references/multi-agent-protocol/docs-site/README.md +0 -82
  370. package/references/multi-agent-protocol/docs-site/_config.yml +0 -91
  371. package/references/multi-agent-protocol/docs-site/_includes/head_custom.html +0 -20
  372. package/references/multi-agent-protocol/docs-site/_sass/color_schemes/map.scss +0 -42
  373. package/references/multi-agent-protocol/docs-site/_sass/custom/custom.scss +0 -34
  374. package/references/multi-agent-protocol/docs-site/examples/full-integration.md +0 -510
  375. package/references/multi-agent-protocol/docs-site/examples/index.md +0 -138
  376. package/references/multi-agent-protocol/docs-site/examples/simple-chat.md +0 -282
  377. package/references/multi-agent-protocol/docs-site/examples/task-queue.md +0 -399
  378. package/references/multi-agent-protocol/docs-site/getting-started/index.md +0 -98
  379. package/references/multi-agent-protocol/docs-site/getting-started/installation.md +0 -219
  380. package/references/multi-agent-protocol/docs-site/getting-started/overview.md +0 -172
  381. package/references/multi-agent-protocol/docs-site/getting-started/quickstart.md +0 -237
  382. package/references/multi-agent-protocol/docs-site/index.md +0 -136
  383. package/references/multi-agent-protocol/docs-site/protocol/authentication.md +0 -391
  384. package/references/multi-agent-protocol/docs-site/protocol/connection-model.md +0 -376
  385. package/references/multi-agent-protocol/docs-site/protocol/design.md +0 -284
  386. package/references/multi-agent-protocol/docs-site/protocol/error-handling.md +0 -312
  387. package/references/multi-agent-protocol/docs-site/protocol/federation.md +0 -449
  388. package/references/multi-agent-protocol/docs-site/protocol/index.md +0 -129
  389. package/references/multi-agent-protocol/docs-site/protocol/permissions.md +0 -398
  390. package/references/multi-agent-protocol/docs-site/protocol/streaming.md +0 -353
  391. package/references/multi-agent-protocol/docs-site/protocol/wire-protocol.md +0 -369
  392. package/references/multi-agent-protocol/docs-site/sdk/api/agent.md +0 -357
  393. package/references/multi-agent-protocol/docs-site/sdk/api/client.md +0 -380
  394. package/references/multi-agent-protocol/docs-site/sdk/api/index.md +0 -62
  395. package/references/multi-agent-protocol/docs-site/sdk/api/server.md +0 -453
  396. package/references/multi-agent-protocol/docs-site/sdk/api/types.md +0 -468
  397. package/references/multi-agent-protocol/docs-site/sdk/guides/agent.md +0 -375
  398. package/references/multi-agent-protocol/docs-site/sdk/guides/authentication.md +0 -405
  399. package/references/multi-agent-protocol/docs-site/sdk/guides/client.md +0 -352
  400. package/references/multi-agent-protocol/docs-site/sdk/guides/index.md +0 -89
  401. package/references/multi-agent-protocol/docs-site/sdk/guides/server.md +0 -360
  402. package/references/multi-agent-protocol/docs-site/sdk/guides/testing.md +0 -446
  403. package/references/multi-agent-protocol/docs-site/sdk/guides/transports.md +0 -363
  404. package/references/multi-agent-protocol/docs-site/sdk/index.md +0 -206
  405. package/references/multi-agent-protocol/package-lock.json +0 -3886
  406. package/references/multi-agent-protocol/package.json +0 -56
  407. package/references/multi-agent-protocol/schema/meta.json +0 -467
  408. package/references/multi-agent-protocol/schema/schema.json +0 -2558
@@ -204,8 +204,61 @@ export interface MessageRouter {
204
204
  * Supports late binding since mail services may be created after router.
205
205
  */
206
206
  setTurnRecorder(recorder: TurnRecorderCallback): void;
207
+
208
+ /**
209
+ * Set signal filter for status notification delivery.
210
+ * Called before delivering each status notification — return false to suppress.
211
+ * Supports late binding since TeamRuntime is created after router.
212
+ */
213
+ setSignalFilter(filter: SignalFilter): void;
214
+
215
+ /**
216
+ * Set emission validator for outbound status events.
217
+ * Called before emitting a status event — can reject, warn, or audit.
218
+ * Supports late binding since TeamRuntime is created after router.
219
+ */
220
+ setEmissionValidator(validator: EmissionValidator): void;
207
221
  }
208
222
 
223
+ /**
224
+ * Signal filter callback for status notification delivery.
225
+ * Return true to deliver, false to suppress.
226
+ *
227
+ * @param from - Agent emitting the status
228
+ * @param to - Agent that would receive the notification
229
+ * @param signal - Signal name from details.signal (undefined if not tagged)
230
+ */
231
+ export type SignalFilter = (
232
+ from: AgentId,
233
+ to: AgentId,
234
+ signal: string | undefined
235
+ ) => boolean;
236
+
237
+ /**
238
+ * Emission validator result.
239
+ * - "allow": emit normally
240
+ * - "reject": block the emission (strict mode)
241
+ * - "warn": log warning but allow (permissive mode)
242
+ * - "audit": record audit event but allow (audit mode)
243
+ */
244
+ export type EmissionValidatorResult = {
245
+ action: "allow" | "reject" | "warn" | "audit";
246
+ message?: string;
247
+ };
248
+
249
+ /**
250
+ * Emission validator callback for outbound status events.
251
+ * Called with the emitting agent's ID and the signal name.
252
+ * Returns an action to take (allow, reject, warn, audit).
253
+ *
254
+ * @param agentId - Agent emitting the status
255
+ * @param signal - Signal name from details.signal (undefined if not tagged)
256
+ */
257
+ export type EmissionValidator = (
258
+ agentId: AgentId,
259
+ signal: string | undefined
260
+ ) => EmissionValidatorResult;
261
+
209
262
  /**
210
263
  * Callback invoked when a message determines a wake action
211
264
  */
@@ -264,6 +317,12 @@ export function createMessageRouter(
264
317
  // Turn recorder for conversation tracking (late-bound)
265
318
  let turnRecorder: TurnRecorderCallback | undefined;
266
319
 
320
+ // Signal filter for status notification delivery (late-bound)
321
+ let signalFilter: SignalFilter | undefined;
322
+
323
+ // Emission validator for outbound status events (late-bound)
324
+ let emissionValidator: EmissionValidator | undefined;
325
+
267
326
  // Track acknowledged messages: Map<agentId, Set<messageId>>
268
327
  const acknowledgedMessages = new Map<AgentId, Set<EventId>>();
269
328
 
@@ -929,6 +988,36 @@ export function createMessageRouter(
929
988
  function emitStatus(request: EmitStatusRequest): void {
930
989
  const { from, status_type, summary, details } = request;
931
990
 
991
+ // Check emission restrictions if validator installed
992
+ if (emissionValidator) {
993
+ const signal = (details as Record<string, unknown> | undefined)?.signal as string | undefined;
994
+ const result = emissionValidator(from.agent_id, signal);
995
+
996
+ if (result.action === "reject") {
997
+ // Strict mode: block the emission entirely
998
+ return;
999
+ }
1000
+
1001
+ if (result.action === "audit") {
1002
+ // Audit mode: record audit event, then continue with emission
1003
+ eventStore.emit({
1004
+ type: "status",
1005
+ source: { agent_id: "system" },
1006
+ payload: {
1007
+ status_type: "discovery",
1008
+ summary: result.message ?? `Emission audit: agent ${from.agent_id} emitted signal '${signal}'`,
1009
+ audit: {
1010
+ type: "emission_violation",
1011
+ agent_id: from.agent_id,
1012
+ signal,
1013
+ status_type,
1014
+ },
1015
+ },
1016
+ });
1017
+ }
1018
+ // "warn" and "allow" proceed normally (warning is logged by the validator installer)
1019
+ }
1020
+
932
1021
  // Emit status event to event store
933
1022
  const event = eventStore.emit({
934
1023
  type: "status",
@@ -943,15 +1032,20 @@ export function createMessageRouter(
943
1032
  },
944
1033
  });
945
1034
 
946
- // Route to subtree subscribers
947
- routeStatusToSubtreeSubscribers(from.agent_id, {
1035
+ const statusNotification: StatusNotification = {
948
1036
  agent_id: from.agent_id,
949
1037
  task_id: from.task_id,
950
1038
  status_type,
951
1039
  summary,
952
1040
  details,
953
1041
  timestamp: event.timestamp,
954
- });
1042
+ };
1043
+
1044
+ // Route to subtree subscribers (hierarchical: parents/ancestors)
1045
+ const subtreeRecipients = routeStatusToSubtreeSubscribers(from.agent_id, statusNotification);
1046
+
1047
+ // Route to topic co-subscribers (non-hierarchical: peers sharing topics)
1048
+ routeStatusToTopicSubscribers(from.agent_id, statusNotification, subtreeRecipients);
955
1049
  }
956
1050
 
957
1051
  // ─────────────────────────────────────────────────────────────────
@@ -1088,13 +1182,15 @@ export function createMessageRouter(
1088
1182
  /**
1089
1183
  * Route status event to subtree subscribers.
1090
1184
  * Parents who have subscribed to an agent's subtree receive status notifications.
1185
+ * Returns the set of agents that were notified (for dedup with topic routing).
1091
1186
  */
1092
1187
  function routeStatusToSubtreeSubscribers(
1093
1188
  agentId: AgentId,
1094
1189
  status: StatusNotification
1095
- ): void {
1190
+ ): Set<AgentId> {
1191
+ const notified = new Set<AgentId>();
1096
1192
  const agent = eventStore.getAgent(agentId);
1097
- if (!agent) return;
1193
+ if (!agent) return notified;
1098
1194
 
1099
1195
  // Find all agents with subtree subscription that includes this agent
1100
1196
  // This includes:
@@ -1128,17 +1224,25 @@ export function createMessageRouter(
1128
1224
  }
1129
1225
  }
1130
1226
 
1227
+ // Extract signal name from details (if tagged)
1228
+ const statusSignal = (status.details as Record<string, unknown> | undefined)?.signal as string | undefined;
1229
+
1131
1230
  // Send status notification to each subscriber
1132
1231
  for (const subscriberId of agentsToNotify) {
1133
1232
  // Skip self-notification
1134
1233
  if (subscriberId === agentId) continue;
1135
1234
 
1235
+ // Apply signal filter if installed
1236
+ if (signalFilter && !signalFilter(agentId, subscriberId, statusSignal)) {
1237
+ continue;
1238
+ }
1239
+
1136
1240
  const statusContent = JSON.stringify({
1137
1241
  type: "status_notification",
1138
1242
  ...status,
1139
1243
  });
1140
1244
 
1141
- eventStore.emit({
1245
+ const event = eventStore.emit({
1142
1246
  type: "message",
1143
1247
  source: {
1144
1248
  agent_id: agentId,
@@ -1151,6 +1255,109 @@ export function createMessageRouter(
1151
1255
  via: "subtree",
1152
1256
  },
1153
1257
  });
1258
+
1259
+ // Wake sleeping agents on status notifications
1260
+ if (sessionChecker && wakeHandler) {
1261
+ try {
1262
+ const decision = getWakeDecisionWithHint(
1263
+ subscriberId,
1264
+ { priority: "normal" as MessagePriority },
1265
+ sessionChecker
1266
+ );
1267
+ if (decision.shouldWake || decision.shouldInterrupt) {
1268
+ wakeHandler(subscriberId, decision, event.id);
1269
+ }
1270
+ } catch {
1271
+ // Never fail status delivery due to wake errors
1272
+ }
1273
+ }
1274
+
1275
+ notified.add(subscriberId);
1276
+ }
1277
+
1278
+ return notified;
1279
+ }
1280
+
1281
+ /**
1282
+ * Route status event to topic co-subscribers.
1283
+ * Agents sharing topic subscriptions with the emitting agent receive status notifications.
1284
+ * This enables non-hierarchical visibility: peers on the same topic see each other's status.
1285
+ * Skips agents already notified via subtree routing to avoid duplicates.
1286
+ */
1287
+ function routeStatusToTopicSubscribers(
1288
+ agentId: AgentId,
1289
+ status: StatusNotification,
1290
+ alreadyNotified: Set<AgentId>
1291
+ ): void {
1292
+ // Find all topics the emitting agent is subscribed to
1293
+ const subscriptions = eventStore.getSubscriptions(agentId);
1294
+ const topicSubscriptions = subscriptions.filter(
1295
+ (s) => s.type === "topic"
1296
+ );
1297
+
1298
+ if (topicSubscriptions.length === 0) return;
1299
+
1300
+ // Collect unique recipients across all shared topics
1301
+ const topicRecipients = new Set<AgentId>();
1302
+ for (const sub of topicSubscriptions) {
1303
+ const subscribers = eventStore.getSubscribers({
1304
+ type: "topic",
1305
+ target: sub.target,
1306
+ });
1307
+ for (const subscriberId of subscribers) {
1308
+ // Skip self and already-notified (from subtree routing)
1309
+ if (subscriberId !== agentId && !alreadyNotified.has(subscriberId)) {
1310
+ topicRecipients.add(subscriberId);
1311
+ }
1312
+ }
1313
+ }
1314
+
1315
+ if (topicRecipients.size === 0) return;
1316
+
1317
+ // Extract signal name from details (if tagged)
1318
+ const statusSignal = (status.details as Record<string, unknown> | undefined)?.signal as string | undefined;
1319
+
1320
+ const statusContent = JSON.stringify({
1321
+ type: "status_notification",
1322
+ ...status,
1323
+ });
1324
+
1325
+ // Deliver to each topic co-subscriber
1326
+ for (const recipientId of topicRecipients) {
1327
+ // Apply signal filter if installed
1328
+ if (signalFilter && !signalFilter(agentId, recipientId, statusSignal)) {
1329
+ continue;
1330
+ }
1331
+
1332
+ const event = eventStore.emit({
1333
+ type: "message",
1334
+ source: {
1335
+ agent_id: agentId,
1336
+ },
1337
+ target: {
1338
+ agent_id: recipientId,
1339
+ },
1340
+ payload: {
1341
+ content: statusContent,
1342
+ via: "topic",
1343
+ },
1344
+ });
1345
+
1346
+ // Wake sleeping agents on status notifications
1347
+ if (sessionChecker && wakeHandler) {
1348
+ try {
1349
+ const decision = getWakeDecisionWithHint(
1350
+ recipientId,
1351
+ { priority: "normal" as MessagePriority },
1352
+ sessionChecker
1353
+ );
1354
+ if (decision.shouldWake || decision.shouldInterrupt) {
1355
+ wakeHandler(recipientId, decision, event.id);
1356
+ }
1357
+ } catch {
1358
+ // Never fail status delivery due to wake errors
1359
+ }
1360
+ }
1154
1361
  }
1155
1362
  }
1156
1363
 
@@ -1158,6 +1365,14 @@ export function createMessageRouter(
1158
1365
  turnRecorder = recorder;
1159
1366
  }
1160
1367
 
1368
+ function setSignalFilter(filter: SignalFilter): void {
1369
+ signalFilter = filter;
1370
+ }
1371
+
1372
+ function setEmissionValidator(validator: EmissionValidator): void {
1373
+ emissionValidator = validator;
1374
+ }
1375
+
1161
1376
  return {
1162
1377
  sendToAddress,
1163
1378
  emitStatus,
@@ -1171,5 +1386,7 @@ export function createMessageRouter(
1171
1386
  getSubscribers,
1172
1387
  setupDefaultSubscriptions,
1173
1388
  setTurnRecorder,
1389
+ setSignalFilter,
1390
+ setEmissionValidator,
1174
1391
  };
1175
1392
  }
@@ -42,6 +42,8 @@ import type {
42
42
  TurnChangeCallback,
43
43
  ConversationType,
44
44
  ConversationStatus,
45
+ Session,
46
+ SessionState,
45
47
  } from './types/index.js';
46
48
  import { CURRENT_EVENT_VERSION } from './types/events.js';
47
49
  import { migrateEvent } from './migrations.js';
@@ -102,6 +104,7 @@ function createBetterSqlite3Persister(
102
104
  export type AgentChangeCallback = (agentId: AgentId, agent: Agent | null) => void;
103
105
  export type TaskChangeCallback = (taskId: TaskId, task: Task | null) => void;
104
106
  export type MessageCallback = (agentId: AgentId, messages: QueuedMessage[]) => void;
107
+ export type SessionChangeCallback = (sessionId: string, session: Session | null) => void;
105
108
 
106
109
  // Unsubscribe function type
107
110
  export type Unsubscribe = () => void;
@@ -173,6 +176,10 @@ export interface EventStore {
173
176
  getSubscriptions(agentId: AgentId): Subscription[];
174
177
  getSubscribers(subscription: Subscription): AgentId[];
175
178
 
179
+ // Session views
180
+ getSession(sessionId: string): Session | null;
181
+ listSessions(filter?: { state?: SessionState; agent_id?: AgentId }): Session[];
182
+
176
183
  // Conversation views
177
184
  getConversation(conversationId: string): Conversation | null;
178
185
  listConversations(filter?: ConversationFilter): Conversation[];
@@ -184,6 +191,7 @@ export interface EventStore {
184
191
  onAgentChange(agentId: AgentId, callback: AgentChangeCallback): Unsubscribe;
185
192
  onTaskChange(callback: TaskChangeCallback): Unsubscribe;
186
193
  onMessageChange(agentId: AgentId, callback: MessageCallback): Unsubscribe;
194
+ onSessionChange(callback: SessionChangeCallback): Unsubscribe;
187
195
  onConversationChange(callback: ConversationChangeCallback): Unsubscribe;
188
196
  onTurnChange(callback: TurnChangeCallback): Unsubscribe;
189
197
 
@@ -325,6 +333,7 @@ export async function createEventStore(config: StoreConfig = {}): Promise<EventS
325
333
  const agentListeners = new Set<AgentChangeCallback>();
326
334
  const agentIdListeners = new Map<AgentId, Set<AgentChangeCallback>>();
327
335
  const taskListeners = new Set<TaskChangeCallback>();
336
+ const sessionListeners = new Set<SessionChangeCallback>();
328
337
  const messageListeners = new Map<AgentId, Set<MessageCallback>>();
329
338
  const conversationListeners = new Set<ConversationChangeCallback>();
330
339
  const turnListeners = new Set<TurnChangeCallback>();
@@ -354,7 +363,7 @@ export async function createEventStore(config: StoreConfig = {}): Promise<EventS
354
363
  });
355
364
 
356
365
  // Update materialized views
357
- applyEventToViews(store, event, notifyAgentChange, notifyTaskChange, notifyMessageChange, notifyConversationChange, notifyTurnChange);
366
+ applyEventToViews(store, event, notifyAgentChange, notifyTaskChange, notifyMessageChange, notifySessionChange, notifyConversationChange, notifyTurnChange);
358
367
 
359
368
  return event;
360
369
  }
@@ -694,6 +703,52 @@ export async function createEventStore(config: StoreConfig = {}): Promise<EventS
694
703
  return () => turnListeners.delete(callback);
695
704
  }
696
705
 
706
+ // ─── Session View Queries ───
707
+
708
+ function getSession(sessionId: string): Session | null {
709
+ const row = store.getRow('sessions', sessionId);
710
+ if (!row.id) return null;
711
+ return rowToSession(row);
712
+ }
713
+
714
+ function listSessions(filter?: { state?: SessionState; agent_id?: AgentId }): Session[] {
715
+ const sessions: Session[] = [];
716
+ const rowIds = store.getRowIds('sessions');
717
+
718
+ for (const rowId of rowIds) {
719
+ const row = store.getRow('sessions', rowId);
720
+ if (!row.id) continue;
721
+
722
+ const session = rowToSession(row);
723
+
724
+ if (filter) {
725
+ if (filter.state && session.state !== filter.state) continue;
726
+ if (filter.agent_id && session.current_agent_id !== filter.agent_id && session.head_manager_id !== filter.agent_id) continue;
727
+ }
728
+
729
+ sessions.push(session);
730
+ }
731
+
732
+ return sessions;
733
+ }
734
+
735
+ /**
736
+ * Notify session change listeners
737
+ */
738
+ function notifySessionChange(sessionId: string, session: Session | null): void {
739
+ for (const callback of sessionListeners) {
740
+ callback(sessionId, session);
741
+ }
742
+ }
743
+
744
+ /**
745
+ * Subscribe to session changes
746
+ */
747
+ function onSessionChange(callback: SessionChangeCallback): Unsubscribe {
748
+ sessionListeners.add(callback);
749
+ return () => sessionListeners.delete(callback);
750
+ }
751
+
697
752
  // ─── Conversation View Queries ───
698
753
 
699
754
  function getConversation(conversationId: string): Conversation | null {
@@ -1048,7 +1103,7 @@ export async function createEventStore(config: StoreConfig = {}): Promise<EventS
1048
1103
  });
1049
1104
 
1050
1105
  // Update materialized views
1051
- applyEventToViews(store, event, notifyAgentChange, notifyTaskChange, notifyMessageChange, notifyConversationChange, notifyTurnChange);
1106
+ applyEventToViews(store, event, notifyAgentChange, notifyTaskChange, notifyMessageChange, notifySessionChange, notifyConversationChange, notifyTurnChange);
1052
1107
  }
1053
1108
  }
1054
1109
 
@@ -1094,6 +1149,8 @@ export async function createEventStore(config: StoreConfig = {}): Promise<EventS
1094
1149
  listTasks,
1095
1150
  getMessages,
1096
1151
  getFullMessage,
1152
+ getSession,
1153
+ listSessions,
1097
1154
  getConversation,
1098
1155
  listConversations,
1099
1156
  listTurns,
@@ -1109,6 +1166,7 @@ export async function createEventStore(config: StoreConfig = {}): Promise<EventS
1109
1166
  onAgentChange,
1110
1167
  onTaskChange,
1111
1168
  onMessageChange,
1169
+ onSessionChange,
1112
1170
  onConversationChange,
1113
1171
  onTurnChange,
1114
1172
 
@@ -1142,6 +1200,7 @@ function initializeTables(store: Store): void {
1142
1200
  store.getRowIds('tasks');
1143
1201
  store.getRowIds('messages');
1144
1202
  store.getRowIds('subscriptions');
1203
+ store.getRowIds('sessions');
1145
1204
  store.getRowIds('conversations');
1146
1205
  store.getRowIds('turns');
1147
1206
  store.getRowIds('threads');
@@ -1162,6 +1221,9 @@ function rebuildViews(store: Store): void {
1162
1221
  for (const rowId of store.getRowIds('messages')) {
1163
1222
  store.delRow('messages', rowId);
1164
1223
  }
1224
+ for (const rowId of store.getRowIds('sessions')) {
1225
+ store.delRow('sessions', rowId);
1226
+ }
1165
1227
  for (const rowId of store.getRowIds('conversations')) {
1166
1228
  store.delRow('conversations', rowId);
1167
1229
  }
@@ -1202,7 +1264,7 @@ function rebuildViews(store: Store): void {
1202
1264
  // Apply each event (no-op callbacks since we're rebuilding)
1203
1265
  const noop = () => {};
1204
1266
  for (const event of events) {
1205
- applyEventToViews(store, event, noop, noop, noop, noop, noop);
1267
+ applyEventToViews(store, event, noop, noop, noop, noop, noop, noop);
1206
1268
  }
1207
1269
  }
1208
1270
 
@@ -1215,6 +1277,7 @@ function applyEventToViews(
1215
1277
  notifyAgentChange: (agentId: AgentId, agent: Agent | null) => void,
1216
1278
  notifyTaskChange: (taskId: TaskId, task: Task | null) => void,
1217
1279
  notifyMessageChange: (agentId: AgentId) => void,
1280
+ notifySessionChange: (sessionId: string, session: Session | null) => void,
1218
1281
  notifyConversationChange: (conversationId: string, conversation: Conversation | null) => void,
1219
1282
  notifyTurnChange: (conversationId: string, turn: ConversationTurn) => void,
1220
1283
  ): void {
@@ -1234,6 +1297,9 @@ function applyEventToViews(
1234
1297
  case 'task':
1235
1298
  applyTaskEvent(store, event, notifyTaskChange);
1236
1299
  break;
1300
+ case 'session':
1301
+ applySessionEvent(store, event, notifySessionChange);
1302
+ break;
1237
1303
  case 'conversation':
1238
1304
  applyConversationEvent(store, event, notifyConversationChange);
1239
1305
  break;
@@ -1671,6 +1737,88 @@ function rowToTask(row: Record<string, unknown>): Task {
1671
1737
  };
1672
1738
  }
1673
1739
 
1740
+ // ─────────────────────────────────────────────────────────────────────────────
1741
+ // Session Event Handlers
1742
+ // ─────────────────────────────────────────────────────────────────────────────
1743
+
1744
+ /**
1745
+ * Apply session event to sessions view
1746
+ */
1747
+ function applySessionEvent(
1748
+ store: Store,
1749
+ event: Event,
1750
+ notify: (sessionId: string, session: Session | null) => void,
1751
+ ): void {
1752
+ const payload = event.payload as {
1753
+ action: string;
1754
+ session_id: string;
1755
+ head_manager_id?: AgentId;
1756
+ agent_id?: AgentId;
1757
+ target_agent_id?: AgentId;
1758
+ previous_agent_id?: AgentId;
1759
+ };
1760
+
1761
+ const sessionId = payload.session_id;
1762
+
1763
+ switch (payload.action) {
1764
+ case 'created': {
1765
+ store.setRow('sessions', sessionId, {
1766
+ id: sessionId,
1767
+ head_manager_id: payload.head_manager_id ?? '',
1768
+ current_agent_id: payload.head_manager_id ?? '',
1769
+ state: 'active',
1770
+ created_at: event.timestamp,
1771
+ updated_at: event.timestamp,
1772
+ closed_at: 0,
1773
+ });
1774
+ break;
1775
+ }
1776
+ case 'mounted': {
1777
+ store.setPartialRow('sessions', sessionId, {
1778
+ current_agent_id: payload.target_agent_id ?? '',
1779
+ state: 'mounted',
1780
+ updated_at: event.timestamp,
1781
+ });
1782
+ break;
1783
+ }
1784
+ case 'unmounted': {
1785
+ const existing = store.getRow('sessions', sessionId);
1786
+ store.setPartialRow('sessions', sessionId, {
1787
+ current_agent_id: existing.head_manager_id as string,
1788
+ state: 'active',
1789
+ updated_at: event.timestamp,
1790
+ });
1791
+ break;
1792
+ }
1793
+ case 'closed': {
1794
+ store.setPartialRow('sessions', sessionId, {
1795
+ state: 'closed',
1796
+ updated_at: event.timestamp,
1797
+ closed_at: event.timestamp,
1798
+ });
1799
+ break;
1800
+ }
1801
+ }
1802
+
1803
+ const session = rowToSession(store.getRow('sessions', sessionId));
1804
+ notify(sessionId, session);
1805
+ }
1806
+
1807
+ /**
1808
+ * Convert a TinyBase row to a Session object
1809
+ */
1810
+ function rowToSession(row: Record<string, unknown>): Session {
1811
+ return {
1812
+ id: row.id as string,
1813
+ head_manager_id: row.head_manager_id as AgentId,
1814
+ current_agent_id: row.current_agent_id as AgentId,
1815
+ state: row.state as SessionState,
1816
+ created_at: row.created_at as Timestamp,
1817
+ updated_at: row.updated_at as Timestamp,
1818
+ closed_at: (row.closed_at as number) || undefined,
1819
+ };
1820
+ }
1821
+
1674
1822
  // ─────────────────────────────────────────────────────────────────────────────
1675
1823
  // Conversation Event Handlers
1676
1824
  // ─────────────────────────────────────────────────────────────────────────────
@@ -5,7 +5,7 @@
5
5
  import type { AgentId, SessionId, TaskId, Timestamp } from "./primitives.js";
6
6
 
7
7
  // Agent states
8
- export type AgentState = "spawning" | "running" | "stopped";
8
+ export type AgentState = "spawning" | "running" | "stopped" | "failed";
9
9
 
10
10
  export type StopReason =
11
11
  | "completed"
@@ -20,7 +20,8 @@ export type EventType =
20
20
  | "peer_request"
21
21
  | "conversation"
22
22
  | "turn"
23
- | "thread";
23
+ | "thread"
24
+ | "session";
24
25
 
25
26
  // Status types for status events
26
27
  export type StatusType =
@@ -9,3 +9,4 @@ export * from "./tasks.js";
9
9
  export * from "./messages.js";
10
10
  export * from "./config.js";
11
11
  export * from "./conversations.js";
12
+ export * from "./sessions.js";
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Session-related type definitions
3
+ *
4
+ * Sessions track the mapping between ACP protocol sessions and
5
+ * macro-agent agents. Unlike the in-memory SessionMapper, these
6
+ * records are persisted in the EventStore for recovery after restart.
7
+ */
8
+
9
+ import type { AgentId, Timestamp } from "./primitives.js";
10
+
11
+ /**
12
+ * Session state enum — tracks the lifecycle of an ACP session.
13
+ *
14
+ * State transitions:
15
+ * active → mounted → active (via unmount)
16
+ * active → closed
17
+ * mounted → closed
18
+ */
19
+ export type SessionState = "active" | "mounted" | "closed";
20
+
21
+ /**
22
+ * Persistent session record in the EventStore materialized view.
23
+ *
24
+ * Maps an ACP session ID to its head manager agent, current agent
25
+ * target (which may differ when mounted), and lifecycle state.
26
+ */
27
+ export interface Session {
28
+ /** ACP session ID (primary key) */
29
+ id: string;
30
+
31
+ /** Head manager agent ID — the original agent for this session */
32
+ head_manager_id: AgentId;
33
+
34
+ /** Currently targeted agent ID (may differ from head_manager_id when mounted) */
35
+ current_agent_id: AgentId;
36
+
37
+ /** Current session state */
38
+ state: SessionState;
39
+
40
+ /** When the session was created */
41
+ created_at: Timestamp;
42
+
43
+ /** When the session state last changed */
44
+ updated_at: Timestamp;
45
+
46
+ /** When the session was closed (if applicable) */
47
+ closed_at?: Timestamp;
48
+ }
49
+
50
+ /**
51
+ * Session event actions used in the event payload.
52
+ */
53
+ export type SessionAction = "created" | "mounted" | "unmounted" | "closed";
@@ -118,4 +118,7 @@ export interface Task {
118
118
 
119
119
  /** Current retry state */
120
120
  retryState?: RetryState;
121
+
122
+ /** Tags for task classification and filtering (used by pull model) */
123
+ tags?: string[];
121
124
  }