@compilr-dev/cli 0.5.0 → 0.5.2
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/LICENSE +108 -0
- package/README.md +237 -69
- package/dist/.tsbuildinfo.app +1 -0
- package/dist/.tsbuildinfo.data +1 -0
- package/dist/.tsbuildinfo.domain +1 -0
- package/dist/.tsbuildinfo.foundation +1 -0
- package/dist/agent.d.ts +61 -4
- package/dist/agent.js +241 -245
- package/dist/anchors/index.d.ts +1 -1
- package/dist/anchors/index.js +1 -1
- package/dist/anchors/project-anchors.d.ts +2 -2
- package/dist/anchors/project-anchors.js +1 -1
- package/dist/auth/api-client.d.ts +124 -0
- package/dist/auth/api-client.js +261 -0
- package/dist/auth/index.d.ts +172 -0
- package/dist/auth/index.js +545 -0
- package/dist/auth/storage.d.ts +52 -0
- package/dist/auth/storage.js +118 -0
- package/dist/changelog/index.d.ts +16 -0
- package/dist/changelog/index.js +24 -0
- package/dist/changelog/releases.d.ts +17 -0
- package/dist/changelog/releases.js +63 -0
- package/dist/commands-v2/handlers/auth.d.ts +10 -0
- package/dist/commands-v2/handlers/auth.js +118 -0
- package/dist/commands-v2/handlers/background.d.ts +14 -0
- package/dist/commands-v2/handlers/background.js +276 -0
- package/dist/commands-v2/handlers/context.js +286 -81
- package/dist/commands-v2/handlers/core.d.ts +1 -0
- package/dist/commands-v2/handlers/core.js +133 -8
- package/dist/commands-v2/handlers/debug.js +18 -0
- package/dist/commands-v2/handlers/delegations.d.ts +8 -0
- package/dist/commands-v2/handlers/delegations.js +29 -0
- package/dist/commands-v2/handlers/files.d.ts +8 -0
- package/dist/commands-v2/handlers/files.js +162 -0
- package/dist/commands-v2/handlers/filter.d.ts +9 -0
- package/dist/commands-v2/handlers/filter.js +130 -0
- package/dist/commands-v2/handlers/games.d.ts +7 -0
- package/dist/commands-v2/handlers/games.js +57 -0
- package/dist/commands-v2/handlers/index.d.ts +13 -0
- package/dist/commands-v2/handlers/index.js +39 -0
- package/dist/commands-v2/handlers/mcp.d.ts +8 -0
- package/dist/commands-v2/handlers/mcp.js +39 -0
- package/dist/commands-v2/handlers/notifications.d.ts +9 -0
- package/dist/commands-v2/handlers/notifications.js +34 -0
- package/dist/commands-v2/handlers/project.js +295 -31
- package/dist/commands-v2/handlers/reset.d.ts +11 -0
- package/dist/commands-v2/handlers/reset.js +118 -0
- package/dist/commands-v2/handlers/session.d.ts +161 -0
- package/dist/commands-v2/handlers/session.js +805 -0
- package/dist/commands-v2/handlers/settings.d.ts +2 -0
- package/dist/commands-v2/handlers/settings.js +217 -35
- package/dist/commands-v2/handlers/tasks.d.ts +5 -0
- package/dist/commands-v2/handlers/tasks.js +36 -0
- package/dist/commands-v2/handlers/team.d.ts +9 -0
- package/dist/commands-v2/handlers/team.js +549 -0
- package/dist/commands-v2/handlers/terminals.d.ts +9 -0
- package/dist/commands-v2/handlers/terminals.js +34 -0
- package/dist/commands-v2/index.d.ts +3 -2
- package/dist/commands-v2/index.js +4 -1
- package/dist/commands-v2/registry.d.ts +15 -0
- package/dist/commands-v2/registry.js +34 -0
- package/dist/commands-v2/types.d.ts +81 -3
- package/dist/commands.js +13 -0
- package/dist/compilr-diff-companion.vsix +0 -0
- package/dist/db/index.js +98 -4
- package/dist/db/repositories/document-repository.d.ts +2 -0
- package/dist/db/repositories/document-repository.js +6 -1
- package/dist/db/repositories/index.d.ts +2 -0
- package/dist/db/repositories/index.js +1 -0
- package/dist/db/repositories/plan-repository.d.ts +101 -0
- package/dist/db/repositories/plan-repository.js +275 -0
- package/dist/db/repositories/project-repository.d.ts +6 -0
- package/dist/db/repositories/project-repository.js +41 -0
- package/dist/db/repositories/work-item-repository.d.ts +15 -0
- package/dist/db/repositories/work-item-repository.js +69 -4
- package/dist/db/schema.d.ts +40 -3
- package/dist/db/schema.js +66 -3
- package/dist/episodes/index.d.ts +20 -0
- package/dist/episodes/index.js +27 -0
- package/dist/episodes/recorder.d.ts +51 -0
- package/dist/episodes/recorder.js +195 -0
- package/dist/episodes/significant-work.d.ts +21 -0
- package/dist/episodes/significant-work.js +56 -0
- package/dist/episodes/store.d.ts +38 -0
- package/dist/episodes/store.js +199 -0
- package/dist/episodes/types.d.ts +35 -0
- package/dist/episodes/types.js +6 -0
- package/dist/episodes/work-at-risk.d.ts +12 -0
- package/dist/episodes/work-at-risk.js +38 -0
- package/dist/episodes/work-summary-anchor.d.ts +23 -0
- package/dist/episodes/work-summary-anchor.js +73 -0
- package/dist/games/coins.d.ts +66 -0
- package/dist/games/coins.js +165 -0
- package/dist/games/game-base.d.ts +84 -0
- package/dist/games/game-base.js +204 -0
- package/dist/games/index.d.ts +16 -0
- package/dist/games/index.js +49 -0
- package/dist/games/scores.d.ts +69 -0
- package/dist/games/scores.js +191 -0
- package/dist/games/tetris/board.d.ts +59 -0
- package/dist/games/tetris/board.js +170 -0
- package/dist/games/tetris/index.d.ts +109 -0
- package/dist/games/tetris/index.js +610 -0
- package/dist/games/tetris/pieces.d.ts +44 -0
- package/dist/games/tetris/pieces.js +271 -0
- package/dist/games/tetris/renderer.d.ts +26 -0
- package/dist/games/tetris/renderer.js +77 -0
- package/dist/guide/guide-content.d.ts +23 -0
- package/dist/guide/guide-content.js +196 -0
- package/dist/guide/index.d.ts +8 -0
- package/dist/guide/index.js +7 -0
- package/dist/guide/shared-content.d.ts +37 -0
- package/dist/guide/shared-content.js +1272 -0
- package/dist/guide/tutorial-helpers.d.ts +57 -0
- package/dist/guide/tutorial-helpers.js +147 -0
- package/dist/handlers/ask-user-handlers.d.ts +32 -0
- package/dist/handlers/ask-user-handlers.js +104 -0
- package/dist/handlers/delegation-handlers.d.ts +34 -0
- package/dist/handlers/delegation-handlers.js +291 -0
- package/dist/handlers/permission-handler.d.ts +30 -0
- package/dist/handlers/permission-handler.js +205 -0
- package/dist/index.d.ts +11 -1
- package/dist/index.js +448 -271
- package/dist/input-handlers/memory-handler.d.ts +1 -1
- package/dist/input-handlers/memory-handler.js +2 -1
- package/dist/models/index.d.ts +10 -0
- package/dist/models/index.js +12 -0
- package/dist/models/model-registry.d.ts +38 -0
- package/dist/models/model-registry.js +69 -0
- package/dist/models/model-tiers.d.ts +28 -0
- package/dist/models/model-tiers.js +71 -0
- package/dist/models/model-validation.d.ts +25 -0
- package/dist/models/model-validation.js +291 -0
- package/dist/models/ollama-models.d.ts +73 -0
- package/dist/models/ollama-models.js +178 -0
- package/dist/models/provider-types.d.ts +6 -0
- package/dist/models/provider-types.js +1 -0
- package/dist/models/providers.d.ts +35 -0
- package/dist/models/providers.js +58 -0
- package/dist/models/types.d.ts +4 -0
- package/dist/models/types.js +4 -0
- package/dist/multi-agent/activity.d.ts +21 -0
- package/dist/multi-agent/activity.js +34 -0
- package/dist/multi-agent/agent-selection.d.ts +55 -0
- package/dist/multi-agent/agent-selection.js +90 -0
- package/dist/multi-agent/artifacts.d.ts +197 -0
- package/dist/multi-agent/artifacts.js +379 -0
- package/dist/multi-agent/checkpointer.d.ts +138 -0
- package/dist/multi-agent/checkpointer.js +471 -0
- package/dist/multi-agent/collision-utils.d.ts +16 -0
- package/dist/multi-agent/collision-utils.js +28 -0
- package/dist/multi-agent/context-resolver.d.ts +97 -0
- package/dist/multi-agent/context-resolver.js +316 -0
- package/dist/multi-agent/custom-agents.d.ts +83 -0
- package/dist/multi-agent/custom-agents.js +227 -0
- package/dist/multi-agent/delegation-tracker.d.ts +157 -0
- package/dist/multi-agent/delegation-tracker.js +243 -0
- package/dist/multi-agent/file-lock-hook.d.ts +29 -0
- package/dist/multi-agent/file-lock-hook.js +97 -0
- package/dist/multi-agent/file-locks.d.ts +58 -0
- package/dist/multi-agent/file-locks.js +194 -0
- package/dist/multi-agent/index.d.ts +24 -0
- package/dist/multi-agent/index.js +30 -0
- package/dist/multi-agent/mention-parser.d.ts +64 -0
- package/dist/multi-agent/mention-parser.js +146 -0
- package/dist/multi-agent/notification-manager.d.ts +84 -0
- package/dist/multi-agent/notification-manager.js +224 -0
- package/dist/multi-agent/pending-requests.d.ts +122 -0
- package/dist/multi-agent/pending-requests.js +155 -0
- package/dist/multi-agent/session-registry.d.ts +139 -0
- package/dist/multi-agent/session-registry.js +514 -0
- package/dist/multi-agent/shared-context.d.ts +293 -0
- package/dist/multi-agent/shared-context.js +671 -0
- package/dist/multi-agent/skill-requirements.d.ts +66 -0
- package/dist/multi-agent/skill-requirements.js +178 -0
- package/dist/multi-agent/task-assignment.d.ts +69 -0
- package/dist/multi-agent/task-assignment.js +123 -0
- package/dist/multi-agent/task-suggestion.d.ts +31 -0
- package/dist/multi-agent/task-suggestion.js +72 -0
- package/dist/multi-agent/team-agent.d.ts +201 -0
- package/dist/multi-agent/team-agent.js +488 -0
- package/dist/multi-agent/team.d.ts +286 -0
- package/dist/multi-agent/team.js +610 -0
- package/dist/multi-agent/tool-config.d.ts +110 -0
- package/dist/multi-agent/tool-config.js +661 -0
- package/dist/multi-agent/types.d.ts +211 -0
- package/dist/multi-agent/types.js +617 -0
- package/dist/prompts/plan-mode-prompt.d.ts +11 -0
- package/dist/prompts/plan-mode-prompt.js +95 -0
- package/dist/repl-helpers.js +5 -2
- package/dist/repl-v2.d.ts +401 -2
- package/dist/repl-v2.js +2588 -65
- package/dist/session/index.d.ts +6 -0
- package/dist/session/index.js +6 -0
- package/dist/session/project-session-manager.d.ts +158 -0
- package/dist/session/project-session-manager.js +650 -0
- package/dist/settings/index.d.ts +133 -13
- package/dist/settings/index.js +329 -24
- package/dist/settings/mcp-config.d.ts +76 -0
- package/dist/settings/mcp-config.js +143 -0
- package/dist/settings/paths.d.ts +4 -0
- package/dist/settings/paths.js +6 -0
- package/dist/shared-handlers.d.ts +62 -0
- package/dist/shared-handlers.js +48 -0
- package/dist/system-prompt/builder.d.ts +5 -0
- package/dist/system-prompt/builder.js +4 -0
- package/dist/system-prompt/index.d.ts +18 -0
- package/dist/system-prompt/index.js +18 -0
- package/dist/system-prompt/modules.d.ts +5 -0
- package/dist/system-prompt/modules.js +4 -0
- package/dist/tabbed-menu.js +2 -1
- package/dist/templates/compilr-md-import.d.ts +16 -0
- package/dist/templates/compilr-md-import.js +241 -0
- package/dist/templates/compilr-md.js +10 -61
- package/dist/templates/config-json.d.ts +1 -25
- package/dist/templates/index.d.ts +2 -0
- package/dist/templates/index.js +34 -73
- package/dist/tool-names.d.ts +113 -0
- package/dist/tool-names.js +239 -0
- package/dist/tools/ask-user-simple.d.ts +1 -1
- package/dist/tools/ask-user-simple.js +2 -1
- package/dist/tools/ask-user.d.ts +1 -1
- package/dist/tools/ask-user.js +2 -1
- package/dist/tools/backlog.d.ts +2 -2
- package/dist/tools/backlog.js +1 -1
- package/dist/tools/db-tools.d.ts +13 -61
- package/dist/tools/db-tools.js +12 -13
- package/dist/tools/delegate-background.d.ts +27 -0
- package/dist/tools/delegate-background.js +115 -0
- package/dist/tools/delegate.d.ts +22 -0
- package/dist/tools/delegate.js +97 -0
- package/dist/tools/delegation-status.d.ts +16 -0
- package/dist/tools/delegation-status.js +128 -0
- package/dist/tools/guide-tool.d.ts +12 -0
- package/dist/tools/guide-tool.js +59 -0
- package/dist/tools/handoff.d.ts +25 -0
- package/dist/tools/handoff.js +99 -0
- package/dist/tools/meta-tools.d.ts +26 -0
- package/dist/tools/meta-tools.js +47 -0
- package/dist/tools/platform-adapter.d.ts +35 -0
- package/dist/tools/platform-adapter.js +404 -0
- package/dist/tools/project-db.d.ts +5 -73
- package/dist/tools/project-db.js +5 -336
- package/dist/tools.d.ts +67 -2
- package/dist/tools.js +240 -48
- package/dist/ui/autocomplete-controller.d.ts +42 -0
- package/dist/ui/autocomplete-controller.js +384 -0
- package/dist/ui/base/index.d.ts +1 -1
- package/dist/ui/base/index.js +1 -1
- package/dist/ui/base/overlay-base-v2.d.ts +10 -0
- package/dist/ui/base/overlay-base-v2.js +14 -0
- package/dist/ui/base/render-utils.d.ts +19 -0
- package/dist/ui/base/render-utils.js +25 -0
- package/dist/ui/base/tabbed-list-overlay-v2.d.ts +16 -1
- package/dist/ui/base/tabbed-list-overlay-v2.js +19 -1
- package/dist/ui/constants/labels.d.ts +14 -0
- package/dist/ui/constants/labels.js +52 -0
- package/dist/ui/conversation-store.d.ts +55 -0
- package/dist/ui/conversation-store.js +107 -0
- package/dist/ui/conversation.js +11 -13
- package/dist/ui/diff.d.ts +7 -1
- package/dist/ui/diff.js +85 -48
- package/dist/ui/ephemeral.js +3 -9
- package/dist/ui/file-autocomplete.d.ts +24 -0
- package/dist/ui/file-autocomplete.js +56 -0
- package/dist/ui/footer-renderer.d.ts +69 -0
- package/dist/ui/footer-renderer.js +431 -0
- package/dist/ui/footer.d.ts +74 -7
- package/dist/ui/footer.js +173 -16
- package/dist/ui/input-controller.d.ts +51 -0
- package/dist/ui/input-controller.js +176 -0
- package/dist/ui/input-prompt.d.ts +19 -0
- package/dist/ui/input-prompt.js +206 -14
- package/dist/ui/keyboard-handler.d.ts +57 -0
- package/dist/ui/keyboard-handler.js +557 -0
- package/dist/ui/live-region-facade.d.ts +42 -0
- package/dist/ui/live-region-facade.js +205 -0
- package/dist/ui/live-region.d.ts +0 -4
- package/dist/ui/live-region.js +6 -14
- package/dist/ui/mascot/renderer.d.ts +1 -1
- package/dist/ui/mascot/renderer.js +37 -2
- package/dist/ui/overlay/data/tutorial-content.d.ts +9 -0
- package/dist/ui/overlay/data/tutorial-content.js +9 -0
- package/dist/ui/overlay/data/tutorial-registry.d.ts +12 -0
- package/dist/ui/overlay/data/tutorial-registry.js +116 -0
- package/dist/ui/overlay/data/tutorial-types.d.ts +35 -0
- package/dist/ui/overlay/data/tutorial-types.js +6 -0
- package/dist/ui/overlay/data/tutorials/basics/first-conversation.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/basics/first-conversation.js +220 -0
- package/dist/ui/overlay/data/tutorials/basics/first-project.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/basics/first-project.js +284 -0
- package/dist/ui/overlay/data/tutorials/basics/navigation.d.ts +8 -0
- package/dist/ui/overlay/data/tutorials/basics/navigation.js +22 -0
- package/dist/ui/overlay/data/tutorials/basics/welcome.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/basics/welcome.js +174 -0
- package/dist/ui/overlay/data/tutorials/config/context-management.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/config/context-management.js +158 -0
- package/dist/ui/overlay/data/tutorials/config/mcp-servers.d.ts +8 -0
- package/dist/ui/overlay/data/tutorials/config/mcp-servers.js +155 -0
- package/dist/ui/overlay/data/tutorials/config/model-selection.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/config/model-selection.js +162 -0
- package/dist/ui/overlay/data/tutorials/config/permissions-safety.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/config/permissions-safety.js +163 -0
- package/dist/ui/overlay/data/tutorials/config/settings-config.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/config/settings-config.js +166 -0
- package/dist/ui/overlay/data/tutorials/planning/arch.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/arch.js +168 -0
- package/dist/ui/overlay/data/tutorials/planning/backlog.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/backlog.js +103 -0
- package/dist/ui/overlay/data/tutorials/planning/build.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/build.js +173 -0
- package/dist/ui/overlay/data/tutorials/planning/design.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/design.js +205 -0
- package/dist/ui/overlay/data/tutorials/planning/docs.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/docs.js +143 -0
- package/dist/ui/overlay/data/tutorials/planning/prd.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/prd.js +173 -0
- package/dist/ui/overlay/data/tutorials/planning/scaffold.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/scaffold.js +164 -0
- package/dist/ui/overlay/data/tutorials/planning/sketch.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/planning/sketch.js +58 -0
- package/dist/ui/overlay/data/tutorials/projects/anchors.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/projects/anchors.js +248 -0
- package/dist/ui/overlay/data/tutorials/projects/import-project.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/projects/import-project.js +172 -0
- package/dist/ui/overlay/data/tutorials/projects/managing-projects.d.ts +8 -0
- package/dist/ui/overlay/data/tutorials/projects/managing-projects.js +212 -0
- package/dist/ui/overlay/data/tutorials/projects/new-project.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/projects/new-project.js +251 -0
- package/dist/ui/overlay/data/tutorials/projects/session-management.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/projects/session-management.js +169 -0
- package/dist/ui/overlay/data/tutorials/teams/background-execution.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/teams/background-execution.js +171 -0
- package/dist/ui/overlay/data/tutorials/teams/multi-terminal.d.ts +8 -0
- package/dist/ui/overlay/data/tutorials/teams/multi-terminal.js +147 -0
- package/dist/ui/overlay/data/tutorials/teams/task-assignment.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/teams/task-assignment.js +204 -0
- package/dist/ui/overlay/data/tutorials/teams/team-overview.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/teams/team-overview.js +165 -0
- package/dist/ui/overlay/data/tutorials/teams/working-with-agents.d.ts +7 -0
- package/dist/ui/overlay/data/tutorials/teams/working-with-agents.js +172 -0
- package/dist/ui/overlay/impl/agents-overlay-v2.js +6 -17
- package/dist/ui/overlay/impl/anchors-overlay-v2.js +30 -64
- package/dist/ui/overlay/impl/artifact-detail-overlay-v2.d.ts +43 -0
- package/dist/ui/overlay/impl/artifact-detail-overlay-v2.js +232 -0
- package/dist/ui/overlay/impl/artifact-overlay-v2.d.ts +40 -0
- package/dist/ui/overlay/impl/artifact-overlay-v2.js +115 -0
- package/dist/ui/overlay/impl/ask-user-overlay-v2.js +2 -5
- package/dist/ui/overlay/impl/background-overlay-v2.d.ts +40 -0
- package/dist/ui/overlay/impl/background-overlay-v2.js +147 -0
- package/dist/ui/overlay/impl/backlog-overlay-v2.d.ts +4 -1
- package/dist/ui/overlay/impl/backlog-overlay-v2.js +55 -16
- package/dist/ui/overlay/impl/changelog-overlay-v2.d.ts +44 -0
- package/dist/ui/overlay/impl/changelog-overlay-v2.js +165 -0
- package/dist/ui/overlay/impl/commands-overlay-v2.js +4 -6
- package/dist/ui/overlay/impl/config-overlay-v2.d.ts +12 -1
- package/dist/ui/overlay/impl/config-overlay-v2.js +164 -100
- package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.d.ts +83 -0
- package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.js +711 -0
- package/dist/ui/overlay/impl/dashboard-overlay-v2.d.ts +2 -0
- package/dist/ui/overlay/impl/dashboard-overlay-v2.js +26 -3
- package/dist/ui/overlay/impl/delegations-overlay-v2.d.ts +28 -0
- package/dist/ui/overlay/impl/delegations-overlay-v2.js +279 -0
- package/dist/ui/overlay/impl/docs-overlay-v2.js +12 -9
- package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +7 -0
- package/dist/ui/overlay/impl/document-detail-overlay-v2.js +119 -78
- package/dist/ui/overlay/impl/filter-overlay-v2.d.ts +41 -0
- package/dist/ui/overlay/impl/filter-overlay-v2.js +110 -0
- package/dist/ui/overlay/impl/games-overlay-v2.d.ts +31 -0
- package/dist/ui/overlay/impl/games-overlay-v2.js +135 -0
- package/dist/ui/overlay/impl/help-overlay-v2.d.ts +26 -3
- package/dist/ui/overlay/impl/help-overlay-v2.js +20 -42
- package/dist/ui/overlay/impl/login-overlay-v2.d.ts +49 -0
- package/dist/ui/overlay/impl/login-overlay-v2.js +277 -0
- package/dist/ui/overlay/impl/mcp-overlay-v2.d.ts +63 -0
- package/dist/ui/overlay/impl/mcp-overlay-v2.js +907 -0
- package/dist/ui/overlay/impl/model-overlay-v2.d.ts +57 -13
- package/dist/ui/overlay/impl/model-overlay-v2.js +1086 -61
- package/dist/ui/overlay/impl/new-overlay-v2.d.ts +37 -6
- package/dist/ui/overlay/impl/new-overlay-v2.js +715 -65
- package/dist/ui/overlay/impl/notifications-overlay-v2.d.ts +20 -0
- package/dist/ui/overlay/impl/notifications-overlay-v2.js +116 -0
- package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.d.ts +76 -0
- package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.js +728 -0
- package/dist/ui/overlay/impl/pending-overlay-v2.d.ts +51 -0
- package/dist/ui/overlay/impl/pending-overlay-v2.js +445 -0
- package/dist/ui/overlay/impl/permission-overlay-v2.js +5 -5
- package/dist/ui/overlay/impl/permissions-overlay-v2.d.ts +85 -0
- package/dist/ui/overlay/impl/permissions-overlay-v2.js +820 -0
- package/dist/ui/overlay/impl/plan-approval-overlay-v2.d.ts +35 -0
- package/dist/ui/overlay/impl/plan-approval-overlay-v2.js +181 -0
- package/dist/ui/overlay/impl/project-edit-overlay-v2.d.ts +36 -0
- package/dist/ui/overlay/impl/project-edit-overlay-v2.js +195 -0
- package/dist/ui/overlay/impl/projects-overlay-v2.d.ts +1 -0
- package/dist/ui/overlay/impl/projects-overlay-v2.js +278 -44
- package/dist/ui/overlay/impl/reset-overlay-v2.d.ts +39 -0
- package/dist/ui/overlay/impl/reset-overlay-v2.js +107 -0
- package/dist/ui/overlay/impl/resume-overlay-v2.d.ts +60 -0
- package/dist/ui/overlay/impl/resume-overlay-v2.js +414 -0
- package/dist/ui/overlay/impl/session-mode-overlay-v2.d.ts +43 -0
- package/dist/ui/overlay/impl/session-mode-overlay-v2.js +124 -0
- package/dist/ui/overlay/impl/tasks-overlay-v2.d.ts +28 -0
- package/dist/ui/overlay/impl/tasks-overlay-v2.js +283 -0
- package/dist/ui/overlay/impl/team-overlay-v2.d.ts +86 -0
- package/dist/ui/overlay/impl/team-overlay-v2.js +692 -0
- package/dist/ui/overlay/impl/terminals-overlay-v2.d.ts +26 -0
- package/dist/ui/overlay/impl/terminals-overlay-v2.js +217 -0
- package/dist/ui/overlay/impl/tools-overlay-v2.js +3 -7
- package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +30 -16
- package/dist/ui/overlay/impl/tutorial-overlay-v2.js +133 -956
- package/dist/ui/overlay/impl/workflow-overlay-v2.d.ts +1 -0
- package/dist/ui/overlay/impl/workflow-overlay-v2.js +10 -4
- package/dist/ui/overlay/index.d.ts +20 -1
- package/dist/ui/overlay/index.js +19 -0
- package/dist/ui/overlay/types.d.ts +5 -0
- package/dist/ui/overlay-manager.d.ts +43 -0
- package/dist/ui/overlay-manager.js +238 -0
- package/dist/ui/overlays.js +4 -16
- package/dist/ui/permission-overlay.js +6 -5
- package/dist/ui/status-bar-controller.d.ts +33 -0
- package/dist/ui/status-bar-controller.js +99 -0
- package/dist/ui/subagent-renderer.js +3 -19
- package/dist/ui/terminal-autocomplete-utils.d.ts +23 -0
- package/dist/ui/terminal-autocomplete-utils.js +83 -0
- package/dist/ui/terminal-line-builders.d.ts +17 -0
- package/dist/ui/terminal-line-builders.js +42 -0
- package/dist/ui/terminal-render-item.d.ts +16 -0
- package/dist/ui/terminal-render-item.js +267 -0
- package/dist/ui/terminal-renderer.d.ts +7 -8
- package/dist/ui/terminal-renderer.js +7 -8
- package/dist/ui/terminal-types.d.ts +179 -0
- package/dist/ui/terminal-types.js +34 -0
- package/dist/ui/terminal-ui.d.ts +144 -276
- package/dist/ui/terminal-ui.js +384 -1861
- package/dist/ui/todo-zone.d.ts +19 -1
- package/dist/ui/todo-zone.js +71 -13
- package/dist/ui/tool-formatters.js +696 -1
- package/dist/ui/turn-metrics.d.ts +56 -0
- package/dist/ui/turn-metrics.js +75 -0
- package/dist/ui/types.d.ts +28 -0
- package/dist/ui/types.js +1 -0
- package/dist/ui/vscode-diff-ipc.d.ts +102 -0
- package/dist/ui/vscode-diff-ipc.js +385 -0
- package/dist/utils/credentials.d.ts +24 -5
- package/dist/utils/credentials.js +123 -9
- package/dist/utils/format-tokens.d.ts +13 -0
- package/dist/utils/format-tokens.js +18 -0
- package/dist/utils/git-config.d.ts +26 -0
- package/dist/utils/git-config.js +54 -0
- package/dist/utils/message-utils.d.ts +61 -0
- package/dist/utils/message-utils.js +72 -0
- package/dist/utils/model-tiers.d.ts +8 -1
- package/dist/utils/model-tiers.js +38 -16
- package/dist/utils/open-browser.d.ts +5 -0
- package/dist/utils/open-browser.js +32 -0
- package/dist/utils/path-safety.js +3 -2
- package/dist/utils/project-detection.d.ts +58 -0
- package/dist/utils/project-detection.js +424 -0
- package/dist/utils/project-memory.js +2 -1
- package/dist/utils/project-status.d.ts +2 -2
- package/dist/utils/startup-perf.d.ts +18 -0
- package/dist/utils/startup-perf.js +60 -0
- package/dist/utils/token-tracker.d.ts +62 -0
- package/dist/utils/token-tracker.js +150 -0
- package/dist/utils/token-types.d.ts +23 -0
- package/dist/utils/token-types.js +18 -0
- package/dist/utils/types/config-types.d.ts +32 -0
- package/dist/utils/types/config-types.js +8 -0
- package/dist/utils/update-checker.d.ts +28 -0
- package/dist/utils/update-checker.js +106 -0
- package/dist/utils/version.d.ts +7 -0
- package/dist/utils/version.js +10 -0
- package/dist/utils/vscode-detect.d.ts +39 -0
- package/dist/utils/vscode-detect.js +137 -0
- package/package.json +27 -13
- package/dist/commands/handler-types.d.ts +0 -68
- package/dist/commands/handler-types.js +0 -8
- package/dist/commands/handlers/agent-commands.d.ts +0 -13
- package/dist/commands/handlers/agent-commands.js +0 -305
- package/dist/commands/handlers/design-commands.d.ts +0 -15
- package/dist/commands/handlers/design-commands.js +0 -334
- package/dist/commands/handlers/index.d.ts +0 -20
- package/dist/commands/handlers/index.js +0 -43
- package/dist/commands/handlers/overlay-commands.d.ts +0 -21
- package/dist/commands/handlers/overlay-commands.js +0 -287
- package/dist/commands/handlers/project-commands.d.ts +0 -11
- package/dist/commands/handlers/project-commands.js +0 -167
- package/dist/commands/handlers/simple-commands.d.ts +0 -19
- package/dist/commands/handlers/simple-commands.js +0 -144
- package/dist/commands/registry.d.ts +0 -50
- package/dist/commands/registry.js +0 -75
- package/dist/index.old.d.ts +0 -7
- package/dist/index.old.js +0 -1014
- package/dist/repl.d.ts +0 -149
- package/dist/repl.js +0 -1151
- package/dist/templates/claude-md.d.ts +0 -7
- package/dist/templates/claude-md.js +0 -189
- package/dist/test-autocomplete.d.ts +0 -7
- package/dist/test-autocomplete.js +0 -85
- package/dist/test-tabbed-menu.d.ts +0 -7
- package/dist/test-tabbed-menu.js +0 -25
- package/dist/tool-selector.d.ts +0 -71
- package/dist/tool-selector.js +0 -184
- package/dist/tools/anchor-tools.d.ts +0 -31
- package/dist/tools/anchor-tools.js +0 -255
- package/dist/tools/backlog-wrappers.d.ts +0 -54
- package/dist/tools/backlog-wrappers.js +0 -338
- package/dist/tools/document-db.d.ts +0 -43
- package/dist/tools/document-db.js +0 -220
- package/dist/tools/workitem-db.d.ts +0 -103
- package/dist/tools/workitem-db.js +0 -549
- package/dist/ui/agents-overlay-v2.d.ts +0 -43
- package/dist/ui/agents-overlay-v2.js +0 -809
- package/dist/ui/agents-overlay.d.ts +0 -12
- package/dist/ui/agents-overlay.js +0 -863
- package/dist/ui/anchors-overlay.d.ts +0 -12
- package/dist/ui/anchors-overlay.js +0 -775
- package/dist/ui/arch-type-overlay.d.ts +0 -15
- package/dist/ui/arch-type-overlay.js +0 -201
- package/dist/ui/ask-user-overlay-v2.d.ts +0 -26
- package/dist/ui/ask-user-overlay-v2.js +0 -555
- package/dist/ui/ask-user-simple-overlay-v2.d.ts +0 -25
- package/dist/ui/ask-user-simple-overlay-v2.js +0 -215
- package/dist/ui/backlog-overlay.d.ts +0 -32
- package/dist/ui/backlog-overlay.js +0 -652
- package/dist/ui/commands-overlay-v2.d.ts +0 -33
- package/dist/ui/commands-overlay-v2.js +0 -441
- package/dist/ui/commands-overlay.d.ts +0 -16
- package/dist/ui/commands-overlay.js +0 -439
- package/dist/ui/config-overlay.d.ts +0 -35
- package/dist/ui/config-overlay.js +0 -707
- package/dist/ui/docs-overlay.d.ts +0 -17
- package/dist/ui/docs-overlay.js +0 -303
- package/dist/ui/footer-v2.d.ts +0 -222
- package/dist/ui/footer-v2.js +0 -1349
- package/dist/ui/help-overlay-v2.d.ts +0 -34
- package/dist/ui/help-overlay-v2.js +0 -309
- package/dist/ui/help-overlay.d.ts +0 -16
- package/dist/ui/help-overlay.js +0 -316
- package/dist/ui/init-overlay-v2.d.ts +0 -34
- package/dist/ui/init-overlay-v2.js +0 -600
- package/dist/ui/init-overlay.d.ts +0 -34
- package/dist/ui/init-overlay.js +0 -604
- package/dist/ui/input-prompt-v2.d.ts +0 -180
- package/dist/ui/input-prompt-v2.js +0 -999
- package/dist/ui/iteration-limit-overlay-v2.d.ts +0 -21
- package/dist/ui/iteration-limit-overlay-v2.js +0 -114
- package/dist/ui/keys-overlay-v2.d.ts +0 -41
- package/dist/ui/keys-overlay-v2.js +0 -248
- package/dist/ui/mascot-overlay-v2.d.ts +0 -41
- package/dist/ui/mascot-overlay-v2.js +0 -138
- package/dist/ui/mascot-overlay.d.ts +0 -21
- package/dist/ui/mascot-overlay.js +0 -146
- package/dist/ui/model-overlay-v2.d.ts +0 -49
- package/dist/ui/model-overlay-v2.js +0 -118
- package/dist/ui/model-overlay.d.ts +0 -27
- package/dist/ui/model-overlay.js +0 -221
- package/dist/ui/model-warning-overlay.d.ts +0 -30
- package/dist/ui/model-warning-overlay.js +0 -169
- package/dist/ui/new-overlay.d.ts +0 -34
- package/dist/ui/new-overlay.js +0 -604
- package/dist/ui/overlay/impl/init-overlay-v2.d.ts +0 -77
- package/dist/ui/overlay/impl/init-overlay-v2.js +0 -593
- package/dist/ui/overlay/overlay-types.d.ts +0 -128
- package/dist/ui/overlay/overlay-types.js +0 -22
- package/dist/ui/overlays/help-overlay-v2.d.ts +0 -28
- package/dist/ui/overlays/help-overlay-v2.js +0 -198
- package/dist/ui/overlays/index.d.ts +0 -11
- package/dist/ui/overlays/index.js +0 -11
- package/dist/ui/permission-overlay-v2.d.ts +0 -36
- package/dist/ui/permission-overlay-v2.js +0 -380
- package/dist/ui/projects-overlay.d.ts +0 -19
- package/dist/ui/projects-overlay.js +0 -484
- package/dist/ui/theme-overlay-v2.d.ts +0 -42
- package/dist/ui/theme-overlay-v2.js +0 -135
- package/dist/ui/theme-overlay.d.ts +0 -24
- package/dist/ui/theme-overlay.js +0 -127
- package/dist/ui/tools-overlay-v2.d.ts +0 -47
- package/dist/ui/tools-overlay-v2.js +0 -218
- package/dist/ui/tools-overlay.d.ts +0 -34
- package/dist/ui/tools-overlay.js +0 -230
- package/dist/ui/tutorial-overlay-v2.d.ts +0 -31
- package/dist/ui/tutorial-overlay-v2.js +0 -1035
- package/dist/ui/tutorial-overlay.d.ts +0 -11
- package/dist/ui/tutorial-overlay.js +0 -1034
- package/dist/ui/workflow-overlay.d.ts +0 -22
- package/dist/ui/workflow-overlay.js +0 -636
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NotificationManager - Cross-session notifications
|
|
3
|
+
*
|
|
4
|
+
* Polls the shared session_notifications table so that events in one terminal
|
|
5
|
+
* (e.g. a background agent finishing, a pending approval request) are surfaced
|
|
6
|
+
* to other terminals working on the same project.
|
|
7
|
+
*
|
|
8
|
+
* Singleton pattern — same as SessionRegistry and FileLockManager.
|
|
9
|
+
*/
|
|
10
|
+
import { EventEmitter } from 'events';
|
|
11
|
+
import { randomUUID } from 'crypto';
|
|
12
|
+
import { getDb } from '../db/index.js';
|
|
13
|
+
import { getActiveTerminalSessionId } from './session-registry.js';
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// Constants
|
|
16
|
+
// =============================================================================
|
|
17
|
+
const POLL_INTERVAL_MS = 5_000; // 5 seconds
|
|
18
|
+
// =============================================================================
|
|
19
|
+
// Module-level singleton
|
|
20
|
+
// =============================================================================
|
|
21
|
+
let _notificationManager = null;
|
|
22
|
+
/**
|
|
23
|
+
* Get the current NotificationManager instance (null if not initialized)
|
|
24
|
+
*/
|
|
25
|
+
export function getNotificationManager() {
|
|
26
|
+
return _notificationManager;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Initialize and return the NotificationManager singleton.
|
|
30
|
+
*/
|
|
31
|
+
export function initNotificationManager() {
|
|
32
|
+
if (!_notificationManager) {
|
|
33
|
+
_notificationManager = new NotificationManager(getDb());
|
|
34
|
+
}
|
|
35
|
+
return _notificationManager;
|
|
36
|
+
}
|
|
37
|
+
// =============================================================================
|
|
38
|
+
// NotificationManager
|
|
39
|
+
// =============================================================================
|
|
40
|
+
export class NotificationManager extends EventEmitter {
|
|
41
|
+
db;
|
|
42
|
+
pollInterval = null;
|
|
43
|
+
lastKnownCount = 0;
|
|
44
|
+
constructor(db) {
|
|
45
|
+
super();
|
|
46
|
+
this.db = db;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Start polling for new notifications (5s interval, .unref()).
|
|
50
|
+
*/
|
|
51
|
+
startPolling() {
|
|
52
|
+
if (this.pollInterval)
|
|
53
|
+
return;
|
|
54
|
+
// Initial count
|
|
55
|
+
this.lastKnownCount = this.getUnreadCount();
|
|
56
|
+
this.pollInterval = setInterval(() => {
|
|
57
|
+
this.checkForNewNotifications();
|
|
58
|
+
}, POLL_INTERVAL_MS);
|
|
59
|
+
this.pollInterval.unref();
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Stop polling.
|
|
63
|
+
*/
|
|
64
|
+
stopPolling() {
|
|
65
|
+
if (this.pollInterval) {
|
|
66
|
+
clearInterval(this.pollInterval);
|
|
67
|
+
this.pollInterval = null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Insert a new notification into the shared DB.
|
|
72
|
+
* Returns the notification ID, or null on failure.
|
|
73
|
+
*/
|
|
74
|
+
insert(options) {
|
|
75
|
+
try {
|
|
76
|
+
const id = randomUUID();
|
|
77
|
+
const payloadJson = options.payload ? JSON.stringify(options.payload) : null;
|
|
78
|
+
this.db.prepare(`
|
|
79
|
+
INSERT INTO session_notifications (id, project_id, from_session_id, to_session_id, type, title, message, payload_json)
|
|
80
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
81
|
+
`).run(id, options.projectId, options.fromSessionId, options.toSessionId ?? null, options.type, options.title, options.message ?? null, payloadJson);
|
|
82
|
+
return id;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get the count of unread notifications for this session.
|
|
90
|
+
* Lightweight COUNT(*) — used by the status bar poll.
|
|
91
|
+
*/
|
|
92
|
+
getUnreadCount() {
|
|
93
|
+
const selfId = getActiveTerminalSessionId();
|
|
94
|
+
if (!selfId)
|
|
95
|
+
return 0;
|
|
96
|
+
try {
|
|
97
|
+
const row = this.db.prepare(`
|
|
98
|
+
SELECT COUNT(*) as count
|
|
99
|
+
FROM session_notifications n
|
|
100
|
+
WHERE n.from_session_id != ?
|
|
101
|
+
AND n.read_at IS NULL
|
|
102
|
+
AND n.project_id = (SELECT project_id FROM terminal_sessions WHERE id = ?)
|
|
103
|
+
AND (n.to_session_id IS NULL OR n.to_session_id = ?)
|
|
104
|
+
`).get(selfId, selfId, selfId);
|
|
105
|
+
return row.count;
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return 0;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get all unread notifications for this session (with sender label).
|
|
113
|
+
* Used by the overlay for full display.
|
|
114
|
+
*/
|
|
115
|
+
getUnread() {
|
|
116
|
+
const selfId = getActiveTerminalSessionId();
|
|
117
|
+
if (!selfId)
|
|
118
|
+
return [];
|
|
119
|
+
try {
|
|
120
|
+
return this.db.prepare(`
|
|
121
|
+
SELECT n.*, ts.label as from_label
|
|
122
|
+
FROM session_notifications n
|
|
123
|
+
LEFT JOIN terminal_sessions ts ON ts.id = n.from_session_id
|
|
124
|
+
WHERE n.from_session_id != ?
|
|
125
|
+
AND n.read_at IS NULL
|
|
126
|
+
AND n.project_id = (SELECT project_id FROM terminal_sessions WHERE id = ?)
|
|
127
|
+
AND (n.to_session_id IS NULL OR n.to_session_id = ?)
|
|
128
|
+
ORDER BY n.created_at DESC
|
|
129
|
+
`).all(selfId, selfId, selfId);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Mark a single notification as read.
|
|
137
|
+
*/
|
|
138
|
+
markRead(notificationId) {
|
|
139
|
+
try {
|
|
140
|
+
this.db.prepare(`UPDATE session_notifications SET read_at = CURRENT_TIMESTAMP WHERE id = ?`).run(notificationId);
|
|
141
|
+
this.emitCountChange();
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
// Best effort
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Mark all unread notifications for this session as read.
|
|
149
|
+
*/
|
|
150
|
+
markAllRead() {
|
|
151
|
+
const selfId = getActiveTerminalSessionId();
|
|
152
|
+
if (!selfId)
|
|
153
|
+
return;
|
|
154
|
+
try {
|
|
155
|
+
this.db.prepare(`
|
|
156
|
+
UPDATE session_notifications SET read_at = CURRENT_TIMESTAMP
|
|
157
|
+
WHERE from_session_id != ?
|
|
158
|
+
AND read_at IS NULL
|
|
159
|
+
AND project_id = (SELECT project_id FROM terminal_sessions WHERE id = ?)
|
|
160
|
+
AND (to_session_id IS NULL OR to_session_id = ?)
|
|
161
|
+
`).run(selfId, selfId, selfId);
|
|
162
|
+
this.emitCountChange();
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// Best effort
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Clean up old notifications:
|
|
170
|
+
* - Delete read notifications older than 1 hour
|
|
171
|
+
* - Delete orphaned notifications (sender session gone, CASCADE missed)
|
|
172
|
+
*/
|
|
173
|
+
cleanup() {
|
|
174
|
+
try {
|
|
175
|
+
// Delete read notifications older than 1 hour
|
|
176
|
+
this.db.prepare(`
|
|
177
|
+
DELETE FROM session_notifications
|
|
178
|
+
WHERE read_at IS NOT NULL
|
|
179
|
+
AND read_at < datetime('now', '-1 hour')
|
|
180
|
+
`).run();
|
|
181
|
+
// Delete unread notifications older than 24 hours (stale)
|
|
182
|
+
this.db.prepare(`
|
|
183
|
+
DELETE FROM session_notifications
|
|
184
|
+
WHERE created_at < datetime('now', '-24 hours')
|
|
185
|
+
`).run();
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
// Best effort
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// ---------------------------------------------------------------------------
|
|
192
|
+
// Private
|
|
193
|
+
// ---------------------------------------------------------------------------
|
|
194
|
+
/**
|
|
195
|
+
* Poll for new notifications and emit 'count-changed' on delta.
|
|
196
|
+
*/
|
|
197
|
+
checkForNewNotifications() {
|
|
198
|
+
try {
|
|
199
|
+
const currentCount = this.getUnreadCount();
|
|
200
|
+
if (currentCount !== this.lastKnownCount) {
|
|
201
|
+
this.lastKnownCount = currentCount;
|
|
202
|
+
this.emit('count-changed', currentCount);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
// Best effort
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Re-check count and emit if changed (after mark operations).
|
|
211
|
+
*/
|
|
212
|
+
emitCountChange() {
|
|
213
|
+
try {
|
|
214
|
+
const currentCount = this.getUnreadCount();
|
|
215
|
+
if (currentCount !== this.lastKnownCount) {
|
|
216
|
+
this.lastKnownCount = currentCount;
|
|
217
|
+
this.emit('count-changed', currentCount);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
// Best effort
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pending Requests Manager (Phase 3b - Background Agents)
|
|
3
|
+
*
|
|
4
|
+
* Manages a queue of requests from background agents that need user input.
|
|
5
|
+
* Background agents can enqueue permission requests or questions, and the
|
|
6
|
+
* user can respond when convenient without blocking foreground work.
|
|
7
|
+
*/
|
|
8
|
+
import { EventEmitter } from 'events';
|
|
9
|
+
export type PendingRequestType = 'permission' | 'question';
|
|
10
|
+
export interface PendingRequest {
|
|
11
|
+
/** Unique request ID */
|
|
12
|
+
id: string;
|
|
13
|
+
/** Agent that made the request */
|
|
14
|
+
agentId: string;
|
|
15
|
+
/** Agent's mascot for display */
|
|
16
|
+
mascot: string;
|
|
17
|
+
/** Type of request */
|
|
18
|
+
type: PendingRequestType;
|
|
19
|
+
/** The prompt/question to show user */
|
|
20
|
+
prompt: string;
|
|
21
|
+
/** Available options (for questions) */
|
|
22
|
+
options?: string[];
|
|
23
|
+
/** When the request was created */
|
|
24
|
+
createdAt: Date;
|
|
25
|
+
/** Additional context (e.g., file path for permission, tool name) */
|
|
26
|
+
context?: Record<string, unknown>;
|
|
27
|
+
/** Resolve function - called when user responds */
|
|
28
|
+
resolve: (response: PendingRequestResponse) => void;
|
|
29
|
+
/** Reject function - called if request is cancelled */
|
|
30
|
+
reject: (error: Error) => void;
|
|
31
|
+
}
|
|
32
|
+
export interface PendingRequestResponse {
|
|
33
|
+
/** Whether the request was approved (for permissions) or answered (for questions) */
|
|
34
|
+
approved: boolean;
|
|
35
|
+
/** The selected option (for questions with options) */
|
|
36
|
+
selectedOption?: string;
|
|
37
|
+
/** Free-form response text */
|
|
38
|
+
responseText?: string;
|
|
39
|
+
/** Full overlay result (for question-type requests that use standard overlays) */
|
|
40
|
+
overlayResult?: unknown;
|
|
41
|
+
}
|
|
42
|
+
export interface EnqueueOptions {
|
|
43
|
+
agentId: string;
|
|
44
|
+
mascot: string;
|
|
45
|
+
type: PendingRequestType;
|
|
46
|
+
prompt: string;
|
|
47
|
+
options?: string[];
|
|
48
|
+
context?: Record<string, unknown>;
|
|
49
|
+
}
|
|
50
|
+
export interface PendingRequestsEvents {
|
|
51
|
+
/** Emitted when a new request is added */
|
|
52
|
+
'request-added': (request: PendingRequest) => void;
|
|
53
|
+
/** Emitted when a request is resolved */
|
|
54
|
+
'request-resolved': (requestId: string, response: PendingRequestResponse) => void;
|
|
55
|
+
/** Emitted when a request is rejected/cancelled */
|
|
56
|
+
'request-rejected': (requestId: string, error: Error) => void;
|
|
57
|
+
/** Emitted when the pending count changes */
|
|
58
|
+
'count-changed': (count: number) => void;
|
|
59
|
+
}
|
|
60
|
+
export declare class PendingRequestsManager extends EventEmitter {
|
|
61
|
+
private readonly requests;
|
|
62
|
+
/**
|
|
63
|
+
* Enqueue a request from a background agent.
|
|
64
|
+
* Returns a promise that resolves when the user responds.
|
|
65
|
+
*
|
|
66
|
+
* @param options - Request options
|
|
67
|
+
* @returns Promise that resolves with the user's response
|
|
68
|
+
*/
|
|
69
|
+
enqueue(options: EnqueueOptions): Promise<PendingRequestResponse>;
|
|
70
|
+
/**
|
|
71
|
+
* Get the number of pending requests.
|
|
72
|
+
*/
|
|
73
|
+
getCount(): number;
|
|
74
|
+
/**
|
|
75
|
+
* Get all pending requests (for overlay display).
|
|
76
|
+
*/
|
|
77
|
+
getAll(): PendingRequest[];
|
|
78
|
+
/**
|
|
79
|
+
* Get a specific request by ID.
|
|
80
|
+
*/
|
|
81
|
+
get(id: string): PendingRequest | undefined;
|
|
82
|
+
/**
|
|
83
|
+
* Get requests for a specific agent.
|
|
84
|
+
*/
|
|
85
|
+
getByAgent(agentId: string): PendingRequest[];
|
|
86
|
+
/**
|
|
87
|
+
* Respond to a pending request (approve/answer).
|
|
88
|
+
* This resolves the promise returned by enqueue().
|
|
89
|
+
*
|
|
90
|
+
* @param id - Request ID
|
|
91
|
+
* @param response - User's response
|
|
92
|
+
*/
|
|
93
|
+
respond(id: string, response: PendingRequestResponse): boolean;
|
|
94
|
+
/**
|
|
95
|
+
* Reject/cancel a pending request.
|
|
96
|
+
* This rejects the promise returned by enqueue().
|
|
97
|
+
*
|
|
98
|
+
* @param id - Request ID
|
|
99
|
+
* @param reason - Rejection reason
|
|
100
|
+
*/
|
|
101
|
+
reject(id: string, reason?: string): boolean;
|
|
102
|
+
/**
|
|
103
|
+
* Reject all requests for a specific agent.
|
|
104
|
+
* Called when an agent is killed/cancelled.
|
|
105
|
+
*
|
|
106
|
+
* @param agentId - Agent ID
|
|
107
|
+
* @param reason - Rejection reason
|
|
108
|
+
*/
|
|
109
|
+
rejectAllForAgent(agentId: string, reason?: string): number;
|
|
110
|
+
/**
|
|
111
|
+
* Clear all pending requests.
|
|
112
|
+
*/
|
|
113
|
+
clear(): void;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get the singleton PendingRequestsManager instance.
|
|
117
|
+
*/
|
|
118
|
+
export declare function getPendingRequestsManager(): PendingRequestsManager;
|
|
119
|
+
/**
|
|
120
|
+
* Reset the singleton (for testing).
|
|
121
|
+
*/
|
|
122
|
+
export declare function resetPendingRequestsManager(): void;
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pending Requests Manager (Phase 3b - Background Agents)
|
|
3
|
+
*
|
|
4
|
+
* Manages a queue of requests from background agents that need user input.
|
|
5
|
+
* Background agents can enqueue permission requests or questions, and the
|
|
6
|
+
* user can respond when convenient without blocking foreground work.
|
|
7
|
+
*/
|
|
8
|
+
import { EventEmitter } from 'events';
|
|
9
|
+
import { randomUUID } from 'crypto';
|
|
10
|
+
// =============================================================================
|
|
11
|
+
// Manager Class
|
|
12
|
+
// =============================================================================
|
|
13
|
+
export class PendingRequestsManager extends EventEmitter {
|
|
14
|
+
requests = new Map();
|
|
15
|
+
/**
|
|
16
|
+
* Enqueue a request from a background agent.
|
|
17
|
+
* Returns a promise that resolves when the user responds.
|
|
18
|
+
*
|
|
19
|
+
* @param options - Request options
|
|
20
|
+
* @returns Promise that resolves with the user's response
|
|
21
|
+
*/
|
|
22
|
+
enqueue(options) {
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
const request = {
|
|
25
|
+
id: randomUUID(),
|
|
26
|
+
agentId: options.agentId,
|
|
27
|
+
mascot: options.mascot,
|
|
28
|
+
type: options.type,
|
|
29
|
+
prompt: options.prompt,
|
|
30
|
+
options: options.options,
|
|
31
|
+
context: options.context,
|
|
32
|
+
createdAt: new Date(),
|
|
33
|
+
resolve,
|
|
34
|
+
reject,
|
|
35
|
+
};
|
|
36
|
+
this.requests.set(request.id, request);
|
|
37
|
+
this.emit('request-added', request);
|
|
38
|
+
this.emit('count-changed', this.requests.size);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get the number of pending requests.
|
|
43
|
+
*/
|
|
44
|
+
getCount() {
|
|
45
|
+
return this.requests.size;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get all pending requests (for overlay display).
|
|
49
|
+
*/
|
|
50
|
+
getAll() {
|
|
51
|
+
return Array.from(this.requests.values()).sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get a specific request by ID.
|
|
55
|
+
*/
|
|
56
|
+
get(id) {
|
|
57
|
+
return this.requests.get(id);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get requests for a specific agent.
|
|
61
|
+
*/
|
|
62
|
+
getByAgent(agentId) {
|
|
63
|
+
return this.getAll().filter(r => r.agentId === agentId);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Respond to a pending request (approve/answer).
|
|
67
|
+
* This resolves the promise returned by enqueue().
|
|
68
|
+
*
|
|
69
|
+
* @param id - Request ID
|
|
70
|
+
* @param response - User's response
|
|
71
|
+
*/
|
|
72
|
+
respond(id, response) {
|
|
73
|
+
const request = this.requests.get(id);
|
|
74
|
+
if (!request) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
// Remove from queue
|
|
78
|
+
this.requests.delete(id);
|
|
79
|
+
// Resolve the promise
|
|
80
|
+
request.resolve(response);
|
|
81
|
+
// Emit events
|
|
82
|
+
this.emit('request-resolved', id, response);
|
|
83
|
+
this.emit('count-changed', this.requests.size);
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Reject/cancel a pending request.
|
|
88
|
+
* This rejects the promise returned by enqueue().
|
|
89
|
+
*
|
|
90
|
+
* @param id - Request ID
|
|
91
|
+
* @param reason - Rejection reason
|
|
92
|
+
*/
|
|
93
|
+
reject(id, reason = 'Request cancelled') {
|
|
94
|
+
const request = this.requests.get(id);
|
|
95
|
+
if (!request) {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
// Remove from queue
|
|
99
|
+
this.requests.delete(id);
|
|
100
|
+
// Reject the promise
|
|
101
|
+
const error = new Error(reason);
|
|
102
|
+
request.reject(error);
|
|
103
|
+
// Emit events
|
|
104
|
+
this.emit('request-rejected', id, error);
|
|
105
|
+
this.emit('count-changed', this.requests.size);
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Reject all requests for a specific agent.
|
|
110
|
+
* Called when an agent is killed/cancelled.
|
|
111
|
+
*
|
|
112
|
+
* @param agentId - Agent ID
|
|
113
|
+
* @param reason - Rejection reason
|
|
114
|
+
*/
|
|
115
|
+
rejectAllForAgent(agentId, reason = 'Agent cancelled') {
|
|
116
|
+
const agentRequests = this.getByAgent(agentId);
|
|
117
|
+
for (const request of agentRequests) {
|
|
118
|
+
this.reject(request.id, reason);
|
|
119
|
+
}
|
|
120
|
+
return agentRequests.length;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Clear all pending requests.
|
|
124
|
+
*/
|
|
125
|
+
clear() {
|
|
126
|
+
for (const request of this.requests.values()) {
|
|
127
|
+
request.reject(new Error('All requests cleared'));
|
|
128
|
+
}
|
|
129
|
+
this.requests.clear();
|
|
130
|
+
this.emit('count-changed', 0);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// =============================================================================
|
|
134
|
+
// Singleton Instance
|
|
135
|
+
// =============================================================================
|
|
136
|
+
let instance = null;
|
|
137
|
+
/**
|
|
138
|
+
* Get the singleton PendingRequestsManager instance.
|
|
139
|
+
*/
|
|
140
|
+
export function getPendingRequestsManager() {
|
|
141
|
+
if (!instance) {
|
|
142
|
+
instance = new PendingRequestsManager();
|
|
143
|
+
}
|
|
144
|
+
return instance;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Reset the singleton (for testing).
|
|
148
|
+
*/
|
|
149
|
+
export function resetPendingRequestsManager() {
|
|
150
|
+
if (instance) {
|
|
151
|
+
instance.clear();
|
|
152
|
+
instance.removeAllListeners();
|
|
153
|
+
}
|
|
154
|
+
instance = null;
|
|
155
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionRegistry - Multi-terminal session awareness
|
|
3
|
+
*
|
|
4
|
+
* Manages this terminal's session lifecycle in a shared SQLite table.
|
|
5
|
+
* Each CLI instance registers on startup, heartbeats periodically,
|
|
6
|
+
* and unregisters on shutdown. Other instances can query active sessions.
|
|
7
|
+
*
|
|
8
|
+
* Uses the shared projects.db with WAL mode for concurrent access.
|
|
9
|
+
*/
|
|
10
|
+
import type Database from 'better-sqlite3';
|
|
11
|
+
import { type TerminalSessionRecord } from '../db/index.js';
|
|
12
|
+
export interface AgentDescriptor {
|
|
13
|
+
id: string;
|
|
14
|
+
displayName: string;
|
|
15
|
+
mascot: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Get the current SessionRegistry instance (null if not initialized)
|
|
19
|
+
*/
|
|
20
|
+
export declare function getSessionRegistry(): SessionRegistry | null;
|
|
21
|
+
/**
|
|
22
|
+
* Initialize and return the SessionRegistry singleton.
|
|
23
|
+
* @param sessionsBasePath - Optional base path for session files (e.g., ~/.compilr-dev/sessions).
|
|
24
|
+
* Used for session file cleanup when terminals unregister.
|
|
25
|
+
*/
|
|
26
|
+
export declare function initSessionRegistry(sessionsBasePath?: string): SessionRegistry;
|
|
27
|
+
/**
|
|
28
|
+
* Get the active terminal session ID for this process
|
|
29
|
+
*/
|
|
30
|
+
export declare function getActiveTerminalSessionId(): string | null;
|
|
31
|
+
/**
|
|
32
|
+
* Set the active terminal session ID for this process
|
|
33
|
+
*/
|
|
34
|
+
export declare function setActiveTerminalSessionId(id: string | null): void;
|
|
35
|
+
export declare class SessionRegistry {
|
|
36
|
+
private sessionId;
|
|
37
|
+
private currentProjectId;
|
|
38
|
+
private heartbeatInterval;
|
|
39
|
+
private countCheckInterval;
|
|
40
|
+
private readonly db;
|
|
41
|
+
private readonly sessionsBasePath;
|
|
42
|
+
private lastKnownCount;
|
|
43
|
+
private onCountChangeCallback;
|
|
44
|
+
constructor(db: Database.Database, sessionsBasePath?: string);
|
|
45
|
+
/**
|
|
46
|
+
* Set a callback invoked when the active session count changes.
|
|
47
|
+
* Used by the footer to trigger a re-render when terminals join/leave.
|
|
48
|
+
*/
|
|
49
|
+
onCountChange(callback: (count: number) => void): void;
|
|
50
|
+
/**
|
|
51
|
+
* Register this terminal in the session registry.
|
|
52
|
+
* Cleans up stale sessions, then inserts a new row.
|
|
53
|
+
* Returns the session ID.
|
|
54
|
+
*/
|
|
55
|
+
register(projectId: number | null, label?: string): string;
|
|
56
|
+
/**
|
|
57
|
+
* Unregister this terminal from the session registry.
|
|
58
|
+
* Stops heartbeat and deletes the row.
|
|
59
|
+
*/
|
|
60
|
+
unregister(): void;
|
|
61
|
+
/**
|
|
62
|
+
* Update the agent roster for this terminal session
|
|
63
|
+
*/
|
|
64
|
+
updateAgents(agents: AgentDescriptor[]): void;
|
|
65
|
+
/**
|
|
66
|
+
* Set the currently active agent for this terminal session
|
|
67
|
+
*/
|
|
68
|
+
setActiveAgent(agentId: string): void;
|
|
69
|
+
/**
|
|
70
|
+
* Get the project-scoped active session count.
|
|
71
|
+
* Returns the count scoped to this terminal's current project,
|
|
72
|
+
* or global count if no project is set.
|
|
73
|
+
* Used by footer rendering to show the correct terminal count.
|
|
74
|
+
*/
|
|
75
|
+
getProjectScopedSessionCount(): number;
|
|
76
|
+
/**
|
|
77
|
+
* Update the project ID for this terminal session.
|
|
78
|
+
* Called when the user switches projects.
|
|
79
|
+
* Triggers an immediate count re-check for the new project scope.
|
|
80
|
+
*/
|
|
81
|
+
updateProjectId(projectId: number | null): void;
|
|
82
|
+
/**
|
|
83
|
+
* Get all active sessions, optionally filtered by project.
|
|
84
|
+
* Pass undefined to get all sessions regardless of project.
|
|
85
|
+
*/
|
|
86
|
+
getActiveSessions(projectId?: number | null): TerminalSessionRecord[];
|
|
87
|
+
/**
|
|
88
|
+
* Get the count of active sessions, optionally filtered by project.
|
|
89
|
+
* Pass undefined to count all sessions.
|
|
90
|
+
*/
|
|
91
|
+
getActiveSessionCount(projectId?: number | null): number;
|
|
92
|
+
/**
|
|
93
|
+
* Clean up stale and dead sessions.
|
|
94
|
+
* A session is stale if its last heartbeat is older than the threshold.
|
|
95
|
+
* A session is dead if its PID no longer exists.
|
|
96
|
+
* Returns the count of sessions cleaned.
|
|
97
|
+
*/
|
|
98
|
+
cleanupStale(): number;
|
|
99
|
+
/**
|
|
100
|
+
* Get all agent IDs in use by other terminals (excluding self).
|
|
101
|
+
* Optionally filtered to the same project.
|
|
102
|
+
* Used for cross-terminal collision detection.
|
|
103
|
+
*/
|
|
104
|
+
getGlobalAgentIds(projectId?: number | null): string[];
|
|
105
|
+
/**
|
|
106
|
+
* Clean up orphaned session files for all stale sessions.
|
|
107
|
+
* Scans project directories under sessionsBasePath for terminal-scoped files
|
|
108
|
+
* whose session prefix is not in the active set.
|
|
109
|
+
* Returns the count of files cleaned.
|
|
110
|
+
*/
|
|
111
|
+
cleanupSessionFiles(): number;
|
|
112
|
+
/**
|
|
113
|
+
* Clean up transient session files for a specific session prefix in all project directories.
|
|
114
|
+
* Preserves current-{prefix}.json files so they remain available for /resume.
|
|
115
|
+
*/
|
|
116
|
+
private cleanupSessionFilesForPrefix;
|
|
117
|
+
/**
|
|
118
|
+
* Clean up orphaned transient session files in a single project directory.
|
|
119
|
+
* Preserves current-*.json files so they remain available for /resume.
|
|
120
|
+
* Returns count of files removed.
|
|
121
|
+
*/
|
|
122
|
+
private cleanupOrphanFilesInDir;
|
|
123
|
+
/**
|
|
124
|
+
* Send a heartbeat (update last_heartbeat timestamp).
|
|
125
|
+
* Also opportunistically clean up stale sessions.
|
|
126
|
+
*/
|
|
127
|
+
private heartbeat;
|
|
128
|
+
/**
|
|
129
|
+
* Check if the active session count changed and notify listener.
|
|
130
|
+
* Runs on a 5s interval — lightweight SELECT COUNT query.
|
|
131
|
+
* Scoped to current project for project-aware terminal count.
|
|
132
|
+
*/
|
|
133
|
+
private checkCountChange;
|
|
134
|
+
/**
|
|
135
|
+
* Generate a label like "Terminal 1", "Terminal 2" using the next available number.
|
|
136
|
+
* Avoids duplicates by checking which numbers are already in use.
|
|
137
|
+
*/
|
|
138
|
+
private generateLabel;
|
|
139
|
+
}
|