maestro-flow 0.3.15 → 0.3.16

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 (374) hide show
  1. package/.claude/commands/maestro-amend.md +300 -0
  2. package/.claude/commands/maestro-analyze.md +1 -49
  3. package/.claude/commands/maestro-execute.md +2 -56
  4. package/.claude/commands/maestro-fork.md +3 -50
  5. package/.claude/commands/maestro-merge.md +2 -26
  6. package/.claude/commands/maestro-milestone-audit.md +1 -5
  7. package/.claude/commands/maestro-milestone-complete.md +1 -7
  8. package/.claude/commands/maestro-plan.md +6 -127
  9. package/.claude/commands/maestro-roadmap.md +3 -101
  10. package/.claude/commands/maestro-spec-generate.md +1 -25
  11. package/.claude/commands/maestro-ui-design.md +14 -73
  12. package/.claude/commands/maestro-verify.md +1 -32
  13. package/.claude/commands/maestro.md +13 -30
  14. package/.claude/commands/manage-harvest.md +7 -44
  15. package/.claude/commands/manage-knowhow-capture.md +193 -0
  16. package/.claude/commands/{manage-memory.md → manage-knowhow.md} +77 -88
  17. package/.claude/commands/manage-learn.md +3 -28
  18. package/.claude/commands/manage-status.md +1 -20
  19. package/.claude/commands/manage-wiki.md +1 -1
  20. package/.claude/commands/quality-business-test.md +1 -1
  21. package/.claude/commands/quality-debug.md +3 -18
  22. package/.claude/commands/quality-integration-test.md +3 -23
  23. package/.claude/commands/quality-retrospective.md +1 -28
  24. package/.claude/commands/quality-review.md +3 -52
  25. package/.claude/commands/quality-test-gen.md +1 -10
  26. package/.claude/commands/quality-test.md +3 -25
  27. package/.claude/commands/spec-add.md +1 -21
  28. package/.claude/commands/spec-load.md +1 -16
  29. package/.claude/commands/wiki-connect.md +2 -112
  30. package/.claude/commands/wiki-digest.md +2 -141
  31. package/.codex/skills/learn-decompose/SKILL.md +2 -8
  32. package/.codex/skills/maestro/SKILL.md +60 -146
  33. package/.codex/skills/maestro-analyze/SKILL.md +52 -150
  34. package/.codex/skills/maestro-brainstorm/SKILL.md +36 -91
  35. package/.codex/skills/maestro-composer/SKILL.md +4 -76
  36. package/.codex/skills/maestro-execute/SKILL.md +46 -177
  37. package/.codex/skills/maestro-init/SKILL.md +7 -51
  38. package/.codex/skills/maestro-link-coordinate/SKILL.md +56 -229
  39. package/.codex/skills/maestro-milestone-audit/SKILL.md +7 -36
  40. package/.codex/skills/maestro-milestone-complete/SKILL.md +11 -93
  41. package/.codex/skills/maestro-overlay/SKILL.md +23 -92
  42. package/.codex/skills/maestro-plan/SKILL.md +42 -166
  43. package/.codex/skills/maestro-player/SKILL.md +24 -149
  44. package/.codex/skills/maestro-quick/SKILL.md +5 -48
  45. package/.codex/skills/maestro-roadmap/SKILL.md +21 -66
  46. package/.codex/skills/maestro-spec-generate/SKILL.md +20 -56
  47. package/.codex/skills/maestro-ui-design/SKILL.md +6 -53
  48. package/.codex/skills/maestro-verify/SKILL.md +39 -136
  49. package/.codex/skills/manage-codebase-rebuild/SKILL.md +25 -75
  50. package/.codex/skills/manage-codebase-refresh/SKILL.md +5 -32
  51. package/.codex/skills/manage-issue/SKILL.md +1 -6
  52. package/.codex/skills/manage-issue-discover/SKILL.md +33 -93
  53. package/.codex/skills/{manage-memory → manage-knowhow}/SKILL.md +95 -95
  54. package/.codex/skills/manage-knowhow-capture/SKILL.md +110 -0
  55. package/.codex/skills/manage-learn/SKILL.md +17 -71
  56. package/.codex/skills/manage-status/SKILL.md +4 -35
  57. package/.codex/skills/manage-wiki/SKILL.md +1 -1
  58. package/.codex/skills/quality-business-test/SKILL.md +2 -14
  59. package/.codex/skills/quality-debug/SKILL.md +41 -133
  60. package/.codex/skills/quality-integration-test/SKILL.md +36 -145
  61. package/.codex/skills/quality-refactor/SKILL.md +6 -59
  62. package/.codex/skills/quality-retrospective/SKILL.md +292 -531
  63. package/.codex/skills/quality-review/SKILL.md +30 -65
  64. package/.codex/skills/quality-sync/SKILL.md +2 -11
  65. package/.codex/skills/quality-test/SKILL.md +4 -45
  66. package/.codex/skills/quality-test-gen/SKILL.md +33 -121
  67. package/.codex/skills/spec-add/SKILL.md +2 -9
  68. package/.codex/skills/spec-load/SKILL.md +4 -14
  69. package/.codex/skills/spec-map/SKILL.md +4 -37
  70. package/.codex/skills/spec-remove/SKILL.md +3 -35
  71. package/.codex/skills/spec-setup/SKILL.md +2 -19
  72. package/.codex/skills/team-coordinate/SKILL.md +20 -132
  73. package/.codex/skills/team-coordinate/roles/coordinator/commands/monitor.md +61 -215
  74. package/.codex/skills/team-executor/SKILL.md +7 -66
  75. package/.codex/skills/team-executor/roles/executor/commands/monitor.md +60 -182
  76. package/.codex/skills/team-executor/specs/session-schema.md +22 -56
  77. package/.codex/skills/team-lifecycle-v4/SKILL.md +22 -143
  78. package/.codex/skills/team-lifecycle-v4/roles/coordinator/commands/monitor.md +31 -223
  79. package/.codex/skills/team-quality-assurance/SKILL.md +14 -88
  80. package/.codex/skills/team-quality-assurance/roles/coordinator/commands/monitor.md +46 -186
  81. package/.codex/skills/team-review/SKILL.md +12 -86
  82. package/.codex/skills/team-review/roles/coordinator/commands/monitor.md +49 -187
  83. package/.codex/skills/team-tech-debt/SKILL.md +11 -50
  84. package/.codex/skills/team-tech-debt/roles/coordinator/commands/monitor.md +50 -239
  85. package/.codex/skills/team-testing/SKILL.md +14 -99
  86. package/.codex/skills/team-testing/roles/coordinator/commands/monitor.md +52 -228
  87. package/.codex/skills/wiki-connect/SKILL.md +2 -5
  88. package/README.md +6 -0
  89. package/README.zh-CN.md +6 -0
  90. package/chains/_intent-map.json +7 -7
  91. package/chains/singles/{memory-capture.json → knowhow-capture.json} +5 -5
  92. package/chains/singles/{memory.json → knowhow.json} +6 -6
  93. package/dashboard/dist/assets/{ArtifactsPage-CUrrDGgN.js → ArtifactsPage-iJZtYsmR.js} +6 -6
  94. package/dashboard/dist/assets/ChatInput-DNnDLdQF.js +6 -0
  95. package/dashboard/dist/assets/ChatPage-BjBibfE4.js +22 -0
  96. package/dashboard/dist/assets/{CollabPage-DIUXeazv.js → CollabPage-8lUMUol_.js} +1 -1
  97. package/dashboard/dist/assets/{ExecutionPanel-VmYeADFj.js → ExecutionPanel-BKV3GZ7Q.js} +1 -1
  98. package/dashboard/dist/assets/{KanbanPage-DLq8v7hg.js → KanbanPage-diY3QmGd.js} +2 -2
  99. package/dashboard/dist/assets/{MarkdownRenderer-D7AehrnR.js → MarkdownRenderer-cYFfe1uX.js} +1 -1
  100. package/dashboard/dist/assets/McpPage-COjuIf7U.js +21 -0
  101. package/dashboard/dist/assets/MeetingRoomPage-wnvT7wlB.js +85 -0
  102. package/dashboard/dist/assets/{OutputPanel-B-Rjwgmv.js → OutputPanel-DDL90Idy.js} +1 -1
  103. package/dashboard/dist/assets/{ProblemsPanel-GEpF-oi4.js → ProblemsPanel-zFN9IIs0.js} +1 -1
  104. package/dashboard/dist/assets/{RequirementBoardPage-xs8uDM7I.js → RequirementBoardPage-DOPJoT0I.js} +2 -2
  105. package/dashboard/dist/assets/{RequirementPage-BKDSFwjA.js → RequirementPage-CEVquRgM.js} +1 -1
  106. package/dashboard/dist/assets/RoomsPage-D5USEWDh.js +1 -0
  107. package/dashboard/dist/assets/{SpecsPage-DLFb9ZH0.js → SpecsPage-BOwBin_o.js} +1 -1
  108. package/dashboard/dist/assets/{SupervisorPage-SOki_kgz.js → SupervisorPage-5iRyMU5T.js} +1 -1
  109. package/dashboard/dist/assets/TeamsPage-DlcEmr_Q.js +1 -0
  110. package/dashboard/dist/assets/{TreeBrowser-B9DHdULE.js → TreeBrowser-Y48Wz-QY.js} +1 -1
  111. package/dashboard/dist/assets/WorkflowPage-CmQaRVgL.js +6 -0
  112. package/dashboard/dist/assets/arrow-left-NCUOENvg.js +6 -0
  113. package/dashboard/dist/assets/{check-DJDk3A2a.js → check-o7nfGNHf.js} +1 -1
  114. package/dashboard/dist/assets/{chevron-right-C7bVDreZ.js → chevron-right-BXySK2fn.js} +1 -1
  115. package/dashboard/dist/assets/{circle-alert-Na1vf6qQ.js → circle-alert-DcSBokh4.js} +1 -1
  116. package/dashboard/dist/assets/{circle-check-CEGgy3NV.js → circle-check-Cd-jce4j.js} +1 -1
  117. package/dashboard/dist/assets/{circle-check-big-3JB8zRYj.js → circle-check-big-BN7Mdp4i.js} +1 -1
  118. package/dashboard/dist/assets/{circle-Qfgy4LB_.js → circle-cooAwnAR.js} +1 -1
  119. package/dashboard/dist/assets/{code-Ble63Idz.js → code-BQa9oL1n.js} +1 -1
  120. package/dashboard/dist/assets/{columns-3-BUcKlxve.js → columns-3-BzgxelGx.js} +1 -1
  121. package/dashboard/dist/assets/{download-CMqkfn8x.js → download-swRJnate.js} +1 -1
  122. package/dashboard/dist/assets/en-C_BD3UCD.js +1 -0
  123. package/dashboard/dist/assets/{folder-B9ewx9LL.js → folder-DbGbLNFN.js} +1 -1
  124. package/dashboard/dist/assets/index-BEUaOz_b.css +1 -0
  125. package/dashboard/dist/assets/{index-JTmGteaT.js → index-DIoMBMbv.js} +1 -1
  126. package/dashboard/dist/assets/index-DLBN_7fb.js +44 -0
  127. package/dashboard/dist/assets/index-uIqUCT8y.js +236 -0
  128. package/dashboard/dist/assets/{list-DI8Wn2aT.js → list-BTRAIvDq.js} +1 -1
  129. package/dashboard/dist/assets/loader-NHtB6Mdn.js +6 -0
  130. package/dashboard/dist/assets/{minus-Lp_BfctG.js → minus-BjMxRTET.js} +1 -1
  131. package/dashboard/dist/assets/{pen-line-Ch7sphzZ.js → pen-line-C4_O16H0.js} +1 -1
  132. package/dashboard/dist/assets/{pencil-_yRMHmGT.js → pencil-DTmKhyDY.js} +1 -1
  133. package/dashboard/dist/assets/{proxy-D72Y8a4Y.js → proxy-Dtx5p6IO.js} +1 -1
  134. package/dashboard/dist/assets/rows-2-GR1dZtRu.js +6 -0
  135. package/dashboard/dist/assets/{search-BS6fI6Bg.js → search-DVtgy2W7.js} +1 -1
  136. package/dashboard/dist/assets/{shallow-BXasQBvr.js → shallow-BOmvDNsv.js} +1 -1
  137. package/dashboard/dist/assets/{table-CeGlFjlP.js → table-DCzuJAFh.js} +1 -1
  138. package/dashboard/dist/assets/team-types-BPeOvVdA.js +6 -0
  139. package/dashboard/dist/assets/{terminal-BJic2yW-.js → terminal-CzogW4cl.js} +1 -1
  140. package/dashboard/dist/assets/{trash-2-Czz4X8Fb.js → trash-2-52LATVfW.js} +1 -1
  141. package/dashboard/dist/assets/users-DLFE2voE.js +6 -0
  142. package/dashboard/dist/assets/{zap-C3H0jVFA.js → zap-DhiYlgyZ.js} +1 -1
  143. package/dashboard/dist/assets/zh-CN-DvQKfow3.js +1 -0
  144. package/dashboard/dist/index.html +2 -2
  145. package/dashboard/dist-server/dashboard/src/server/agents/agent-manager.d.ts +2 -0
  146. package/dashboard/dist-server/dashboard/src/server/agents/agent-manager.js +19 -11
  147. package/dashboard/dist-server/dashboard/src/server/agents/agent-manager.js.map +1 -1
  148. package/dashboard/dist-server/dashboard/src/server/agents/agent-sdk-adapter.js +5 -0
  149. package/dashboard/dist-server/dashboard/src/server/agents/agent-sdk-adapter.js.map +1 -1
  150. package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.d.ts +1 -0
  151. package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.js +21 -4
  152. package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.js.map +1 -1
  153. package/dashboard/dist-server/dashboard/src/server/agents/env-cleanup.js +8 -0
  154. package/dashboard/dist-server/dashboard/src/server/agents/env-cleanup.js.map +1 -1
  155. package/dashboard/dist-server/dashboard/src/server/coordinator/chain-map.js +6 -6
  156. package/dashboard/dist-server/dashboard/src/server/coordinator/chain-map.js.map +1 -1
  157. package/dashboard/dist-server/dashboard/src/server/coordinator/chain-map.test.js +2 -2
  158. package/dashboard/dist-server/dashboard/src/server/coordinator/chain-map.test.js.map +1 -1
  159. package/dashboard/dist-server/dashboard/src/server/index.js +14 -3
  160. package/dashboard/dist-server/dashboard/src/server/index.js.map +1 -1
  161. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/mcp-config-builder.d.ts +24 -0
  162. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/mcp-config-builder.js +220 -0
  163. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/mcp-config-builder.js.map +1 -0
  164. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/mcp-config-builder.test.d.ts +1 -0
  165. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/mcp-config-builder.test.js +115 -0
  166. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/mcp-config-builder.test.js.map +1 -0
  167. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/meeting-room-mcp-server.d.ts +44 -0
  168. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/meeting-room-mcp-server.js +260 -0
  169. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/meeting-room-mcp-server.js.map +1 -0
  170. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/meeting-room-mcp-server.test.d.ts +1 -0
  171. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/meeting-room-mcp-server.test.js +194 -0
  172. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/meeting-room-mcp-server.test.js.map +1 -0
  173. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/stdio-bridge.d.ts +2 -0
  174. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/stdio-bridge.js +279 -0
  175. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/stdio-bridge.js.map +1 -0
  176. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/tcp-helpers.d.ts +14 -0
  177. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/tcp-helpers.js +131 -0
  178. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/tcp-helpers.js.map +1 -0
  179. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/tcp-helpers.test.d.ts +1 -0
  180. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/tcp-helpers.test.js +134 -0
  181. package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/tcp-helpers.test.js.map +1 -0
  182. package/dashboard/dist-server/dashboard/src/server/rooms/meeting-room-session.d.ts +51 -0
  183. package/dashboard/dist-server/dashboard/src/server/rooms/meeting-room-session.js +185 -0
  184. package/dashboard/dist-server/dashboard/src/server/rooms/meeting-room-session.js.map +1 -0
  185. package/dashboard/dist-server/dashboard/src/server/rooms/room-agent-registry.d.ts +29 -0
  186. package/dashboard/dist-server/dashboard/src/server/rooms/room-agent-registry.js +125 -0
  187. package/dashboard/dist-server/dashboard/src/server/rooms/room-agent-registry.js.map +1 -0
  188. package/dashboard/dist-server/dashboard/src/server/rooms/room-mailbox.d.ts +18 -0
  189. package/dashboard/dist-server/dashboard/src/server/rooms/room-mailbox.js +63 -0
  190. package/dashboard/dist-server/dashboard/src/server/rooms/room-mailbox.js.map +1 -0
  191. package/dashboard/dist-server/dashboard/src/server/rooms/room-session-manager.d.ts +19 -0
  192. package/dashboard/dist-server/dashboard/src/server/rooms/room-session-manager.js +45 -0
  193. package/dashboard/dist-server/dashboard/src/server/rooms/room-session-manager.js.map +1 -0
  194. package/dashboard/dist-server/dashboard/src/server/rooms/room-task-board.d.ts +25 -0
  195. package/dashboard/dist-server/dashboard/src/server/rooms/room-task-board.js +115 -0
  196. package/dashboard/dist-server/dashboard/src/server/rooms/room-task-board.js.map +1 -0
  197. package/dashboard/dist-server/dashboard/src/server/rooms/room-types.d.ts +53 -0
  198. package/dashboard/dist-server/dashboard/src/server/rooms/room-types.js +5 -0
  199. package/dashboard/dist-server/dashboard/src/server/rooms/room-types.js.map +1 -0
  200. package/dashboard/dist-server/dashboard/src/server/routes/agents.js +6 -0
  201. package/dashboard/dist-server/dashboard/src/server/routes/agents.js.map +1 -1
  202. package/dashboard/dist-server/dashboard/src/server/routes/cli-history.js +20 -1
  203. package/dashboard/dist-server/dashboard/src/server/routes/cli-history.js.map +1 -1
  204. package/dashboard/dist-server/dashboard/src/server/routes/index.d.ts +2 -1
  205. package/dashboard/dist-server/dashboard/src/server/routes/index.js +8 -1
  206. package/dashboard/dist-server/dashboard/src/server/routes/index.js.map +1 -1
  207. package/dashboard/dist-server/dashboard/src/server/routes/install.js +1 -1
  208. package/dashboard/dist-server/dashboard/src/server/routes/install.js.map +1 -1
  209. package/dashboard/dist-server/dashboard/src/server/routes/mcp.js +2 -2
  210. package/dashboard/dist-server/dashboard/src/server/routes/mcp.js.map +1 -1
  211. package/dashboard/dist-server/dashboard/src/server/routes/room-mcp.d.ts +3 -0
  212. package/dashboard/dist-server/dashboard/src/server/routes/room-mcp.js +246 -0
  213. package/dashboard/dist-server/dashboard/src/server/routes/room-mcp.js.map +1 -0
  214. package/dashboard/dist-server/dashboard/src/server/routes/rooms.d.ts +3 -0
  215. package/dashboard/dist-server/dashboard/src/server/routes/rooms.js +38 -0
  216. package/dashboard/dist-server/dashboard/src/server/routes/rooms.js.map +1 -0
  217. package/dashboard/dist-server/dashboard/src/server/routes/wiki.integration.test.js +7 -7
  218. package/dashboard/dist-server/dashboard/src/server/routes/wiki.integration.test.js.map +1 -1
  219. package/dashboard/dist-server/dashboard/src/server/routes/wiki.js +1 -1
  220. package/dashboard/dist-server/dashboard/src/server/routes/wiki.js.map +1 -1
  221. package/dashboard/dist-server/dashboard/src/server/state/event-bus.d.ts +39 -1
  222. package/dashboard/dist-server/dashboard/src/server/state/event-bus.js +12 -0
  223. package/dashboard/dist-server/dashboard/src/server/state/event-bus.js.map +1 -1
  224. package/dashboard/dist-server/dashboard/src/server/wiki/stress.test.js +1 -1
  225. package/dashboard/dist-server/dashboard/src/server/wiki/stress.test.js.map +1 -1
  226. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js +25 -14
  227. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js.map +1 -1
  228. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.test.js +6 -6
  229. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.test.js.map +1 -1
  230. package/dashboard/dist-server/dashboard/src/server/wiki/wiki-types.d.ts +1 -1
  231. package/dashboard/dist-server/dashboard/src/server/wiki/writer-stress.test.js +17 -16
  232. package/dashboard/dist-server/dashboard/src/server/wiki/writer-stress.test.js.map +1 -1
  233. package/dashboard/dist-server/dashboard/src/server/wiki/writer.d.ts +1 -1
  234. package/dashboard/dist-server/dashboard/src/server/wiki/writer.js +18 -7
  235. package/dashboard/dist-server/dashboard/src/server/wiki/writer.js.map +1 -1
  236. package/dashboard/dist-server/dashboard/src/server/ws/handlers/agent-handler.d.ts +3 -1
  237. package/dashboard/dist-server/dashboard/src/server/ws/handlers/agent-handler.js +75 -1
  238. package/dashboard/dist-server/dashboard/src/server/ws/handlers/agent-handler.js.map +1 -1
  239. package/dashboard/dist-server/dashboard/src/server/ws/handlers/room-handler.d.ts +17 -0
  240. package/dashboard/dist-server/dashboard/src/server/ws/handlers/room-handler.js +192 -0
  241. package/dashboard/dist-server/dashboard/src/server/ws/handlers/room-handler.js.map +1 -0
  242. package/dashboard/dist-server/dashboard/src/server/ws/session-scoped-event-filter.d.ts +13 -0
  243. package/dashboard/dist-server/dashboard/src/server/ws/session-scoped-event-filter.js +37 -0
  244. package/dashboard/dist-server/dashboard/src/server/ws/session-scoped-event-filter.js.map +1 -0
  245. package/dashboard/dist-server/dashboard/src/server/ws/ws-manager.d.ts +7 -1
  246. package/dashboard/dist-server/dashboard/src/server/ws/ws-manager.js +39 -2
  247. package/dashboard/dist-server/dashboard/src/server/ws/ws-manager.js.map +1 -1
  248. package/dashboard/dist-server/dashboard/src/shared/constants.js +12 -0
  249. package/dashboard/dist-server/dashboard/src/shared/constants.js.map +1 -1
  250. package/dashboard/dist-server/dashboard/src/shared/room-leader-prompt.d.ts +1 -0
  251. package/dashboard/dist-server/dashboard/src/shared/room-leader-prompt.js +38 -0
  252. package/dashboard/dist-server/dashboard/src/shared/room-leader-prompt.js.map +1 -0
  253. package/dashboard/dist-server/dashboard/src/shared/team-types.d.ts +66 -0
  254. package/dashboard/dist-server/dashboard/src/shared/team-types.js.map +1 -1
  255. package/dashboard/dist-server/dashboard/src/shared/types.d.ts +24 -3
  256. package/dashboard/dist-server/dashboard/src/shared/ws-protocol.d.ts +76 -2
  257. package/dashboard/dist-server/dashboard/src/shared/ws-protocol.js.map +1 -1
  258. package/dashboard/dist-server/shared/agent-types.d.ts +2 -0
  259. package/dashboard/dist-server/src/commands/delegate.js +11 -8
  260. package/dashboard/dist-server/src/commands/delegate.js.map +1 -1
  261. package/dist/shared/agent-types.d.ts +2 -0
  262. package/dist/shared/agent-types.d.ts.map +1 -1
  263. package/dist/src/cli.js +2 -2
  264. package/dist/src/cli.js.map +1 -1
  265. package/dist/src/commands/delegate.d.ts.map +1 -1
  266. package/dist/src/commands/delegate.js +11 -8
  267. package/dist/src/commands/delegate.js.map +1 -1
  268. package/dist/src/commands/install-backend.d.ts +1 -1
  269. package/dist/src/commands/install-backend.d.ts.map +1 -1
  270. package/dist/src/commands/install-backend.js +1 -1
  271. package/dist/src/commands/install-backend.js.map +1 -1
  272. package/dist/src/commands/knowhow.d.ts +10 -0
  273. package/dist/src/commands/knowhow.d.ts.map +1 -0
  274. package/dist/src/commands/knowhow.js +217 -0
  275. package/dist/src/commands/knowhow.js.map +1 -0
  276. package/dist/src/commands/overlay-ui/OverlayList.d.ts +2 -0
  277. package/dist/src/commands/overlay-ui/OverlayList.d.ts.map +1 -1
  278. package/dist/src/commands/overlay-ui/OverlayList.js +6 -3
  279. package/dist/src/commands/overlay-ui/OverlayList.js.map +1 -1
  280. package/dist/src/commands/overlay-ui/index.d.ts.map +1 -1
  281. package/dist/src/commands/overlay-ui/index.js +70 -44
  282. package/dist/src/commands/overlay-ui/index.js.map +1 -1
  283. package/dist/src/commands/overlay.d.ts.map +1 -1
  284. package/dist/src/commands/overlay.js +4 -3
  285. package/dist/src/commands/overlay.js.map +1 -1
  286. package/dist/src/core/overlay/applier.d.ts +1 -1
  287. package/dist/src/core/overlay/applier.d.ts.map +1 -1
  288. package/dist/src/core/overlay/applier.js +40 -13
  289. package/dist/src/core/overlay/applier.js.map +1 -1
  290. package/dist/src/core/overlay/loader.d.ts.map +1 -1
  291. package/dist/src/core/overlay/loader.js +6 -0
  292. package/dist/src/core/overlay/loader.js.map +1 -1
  293. package/dist/src/core/overlay/types.d.ts +5 -1
  294. package/dist/src/core/overlay/types.d.ts.map +1 -1
  295. package/dist/src/core/overlay/types.js +1 -1
  296. package/dist/src/core/overlay/types.js.map +1 -1
  297. package/dist/src/hooks/context-monitor.js +1 -1
  298. package/dist/src/hooks/context-monitor.js.map +1 -1
  299. package/dist/src/hooks/skill-context.js +1 -1
  300. package/dist/src/hooks/skill-context.js.map +1 -1
  301. package/dist/src/mcp/delegate-channel-relay.d.ts +4 -0
  302. package/dist/src/mcp/delegate-channel-relay.d.ts.map +1 -1
  303. package/dist/src/mcp/delegate-channel-relay.js +73 -4
  304. package/dist/src/mcp/delegate-channel-relay.js.map +1 -1
  305. package/dist/src/tools/index.js +2 -2
  306. package/dist/src/tools/index.js.map +1 -1
  307. package/dist/src/tools/store-knowhow.d.ts +21 -0
  308. package/dist/src/tools/store-knowhow.d.ts.map +1 -0
  309. package/dist/src/tools/store-knowhow.js +295 -0
  310. package/dist/src/tools/store-knowhow.js.map +1 -0
  311. package/package.json +1 -1
  312. package/shared/agent-types.ts +2 -0
  313. package/workflows/analyze.md +61 -185
  314. package/workflows/brainstorm.md +3 -23
  315. package/workflows/codebase-rebuild.md +79 -191
  316. package/workflows/codebase-refresh.md +26 -124
  317. package/workflows/debug.md +21 -141
  318. package/workflows/execute.md +183 -350
  319. package/workflows/fork.md +72 -230
  320. package/workflows/harvest.md +12 -79
  321. package/workflows/init.md +3 -17
  322. package/workflows/integration-test.md +21 -190
  323. package/workflows/issue-analyze.md +35 -153
  324. package/workflows/issue-discover.md +88 -263
  325. package/workflows/issue-execute.md +29 -208
  326. package/workflows/issue-plan.md +33 -154
  327. package/workflows/issue.md +44 -202
  328. package/workflows/knowhow.md +374 -0
  329. package/workflows/learn.md +30 -177
  330. package/workflows/maestro-coordinate.codex.md +77 -362
  331. package/workflows/maestro-link-coordinate.md +12 -61
  332. package/workflows/maestro.codex.md +124 -457
  333. package/workflows/maestro.md +562 -976
  334. package/workflows/map.md +16 -53
  335. package/workflows/merge.md +42 -197
  336. package/workflows/milestone-audit.md +5 -43
  337. package/workflows/milestone-complete.md +11 -60
  338. package/workflows/plan.md +176 -387
  339. package/workflows/quick.md +25 -174
  340. package/workflows/refactor.md +28 -221
  341. package/workflows/retrospective.md +104 -443
  342. package/workflows/review.md +87 -299
  343. package/workflows/roadmap.md +117 -97
  344. package/workflows/spec-generate.md +22 -118
  345. package/workflows/specs-add.md +5 -25
  346. package/workflows/specs-load.md +1 -5
  347. package/workflows/specs-remove.md +0 -11
  348. package/workflows/specs-setup.md +11 -47
  349. package/workflows/status.md +58 -200
  350. package/workflows/sync.md +28 -141
  351. package/workflows/test-gen.md +23 -100
  352. package/workflows/test.md +15 -125
  353. package/workflows/ui-design.md +139 -465
  354. package/workflows/ui-style.md +36 -228
  355. package/workflows/verify.md +52 -273
  356. package/workflows/wiki-connect.md +9 -46
  357. package/workflows/wiki-digest.md +7 -50
  358. package/workflows/wiki-manage.md +11 -108
  359. package/.claude/commands/maestro-coordinate.md +0 -63
  360. package/.claude/commands/manage-memory-capture.md +0 -59
  361. package/.codex/skills/maestro-coordinate/SKILL.md +0 -213
  362. package/.codex/skills/manage-memory-capture/SKILL.md +0 -93
  363. package/dashboard/dist/assets/ChatInput-pUOLJIKE.js +0 -49
  364. package/dashboard/dist/assets/ChatPage-B8Xqkt0v.js +0 -27
  365. package/dashboard/dist/assets/McpPage-BY0SjTgw.js +0 -21
  366. package/dashboard/dist/assets/TeamsPage-BO2kP70F.js +0 -11
  367. package/dashboard/dist/assets/WorkflowPage-C8hWbYim.js +0 -6
  368. package/dashboard/dist/assets/en-ZbRpfzuP.js +0 -1
  369. package/dashboard/dist/assets/index-C2Mcb4TJ.js +0 -231
  370. package/dashboard/dist/assets/index-DyBbPc18.css +0 -1
  371. package/dashboard/dist/assets/loader-B5F6PzFT.js +0 -11
  372. package/dashboard/dist/assets/zh-CN-CoXBFuny.js +0 -1
  373. package/workflows/maestro-coordinate.md +0 -582
  374. package/workflows/memory.md +0 -451
