@compilr-dev/cli 0.4.0 → 0.5.1
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/README.md +254 -68
- 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 +134 -4
- package/dist/agent.js +345 -166
- package/dist/anchors/index.d.ts +9 -0
- package/dist/anchors/index.js +9 -0
- package/dist/anchors/project-anchors.d.ts +79 -0
- package/dist/anchors/project-anchors.js +202 -0
- 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/index.d.ts +2 -1
- 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.d.ts +13 -0
- package/dist/commands-v2/handlers/context.js +533 -0
- package/dist/commands-v2/handlers/core.d.ts +14 -0
- package/dist/commands-v2/handlers/core.js +290 -0
- package/dist/commands-v2/handlers/debug.d.ts +11 -0
- package/dist/commands-v2/handlers/debug.js +177 -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 +25 -0
- package/dist/commands-v2/handlers/index.js +63 -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.d.ts +22 -0
- package/dist/commands-v2/handlers/project.js +1035 -0
- 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 +17 -0
- package/dist/commands-v2/handlers/settings.js +417 -0
- 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 +14 -0
- package/dist/commands-v2/index.js +18 -0
- package/dist/commands-v2/registry.d.ts +52 -0
- package/dist/commands-v2/registry.js +114 -0
- package/dist/commands-v2/types.d.ts +153 -0
- package/dist/commands-v2/types.js +7 -0
- package/dist/commands.js +123 -7
- 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 +5 -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 +615 -179
- package/dist/input-handlers/index.d.ts +7 -0
- package/dist/input-handlers/index.js +7 -0
- package/dist/input-handlers/memory-handler.d.ts +26 -0
- package/dist/input-handlers/memory-handler.js +69 -0
- 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.d.ts +63 -0
- package/dist/repl-helpers.js +319 -0
- package/dist/repl-v2.d.ts +554 -0
- package/dist/repl-v2.js +3286 -0
- 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 +156 -13
- package/dist/settings/index.js +377 -24
- package/dist/settings/mcp-config.d.ts +76 -0
- package/dist/settings/mcp-config.js +143 -0
- package/dist/settings/paths.d.ts +114 -0
- package/dist/settings/paths.js +270 -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 -58
- package/dist/templates/config-json.d.ts +1 -25
- package/dist/templates/index.d.ts +2 -0
- package/dist/templates/index.js +35 -75
- package/dist/themes/colors.js +3 -1
- package/dist/themes/registry.d.ts +5 -36
- package/dist/themes/registry.js +11 -95
- package/dist/themes/types.d.ts +3 -38
- package/dist/themes/types.js +2 -2
- package/dist/tool-names.d.ts +108 -0
- package/dist/tool-names.js +227 -0
- package/dist/tools/anchor-tools.d.ts +31 -0
- package/dist/tools/anchor-tools.js +255 -0
- package/dist/tools/artifact-tools.d.ts +42 -0
- package/dist/tools/artifact-tools.js +328 -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-wrappers.d.ts +56 -0
- package/dist/tools/backlog-wrappers.js +353 -0
- package/dist/tools/backlog.d.ts +2 -2
- package/dist/tools/backlog.js +2 -2
- package/dist/tools/db-tools.d.ts +12 -0
- package/dist/tools/db-tools.js +14 -0
- 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/document-db.d.ts +43 -0
- package/dist/tools/document-db.js +220 -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/plan-tools.d.ts +54 -0
- package/dist/tools/plan-tools.js +338 -0
- package/dist/tools/platform-adapter.d.ts +29 -0
- package/dist/tools/platform-adapter.js +394 -0
- package/dist/tools/project-db.d.ts +34 -0
- package/dist/tools/project-db.js +39 -0
- package/dist/tools/recall-work-tool.d.ts +18 -0
- package/dist/tools/recall-work-tool.js +82 -0
- package/dist/tools/workitem-db.d.ts +135 -0
- package/dist/tools/workitem-db.js +730 -0
- package/dist/tools.d.ts +67 -2
- package/dist/tools.js +238 -38
- package/dist/ui/ask-user-overlay.d.ts +2 -2
- package/dist/ui/ask-user-overlay.js +443 -535
- package/dist/ui/ask-user-simple-overlay.d.ts +2 -2
- package/dist/ui/ask-user-simple-overlay.js +182 -209
- package/dist/ui/autocomplete-controller.d.ts +42 -0
- package/dist/ui/autocomplete-controller.js +384 -0
- package/dist/ui/base/index.d.ts +26 -0
- package/dist/ui/base/index.js +33 -0
- package/dist/ui/base/inline-overlay-utils.d.ts +217 -0
- package/dist/ui/base/inline-overlay-utils.js +320 -0
- package/dist/ui/base/inline-overlay.d.ts +159 -0
- package/dist/ui/base/inline-overlay.js +257 -0
- package/dist/ui/base/key-utils.d.ts +15 -0
- package/dist/ui/base/key-utils.js +30 -0
- package/dist/ui/base/overlay-base-v2.d.ts +203 -0
- package/dist/ui/base/overlay-base-v2.js +260 -0
- package/dist/ui/base/overlay-base.d.ts +156 -0
- package/dist/ui/base/overlay-base.js +238 -0
- package/dist/ui/base/overlay-lifecycle.d.ts +65 -0
- package/dist/ui/base/overlay-lifecycle.js +159 -0
- package/dist/ui/base/overlay-types.d.ts +185 -0
- package/dist/ui/base/overlay-types.js +7 -0
- package/dist/ui/base/render-utils.d.ts +27 -0
- package/dist/ui/base/render-utils.js +36 -0
- package/dist/ui/base/screen-stack.d.ts +148 -0
- package/dist/ui/base/screen-stack.js +184 -0
- package/dist/ui/base/tabbed-list-overlay-v2.d.ts +118 -0
- package/dist/ui/base/tabbed-list-overlay-v2.js +335 -0
- package/dist/ui/base/tabbed-list-overlay.d.ts +153 -0
- package/dist/ui/base/tabbed-list-overlay.js +369 -0
- package/dist/ui/constants/labels.d.ts +14 -0
- package/dist/ui/constants/labels.js +51 -0
- package/dist/ui/conversation-store.d.ts +55 -0
- package/dist/ui/conversation-store.js +107 -0
- package/dist/ui/conversation.d.ts +75 -4
- package/dist/ui/conversation.js +376 -165
- package/dist/ui/diff.d.ts +7 -1
- package/dist/ui/diff.js +85 -48
- package/dist/ui/ephemeral.d.ts +1 -1
- package/dist/ui/ephemeral.js +4 -10
- package/dist/ui/features/index.d.ts +34 -0
- package/dist/ui/features/index.js +34 -0
- package/dist/ui/features/input-feature.d.ts +85 -0
- package/dist/ui/features/input-feature.js +238 -0
- package/dist/ui/features/list-feature.d.ts +155 -0
- package/dist/ui/features/list-feature.js +244 -0
- package/dist/ui/features/pagination-feature.d.ts +154 -0
- package/dist/ui/features/pagination-feature.js +238 -0
- package/dist/ui/features/search-feature.d.ts +148 -0
- package/dist/ui/features/search-feature.js +185 -0
- package/dist/ui/features/tab-feature.d.ts +194 -0
- package/dist/ui/features/tab-feature.js +307 -0
- 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 +181 -7
- package/dist/ui/footer.js +523 -74
- package/dist/ui/guardrail-overlay.d.ts +29 -0
- package/dist/ui/guardrail-overlay.js +145 -0
- package/dist/ui/index.d.ts +1 -1
- package/dist/ui/index.js +1 -3
- package/dist/ui/input-controller.d.ts +51 -0
- package/dist/ui/input-controller.js +176 -0
- package/dist/ui/input-prompt.d.ts +135 -33
- package/dist/ui/input-prompt.js +728 -337
- package/dist/ui/iteration-limit-overlay.d.ts +2 -2
- package/dist/ui/iteration-limit-overlay.js +92 -128
- package/dist/ui/keyboard-handler.d.ts +57 -0
- package/dist/ui/keyboard-handler.js +557 -0
- package/dist/ui/keys-overlay.d.ts +1 -0
- package/dist/ui/keys-overlay.js +203 -141
- package/dist/ui/line-utils.d.ts +88 -0
- package/dist/ui/line-utils.js +150 -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 +157 -0
- package/dist/ui/live-region.js +379 -0
- package/dist/ui/mascot/expressions.d.ts +32 -0
- package/dist/ui/mascot/expressions.js +213 -0
- package/dist/ui/mascot/index.d.ts +8 -0
- package/dist/ui/mascot/index.js +8 -0
- package/dist/ui/mascot/renderer.d.ts +19 -0
- package/dist/ui/mascot/renderer.js +132 -0
- 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.d.ts +45 -0
- package/dist/ui/overlay/impl/agents-overlay-v2.js +814 -0
- package/dist/ui/overlay/impl/anchors-overlay-v2.d.ts +47 -0
- package/dist/ui/overlay/impl/anchors-overlay-v2.js +749 -0
- package/dist/ui/overlay/impl/arch-type-overlay-v2.d.ts +37 -0
- package/dist/ui/overlay/impl/arch-type-overlay-v2.js +240 -0
- 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.d.ts +72 -0
- package/dist/ui/overlay/impl/ask-user-overlay-v2.js +581 -0
- package/dist/ui/overlay/impl/ask-user-simple-overlay-v2.d.ts +46 -0
- package/dist/ui/overlay/impl/ask-user-simple-overlay-v2.js +204 -0
- 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 +52 -0
- package/dist/ui/overlay/impl/backlog-overlay-v2.js +681 -0
- 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.d.ts +33 -0
- package/dist/ui/overlay/impl/commands-overlay-v2.js +439 -0
- package/dist/ui/overlay/impl/config-overlay-v2.d.ts +111 -0
- package/dist/ui/overlay/impl/config-overlay-v2.js +718 -0
- 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 +57 -0
- package/dist/ui/overlay/impl/dashboard-overlay-v2.js +382 -0
- 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.d.ts +45 -0
- package/dist/ui/overlay/impl/docs-overlay-v2.js +117 -0
- package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +84 -0
- package/dist/ui/overlay/impl/document-detail-overlay-v2.js +1112 -0
- 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/guardrail-overlay-v2.d.ts +43 -0
- package/dist/ui/overlay/impl/guardrail-overlay-v2.js +114 -0
- package/dist/ui/overlay/impl/help-overlay-v2.d.ts +57 -0
- package/dist/ui/overlay/impl/help-overlay-v2.js +287 -0
- package/dist/ui/overlay/impl/init-setup-overlay-v2.d.ts +25 -0
- package/dist/ui/overlay/impl/init-setup-overlay-v2.js +97 -0
- package/dist/ui/overlay/impl/iteration-limit-overlay-v2.d.ts +35 -0
- package/dist/ui/overlay/impl/iteration-limit-overlay-v2.js +105 -0
- package/dist/ui/overlay/impl/keys-overlay-v2.d.ts +41 -0
- package/dist/ui/overlay/impl/keys-overlay-v2.js +248 -0
- 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/mascot-overlay-v2.d.ts +41 -0
- package/dist/ui/overlay/impl/mascot-overlay-v2.js +138 -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 +93 -0
- package/dist/ui/overlay/impl/model-overlay-v2.js +1143 -0
- package/dist/ui/overlay/impl/model-warning-overlay-v2.d.ts +46 -0
- package/dist/ui/overlay/impl/model-warning-overlay-v2.js +132 -0
- package/dist/ui/overlay/impl/new-overlay-v2.d.ts +108 -0
- package/dist/ui/overlay/impl/new-overlay-v2.js +1243 -0
- 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.d.ts +36 -0
- package/dist/ui/overlay/impl/permission-overlay-v2.js +380 -0
- 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 +37 -0
- package/dist/ui/overlay/impl/projects-overlay-v2.js +733 -0
- 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/theme-overlay-v2.d.ts +42 -0
- package/dist/ui/overlay/impl/theme-overlay-v2.js +135 -0
- package/dist/ui/overlay/impl/tools-overlay-v2.d.ts +47 -0
- package/dist/ui/overlay/impl/tools-overlay-v2.js +214 -0
- package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +45 -0
- package/dist/ui/overlay/impl/tutorial-overlay-v2.js +212 -0
- package/dist/ui/overlay/impl/workflow-overlay-v2.d.ts +80 -0
- package/dist/ui/overlay/impl/workflow-overlay-v2.js +641 -0
- package/dist/ui/overlay/index.d.ts +52 -0
- package/dist/ui/overlay/index.js +54 -0
- package/dist/ui/overlay/key-utils.d.ts +6 -0
- package/dist/ui/overlay/key-utils.js +6 -0
- package/dist/ui/overlay/types.d.ts +140 -0
- package/dist/ui/overlay/types.js +22 -0
- package/dist/ui/overlay-manager.d.ts +43 -0
- package/dist/ui/overlay-manager.js +238 -0
- package/dist/ui/overlays.d.ts +0 -4
- package/dist/ui/overlays.js +4 -460
- package/dist/ui/permission-overlay.d.ts +1 -1
- package/dist/ui/permission-overlay.js +189 -300
- package/dist/ui/providers/types.d.ts +178 -0
- package/dist/ui/providers/types.js +9 -0
- package/dist/ui/render-modes.d.ts +36 -0
- package/dist/ui/render-modes.js +44 -0
- package/dist/ui/startup-menu.d.ts +36 -0
- package/dist/ui/startup-menu.js +236 -0
- package/dist/ui/status-bar-controller.d.ts +33 -0
- package/dist/ui/status-bar-controller.js +99 -0
- package/dist/ui/subagent-renderer.d.ts +117 -0
- package/dist/ui/subagent-renderer.js +318 -0
- package/dist/ui/terminal-autocomplete-utils.d.ts +23 -0
- package/dist/ui/terminal-autocomplete-utils.js +83 -0
- package/dist/ui/terminal-codes.d.ts +94 -0
- package/dist/ui/terminal-codes.js +124 -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 +220 -0
- package/dist/ui/terminal-renderer.js +750 -0
- package/dist/ui/terminal-types.d.ts +179 -0
- package/dist/ui/terminal-types.js +34 -0
- package/dist/ui/terminal-ui.d.ts +331 -0
- package/dist/ui/terminal-ui.js +819 -0
- package/dist/ui/terminal.d.ts +20 -0
- package/dist/ui/terminal.js +72 -0
- package/dist/ui/todo-zone.d.ts +19 -1
- package/dist/ui/todo-zone.js +124 -38
- package/dist/ui/tool-formatters.d.ts +16 -0
- package/dist/ui/tool-formatters.js +1027 -0
- 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/debug-log.d.ts +28 -0
- package/dist/utils/debug-log.js +57 -0
- 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 +39 -17
- package/dist/utils/open-browser.d.ts +5 -0
- package/dist/utils/open-browser.js +32 -0
- package/dist/utils/path-safety.d.ts +56 -0
- package/dist/utils/path-safety.js +240 -0
- 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/dist/workflow/guided-mode-injector.d.ts +42 -0
- package/dist/workflow/guided-mode-injector.js +191 -0
- package/dist/workflow/index.d.ts +8 -0
- package/dist/workflow/index.js +8 -0
- package/dist/workflow/step-criteria.d.ts +62 -0
- package/dist/workflow/step-criteria.js +150 -0
- package/dist/workflow/step-tracker.d.ts +92 -0
- package/dist/workflow/step-tracker.js +141 -0
- package/package.json +32 -12
- package/dist/index.old.d.ts +0 -7
- package/dist/index.old.js +0 -1014
- package/dist/repl.d.ts +0 -121
- package/dist/repl.js +0 -1878
- 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/ui/agents-overlay.d.ts +0 -12
- package/dist/ui/agents-overlay.js +0 -501
- package/dist/ui/arch-type-overlay.d.ts +0 -20
- package/dist/ui/arch-type-overlay.js +0 -229
- package/dist/ui/backlog-overlay.d.ts +0 -17
- package/dist/ui/backlog-overlay.js +0 -786
- package/dist/ui/commands-overlay.d.ts +0 -11
- package/dist/ui/commands-overlay.js +0 -410
- package/dist/ui/config-overlay.d.ts +0 -34
- package/dist/ui/config-overlay.js +0 -977
- package/dist/ui/init-overlay.d.ts +0 -24
- package/dist/ui/init-overlay.js +0 -525
- package/dist/ui/input-prompt-v2.d.ts +0 -179
- package/dist/ui/input-prompt-v2.js +0 -991
- package/dist/ui/model-warning-overlay.d.ts +0 -30
- package/dist/ui/model-warning-overlay.js +0 -171
- package/dist/ui/tools-overlay.d.ts +0 -26
- package/dist/ui/tools-overlay.js +0 -278
- package/dist/ui/tutorial-overlay.d.ts +0 -10
- package/dist/ui/tutorial-overlay.js +0 -936
|
@@ -0,0 +1,514 @@
|
|
|
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 * as crypto from 'node:crypto';
|
|
11
|
+
import * as fs from 'node:fs';
|
|
12
|
+
import * as path from 'node:path';
|
|
13
|
+
import { getDb } from '../db/index.js';
|
|
14
|
+
import { getFileLockManager } from './file-locks.js';
|
|
15
|
+
import { getNotificationManager } from './notification-manager.js';
|
|
16
|
+
import { cleanupSessionDiffs } from '../ui/vscode-diff-ipc.js';
|
|
17
|
+
// =============================================================================
|
|
18
|
+
// Module-level accessors
|
|
19
|
+
// =============================================================================
|
|
20
|
+
let _registry = null;
|
|
21
|
+
/**
|
|
22
|
+
* Get the current SessionRegistry instance (null if not initialized)
|
|
23
|
+
*/
|
|
24
|
+
export function getSessionRegistry() {
|
|
25
|
+
return _registry;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Initialize and return the SessionRegistry singleton.
|
|
29
|
+
* @param sessionsBasePath - Optional base path for session files (e.g., ~/.compilr-dev/sessions).
|
|
30
|
+
* Used for session file cleanup when terminals unregister.
|
|
31
|
+
*/
|
|
32
|
+
export function initSessionRegistry(sessionsBasePath) {
|
|
33
|
+
if (!_registry) {
|
|
34
|
+
_registry = new SessionRegistry(getDb(), sessionsBasePath);
|
|
35
|
+
}
|
|
36
|
+
return _registry;
|
|
37
|
+
}
|
|
38
|
+
let _activeTerminalSessionId = null;
|
|
39
|
+
/**
|
|
40
|
+
* Get the active terminal session ID for this process
|
|
41
|
+
*/
|
|
42
|
+
export function getActiveTerminalSessionId() {
|
|
43
|
+
return _activeTerminalSessionId;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Set the active terminal session ID for this process
|
|
47
|
+
*/
|
|
48
|
+
export function setActiveTerminalSessionId(id) {
|
|
49
|
+
_activeTerminalSessionId = id;
|
|
50
|
+
}
|
|
51
|
+
// =============================================================================
|
|
52
|
+
// Constants
|
|
53
|
+
// =============================================================================
|
|
54
|
+
const HEARTBEAT_INTERVAL_MS = 30_000; // 30 seconds
|
|
55
|
+
const STALE_THRESHOLD_MS = 120_000; // 2 minutes
|
|
56
|
+
const COUNT_CHECK_INTERVAL_MS = 5_000; // 5 seconds — lightweight DB poll for count changes
|
|
57
|
+
// =============================================================================
|
|
58
|
+
// SessionRegistry
|
|
59
|
+
// =============================================================================
|
|
60
|
+
/**
|
|
61
|
+
* Regex pattern for TRANSIENT session files that can be cleaned up on exit.
|
|
62
|
+
* Session files (current-*, team-*, agent-*, shared-context-*) all persist
|
|
63
|
+
* for resume and team restore. Only shared-context is truly transient — it's
|
|
64
|
+
* rebuilt from the team on load.
|
|
65
|
+
*/
|
|
66
|
+
const TRANSIENT_FILE_PATTERN = /^shared-context-([a-f0-9]{8})\.json$/;
|
|
67
|
+
export class SessionRegistry {
|
|
68
|
+
sessionId = null;
|
|
69
|
+
currentProjectId = null;
|
|
70
|
+
heartbeatInterval = null;
|
|
71
|
+
countCheckInterval = null;
|
|
72
|
+
db;
|
|
73
|
+
sessionsBasePath;
|
|
74
|
+
lastKnownCount = 0;
|
|
75
|
+
onCountChangeCallback = null;
|
|
76
|
+
constructor(db, sessionsBasePath) {
|
|
77
|
+
this.db = db;
|
|
78
|
+
this.sessionsBasePath = sessionsBasePath ?? null;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Set a callback invoked when the active session count changes.
|
|
82
|
+
* Used by the footer to trigger a re-render when terminals join/leave.
|
|
83
|
+
*/
|
|
84
|
+
onCountChange(callback) {
|
|
85
|
+
this.onCountChangeCallback = callback;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Register this terminal in the session registry.
|
|
89
|
+
* Cleans up stale sessions, then inserts a new row.
|
|
90
|
+
* Returns the session ID.
|
|
91
|
+
*/
|
|
92
|
+
register(projectId, label) {
|
|
93
|
+
// Clean up stale/dead sessions first
|
|
94
|
+
this.cleanupStale();
|
|
95
|
+
this.sessionId = crypto.randomUUID();
|
|
96
|
+
this.currentProjectId = projectId;
|
|
97
|
+
const pid = process.pid;
|
|
98
|
+
const ttyPath = process.stdin.isTTY
|
|
99
|
+
? (process.env.TTY || 'unknown')
|
|
100
|
+
: 'pipe';
|
|
101
|
+
// Auto-assign label based on active session count
|
|
102
|
+
const assignedLabel = label ?? this.generateLabel(projectId);
|
|
103
|
+
this.db.prepare(`
|
|
104
|
+
INSERT INTO terminal_sessions (id, project_id, pid, tty_path, label, active_agent, agents_json, status)
|
|
105
|
+
VALUES (?, ?, ?, ?, ?, 'default', '[]', 'active')
|
|
106
|
+
`).run(this.sessionId, projectId, pid, ttyPath, assignedLabel);
|
|
107
|
+
// Track initial count (after our own registration), scoped to project
|
|
108
|
+
this.lastKnownCount = this.currentProjectId !== null
|
|
109
|
+
? this.getActiveSessionCount(this.currentProjectId)
|
|
110
|
+
: this.getActiveSessionCount();
|
|
111
|
+
// Start heartbeat (30s — updates last_heartbeat + stale cleanup)
|
|
112
|
+
this.heartbeatInterval = setInterval(() => {
|
|
113
|
+
this.heartbeat();
|
|
114
|
+
}, HEARTBEAT_INTERVAL_MS);
|
|
115
|
+
this.heartbeatInterval.unref();
|
|
116
|
+
// Start count-check interval (5s — lightweight SELECT COUNT to detect joins/leaves)
|
|
117
|
+
this.countCheckInterval = setInterval(() => {
|
|
118
|
+
this.checkCountChange();
|
|
119
|
+
}, COUNT_CHECK_INTERVAL_MS);
|
|
120
|
+
this.countCheckInterval.unref();
|
|
121
|
+
return this.sessionId;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Unregister this terminal from the session registry.
|
|
125
|
+
* Stops heartbeat and deletes the row.
|
|
126
|
+
*/
|
|
127
|
+
unregister() {
|
|
128
|
+
if (this.heartbeatInterval) {
|
|
129
|
+
clearInterval(this.heartbeatInterval);
|
|
130
|
+
this.heartbeatInterval = null;
|
|
131
|
+
}
|
|
132
|
+
if (this.countCheckInterval) {
|
|
133
|
+
clearInterval(this.countCheckInterval);
|
|
134
|
+
this.countCheckInterval = null;
|
|
135
|
+
}
|
|
136
|
+
if (this.sessionId) {
|
|
137
|
+
const sessionPrefix = this.sessionId.slice(0, 8);
|
|
138
|
+
// Release file locks before deleting the session row
|
|
139
|
+
// (CASCADE handles this at DB level too, but explicit is cleaner)
|
|
140
|
+
const lockManager = getFileLockManager();
|
|
141
|
+
if (lockManager) {
|
|
142
|
+
lockManager.releaseSessionLocks(this.sessionId);
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
this.db.prepare('DELETE FROM terminal_sessions WHERE id = ?').run(this.sessionId);
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// Best effort — DB may already be closed
|
|
149
|
+
}
|
|
150
|
+
// Clean up own session files
|
|
151
|
+
if (this.sessionsBasePath) {
|
|
152
|
+
this.cleanupSessionFilesForPrefix(sessionPrefix);
|
|
153
|
+
}
|
|
154
|
+
// Clean up VS Code diff IPC files for this session
|
|
155
|
+
cleanupSessionDiffs(sessionPrefix);
|
|
156
|
+
this.sessionId = null;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Update the agent roster for this terminal session
|
|
161
|
+
*/
|
|
162
|
+
updateAgents(agents) {
|
|
163
|
+
if (!this.sessionId)
|
|
164
|
+
return;
|
|
165
|
+
try {
|
|
166
|
+
this.db.prepare('UPDATE terminal_sessions SET agents_json = ? WHERE id = ?')
|
|
167
|
+
.run(JSON.stringify(agents), this.sessionId);
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
// Best effort
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Set the currently active agent for this terminal session
|
|
175
|
+
*/
|
|
176
|
+
setActiveAgent(agentId) {
|
|
177
|
+
if (!this.sessionId)
|
|
178
|
+
return;
|
|
179
|
+
try {
|
|
180
|
+
this.db.prepare('UPDATE terminal_sessions SET active_agent = ? WHERE id = ?')
|
|
181
|
+
.run(agentId, this.sessionId);
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
// Best effort
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Get the project-scoped active session count.
|
|
189
|
+
* Returns the count scoped to this terminal's current project,
|
|
190
|
+
* or global count if no project is set.
|
|
191
|
+
* Used by footer rendering to show the correct terminal count.
|
|
192
|
+
*/
|
|
193
|
+
getProjectScopedSessionCount() {
|
|
194
|
+
return this.currentProjectId !== null
|
|
195
|
+
? this.getActiveSessionCount(this.currentProjectId)
|
|
196
|
+
: this.getActiveSessionCount();
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Update the project ID for this terminal session.
|
|
200
|
+
* Called when the user switches projects.
|
|
201
|
+
* Triggers an immediate count re-check for the new project scope.
|
|
202
|
+
*/
|
|
203
|
+
updateProjectId(projectId) {
|
|
204
|
+
if (!this.sessionId)
|
|
205
|
+
return;
|
|
206
|
+
try {
|
|
207
|
+
this.db.prepare('UPDATE terminal_sessions SET project_id = ? WHERE id = ?')
|
|
208
|
+
.run(projectId, this.sessionId);
|
|
209
|
+
this.currentProjectId = projectId;
|
|
210
|
+
// Trigger immediate count re-check for new project scope
|
|
211
|
+
this.checkCountChange();
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
// Best effort
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Get all active sessions, optionally filtered by project.
|
|
219
|
+
* Pass undefined to get all sessions regardless of project.
|
|
220
|
+
*/
|
|
221
|
+
getActiveSessions(projectId) {
|
|
222
|
+
try {
|
|
223
|
+
if (projectId === undefined) {
|
|
224
|
+
return this.db.prepare(`SELECT * FROM terminal_sessions WHERE status = 'active' ORDER BY started_at`).all();
|
|
225
|
+
}
|
|
226
|
+
if (projectId === null) {
|
|
227
|
+
return this.db.prepare(`SELECT * FROM terminal_sessions WHERE status = 'active' AND project_id IS NULL ORDER BY started_at`).all();
|
|
228
|
+
}
|
|
229
|
+
return this.db.prepare(`SELECT * FROM terminal_sessions WHERE status = 'active' AND project_id = ? ORDER BY started_at`).all(projectId);
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
return [];
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Get the count of active sessions, optionally filtered by project.
|
|
237
|
+
* Pass undefined to count all sessions.
|
|
238
|
+
*/
|
|
239
|
+
getActiveSessionCount(projectId) {
|
|
240
|
+
try {
|
|
241
|
+
if (projectId === undefined) {
|
|
242
|
+
const row = this.db.prepare(`SELECT COUNT(*) as count FROM terminal_sessions WHERE status = 'active'`).get();
|
|
243
|
+
return row.count;
|
|
244
|
+
}
|
|
245
|
+
if (projectId === null) {
|
|
246
|
+
const row = this.db.prepare(`SELECT COUNT(*) as count FROM terminal_sessions WHERE status = 'active' AND project_id IS NULL`).get();
|
|
247
|
+
return row.count;
|
|
248
|
+
}
|
|
249
|
+
const row = this.db.prepare(`SELECT COUNT(*) as count FROM terminal_sessions WHERE status = 'active' AND project_id = ?`).get(projectId);
|
|
250
|
+
return row.count;
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
return 0;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Clean up stale and dead sessions.
|
|
258
|
+
* A session is stale if its last heartbeat is older than the threshold.
|
|
259
|
+
* A session is dead if its PID no longer exists.
|
|
260
|
+
* Returns the count of sessions cleaned.
|
|
261
|
+
*/
|
|
262
|
+
cleanupStale() {
|
|
263
|
+
let cleaned = 0;
|
|
264
|
+
try {
|
|
265
|
+
const sessions = this.db.prepare(`SELECT id, pid, last_heartbeat FROM terminal_sessions WHERE status = 'active'`).all();
|
|
266
|
+
for (const session of sessions) {
|
|
267
|
+
// Skip our own session
|
|
268
|
+
if (session.id === this.sessionId)
|
|
269
|
+
continue;
|
|
270
|
+
let shouldRemove = false;
|
|
271
|
+
// Check if PID is still alive
|
|
272
|
+
try {
|
|
273
|
+
process.kill(session.pid, 0);
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
// PID doesn't exist — dead session
|
|
277
|
+
shouldRemove = true;
|
|
278
|
+
}
|
|
279
|
+
// Check heartbeat age
|
|
280
|
+
if (!shouldRemove) {
|
|
281
|
+
const lastHeartbeat = new Date(session.last_heartbeat).getTime();
|
|
282
|
+
const age = Date.now() - lastHeartbeat;
|
|
283
|
+
if (age > STALE_THRESHOLD_MS) {
|
|
284
|
+
shouldRemove = true;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
if (shouldRemove) {
|
|
288
|
+
this.db.prepare('DELETE FROM terminal_sessions WHERE id = ?').run(session.id);
|
|
289
|
+
// Clean up orphaned session files
|
|
290
|
+
if (this.sessionsBasePath) {
|
|
291
|
+
this.cleanupSessionFilesForPrefix(session.id.slice(0, 8));
|
|
292
|
+
}
|
|
293
|
+
cleaned++;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
// Also clean up any orphaned file locks from stale sessions
|
|
297
|
+
if (cleaned > 0) {
|
|
298
|
+
const lockManager = getFileLockManager();
|
|
299
|
+
if (lockManager) {
|
|
300
|
+
lockManager.cleanupStaleLocks(STALE_THRESHOLD_MS);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// Clean up old/stale notifications
|
|
304
|
+
const notifManager = getNotificationManager();
|
|
305
|
+
if (notifManager) {
|
|
306
|
+
notifManager.cleanup();
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
catch {
|
|
310
|
+
// Best effort
|
|
311
|
+
}
|
|
312
|
+
return cleaned;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Get all agent IDs in use by other terminals (excluding self).
|
|
316
|
+
* Optionally filtered to the same project.
|
|
317
|
+
* Used for cross-terminal collision detection.
|
|
318
|
+
*/
|
|
319
|
+
getGlobalAgentIds(projectId) {
|
|
320
|
+
try {
|
|
321
|
+
const sessions = this.getActiveSessions(projectId);
|
|
322
|
+
const agentIds = [];
|
|
323
|
+
for (const session of sessions) {
|
|
324
|
+
// Skip our own session
|
|
325
|
+
if (session.id === this.sessionId)
|
|
326
|
+
continue;
|
|
327
|
+
try {
|
|
328
|
+
const agents = JSON.parse(session.agents_json);
|
|
329
|
+
for (const agent of agents) {
|
|
330
|
+
agentIds.push(agent.id);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
catch {
|
|
334
|
+
// Ignore parse errors for individual sessions
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
return agentIds;
|
|
338
|
+
}
|
|
339
|
+
catch {
|
|
340
|
+
return [];
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Clean up orphaned session files for all stale sessions.
|
|
345
|
+
* Scans project directories under sessionsBasePath for terminal-scoped files
|
|
346
|
+
* whose session prefix is not in the active set.
|
|
347
|
+
* Returns the count of files cleaned.
|
|
348
|
+
*/
|
|
349
|
+
cleanupSessionFiles() {
|
|
350
|
+
if (!this.sessionsBasePath)
|
|
351
|
+
return 0;
|
|
352
|
+
// Build set of active session prefixes (first 8 chars)
|
|
353
|
+
const activePrefixes = new Set();
|
|
354
|
+
try {
|
|
355
|
+
const sessions = this.getActiveSessions();
|
|
356
|
+
for (const session of sessions) {
|
|
357
|
+
activePrefixes.add(session.id.slice(0, 8));
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
catch {
|
|
361
|
+
return 0;
|
|
362
|
+
}
|
|
363
|
+
let cleaned = 0;
|
|
364
|
+
try {
|
|
365
|
+
if (!fs.existsSync(this.sessionsBasePath))
|
|
366
|
+
return 0;
|
|
367
|
+
const entries = fs.readdirSync(this.sessionsBasePath, { withFileTypes: true });
|
|
368
|
+
for (const entry of entries) {
|
|
369
|
+
if (!entry.isDirectory())
|
|
370
|
+
continue;
|
|
371
|
+
const dirPath = path.join(this.sessionsBasePath, entry.name);
|
|
372
|
+
cleaned += this.cleanupOrphanFilesInDir(dirPath, activePrefixes);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
catch {
|
|
376
|
+
// Best effort
|
|
377
|
+
}
|
|
378
|
+
return cleaned;
|
|
379
|
+
}
|
|
380
|
+
// ---------------------------------------------------------------------------
|
|
381
|
+
// Private
|
|
382
|
+
// ---------------------------------------------------------------------------
|
|
383
|
+
/**
|
|
384
|
+
* Clean up transient session files for a specific session prefix in all project directories.
|
|
385
|
+
* Preserves current-{prefix}.json files so they remain available for /resume.
|
|
386
|
+
*/
|
|
387
|
+
cleanupSessionFilesForPrefix(prefix) {
|
|
388
|
+
if (!this.sessionsBasePath)
|
|
389
|
+
return;
|
|
390
|
+
try {
|
|
391
|
+
if (!fs.existsSync(this.sessionsBasePath))
|
|
392
|
+
return;
|
|
393
|
+
const entries = fs.readdirSync(this.sessionsBasePath, { withFileTypes: true });
|
|
394
|
+
for (const entry of entries) {
|
|
395
|
+
if (!entry.isDirectory())
|
|
396
|
+
continue;
|
|
397
|
+
const dirPath = path.join(this.sessionsBasePath, entry.name);
|
|
398
|
+
try {
|
|
399
|
+
const files = fs.readdirSync(dirPath);
|
|
400
|
+
for (const file of files) {
|
|
401
|
+
const match = TRANSIENT_FILE_PATTERN.exec(file);
|
|
402
|
+
if (match) {
|
|
403
|
+
const filePrefix = match[1] || match[2];
|
|
404
|
+
if (filePrefix === prefix) {
|
|
405
|
+
fs.unlinkSync(path.join(dirPath, file));
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
catch {
|
|
411
|
+
// Best effort per directory
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
catch {
|
|
416
|
+
// Best effort
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Clean up orphaned transient session files in a single project directory.
|
|
421
|
+
* Preserves current-*.json files so they remain available for /resume.
|
|
422
|
+
* Returns count of files removed.
|
|
423
|
+
*/
|
|
424
|
+
cleanupOrphanFilesInDir(dirPath, activePrefixes) {
|
|
425
|
+
let cleaned = 0;
|
|
426
|
+
try {
|
|
427
|
+
const files = fs.readdirSync(dirPath);
|
|
428
|
+
for (const file of files) {
|
|
429
|
+
const match = TRANSIENT_FILE_PATTERN.exec(file);
|
|
430
|
+
if (match) {
|
|
431
|
+
const filePrefix = match[1] || match[2];
|
|
432
|
+
if (!activePrefixes.has(filePrefix)) {
|
|
433
|
+
fs.unlinkSync(path.join(dirPath, file));
|
|
434
|
+
cleaned++;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
catch {
|
|
440
|
+
// Best effort
|
|
441
|
+
}
|
|
442
|
+
return cleaned;
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Send a heartbeat (update last_heartbeat timestamp).
|
|
446
|
+
* Also opportunistically clean up stale sessions.
|
|
447
|
+
*/
|
|
448
|
+
heartbeat() {
|
|
449
|
+
if (!this.sessionId)
|
|
450
|
+
return;
|
|
451
|
+
try {
|
|
452
|
+
this.db.prepare(`UPDATE terminal_sessions SET last_heartbeat = CURRENT_TIMESTAMP WHERE id = ?`).run(this.sessionId);
|
|
453
|
+
// Opportunistic cleanup
|
|
454
|
+
this.cleanupStale();
|
|
455
|
+
}
|
|
456
|
+
catch {
|
|
457
|
+
// Best effort — DB may be locked briefly
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* Check if the active session count changed and notify listener.
|
|
462
|
+
* Runs on a 5s interval — lightweight SELECT COUNT query.
|
|
463
|
+
* Scoped to current project for project-aware terminal count.
|
|
464
|
+
*/
|
|
465
|
+
checkCountChange() {
|
|
466
|
+
try {
|
|
467
|
+
// Count sessions on the same project (or all if no project)
|
|
468
|
+
const currentCount = this.currentProjectId !== null
|
|
469
|
+
? this.getActiveSessionCount(this.currentProjectId)
|
|
470
|
+
: this.getActiveSessionCount();
|
|
471
|
+
if (currentCount !== this.lastKnownCount) {
|
|
472
|
+
this.lastKnownCount = currentCount;
|
|
473
|
+
if (this.onCountChangeCallback) {
|
|
474
|
+
this.onCountChangeCallback(currentCount);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
catch {
|
|
479
|
+
// Best effort
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* Generate a label like "Terminal 1", "Terminal 2" using the next available number.
|
|
484
|
+
* Avoids duplicates by checking which numbers are already in use.
|
|
485
|
+
*/
|
|
486
|
+
generateLabel(projectId) {
|
|
487
|
+
try {
|
|
488
|
+
const query = projectId !== null
|
|
489
|
+
? `SELECT label FROM terminal_sessions WHERE status = 'active' AND project_id = ?`
|
|
490
|
+
: `SELECT label FROM terminal_sessions WHERE status = 'active' AND project_id IS NULL`;
|
|
491
|
+
const rows = projectId !== null
|
|
492
|
+
? this.db.prepare(query).all(projectId)
|
|
493
|
+
: this.db.prepare(query).all();
|
|
494
|
+
// Collect numbers already in use
|
|
495
|
+
const usedNumbers = new Set();
|
|
496
|
+
for (const row of rows) {
|
|
497
|
+
const match = /^Terminal (\d+)$/.exec(row.label);
|
|
498
|
+
if (match) {
|
|
499
|
+
usedNumbers.add(parseInt(match[1], 10));
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
// Find the first available number
|
|
503
|
+
let n = 1;
|
|
504
|
+
while (usedNumbers.has(n))
|
|
505
|
+
n++;
|
|
506
|
+
return `Terminal ${String(n)}`;
|
|
507
|
+
}
|
|
508
|
+
catch {
|
|
509
|
+
// Fallback to count-based
|
|
510
|
+
const count = this.getActiveSessionCount(projectId);
|
|
511
|
+
return `Terminal ${String(count + 1)}`;
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
}
|