maestro-flow 0.3.15 → 0.3.17
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.
- package/.claude/agents/workflow-planner.md +24 -8
- package/.claude/commands/maestro-amend.md +300 -0
- package/.claude/commands/maestro-analyze.md +1 -49
- package/.claude/commands/maestro-execute.md +2 -56
- package/.claude/commands/maestro-fork.md +3 -50
- package/.claude/commands/maestro-merge.md +2 -26
- package/.claude/commands/maestro-milestone-audit.md +1 -5
- package/.claude/commands/maestro-milestone-complete.md +1 -7
- package/.claude/commands/maestro-plan.md +6 -127
- package/.claude/commands/maestro-roadmap.md +3 -101
- package/.claude/commands/maestro-spec-generate.md +1 -25
- package/.claude/commands/maestro-ui-design.md +14 -73
- package/.claude/commands/maestro-verify.md +1 -32
- package/.claude/commands/maestro.md +13 -30
- package/.claude/commands/manage-harvest.md +7 -44
- package/.claude/commands/manage-knowhow-capture.md +193 -0
- package/.claude/commands/{manage-memory.md → manage-knowhow.md} +77 -88
- package/.claude/commands/manage-learn.md +3 -28
- package/.claude/commands/manage-status.md +1 -20
- package/.claude/commands/manage-wiki.md +1 -1
- package/.claude/commands/quality-business-test.md +1 -1
- package/.claude/commands/quality-debug.md +3 -18
- package/.claude/commands/quality-integration-test.md +3 -23
- package/.claude/commands/quality-retrospective.md +1 -28
- package/.claude/commands/quality-review.md +3 -52
- package/.claude/commands/quality-test-gen.md +1 -10
- package/.claude/commands/quality-test.md +3 -25
- package/.claude/commands/spec-add.md +1 -21
- package/.claude/commands/spec-load.md +1 -16
- package/.claude/commands/wiki-connect.md +2 -112
- package/.claude/commands/wiki-digest.md +2 -141
- package/.codex/skills/learn-decompose/SKILL.md +2 -8
- package/.codex/skills/maestro/SKILL.md +60 -146
- package/.codex/skills/maestro-analyze/SKILL.md +52 -150
- package/.codex/skills/maestro-brainstorm/SKILL.md +36 -91
- package/.codex/skills/maestro-composer/SKILL.md +4 -76
- package/.codex/skills/maestro-execute/SKILL.md +46 -177
- package/.codex/skills/maestro-init/SKILL.md +7 -51
- package/.codex/skills/maestro-link-coordinate/SKILL.md +56 -229
- package/.codex/skills/maestro-milestone-audit/SKILL.md +7 -36
- package/.codex/skills/maestro-milestone-complete/SKILL.md +11 -93
- package/.codex/skills/maestro-overlay/SKILL.md +23 -92
- package/.codex/skills/maestro-plan/SKILL.md +70 -166
- package/.codex/skills/maestro-player/SKILL.md +24 -149
- package/.codex/skills/maestro-quick/SKILL.md +5 -48
- package/.codex/skills/maestro-roadmap/SKILL.md +21 -66
- package/.codex/skills/maestro-spec-generate/SKILL.md +20 -56
- package/.codex/skills/maestro-ui-design/SKILL.md +6 -53
- package/.codex/skills/maestro-verify/SKILL.md +39 -136
- package/.codex/skills/manage-codebase-rebuild/SKILL.md +25 -75
- package/.codex/skills/manage-codebase-refresh/SKILL.md +5 -32
- package/.codex/skills/manage-issue/SKILL.md +1 -6
- package/.codex/skills/manage-issue-discover/SKILL.md +33 -93
- package/.codex/skills/{manage-memory → manage-knowhow}/SKILL.md +95 -95
- package/.codex/skills/manage-knowhow-capture/SKILL.md +110 -0
- package/.codex/skills/manage-learn/SKILL.md +17 -71
- package/.codex/skills/manage-status/SKILL.md +4 -35
- package/.codex/skills/manage-wiki/SKILL.md +1 -1
- package/.codex/skills/quality-business-test/SKILL.md +2 -14
- package/.codex/skills/quality-debug/SKILL.md +41 -133
- package/.codex/skills/quality-integration-test/SKILL.md +36 -145
- package/.codex/skills/quality-refactor/SKILL.md +6 -59
- package/.codex/skills/quality-retrospective/SKILL.md +292 -531
- package/.codex/skills/quality-review/SKILL.md +30 -65
- package/.codex/skills/quality-sync/SKILL.md +2 -11
- package/.codex/skills/quality-test/SKILL.md +4 -45
- package/.codex/skills/quality-test-gen/SKILL.md +33 -121
- package/.codex/skills/spec-add/SKILL.md +2 -9
- package/.codex/skills/spec-load/SKILL.md +4 -14
- package/.codex/skills/spec-map/SKILL.md +4 -37
- package/.codex/skills/spec-remove/SKILL.md +3 -35
- package/.codex/skills/spec-setup/SKILL.md +2 -19
- package/.codex/skills/team-coordinate/SKILL.md +20 -132
- package/.codex/skills/team-coordinate/roles/coordinator/commands/monitor.md +61 -215
- package/.codex/skills/team-executor/SKILL.md +7 -66
- package/.codex/skills/team-executor/roles/executor/commands/monitor.md +60 -182
- package/.codex/skills/team-executor/specs/session-schema.md +22 -56
- package/.codex/skills/team-lifecycle-v4/SKILL.md +22 -143
- package/.codex/skills/team-lifecycle-v4/roles/coordinator/commands/monitor.md +31 -223
- package/.codex/skills/team-quality-assurance/SKILL.md +14 -88
- package/.codex/skills/team-quality-assurance/roles/coordinator/commands/monitor.md +46 -186
- package/.codex/skills/team-review/SKILL.md +12 -86
- package/.codex/skills/team-review/roles/coordinator/commands/monitor.md +49 -187
- package/.codex/skills/team-tech-debt/SKILL.md +11 -50
- package/.codex/skills/team-tech-debt/roles/coordinator/commands/monitor.md +50 -239
- package/.codex/skills/team-testing/SKILL.md +14 -99
- package/.codex/skills/team-testing/roles/coordinator/commands/monitor.md +52 -228
- package/.codex/skills/wiki-connect/SKILL.md +2 -5
- package/README.md +6 -0
- package/README.zh-CN.md +6 -0
- package/chains/_intent-map.json +7 -7
- package/chains/singles/{memory-capture.json → knowhow-capture.json} +5 -5
- package/chains/singles/{memory.json → knowhow.json} +6 -6
- package/dashboard/dist/assets/{ArtifactsPage-CUrrDGgN.js → ArtifactsPage-iJZtYsmR.js} +6 -6
- package/dashboard/dist/assets/ChatInput-DNnDLdQF.js +6 -0
- package/dashboard/dist/assets/ChatPage-BjBibfE4.js +22 -0
- package/dashboard/dist/assets/{CollabPage-DIUXeazv.js → CollabPage-8lUMUol_.js} +1 -1
- package/dashboard/dist/assets/{ExecutionPanel-VmYeADFj.js → ExecutionPanel-BKV3GZ7Q.js} +1 -1
- package/dashboard/dist/assets/{KanbanPage-DLq8v7hg.js → KanbanPage-diY3QmGd.js} +2 -2
- package/dashboard/dist/assets/{MarkdownRenderer-D7AehrnR.js → MarkdownRenderer-cYFfe1uX.js} +1 -1
- package/dashboard/dist/assets/McpPage-COjuIf7U.js +21 -0
- package/dashboard/dist/assets/MeetingRoomPage-wnvT7wlB.js +85 -0
- package/dashboard/dist/assets/{OutputPanel-B-Rjwgmv.js → OutputPanel-DDL90Idy.js} +1 -1
- package/dashboard/dist/assets/{ProblemsPanel-GEpF-oi4.js → ProblemsPanel-zFN9IIs0.js} +1 -1
- package/dashboard/dist/assets/{RequirementBoardPage-xs8uDM7I.js → RequirementBoardPage-DOPJoT0I.js} +2 -2
- package/dashboard/dist/assets/{RequirementPage-BKDSFwjA.js → RequirementPage-CEVquRgM.js} +1 -1
- package/dashboard/dist/assets/RoomsPage-D5USEWDh.js +1 -0
- package/dashboard/dist/assets/{SpecsPage-DLFb9ZH0.js → SpecsPage-BOwBin_o.js} +1 -1
- package/dashboard/dist/assets/{SupervisorPage-SOki_kgz.js → SupervisorPage-5iRyMU5T.js} +1 -1
- package/dashboard/dist/assets/TeamsPage-DlcEmr_Q.js +1 -0
- package/dashboard/dist/assets/{TreeBrowser-B9DHdULE.js → TreeBrowser-Y48Wz-QY.js} +1 -1
- package/dashboard/dist/assets/WorkflowPage-CmQaRVgL.js +6 -0
- package/dashboard/dist/assets/arrow-left-NCUOENvg.js +6 -0
- package/dashboard/dist/assets/{check-DJDk3A2a.js → check-o7nfGNHf.js} +1 -1
- package/dashboard/dist/assets/{chevron-right-C7bVDreZ.js → chevron-right-BXySK2fn.js} +1 -1
- package/dashboard/dist/assets/{circle-alert-Na1vf6qQ.js → circle-alert-DcSBokh4.js} +1 -1
- package/dashboard/dist/assets/{circle-check-CEGgy3NV.js → circle-check-Cd-jce4j.js} +1 -1
- package/dashboard/dist/assets/{circle-check-big-3JB8zRYj.js → circle-check-big-BN7Mdp4i.js} +1 -1
- package/dashboard/dist/assets/{circle-Qfgy4LB_.js → circle-cooAwnAR.js} +1 -1
- package/dashboard/dist/assets/{code-Ble63Idz.js → code-BQa9oL1n.js} +1 -1
- package/dashboard/dist/assets/{columns-3-BUcKlxve.js → columns-3-BzgxelGx.js} +1 -1
- package/dashboard/dist/assets/{download-CMqkfn8x.js → download-swRJnate.js} +1 -1
- package/dashboard/dist/assets/en-C_BD3UCD.js +1 -0
- package/dashboard/dist/assets/{folder-B9ewx9LL.js → folder-DbGbLNFN.js} +1 -1
- package/dashboard/dist/assets/index-BEUaOz_b.css +1 -0
- package/dashboard/dist/assets/{index-JTmGteaT.js → index-DIoMBMbv.js} +1 -1
- package/dashboard/dist/assets/index-DLBN_7fb.js +44 -0
- package/dashboard/dist/assets/index-uIqUCT8y.js +236 -0
- package/dashboard/dist/assets/{list-DI8Wn2aT.js → list-BTRAIvDq.js} +1 -1
- package/dashboard/dist/assets/loader-NHtB6Mdn.js +6 -0
- package/dashboard/dist/assets/{minus-Lp_BfctG.js → minus-BjMxRTET.js} +1 -1
- package/dashboard/dist/assets/{pen-line-Ch7sphzZ.js → pen-line-C4_O16H0.js} +1 -1
- package/dashboard/dist/assets/{pencil-_yRMHmGT.js → pencil-DTmKhyDY.js} +1 -1
- package/dashboard/dist/assets/{proxy-D72Y8a4Y.js → proxy-Dtx5p6IO.js} +1 -1
- package/dashboard/dist/assets/rows-2-GR1dZtRu.js +6 -0
- package/dashboard/dist/assets/{search-BS6fI6Bg.js → search-DVtgy2W7.js} +1 -1
- package/dashboard/dist/assets/{shallow-BXasQBvr.js → shallow-BOmvDNsv.js} +1 -1
- package/dashboard/dist/assets/{table-CeGlFjlP.js → table-DCzuJAFh.js} +1 -1
- package/dashboard/dist/assets/team-types-BPeOvVdA.js +6 -0
- package/dashboard/dist/assets/{terminal-BJic2yW-.js → terminal-CzogW4cl.js} +1 -1
- package/dashboard/dist/assets/{trash-2-Czz4X8Fb.js → trash-2-52LATVfW.js} +1 -1
- package/dashboard/dist/assets/users-DLFE2voE.js +6 -0
- package/dashboard/dist/assets/{zap-C3H0jVFA.js → zap-DhiYlgyZ.js} +1 -1
- package/dashboard/dist/assets/zh-CN-DvQKfow3.js +1 -0
- package/dashboard/dist/index.html +2 -2
- package/dashboard/dist-server/dashboard/src/server/agents/agent-manager.d.ts +2 -0
- package/dashboard/dist-server/dashboard/src/server/agents/agent-manager.js +19 -11
- package/dashboard/dist-server/dashboard/src/server/agents/agent-manager.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/agents/agent-sdk-adapter.js +5 -0
- package/dashboard/dist-server/dashboard/src/server/agents/agent-sdk-adapter.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.d.ts +1 -0
- package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.js +21 -4
- package/dashboard/dist-server/dashboard/src/server/agents/claude-code-adapter.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/agents/env-cleanup.js +8 -0
- package/dashboard/dist-server/dashboard/src/server/agents/env-cleanup.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/coordinator/chain-map.js +6 -6
- package/dashboard/dist-server/dashboard/src/server/coordinator/chain-map.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/coordinator/chain-map.test.js +2 -2
- package/dashboard/dist-server/dashboard/src/server/coordinator/chain-map.test.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/index.js +14 -3
- package/dashboard/dist-server/dashboard/src/server/index.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/mcp-config-builder.d.ts +24 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/mcp-config-builder.js +220 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/mcp-config-builder.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/mcp-config-builder.test.d.ts +1 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/mcp-config-builder.test.js +115 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/mcp-config-builder.test.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/meeting-room-mcp-server.d.ts +44 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/meeting-room-mcp-server.js +260 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/meeting-room-mcp-server.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/meeting-room-mcp-server.test.d.ts +1 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/meeting-room-mcp-server.test.js +194 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/meeting-room-mcp-server.test.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/stdio-bridge.d.ts +2 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/stdio-bridge.js +279 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/stdio-bridge.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/tcp-helpers.d.ts +14 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/tcp-helpers.js +131 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/tcp-helpers.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/tcp-helpers.test.d.ts +1 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/tcp-helpers.test.js +134 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/mcp-server/tcp-helpers.test.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/meeting-room-session.d.ts +51 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/meeting-room-session.js +185 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/meeting-room-session.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/room-agent-registry.d.ts +29 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/room-agent-registry.js +125 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/room-agent-registry.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/room-mailbox.d.ts +18 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/room-mailbox.js +63 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/room-mailbox.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/room-session-manager.d.ts +19 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/room-session-manager.js +45 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/room-session-manager.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/room-task-board.d.ts +25 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/room-task-board.js +115 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/room-task-board.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/room-types.d.ts +53 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/room-types.js +5 -0
- package/dashboard/dist-server/dashboard/src/server/rooms/room-types.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/server/routes/agents.js +6 -0
- package/dashboard/dist-server/dashboard/src/server/routes/agents.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/cli-history.js +20 -1
- package/dashboard/dist-server/dashboard/src/server/routes/cli-history.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/index.d.ts +2 -1
- package/dashboard/dist-server/dashboard/src/server/routes/index.js +8 -1
- package/dashboard/dist-server/dashboard/src/server/routes/index.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/install.js +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/install.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/mcp.js +2 -2
- package/dashboard/dist-server/dashboard/src/server/routes/mcp.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/room-mcp.d.ts +3 -0
- package/dashboard/dist-server/dashboard/src/server/routes/room-mcp.js +246 -0
- package/dashboard/dist-server/dashboard/src/server/routes/room-mcp.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/server/routes/rooms.d.ts +3 -0
- package/dashboard/dist-server/dashboard/src/server/routes/rooms.js +38 -0
- package/dashboard/dist-server/dashboard/src/server/routes/rooms.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/server/routes/wiki.integration.test.js +7 -7
- package/dashboard/dist-server/dashboard/src/server/routes/wiki.integration.test.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/wiki.js +1 -1
- package/dashboard/dist-server/dashboard/src/server/routes/wiki.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/state/event-bus.d.ts +39 -1
- package/dashboard/dist-server/dashboard/src/server/state/event-bus.js +12 -0
- package/dashboard/dist-server/dashboard/src/server/state/event-bus.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/stress.test.js +1 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/stress.test.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js +25 -14
- package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.test.js +6 -6
- package/dashboard/dist-server/dashboard/src/server/wiki/wiki-indexer.test.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/wiki-types.d.ts +1 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/writer-stress.test.js +17 -16
- package/dashboard/dist-server/dashboard/src/server/wiki/writer-stress.test.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/writer.d.ts +1 -1
- package/dashboard/dist-server/dashboard/src/server/wiki/writer.js +18 -7
- package/dashboard/dist-server/dashboard/src/server/wiki/writer.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/ws/handlers/agent-handler.d.ts +3 -1
- package/dashboard/dist-server/dashboard/src/server/ws/handlers/agent-handler.js +75 -1
- package/dashboard/dist-server/dashboard/src/server/ws/handlers/agent-handler.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/server/ws/handlers/room-handler.d.ts +17 -0
- package/dashboard/dist-server/dashboard/src/server/ws/handlers/room-handler.js +192 -0
- package/dashboard/dist-server/dashboard/src/server/ws/handlers/room-handler.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/server/ws/session-scoped-event-filter.d.ts +13 -0
- package/dashboard/dist-server/dashboard/src/server/ws/session-scoped-event-filter.js +37 -0
- package/dashboard/dist-server/dashboard/src/server/ws/session-scoped-event-filter.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/server/ws/ws-manager.d.ts +7 -1
- package/dashboard/dist-server/dashboard/src/server/ws/ws-manager.js +39 -2
- package/dashboard/dist-server/dashboard/src/server/ws/ws-manager.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/constants.js +12 -0
- package/dashboard/dist-server/dashboard/src/shared/constants.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/room-leader-prompt.d.ts +1 -0
- package/dashboard/dist-server/dashboard/src/shared/room-leader-prompt.js +38 -0
- package/dashboard/dist-server/dashboard/src/shared/room-leader-prompt.js.map +1 -0
- package/dashboard/dist-server/dashboard/src/shared/team-types.d.ts +66 -0
- package/dashboard/dist-server/dashboard/src/shared/team-types.js.map +1 -1
- package/dashboard/dist-server/dashboard/src/shared/types.d.ts +24 -3
- package/dashboard/dist-server/dashboard/src/shared/ws-protocol.d.ts +76 -2
- package/dashboard/dist-server/dashboard/src/shared/ws-protocol.js.map +1 -1
- package/dashboard/dist-server/shared/agent-types.d.ts +2 -0
- package/dashboard/dist-server/src/commands/delegate.js +11 -8
- package/dashboard/dist-server/src/commands/delegate.js.map +1 -1
- package/dist/shared/agent-types.d.ts +2 -0
- package/dist/shared/agent-types.d.ts.map +1 -1
- package/dist/src/cli.js +2 -2
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/delegate.d.ts.map +1 -1
- package/dist/src/commands/delegate.js +11 -8
- package/dist/src/commands/delegate.js.map +1 -1
- package/dist/src/commands/install-backend.d.ts +1 -1
- package/dist/src/commands/install-backend.d.ts.map +1 -1
- package/dist/src/commands/install-backend.js +1 -1
- package/dist/src/commands/install-backend.js.map +1 -1
- package/dist/src/commands/install-ui/ExecutionView.d.ts.map +1 -1
- package/dist/src/commands/install-ui/ExecutionView.js +4 -1
- package/dist/src/commands/install-ui/ExecutionView.js.map +1 -1
- package/dist/src/commands/install-ui/InstallExecution.d.ts.map +1 -1
- package/dist/src/commands/install-ui/InstallExecution.js +4 -1
- package/dist/src/commands/install-ui/InstallExecution.js.map +1 -1
- package/dist/src/commands/install.js +5 -5
- package/dist/src/commands/install.js.map +1 -1
- package/dist/src/commands/knowhow.d.ts +10 -0
- package/dist/src/commands/knowhow.d.ts.map +1 -0
- package/dist/src/commands/knowhow.js +217 -0
- package/dist/src/commands/knowhow.js.map +1 -0
- package/dist/src/commands/overlay-ui/OverlayList.d.ts +2 -0
- package/dist/src/commands/overlay-ui/OverlayList.d.ts.map +1 -1
- package/dist/src/commands/overlay-ui/OverlayList.js +6 -3
- package/dist/src/commands/overlay-ui/OverlayList.js.map +1 -1
- package/dist/src/commands/overlay-ui/index.d.ts.map +1 -1
- package/dist/src/commands/overlay-ui/index.js +70 -44
- package/dist/src/commands/overlay-ui/index.js.map +1 -1
- package/dist/src/commands/overlay.d.ts.map +1 -1
- package/dist/src/commands/overlay.js +4 -3
- package/dist/src/commands/overlay.js.map +1 -1
- package/dist/src/commands/update.d.ts.map +1 -1
- package/dist/src/commands/update.js +31 -21
- package/dist/src/commands/update.js.map +1 -1
- package/dist/src/core/manifest.d.ts +8 -1
- package/dist/src/core/manifest.d.ts.map +1 -1
- package/dist/src/core/manifest.js +3 -1
- package/dist/src/core/manifest.js.map +1 -1
- package/dist/src/core/overlay/applier.d.ts +1 -1
- package/dist/src/core/overlay/applier.d.ts.map +1 -1
- package/dist/src/core/overlay/applier.js +40 -13
- package/dist/src/core/overlay/applier.js.map +1 -1
- package/dist/src/core/overlay/loader.d.ts.map +1 -1
- package/dist/src/core/overlay/loader.js +6 -0
- package/dist/src/core/overlay/loader.js.map +1 -1
- package/dist/src/core/overlay/types.d.ts +5 -1
- package/dist/src/core/overlay/types.d.ts.map +1 -1
- package/dist/src/core/overlay/types.js +1 -1
- package/dist/src/core/overlay/types.js.map +1 -1
- package/dist/src/hooks/context-monitor.js +1 -1
- package/dist/src/hooks/context-monitor.js.map +1 -1
- package/dist/src/hooks/skill-context.js +1 -1
- package/dist/src/hooks/skill-context.js.map +1 -1
- package/dist/src/mcp/delegate-channel-relay.d.ts +4 -0
- package/dist/src/mcp/delegate-channel-relay.d.ts.map +1 -1
- package/dist/src/mcp/delegate-channel-relay.js +73 -4
- package/dist/src/mcp/delegate-channel-relay.js.map +1 -1
- package/dist/src/tools/index.js +2 -2
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/store-knowhow.d.ts +21 -0
- package/dist/src/tools/store-knowhow.d.ts.map +1 -0
- package/dist/src/tools/store-knowhow.js +295 -0
- package/dist/src/tools/store-knowhow.js.map +1 -0
- package/package.json +1 -1
- package/shared/agent-types.ts +2 -0
- package/workflows/analyze.md +61 -185
- package/workflows/brainstorm.md +3 -23
- package/workflows/codebase-rebuild.md +79 -191
- package/workflows/codebase-refresh.md +26 -124
- package/workflows/debug.md +21 -141
- package/workflows/execute.md +183 -350
- package/workflows/fork.md +72 -230
- package/workflows/harvest.md +12 -79
- package/workflows/init.md +3 -17
- package/workflows/integration-test.md +21 -190
- package/workflows/issue-analyze.md +35 -153
- package/workflows/issue-discover.md +88 -263
- package/workflows/issue-execute.md +29 -208
- package/workflows/issue-plan.md +33 -154
- package/workflows/issue.md +44 -202
- package/workflows/knowhow.md +374 -0
- package/workflows/learn.md +30 -177
- package/workflows/maestro-coordinate.codex.md +77 -362
- package/workflows/maestro-link-coordinate.md +12 -61
- package/workflows/maestro.codex.md +124 -457
- package/workflows/maestro.md +562 -976
- package/workflows/map.md +16 -53
- package/workflows/merge.md +42 -197
- package/workflows/milestone-audit.md +5 -43
- package/workflows/milestone-complete.md +11 -60
- package/workflows/plan.md +188 -387
- package/workflows/quick.md +25 -174
- package/workflows/refactor.md +28 -221
- package/workflows/retrospective.md +104 -443
- package/workflows/review.md +87 -299
- package/workflows/roadmap.md +117 -97
- package/workflows/spec-generate.md +22 -118
- package/workflows/specs-add.md +5 -25
- package/workflows/specs-load.md +1 -5
- package/workflows/specs-remove.md +0 -11
- package/workflows/specs-setup.md +11 -47
- package/workflows/status.md +58 -200
- package/workflows/sync.md +28 -141
- package/workflows/test-gen.md +23 -100
- package/workflows/test.md +15 -125
- package/workflows/ui-design.md +139 -465
- package/workflows/ui-style.md +36 -228
- package/workflows/verify.md +52 -273
- package/workflows/wiki-connect.md +9 -46
- package/workflows/wiki-digest.md +7 -50
- package/workflows/wiki-manage.md +11 -108
- package/.claude/commands/maestro-coordinate.md +0 -63
- package/.claude/commands/manage-memory-capture.md +0 -59
- package/.codex/skills/maestro-coordinate/SKILL.md +0 -213
- package/.codex/skills/manage-memory-capture/SKILL.md +0 -93
- package/dashboard/dist/assets/ChatInput-pUOLJIKE.js +0 -49
- package/dashboard/dist/assets/ChatPage-B8Xqkt0v.js +0 -27
- package/dashboard/dist/assets/McpPage-BY0SjTgw.js +0 -21
- package/dashboard/dist/assets/TeamsPage-BO2kP70F.js +0 -11
- package/dashboard/dist/assets/WorkflowPage-C8hWbYim.js +0 -6
- package/dashboard/dist/assets/en-ZbRpfzuP.js +0 -1
- package/dashboard/dist/assets/index-C2Mcb4TJ.js +0 -231
- package/dashboard/dist/assets/index-DyBbPc18.css +0 -1
- package/dashboard/dist/assets/loader-B5F6PzFT.js +0 -11
- package/dashboard/dist/assets/zh-CN-CoXBFuny.js +0 -1
- package/workflows/maestro-coordinate.md +0 -582
- 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":"AAAA,8EAA8E;AAC9E,wEAAwE;AACxE,8EAA8E;AAK9E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAE/E,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,eAAe,GAChB,MAAM,oCAAoC,CAAC;AAgB5C,MAAM,OAAO,kBAAkB;IAcV;IAbV,SAAS,CAAS;IACnB,MAAM,GAAsB,QAAQ,CAAC;IAC5B,SAAS,CAAS;IAE1B,OAAO,CAAc;IACrB,SAAS,CAAgB;IACzB,aAAa,CAAoB;IAElC,SAAS,GAAgC,IAAI,CAAC;IAC9C,aAAa,GAAoC,IAAI,CAAC;IAE9D,YACE,SAAiB,EACA,QAA2B,EAC5C,YAA0B;QADT,aAAQ,GAAR,QAAQ,CAAmB;QAG5C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC1C,IAAI,CAAC,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,IAAI,aAAa,EAAE,CAAC;QACrC,IAAI,CAAC,aAAa,GAAG,IAAI,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAC3D,CAAC;IAED,2BAA2B;IAE3B,QAAQ,CAAC,IAAY,EAAE,SAAkB;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QAC3E,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,EAAE;YACtC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,YAAY,EAAE,KAAK,CAAC,cAAc;SACnC,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;IAED,WAAW,CAAC,IAAY;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACpE,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,EAAE;gBACtC,IAAI;gBACJ,MAAM,EAAE,SAAS;gBACjB,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACvC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,cAAc,CAAC,IAAY,EAAE,MAAuB;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3E,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACtE,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,EAAE;oBACtC,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,YAAY,EAAE,KAAK,CAAC,cAAc;iBACnC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;IAED,oBAAoB;IAEpB,qFAAqF;IACrF,KAAK,CAAC,WAAW,CACf,IAAY,EACZ,EAAU,EACV,OAAe,EACf,WAA4B,QAAQ;QAEpC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAE5E,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE;YACjC,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,eAAe,EAAE,SAAS;YAC1B,SAAS,EAAE,GAAG,CAAC,SAAS;SACzB,CAAC,CAAC;QAEH,wBAAwB;QACxB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED,wCAAwC;IACxC,KAAK,CAAC,gBAAgB,CACpB,IAAY,EACZ,OAAe,EACf,WAA4B,QAAQ;QAEpC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAE7E,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE;YAClC,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,EAAE,EAAE,GAAG;YACP,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,eAAe,EAAE,SAAS;YAC1B,SAAS,EAAE,GAAG,CAAC,SAAS;SACzB,CAAC,CAAC;QAEH,kBAAkB;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5D,MAAM,OAAO,CAAC,UAAU,CACtB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACnB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAC7D,CACF,CAAC;QAEF,OAAO,GAAG,CAAC;IACb,CAAC;IAED,0BAA0B;IAE1B,UAAU,CAAC,KAAqB;QAC9B,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACtD,CAAC;IAED,UAAU,CAAC,MAAc,EAAE,KAAqB;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAElE,iDAAiD;QACjD,IAAI,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACzC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC;IAED,+BAA+B;IAE/B,sEAAsE;IACtE,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,aAAa,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,qDAAqD;IACrD,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YAC/B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,6DAA6D;IAC7D,UAAU;QACR,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;;;;OAKG;IACH,YAAY,CAAC,SAA2B,EAAE,OAAe;QACvD,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;YAC9B,sDAAsD;YACtD,OAAO,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC;QAED,2CAA2C;QAC3C,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,SAAS,KAAK,aAAa,EAAE,CAAC;YAChC,OAAO,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1D,CAAC;QAED,uDAAuD;QACvD,OAAO,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IACrD,CAAC;IAED,4BAA4B;IAE5B,WAAW;QACT,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;YACpD,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;YACjD,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;YAC1C,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;IACJ,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;IACzB,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;QAC1B,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;CACF"}
|
|
@@ -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
|
+
}
|