@@ -0,0 +1,51 @@
1
+ import type { DashboardEventBus } from '../state/event-bus.js';
2
+ import type { AgentManager } from '../agents/agent-manager.js';
3
+ import type { McpSdkServerConfigWithInstance, McpStdioServerConfig } from '@anthropic-ai/claude-agent-sdk';
4
+ import { RoomMailbox } from './room-mailbox.js';
5
+ import { RoomTaskBoard } from './room-task-board.js';
6
+ import { RoomAgentRegistry } from './room-agent-registry.js';
7
+ import type { MeetingRoomMcpServerInfo } from './mcp-server/meeting-room-mcp-server.js';
8
+ import type { StdioMcpConfig } from './mcp-server/mcp-config-builder.js';
9
+ import type { RoomSessionStatus, RoomSessionSnapshot, RoomMailboxMessage, RoomTask, RoomTaskCreate, RoomTaskUpdate, RoomAgent, RoomAgentStatus, MessagePriority } from './room-types.js';
10
+ export type RoomMcpAgentType = 'claude-code' | 'codex' | 'agent-sdk';
11
+ export declare class MeetingRoomSession {
12
+ private readonly eventBus;
13
+ readonly sessionId: string;
14
+ private status;
15
+ private readonly createdAt;
16
+ readonly mailbox: RoomMailbox;
17
+ readonly taskBoard: RoomTaskBoard;
18
+ readonly agentRegistry: RoomAgentRegistry;
19
+ private mcpServer;
20
+ private mcpServerInfo;
21
+ constructor(sessionId: string, eventBus: DashboardEventBus, agentManager: AgentManager);
22
+ addAgent(role: string, processId?: string): RoomAgent;
23
+ removeAgent(role: string): boolean;
24
+ setAgentStatus(role: string, status: RoomAgentStatus): boolean;
25
+ getAgents(): RoomAgent[];
26
+ /** Send a message to a specific agent, write to mailbox + emit event + wake agent */
27
+ sendMessage(from: string, to: string, content: string, priority?: MessagePriority): Promise<RoomMailboxMessage>;
28
+ /** Broadcast a message to all agents */
29
+ broadcastMessage(from: string, content: string, priority?: MessagePriority): Promise<RoomMailboxMessage>;
30
+ createTask(input: RoomTaskCreate): RoomTask;
31
+ updateTask(taskId: string, patch: RoomTaskUpdate): RoomTask | undefined;
32
+ getTasks(): RoomTask[];
33
+ /** Start the MCP TCP server. Must be called before getMcpConfig(). */
34
+ startMcp(): Promise<MeetingRoomMcpServerInfo>;
35
+ /** Stop the MCP TCP server and release resources. */
36
+ stopMcp(): Promise<void>;
37
+ /** Get MCP server info (port + token) for HTTP transport. */
38
+ getMcpInfo(): MeetingRoomMcpServerInfo | null;
39
+ /**
40
+ * Get MCP config for a specific adapter type and agent.
41
+ * - 'claude-code': returns McpStdioServerConfig for --mcp-config
42
+ * - 'codex': returns StdioMcpConfig with env vars
43
+ * - 'agent-sdk': returns McpSdkServerConfigWithInstance for in-process SDK
44
+ */
45
+ getMcpConfig(agentType: RoomMcpAgentType, agentId: string): McpStdioServerConfig | StdioMcpConfig | McpSdkServerConfigWithInstance;
46
+ getSnapshot(): RoomSessionSnapshot;
47
+ getStatus(): RoomSessionStatus;
48
+ pause(): void;
49
+ resume(): void;
50
+ destroy(): Promise<void>;
51
+ }
@@ -0,0 +1,185 @@
1
+ // ---------------------------------------------------------------------------
2
+ // MeetingRoomSession — thin coordinator composing subsystems + EventBus
3
+ // ---------------------------------------------------------------------------
4
+ import { RoomMailbox } from './room-mailbox.js';
5
+ import { RoomTaskBoard } from './room-task-board.js';
6
+ import { RoomAgentRegistry } from './room-agent-registry.js';
7
+ import { MeetingRoomMcpServer } from './mcp-server/meeting-room-mcp-server.js';
8
+ import { getStdioConfig, getClaudeCodeConfig, getSdkMcpServer, } from './mcp-server/mcp-config-builder.js';
9
+ export class MeetingRoomSession {
10
+ eventBus;
11
+ sessionId;
12
+ status = 'active';
13
+ createdAt;
14
+ mailbox;
15
+ taskBoard;
16
+ agentRegistry;
17
+ mcpServer = null;
18
+ mcpServerInfo = null;
19
+ constructor(sessionId, eventBus, agentManager) {
20
+ this.eventBus = eventBus;
21
+ this.sessionId = sessionId;
22
+ this.createdAt = new Date().toISOString();
23
+ this.mailbox = new RoomMailbox();
24
+ this.taskBoard = new RoomTaskBoard();
25
+ this.agentRegistry = new RoomAgentRegistry(agentManager);
26
+ }
27
+ // --- Agent management ---
28
+ addAgent(role, processId) {
29
+ const agent = this.agentRegistry.register(this.sessionId, role, processId);
30
+ this.eventBus.emit('team:agent_status', {
31
+ role: agent.role,
32
+ status: agent.status,
33
+ lastActivity: agent.lastActivityAt,
34
+ });
35
+ return agent;
36
+ }
37
+ removeAgent(role) {
38
+ const removed = this.agentRegistry.unregister(this.sessionId, role);
39
+ if (removed) {
40
+ this.eventBus.emit('team:agent_status', {
41
+ role,
42
+ status: 'offline',
43
+ lastActivity: new Date().toISOString(),
44
+ });
45
+ }
46
+ return removed;
47
+ }
48
+ setAgentStatus(role, status) {
49
+ const updated = this.agentRegistry.setStatus(this.sessionId, role, status);
50
+ if (updated) {
51
+ const agent = this.agentRegistry.getAgentByRole(this.sessionId, role);
52
+ if (agent) {
53
+ this.eventBus.emit('team:agent_status', {
54
+ role: agent.role,
55
+ status: agent.status,
56
+ lastActivity: agent.lastActivityAt,
57
+ });
58
+ }
59
+ }
60
+ return updated;
61
+ }
62
+ getAgents() {
63
+ return this.agentRegistry.getAgents(this.sessionId);
64
+ }
65
+ // --- Messaging ---
66
+ /** Send a message to a specific agent, write to mailbox + emit event + wake agent */
67
+ async sendMessage(from, to, content, priority = 'normal') {
68
+ const msg = this.mailbox.write(this.sessionId, from, to, content, priority);
69
+ this.eventBus.emit('team:message', {
70
+ id: msg.id,
71
+ from: msg.from,
72
+ to: msg.to,
73
+ content: msg.content,
74
+ dispatch_status: 'pending',
75
+ timestamp: msg.createdAt,
76
+ });
77
+ // Wake the target agent
78
+ if (to !== '*') {
79
+ await this.agentRegistry.wake(this.sessionId, to, content);
80
+ }
81
+ return msg;
82
+ }
83
+ /** Broadcast a message to all agents */
84
+ async broadcastMessage(from, content, priority = 'normal') {
85
+ const msg = this.mailbox.write(this.sessionId, from, '*', content, priority);
86
+ this.eventBus.emit('team:dispatch', {
87
+ id: msg.id,
88
+ from: msg.from,
89
+ to: '*',
90
+ content: msg.content,
91
+ dispatch_status: 'pending',
92
+ timestamp: msg.createdAt,
93
+ });
94
+ // Wake all agents
95
+ const agents = this.agentRegistry.getAgents(this.sessionId);
96
+ await Promise.allSettled(agents.map((agent) => this.agentRegistry.wake(this.sessionId, agent.role, content)));
97
+ return msg;
98
+ }
99
+ // --- Task management ---
100
+ createTask(input) {
101
+ return this.taskBoard.create(this.sessionId, input);
102
+ }
103
+ updateTask(taskId, patch) {
104
+ const task = this.taskBoard.update(this.sessionId, taskId, patch);
105
+ // If task was marked completed, cascade unblocks
106
+ if (task && patch.status === 'completed') {
107
+ this.taskBoard.checkUnblocks(this.sessionId, taskId);
108
+ }
109
+ return task;
110
+ }
111
+ getTasks() {
112
+ return this.taskBoard.list(this.sessionId);
113
+ }
114
+ // --- MCP server lifecycle ---
115
+ /** Start the MCP TCP server. Must be called before getMcpConfig(). */
116
+ async startMcp() {
117
+ if (this.mcpServer) {
118
+ return this.mcpServer.getInfo();
119
+ }
120
+ this.mcpServer = new MeetingRoomMcpServer(this);
121
+ this.mcpServerInfo = await this.mcpServer.start();
122
+ return this.mcpServerInfo;
123
+ }
124
+ /** Stop the MCP TCP server and release resources. */
125
+ async stopMcp() {
126
+ if (this.mcpServer) {
127
+ await this.mcpServer.destroy();
128
+ this.mcpServer = null;
129
+ this.mcpServerInfo = null;
130
+ }
131
+ }
132
+ /** Get MCP server info (port + token) for HTTP transport. */
133
+ getMcpInfo() {
134
+ return this.mcpServerInfo;
135
+ }
136
+ /**
137
+ * Get MCP config for a specific adapter type and agent.
138
+ * - 'claude-code': returns McpStdioServerConfig for --mcp-config
139
+ * - 'codex': returns StdioMcpConfig with env vars
140
+ * - 'agent-sdk': returns McpSdkServerConfigWithInstance for in-process SDK
141
+ */
142
+ getMcpConfig(agentType, agentId) {
143
+ if (agentType === 'agent-sdk') {
144
+ // SDK adapter uses in-process server -- no TCP needed
145
+ return getSdkMcpServer(this, agentId);
146
+ }
147
+ // CLI adapters need the TCP server running
148
+ if (!this.mcpServerInfo) {
149
+ throw new Error('MCP server not started. Call startMcp() first.');
150
+ }
151
+ if (agentType === 'claude-code') {
152
+ return getClaudeCodeConfig(agentId, this.mcpServerInfo);
153
+ }
154
+ // Default: stdio config (codex and other CLI adapters)
155
+ return getStdioConfig(agentId, this.mcpServerInfo);
156
+ }
157
+ // --- Session lifecycle ---
158
+ getSnapshot() {
159
+ return {
160
+ sessionId: this.sessionId,
161
+ status: this.status,
162
+ agents: this.agentRegistry.getAgents(this.sessionId),
163
+ messages: this.mailbox.getHistory(this.sessionId),
164
+ tasks: this.taskBoard.list(this.sessionId),
165
+ createdAt: this.createdAt,
166
+ };
167
+ }
168
+ getStatus() {
169
+ return this.status;
170
+ }
171
+ pause() {
172
+ this.status = 'paused';
173
+ }
174
+ resume() {
175
+ this.status = 'active';
176
+ }
177
+ async destroy() {
178
+ this.status = 'destroyed';
179
+ await this.stopMcp();
180
+ this.mailbox.clear(this.sessionId);
181
+ this.taskBoard.clear(this.sessionId);
182
+ this.agentRegistry.clear(this.sessionId);
183
+ }
184
+ }
185
+ //# sourceMappingURL=meeting-room-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meeting-room-session.js","sourceRoot":"","sources":["../../../../../src/server/rooms/meeting-room-session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { AgentManager } from '../agents/agent-manager.js';
2
+ import type { RoomAgent, RoomAgentStatus } from './room-types.js';
3
+ export declare class RoomAgentRegistry {
4
+ private readonly agentManager;
5
+ private readonly wakeTimeoutMs;
6
+ private readonly agents;
7
+ private readonly activeWakes;
8
+ private readonly wakeTimeouts;
9
+ constructor(agentManager: AgentManager, wakeTimeoutMs?: number);
10
+ /** Register an agent in a session */
11
+ register(sessionId: string, role: string, processId?: string): RoomAgent;
12
+ /** Unregister an agent from a session */
13
+ unregister(sessionId: string, role: string): boolean;
14
+ /** Get all agents in a session */
15
+ getAgents(sessionId: string): RoomAgent[];
16
+ /** Get a specific agent by role in a session */
17
+ getAgentByRole(sessionId: string, role: string): RoomAgent | undefined;
18
+ /** Update agent status */
19
+ setStatus(sessionId: string, role: string, status: RoomAgentStatus): boolean;
20
+ /**
21
+ * Wake an agent by sending a message to its process.
22
+ * Uses an activeWakes guard set to prevent concurrent wake calls for the same agent.
23
+ * Guard auto-clears after wakeTimeoutMs.
24
+ */
25
+ wake(sessionId: string, role: string, message: string): Promise<boolean>;
26
+ /** Clear all agents for a session */
27
+ clear(sessionId: string): void;
28
+ private clearWakeGuard;
29
+ }
@@ -0,0 +1,125 @@
1
+ // ---------------------------------------------------------------------------
2
+ // RoomAgentRegistry — agent lifecycle management with activeWakes guard
3
+ // ---------------------------------------------------------------------------
4
+ const DEFAULT_WAKE_TIMEOUT_MS = 5_000;
5
+ export class RoomAgentRegistry {
6
+ agentManager;
7
+ wakeTimeoutMs;
8
+ agents = new Map();
9
+ activeWakes = new Set(); // "sessionId:role" keys
10
+ wakeTimeouts = new Map();
11
+ constructor(agentManager, wakeTimeoutMs = DEFAULT_WAKE_TIMEOUT_MS) {
12
+ this.agentManager = agentManager;
13
+ this.wakeTimeoutMs = wakeTimeoutMs;
14
+ }
15
+ /** Register an agent in a session */
16
+ register(sessionId, role, processId) {
17
+ const now = new Date().toISOString();
18
+ const agent = {
19
+ role,
20
+ processId,
21
+ status: 'idle',
22
+ joinedAt: now,
23
+ lastActivityAt: now,
24
+ };
25
+ let list = this.agents.get(sessionId);
26
+ if (!list) {
27
+ list = [];
28
+ this.agents.set(sessionId, list);
29
+ }
30
+ // Replace existing agent with same role if present
31
+ const existingIdx = list.findIndex((a) => a.role === role);
32
+ if (existingIdx !== -1) {
33
+ list[existingIdx] = agent;
34
+ }
35
+ else {
36
+ list.push(agent);
37
+ }
38
+ return agent;
39
+ }
40
+ /** Unregister an agent from a session */
41
+ unregister(sessionId, role) {
42
+ const list = this.agents.get(sessionId);
43
+ if (!list)
44
+ return false;
45
+ const idx = list.findIndex((a) => a.role === role);
46
+ if (idx === -1)
47
+ return false;
48
+ list.splice(idx, 1);
49
+ // Clean up wake guard
50
+ const wakeKey = `${sessionId}:${role}`;
51
+ this.clearWakeGuard(wakeKey);
52
+ return true;
53
+ }
54
+ /** Get all agents in a session */
55
+ getAgents(sessionId) {
56
+ return this.agents.get(sessionId) ?? [];
57
+ }
58
+ /** Get a specific agent by role in a session */
59
+ getAgentByRole(sessionId, role) {
60
+ const list = this.agents.get(sessionId);
61
+ if (!list)
62
+ return undefined;
63
+ return list.find((a) => a.role === role);
64
+ }
65
+ /** Update agent status */
66
+ setStatus(sessionId, role, status) {
67
+ const agent = this.getAgentByRole(sessionId, role);
68
+ if (!agent)
69
+ return false;
70
+ agent.status = status;
71
+ agent.lastActivityAt = new Date().toISOString();
72
+ return true;
73
+ }
74
+ /**
75
+ * Wake an agent by sending a message to its process.
76
+ * Uses an activeWakes guard set to prevent concurrent wake calls for the same agent.
77
+ * Guard auto-clears after wakeTimeoutMs.
78
+ */
79
+ async wake(sessionId, role, message) {
80
+ const agent = this.getAgentByRole(sessionId, role);
81
+ if (!agent?.processId)
82
+ return false;
83
+ const wakeKey = `${sessionId}:${role}`;
84
+ // Guard: prevent concurrent wakes for the same agent
85
+ if (this.activeWakes.has(wakeKey)) {
86
+ return false;
87
+ }
88
+ this.activeWakes.add(wakeKey);
89
+ // Auto-clear guard after timeout
90
+ const timer = setTimeout(() => {
91
+ this.clearWakeGuard(wakeKey);
92
+ }, this.wakeTimeoutMs);
93
+ this.wakeTimeouts.set(wakeKey, timer);
94
+ try {
95
+ await this.agentManager.sendMessage(agent.processId, message);
96
+ agent.lastActivityAt = new Date().toISOString();
97
+ return true;
98
+ }
99
+ catch {
100
+ // Clear guard on failure so retry is possible
101
+ this.clearWakeGuard(wakeKey);
102
+ return false;
103
+ }
104
+ }
105
+ /** Clear all agents for a session */
106
+ clear(sessionId) {
107
+ const list = this.agents.get(sessionId);
108
+ if (list) {
109
+ for (const agent of list) {
110
+ const wakeKey = `${sessionId}:${agent.role}`;
111
+ this.clearWakeGuard(wakeKey);
112
+ }
113
+ }
114
+ this.agents.delete(sessionId);
115
+ }
116
+ clearWakeGuard(wakeKey) {
117
+ this.activeWakes.delete(wakeKey);
118
+ const timer = this.wakeTimeouts.get(wakeKey);
119
+ if (timer) {
120
+ clearTimeout(timer);
121
+ this.wakeTimeouts.delete(wakeKey);
122
+ }
123
+ }
124
+ }
125
+ //# sourceMappingURL=room-agent-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"room-agent-registry.js","sourceRoot":"","sources":["../../../../../src/server/rooms/room-agent-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { RoomMailboxMessage, MessagePriority } from './room-types.js';
2
+ export declare class RoomMailbox {
3
+ private readonly messages;
4
+ /** Write a message into the session mailbox. Returns the generated message. */
5
+ write(sessionId: string, from: string, to: string, content: string, priority?: MessagePriority): RoomMailboxMessage;
6
+ /**
7
+ * Atomically read all unread messages for an agent in a session.
8
+ * Marks returned messages as read so subsequent calls won't return them again.
9
+ * Pass `to = '*'` to read broadcast messages only.
10
+ */
11
+ readUnread(sessionId: string, agentRole: string): RoomMailboxMessage[];
12
+ /** Get full message history for a session */
13
+ getHistory(sessionId: string): RoomMailboxMessage[];
14
+ /** Get message history filtered to a specific agent (sent or received) */
15
+ getHistoryForAgent(sessionId: string, agentRole: string): RoomMailboxMessage[];
16
+ /** Clear all messages for a session */
17
+ clear(sessionId: string): void;
18
+ }
@@ -0,0 +1,63 @@
1
+ // ---------------------------------------------------------------------------
2
+ // RoomMailbox — in-memory message store with atomic readUnread
3
+ // ---------------------------------------------------------------------------
4
+ import { randomUUID } from 'node:crypto';
5
+ export class RoomMailbox {
6
+ messages = new Map();
7
+ /** Write a message into the session mailbox. Returns the generated message. */
8
+ write(sessionId, from, to, content, priority = 'normal') {
9
+ const msg = {
10
+ id: randomUUID(),
11
+ sessionId,
12
+ from,
13
+ to,
14
+ content,
15
+ priority,
16
+ read: false,
17
+ createdAt: new Date().toISOString(),
18
+ };
19
+ let list = this.messages.get(sessionId);
20
+ if (!list) {
21
+ list = [];
22
+ this.messages.set(sessionId, list);
23
+ }
24
+ list.push(msg);
25
+ return msg;
26
+ }
27
+ /**
28
+ * Atomically read all unread messages for an agent in a session.
29
+ * Marks returned messages as read so subsequent calls won't return them again.
30
+ * Pass `to = '*'` to read broadcast messages only.
31
+ */
32
+ readUnread(sessionId, agentRole) {
33
+ const list = this.messages.get(sessionId);
34
+ if (!list)
35
+ return [];
36
+ const unread = [];
37
+ for (const msg of list) {
38
+ if (msg.read)
39
+ continue;
40
+ if (msg.to === agentRole || msg.to === '*') {
41
+ msg.read = true;
42
+ unread.push(msg);
43
+ }
44
+ }
45
+ return unread;
46
+ }
47
+ /** Get full message history for a session */
48
+ getHistory(sessionId) {
49
+ return this.messages.get(sessionId) ?? [];
50
+ }
51
+ /** Get message history filtered to a specific agent (sent or received) */
52
+ getHistoryForAgent(sessionId, agentRole) {
53
+ const list = this.messages.get(sessionId);
54
+ if (!list)
55
+ return [];
56
+ return list.filter((msg) => msg.from === agentRole || msg.to === agentRole || msg.to === '*');
57
+ }
58
+ /** Clear all messages for a session */
59
+ clear(sessionId) {
60
+ this.messages.delete(sessionId);
61
+ }
62
+ }
63
+ //# sourceMappingURL=room-mailbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"room-mailbox.js","sourceRoot":"","sources":["../../../../../src/server/rooms/room-mailbox.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,+DAA+D;AAC/D,8EAA8E;AAE9E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC,MAAM,OAAO,WAAW;IACL,QAAQ,GAAG,IAAI,GAAG,EAAgC,CAAC;IAEpE,+EAA+E;IAC/E,KAAK,CACH,SAAiB,EACjB,IAAY,EACZ,EAAU,EACV,OAAe,EACf,WAA4B,QAAQ;QAEpC,MAAM,GAAG,GAAuB;YAC9B,EAAE,EAAE,UAAU,EAAE;YAChB,SAAS;YACT,IAAI;YACJ,EAAE;YACF,OAAO;YACP,QAAQ;YACR,IAAI,EAAE,KAAK;YACX,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,EAAE,CAAC;YACV,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEf,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,SAAiB,EAAE,SAAiB;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAC;QAErB,MAAM,MAAM,GAAyB,EAAE,CAAC;QACxC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,GAAG,CAAC,IAAI;gBAAE,SAAS;YACvB,IAAI,GAAG,CAAC,EAAE,KAAK,SAAS,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,CAAC;gBAC3C,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;gBAChB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,6CAA6C;IAC7C,UAAU,CAAC,SAAiB;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IAC5C,CAAC;IAED,0EAA0E;IAC1E,kBAAkB,CAAC,SAAiB,EAAE,SAAiB;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,MAAM,CAChB,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,EAAE,KAAK,SAAS,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,CAC1E,CAAC;IACJ,CAAC;IAED,uCAAuC;IACvC,KAAK,CAAC,SAAiB;QACrB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,19 @@
1
+ import type { AgentManager } from '../agents/agent-manager.js';
2
+ import type { DashboardEventBus } from '../state/event-bus.js';
3
+ import { MeetingRoomSession } from './meeting-room-session.js';
4
+ export declare class RoomSessionManager {
5
+ private readonly agentManager;
6
+ private readonly eventBus;
7
+ private readonly sessions;
8
+ constructor(agentManager: AgentManager, eventBus: DashboardEventBus);
9
+ /** Create a new meeting room session */
10
+ createSession(sessionId: string): MeetingRoomSession;
11
+ /** Get an existing session by ID */
12
+ getSession(sessionId: string): MeetingRoomSession | undefined;
13
+ /** List all active session IDs */
14
+ listSessions(): string[];
15
+ /** Destroy a specific session and clean up resources */
16
+ destroySession(sessionId: string): Promise<boolean>;
17
+ /** Destroy all sessions — used during server shutdown */
18
+ destroyAll(): Promise<void>;
19
+ }
@@ -0,0 +1,45 @@
1
+ // ---------------------------------------------------------------------------
2
+ // RoomSessionManager — manages all MeetingRoomSession instances
3
+ // ---------------------------------------------------------------------------
4
+ import { MeetingRoomSession } from './meeting-room-session.js';
5
+ export class RoomSessionManager {
6
+ agentManager;
7
+ eventBus;
8
+ sessions = new Map();
9
+ constructor(agentManager, eventBus) {
10
+ this.agentManager = agentManager;
11
+ this.eventBus = eventBus;
12
+ }
13
+ /** Create a new meeting room session */
14
+ createSession(sessionId) {
15
+ if (this.sessions.has(sessionId)) {
16
+ throw new Error(`Room session already exists: ${sessionId}`);
17
+ }
18
+ const session = new MeetingRoomSession(sessionId, this.eventBus, this.agentManager);
19
+ this.sessions.set(sessionId, session);
20
+ return session;
21
+ }
22
+ /** Get an existing session by ID */
23
+ getSession(sessionId) {
24
+ return this.sessions.get(sessionId);
25
+ }
26
+ /** List all active session IDs */
27
+ listSessions() {
28
+ return Array.from(this.sessions.keys());
29
+ }
30
+ /** Destroy a specific session and clean up resources */
31
+ async destroySession(sessionId) {
32
+ const session = this.sessions.get(sessionId);
33
+ if (!session)
34
+ return false;
35
+ await session.destroy();
36
+ this.sessions.delete(sessionId);
37
+ return true;
38
+ }
39
+ /** Destroy all sessions — used during server shutdown */
40
+ async destroyAll() {
41
+ await Promise.allSettled(Array.from(this.sessions.values()).map((session) => session.destroy()));
42
+ this.sessions.clear();
43
+ }
44
+ }
45
+ //# sourceMappingURL=room-session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"room-session-manager.js","sourceRoot":"","sources":["../../../../../src/server/rooms/room-session-manager.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,gEAAgE;AAChE,8EAA8E;AAI9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,MAAM,OAAO,kBAAkB;IAIV;IACA;IAJF,QAAQ,GAAG,IAAI,GAAG,EAA8B,CAAC;IAElE,YACmB,YAA0B,EAC1B,QAA2B;QAD3B,iBAAY,GAAZ,YAAY,CAAc;QAC1B,aAAQ,GAAR,QAAQ,CAAmB;IAC3C,CAAC;IAEJ,wCAAwC;IACxC,aAAa,CAAC,SAAiB;QAC7B,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,gCAAgC,SAAS,EAAE,CAAC,CAAC;QAC/D,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QACpF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACtC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,oCAAoC;IACpC,UAAU,CAAC,SAAiB;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;IAED,kCAAkC;IAClC,YAAY;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,wDAAwD;IACxD,KAAK,CAAC,cAAc,CAAC,SAAiB;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAE3B,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,yDAAyD;IACzD,KAAK,CAAC,UAAU;QACd,MAAM,OAAO,CAAC,UAAU,CACtB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CACvE,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ import type { RoomTask, RoomTaskCreate, RoomTaskUpdate } from './room-types.js';
2
+ export declare class RoomTaskBoard {
3
+ private readonly tasks;
4
+ /**
5
+ * Create a task in the session. Auto-links bidirectional blockedBy/blocks.
6
+ * Returns the created task.
7
+ */
8
+ create(sessionId: string, input: RoomTaskCreate): RoomTask;
9
+ /**
10
+ * Update a task by ID. Returns the updated task or undefined if not found.
11
+ */
12
+ update(sessionId: string, taskId: string, patch: RoomTaskUpdate): RoomTask | undefined;
13
+ /** List all tasks in a session */
14
+ list(sessionId: string): RoomTask[];
15
+ /** Get tasks owned by a specific agent role */
16
+ getByOwner(sessionId: string, owner: string): RoomTask[];
17
+ /**
18
+ * Check which tasks become unblocked after a task completes.
19
+ * Removes the completed task from dependents' blockedBy arrays.
20
+ * Returns the list of tasks that became newly unblocked (transitioned from blocked to pending).
21
+ */
22
+ checkUnblocks(sessionId: string, completedTaskId: string): RoomTask[];
23
+ /** Clear all tasks for a session */
24
+ clear(sessionId: string): void;
25
+ }