@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,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reset Overlay V2
|
|
3
|
+
*
|
|
4
|
+
* Modal overlay for resetting/clearing the conversation within the current project.
|
|
5
|
+
* Provides options for:
|
|
6
|
+
* - Reset & reload context: Clear messages, refresh COMPILR.md
|
|
7
|
+
* - Reset only: Clear messages, keep current context
|
|
8
|
+
* - Cancel: Keep current session
|
|
9
|
+
*/
|
|
10
|
+
import { BaseOverlayV2 } from '../../base/index.js';
|
|
11
|
+
import type { RenderContext, OverlayAction, KeyEvent } from '../types.js';
|
|
12
|
+
export type ResetOption = 'reset-reload' | 'reset-only' | 'delete-history' | 'cancel';
|
|
13
|
+
interface ResetState {
|
|
14
|
+
/** Selected option index */
|
|
15
|
+
selectedIndex: number;
|
|
16
|
+
}
|
|
17
|
+
export interface ResetOverlayV2Options {
|
|
18
|
+
/** Project name for display */
|
|
19
|
+
projectName: string;
|
|
20
|
+
/** Number of messages in current session */
|
|
21
|
+
messageCount: number;
|
|
22
|
+
/** Estimated token usage */
|
|
23
|
+
tokenCount?: number;
|
|
24
|
+
}
|
|
25
|
+
export interface ResetOverlayV2Result {
|
|
26
|
+
/** Selected option */
|
|
27
|
+
option: ResetOption;
|
|
28
|
+
}
|
|
29
|
+
export declare class ResetOverlayV2 extends BaseOverlayV2<ResetState, ResetOverlayV2Result> {
|
|
30
|
+
readonly type: "inline";
|
|
31
|
+
readonly id = "reset-overlay-v2";
|
|
32
|
+
private readonly projectName;
|
|
33
|
+
private readonly messageCount;
|
|
34
|
+
private readonly tokenCount?;
|
|
35
|
+
constructor(options: ResetOverlayV2Options);
|
|
36
|
+
protected renderContent(context: RenderContext): string[];
|
|
37
|
+
handleKey(key: KeyEvent): OverlayAction<ResetOverlayV2Result>;
|
|
38
|
+
}
|
|
39
|
+
export {};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reset Overlay V2
|
|
3
|
+
*
|
|
4
|
+
* Modal overlay for resetting/clearing the conversation within the current project.
|
|
5
|
+
* Provides options for:
|
|
6
|
+
* - Reset & reload context: Clear messages, refresh COMPILR.md
|
|
7
|
+
* - Reset only: Clear messages, keep current context
|
|
8
|
+
* - Cancel: Keep current session
|
|
9
|
+
*/
|
|
10
|
+
import { BaseOverlayV2, renderBorder, formatTokens } from '../../base/index.js';
|
|
11
|
+
const RESET_OPTIONS = [
|
|
12
|
+
{
|
|
13
|
+
id: 'reset-reload',
|
|
14
|
+
label: 'Reset & reload context',
|
|
15
|
+
description: 'Clear messages, refresh COMPILR.md and project context',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
id: 'reset-only',
|
|
19
|
+
label: 'Reset only',
|
|
20
|
+
description: 'Clear messages, keep current context',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
id: 'delete-history',
|
|
24
|
+
label: 'Delete conversation history',
|
|
25
|
+
description: 'Delete all archived sessions for this project',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
id: 'cancel',
|
|
29
|
+
label: 'Cancel',
|
|
30
|
+
description: 'Keep current session',
|
|
31
|
+
},
|
|
32
|
+
];
|
|
33
|
+
// =============================================================================
|
|
34
|
+
// Reset Overlay V2 Class
|
|
35
|
+
// =============================================================================
|
|
36
|
+
export class ResetOverlayV2 extends BaseOverlayV2 {
|
|
37
|
+
type = 'inline';
|
|
38
|
+
id = 'reset-overlay-v2';
|
|
39
|
+
projectName;
|
|
40
|
+
messageCount;
|
|
41
|
+
tokenCount;
|
|
42
|
+
constructor(options) {
|
|
43
|
+
super({ selectedIndex: 0 });
|
|
44
|
+
this.projectName = options.projectName;
|
|
45
|
+
this.messageCount = options.messageCount;
|
|
46
|
+
this.tokenCount = options.tokenCount;
|
|
47
|
+
this.minHeight = 18;
|
|
48
|
+
}
|
|
49
|
+
renderContent(context) {
|
|
50
|
+
const s = context.styles;
|
|
51
|
+
const border = renderBorder(context.width, s);
|
|
52
|
+
const lines = [];
|
|
53
|
+
lines.push(border);
|
|
54
|
+
lines.push(` ${s.primaryBold('Reset Conversation')}`);
|
|
55
|
+
lines.push('');
|
|
56
|
+
// Session info
|
|
57
|
+
lines.push(` ${s.muted('Project:')} ${s.primary(this.projectName)}`);
|
|
58
|
+
const sessionInfo = this.tokenCount
|
|
59
|
+
? `${String(this.messageCount)} messages · ~${formatTokens(this.tokenCount)} tokens`
|
|
60
|
+
: `${String(this.messageCount)} messages`;
|
|
61
|
+
lines.push(` ${s.muted('Session:')} ${s.secondary(sessionInfo)}`);
|
|
62
|
+
lines.push('');
|
|
63
|
+
// Warning
|
|
64
|
+
lines.push(` ${s.warning('This will clear your conversation history.')}`);
|
|
65
|
+
lines.push(` ${s.muted('Previous session will be archived.')}`);
|
|
66
|
+
lines.push('');
|
|
67
|
+
// Options
|
|
68
|
+
for (let i = 0; i < RESET_OPTIONS.length; i++) {
|
|
69
|
+
const opt = RESET_OPTIONS[i];
|
|
70
|
+
const isSelected = i === this.state.selectedIndex;
|
|
71
|
+
const prefix = isSelected ? s.primary('> ') : ' ';
|
|
72
|
+
const label = isSelected ? s.primaryBold(opt.label) : s.secondary(opt.label);
|
|
73
|
+
const desc = s.muted(` - ${opt.description}`);
|
|
74
|
+
lines.push(` ${prefix}${label}${desc}`);
|
|
75
|
+
}
|
|
76
|
+
lines.push('');
|
|
77
|
+
lines.push(border);
|
|
78
|
+
lines.push(` ${s.muted('j/k Navigate Enter Select Esc Cancel')}`);
|
|
79
|
+
lines.push(border);
|
|
80
|
+
return lines;
|
|
81
|
+
}
|
|
82
|
+
handleKey(key) {
|
|
83
|
+
// Ctrl+C closes everything
|
|
84
|
+
if (key.ctrl && key.name === 'c') {
|
|
85
|
+
return this.close({ option: 'cancel' });
|
|
86
|
+
}
|
|
87
|
+
// Escape cancels
|
|
88
|
+
if (key.name === 'escape') {
|
|
89
|
+
return this.close({ option: 'cancel' });
|
|
90
|
+
}
|
|
91
|
+
// Navigation with j/k
|
|
92
|
+
if (key.char === 'j' || key.name === 'down') {
|
|
93
|
+
this.state.selectedIndex = Math.min(this.state.selectedIndex + 1, RESET_OPTIONS.length - 1);
|
|
94
|
+
return this.rerender();
|
|
95
|
+
}
|
|
96
|
+
if (key.char === 'k' || key.name === 'up') {
|
|
97
|
+
this.state.selectedIndex = Math.max(this.state.selectedIndex - 1, 0);
|
|
98
|
+
return this.rerender();
|
|
99
|
+
}
|
|
100
|
+
// Enter selects
|
|
101
|
+
if (key.name === 'return') {
|
|
102
|
+
const selected = RESET_OPTIONS[this.state.selectedIndex];
|
|
103
|
+
return this.close({ option: selected.id });
|
|
104
|
+
}
|
|
105
|
+
return this.rerender();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resume Overlay V2
|
|
3
|
+
*
|
|
4
|
+
* Modal overlay for viewing and resuming saved sessions.
|
|
5
|
+
* Uses TabbedListOverlayV2 for consistent list/tab/search behavior.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - List saved sessions with relative timestamps
|
|
9
|
+
* - Preview of last user message
|
|
10
|
+
* - Search sessions by content
|
|
11
|
+
* - Delete sessions
|
|
12
|
+
* - Resume selected session
|
|
13
|
+
*/
|
|
14
|
+
import { TabbedListOverlayV2, BaseScreen } from '../../base/index.js';
|
|
15
|
+
import type { SessionInfo } from '@compilr-dev/sdk';
|
|
16
|
+
export interface SessionItem {
|
|
17
|
+
sessionId: string;
|
|
18
|
+
preview: string;
|
|
19
|
+
messageCount: number;
|
|
20
|
+
createdAt: string;
|
|
21
|
+
updatedAt: string;
|
|
22
|
+
/** Relative time string like "2 minutes ago" */
|
|
23
|
+
relativeTime: string;
|
|
24
|
+
/** Project ID (null for global sessions) */
|
|
25
|
+
projectId?: number | null;
|
|
26
|
+
/** Project name for display */
|
|
27
|
+
projectName?: string | null;
|
|
28
|
+
/** Whether this is the current project's session */
|
|
29
|
+
isCurrentProject?: boolean;
|
|
30
|
+
/** 8-hex terminal prefix from session filename */
|
|
31
|
+
terminalPrefix?: string | null;
|
|
32
|
+
/** Human-readable terminal label, e.g. "Terminal 1" */
|
|
33
|
+
terminalLabel?: string | null;
|
|
34
|
+
/** Whether the terminal that owns this session is still running */
|
|
35
|
+
isActiveTerminal?: boolean;
|
|
36
|
+
/** Number of agents in the team roster for this session */
|
|
37
|
+
teamAgentCount?: number;
|
|
38
|
+
}
|
|
39
|
+
export interface ResumeOverlayV2Options {
|
|
40
|
+
/** Sessions to display */
|
|
41
|
+
sessions: SessionInfo[];
|
|
42
|
+
/** Current project ID (null for global) */
|
|
43
|
+
currentProjectId?: number | null;
|
|
44
|
+
/** Callback to delete a session */
|
|
45
|
+
onDelete?: (sessionId: string) => Promise<boolean>;
|
|
46
|
+
}
|
|
47
|
+
export interface ResumeOverlayV2Result {
|
|
48
|
+
/** Session ID to resume */
|
|
49
|
+
sessionId?: string;
|
|
50
|
+
/** Session was deleted */
|
|
51
|
+
deleted?: string;
|
|
52
|
+
}
|
|
53
|
+
export declare class ResumeOverlayV2 extends TabbedListOverlayV2<SessionItem, ResumeOverlayV2Result> {
|
|
54
|
+
readonly type: "inline";
|
|
55
|
+
readonly id = "resume-overlay-v2";
|
|
56
|
+
private readonly onDeleteSession?;
|
|
57
|
+
constructor(options: ResumeOverlayV2Options);
|
|
58
|
+
protected createDetailScreen(item: SessionItem): BaseScreen | null;
|
|
59
|
+
protected onItemSelected(item: SessionItem): ResumeOverlayV2Result | undefined;
|
|
60
|
+
}
|
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resume Overlay V2
|
|
3
|
+
*
|
|
4
|
+
* Modal overlay for viewing and resuming saved sessions.
|
|
5
|
+
* Uses TabbedListOverlayV2 for consistent list/tab/search behavior.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - List saved sessions with relative timestamps
|
|
9
|
+
* - Preview of last user message
|
|
10
|
+
* - Search sessions by content
|
|
11
|
+
* - Delete sessions
|
|
12
|
+
* - Resume selected session
|
|
13
|
+
*/
|
|
14
|
+
import * as terminal from '../../terminal.js';
|
|
15
|
+
import { TabbedListOverlayV2, BaseScreen, stay, popScreen, closeOverlay, isEscape, isCtrlC, isEnter, isClose, extractPrintable, renderBorder, wrapText, truncate, } from '../../base/index.js';
|
|
16
|
+
const TABS = [
|
|
17
|
+
{ id: 'recent', label: 'Recent' },
|
|
18
|
+
{ id: 'all', label: 'All' },
|
|
19
|
+
];
|
|
20
|
+
// =============================================================================
|
|
21
|
+
// Helper Functions
|
|
22
|
+
// =============================================================================
|
|
23
|
+
/**
|
|
24
|
+
* Format a date as a relative time string.
|
|
25
|
+
*/
|
|
26
|
+
function formatRelativeTime(date) {
|
|
27
|
+
const now = Date.now();
|
|
28
|
+
const then = new Date(date).getTime();
|
|
29
|
+
const diff = now - then;
|
|
30
|
+
const seconds = Math.floor(diff / 1000);
|
|
31
|
+
const minutes = Math.floor(seconds / 60);
|
|
32
|
+
const hours = Math.floor(minutes / 60);
|
|
33
|
+
const days = Math.floor(hours / 24);
|
|
34
|
+
if (days > 7) {
|
|
35
|
+
return new Date(date).toLocaleDateString();
|
|
36
|
+
}
|
|
37
|
+
if (days > 1) {
|
|
38
|
+
return `${String(days)} days ago`;
|
|
39
|
+
}
|
|
40
|
+
if (days === 1) {
|
|
41
|
+
return 'Yesterday';
|
|
42
|
+
}
|
|
43
|
+
if (hours >= 1) {
|
|
44
|
+
return `${String(hours)} hour${hours > 1 ? 's' : ''} ago`;
|
|
45
|
+
}
|
|
46
|
+
if (minutes >= 1) {
|
|
47
|
+
return `${String(minutes)} minute${minutes > 1 ? 's' : ''} ago`;
|
|
48
|
+
}
|
|
49
|
+
return 'Just now';
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Convert SessionInfo to SessionItem with relative time.
|
|
53
|
+
*/
|
|
54
|
+
function toSessionItem(session, currentProjectId) {
|
|
55
|
+
// Check if this is a ProjectSessionInfo with project metadata
|
|
56
|
+
const projectSession = session;
|
|
57
|
+
const projectId = projectSession.projectId;
|
|
58
|
+
const projectName = projectSession.projectName;
|
|
59
|
+
const isCurrentProject = projectId === currentProjectId;
|
|
60
|
+
return {
|
|
61
|
+
sessionId: session.sessionId,
|
|
62
|
+
preview: session.preview || 'No preview available',
|
|
63
|
+
messageCount: session.messageCount,
|
|
64
|
+
createdAt: session.createdAt,
|
|
65
|
+
updatedAt: session.updatedAt,
|
|
66
|
+
relativeTime: formatRelativeTime(session.updatedAt),
|
|
67
|
+
projectId,
|
|
68
|
+
projectName,
|
|
69
|
+
isCurrentProject,
|
|
70
|
+
terminalPrefix: projectSession.terminalPrefix ?? null,
|
|
71
|
+
terminalLabel: projectSession.terminalLabel ?? null,
|
|
72
|
+
isActiveTerminal: projectSession.isActiveTerminal ?? false,
|
|
73
|
+
teamAgentCount: projectSession.teamAgentCount ?? 0,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
// =============================================================================
|
|
77
|
+
// Detail Screen (Session Details)
|
|
78
|
+
// =============================================================================
|
|
79
|
+
/**
|
|
80
|
+
* Screen for viewing session details before resuming.
|
|
81
|
+
*/
|
|
82
|
+
class DetailScreen extends BaseScreen {
|
|
83
|
+
item;
|
|
84
|
+
styles;
|
|
85
|
+
onDelete;
|
|
86
|
+
confirmDelete = false;
|
|
87
|
+
confirmCrossProject = false;
|
|
88
|
+
confirmSelected = 1; // 0 = Yes, 1 = No (for both confirmations)
|
|
89
|
+
constructor(item, styles, onDelete) {
|
|
90
|
+
super();
|
|
91
|
+
this.item = item;
|
|
92
|
+
this.styles = styles;
|
|
93
|
+
this.onDelete = onDelete;
|
|
94
|
+
}
|
|
95
|
+
render() {
|
|
96
|
+
const s = this.styles;
|
|
97
|
+
const cols = terminal.getTerminalWidth();
|
|
98
|
+
const border = renderBorder(cols, s);
|
|
99
|
+
const lines = [];
|
|
100
|
+
lines.push(border);
|
|
101
|
+
lines.push(` ${s.primaryBold('Session Details')}`);
|
|
102
|
+
lines.push('');
|
|
103
|
+
// Delete confirmation
|
|
104
|
+
if (this.confirmDelete) {
|
|
105
|
+
lines.push(` ${s.error('Delete this session?')}`);
|
|
106
|
+
lines.push('');
|
|
107
|
+
lines.push(` ${s.muted('Session ID:')} ${s.secondary(this.item.sessionId)}`);
|
|
108
|
+
lines.push(` ${s.muted('Messages:')} ${s.secondary(String(this.item.messageCount))}`);
|
|
109
|
+
lines.push('');
|
|
110
|
+
lines.push(this.confirmSelected === 0
|
|
111
|
+
? ` ${s.error('> Yes, delete')}`
|
|
112
|
+
: ` ${s.muted(' Yes, delete')}`);
|
|
113
|
+
lines.push(this.confirmSelected === 1
|
|
114
|
+
? ` ${s.primary('> No, cancel')}`
|
|
115
|
+
: ` ${s.muted(' No, cancel')}`);
|
|
116
|
+
lines.push('');
|
|
117
|
+
lines.push(border);
|
|
118
|
+
lines.push(` ${s.muted('↑/↓ Navigate · Enter Select · Esc Cancel')}`);
|
|
119
|
+
lines.push(border);
|
|
120
|
+
return lines;
|
|
121
|
+
}
|
|
122
|
+
// Cross-project confirmation
|
|
123
|
+
if (this.confirmCrossProject) {
|
|
124
|
+
const projName = this.item.projectName ?? `Project ${String(this.item.projectId)}`;
|
|
125
|
+
lines.push(` ${s.warning('⚠ This session is from a different project')}`);
|
|
126
|
+
lines.push('');
|
|
127
|
+
lines.push(` ${s.muted('Project:')} ${s.primary(projName)}`);
|
|
128
|
+
lines.push(` ${s.muted('Messages:')} ${s.secondary(String(this.item.messageCount))}`);
|
|
129
|
+
lines.push('');
|
|
130
|
+
lines.push(` ${s.secondary('Resuming will load conversation history from that project.')}`);
|
|
131
|
+
lines.push(` ${s.secondary('Your current project context will remain unchanged.')}`);
|
|
132
|
+
lines.push('');
|
|
133
|
+
lines.push(this.confirmSelected === 0
|
|
134
|
+
? ` ${s.warning('> Yes, resume anyway')}`
|
|
135
|
+
: ` ${s.muted(' Yes, resume anyway')}`);
|
|
136
|
+
lines.push(this.confirmSelected === 1
|
|
137
|
+
? ` ${s.primary('> No, cancel')}`
|
|
138
|
+
: ` ${s.muted(' No, cancel')}`);
|
|
139
|
+
lines.push('');
|
|
140
|
+
lines.push(border);
|
|
141
|
+
lines.push(` ${s.muted('↑/↓ Navigate · Enter Select · Esc Cancel')}`);
|
|
142
|
+
lines.push(border);
|
|
143
|
+
return lines;
|
|
144
|
+
}
|
|
145
|
+
// Show cross-project warning banner if applicable
|
|
146
|
+
if (!this.item.isCurrentProject && this.item.projectId !== null) {
|
|
147
|
+
const projName = this.item.projectName ?? `Project ${String(this.item.projectId)}`;
|
|
148
|
+
lines.push(` ${s.warning(`⚠ From different project: ${projName}`)}`);
|
|
149
|
+
lines.push('');
|
|
150
|
+
}
|
|
151
|
+
// Active terminal warning
|
|
152
|
+
if (this.item.isActiveTerminal) {
|
|
153
|
+
lines.push(` ${s.warning('\u26A0 This session is in use by another terminal')}`);
|
|
154
|
+
lines.push('');
|
|
155
|
+
}
|
|
156
|
+
// Session info
|
|
157
|
+
lines.push(` ${s.muted('Updated:')} ${s.primary(this.item.relativeTime)}`);
|
|
158
|
+
lines.push(` ${s.muted('Created:')} ${s.secondary(new Date(this.item.createdAt).toLocaleString())}`);
|
|
159
|
+
if (this.item.messageCount > 0) {
|
|
160
|
+
lines.push(` ${s.muted('Messages:')} ${s.secondary(String(this.item.messageCount))}`);
|
|
161
|
+
}
|
|
162
|
+
else if (this.item.teamAgentCount && this.item.teamAgentCount > 1) {
|
|
163
|
+
lines.push(` ${s.muted('Messages:')} ${s.secondary('None (team only)')}`);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
lines.push(` ${s.muted('Messages:')} ${s.secondary(String(this.item.messageCount))}`);
|
|
167
|
+
}
|
|
168
|
+
if (this.item.teamAgentCount && this.item.teamAgentCount > 1) {
|
|
169
|
+
lines.push(` ${s.muted('Team:')} ${s.secondary(`${String(this.item.teamAgentCount)} agents`)}`);
|
|
170
|
+
}
|
|
171
|
+
lines.push(` ${s.muted('Session ID:')} ${s.secondary(this.item.sessionId)}`);
|
|
172
|
+
// Terminal info (for multi-terminal sessions)
|
|
173
|
+
if (this.item.terminalLabel) {
|
|
174
|
+
const prefixStr = this.item.terminalPrefix ? ` (${this.item.terminalPrefix})` : '';
|
|
175
|
+
const statusStr = this.item.isActiveTerminal
|
|
176
|
+
? s.success('\u25CF Active')
|
|
177
|
+
: s.muted('\u2014 Exited');
|
|
178
|
+
lines.push(` ${s.muted('Terminal:')} ${s.secondary(this.item.terminalLabel + prefixStr)} ${statusStr}`);
|
|
179
|
+
}
|
|
180
|
+
lines.push('');
|
|
181
|
+
// Preview
|
|
182
|
+
lines.push(` ${s.muted('Last message:')}`);
|
|
183
|
+
const previewLines = wrapText(this.item.preview, cols - 6);
|
|
184
|
+
for (const line of previewLines.slice(0, 3)) {
|
|
185
|
+
lines.push(` ${s.secondary(line)}`);
|
|
186
|
+
}
|
|
187
|
+
if (previewLines.length > 3) {
|
|
188
|
+
lines.push(` ${s.muted('...')}`);
|
|
189
|
+
}
|
|
190
|
+
lines.push('');
|
|
191
|
+
lines.push(border);
|
|
192
|
+
if (this.item.isActiveTerminal) {
|
|
193
|
+
lines.push(` ${s.muted('d Delete · q/Esc Back')} ${s.warning('(in use — cannot resume)')}`);
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
lines.push(` ${s.muted('Enter Resume · d Delete · q/Esc Back')}`);
|
|
197
|
+
}
|
|
198
|
+
lines.push(border);
|
|
199
|
+
return lines;
|
|
200
|
+
}
|
|
201
|
+
handleKey(data) {
|
|
202
|
+
const char = extractPrintable(data);
|
|
203
|
+
const key = data.toString();
|
|
204
|
+
// Ctrl+C closes everything
|
|
205
|
+
if (isCtrlC(data)) {
|
|
206
|
+
return closeOverlay(undefined);
|
|
207
|
+
}
|
|
208
|
+
// Confirm delete mode
|
|
209
|
+
if (this.confirmDelete) {
|
|
210
|
+
if (isEscape(data)) {
|
|
211
|
+
this.confirmDelete = false;
|
|
212
|
+
return stay();
|
|
213
|
+
}
|
|
214
|
+
if (char === 'j' || char === 'k' || key === '\x1b[A' || key === '\x1b[B') {
|
|
215
|
+
this.confirmSelected = this.confirmSelected === 0 ? 1 : 0;
|
|
216
|
+
return stay();
|
|
217
|
+
}
|
|
218
|
+
if (isEnter(data)) {
|
|
219
|
+
if (this.confirmSelected === 0) {
|
|
220
|
+
// Yes - delete the session
|
|
221
|
+
void this.handleDelete();
|
|
222
|
+
return closeOverlay({ deleted: this.item.sessionId });
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
// No - cancel
|
|
226
|
+
this.confirmDelete = false;
|
|
227
|
+
return stay();
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return stay(false);
|
|
231
|
+
}
|
|
232
|
+
// Cross-project confirmation mode
|
|
233
|
+
if (this.confirmCrossProject) {
|
|
234
|
+
if (isEscape(data)) {
|
|
235
|
+
this.confirmCrossProject = false;
|
|
236
|
+
return stay();
|
|
237
|
+
}
|
|
238
|
+
if (char === 'j' || char === 'k' || key === '\x1b[A' || key === '\x1b[B') {
|
|
239
|
+
this.confirmSelected = this.confirmSelected === 0 ? 1 : 0;
|
|
240
|
+
return stay();
|
|
241
|
+
}
|
|
242
|
+
if (isEnter(data)) {
|
|
243
|
+
if (this.confirmSelected === 0) {
|
|
244
|
+
// Yes - resume anyway
|
|
245
|
+
return closeOverlay({ sessionId: this.item.sessionId });
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
// No - cancel
|
|
249
|
+
this.confirmCrossProject = false;
|
|
250
|
+
return stay();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return stay(false);
|
|
254
|
+
}
|
|
255
|
+
// Normal mode
|
|
256
|
+
if (isEscape(data) || isClose(data)) {
|
|
257
|
+
return popScreen();
|
|
258
|
+
}
|
|
259
|
+
// Enter resumes the session (with confirmation if cross-project)
|
|
260
|
+
if (isEnter(data)) {
|
|
261
|
+
// Active terminal sessions cannot be resumed
|
|
262
|
+
if (this.item.isActiveTerminal) {
|
|
263
|
+
return stay(false);
|
|
264
|
+
}
|
|
265
|
+
// Check if this is a cross-project session
|
|
266
|
+
if (!this.item.isCurrentProject && this.item.projectId !== null) {
|
|
267
|
+
this.confirmCrossProject = true;
|
|
268
|
+
this.confirmSelected = 1; // Default to "No"
|
|
269
|
+
return stay();
|
|
270
|
+
}
|
|
271
|
+
return closeOverlay({ sessionId: this.item.sessionId });
|
|
272
|
+
}
|
|
273
|
+
// 'd' deletes the session
|
|
274
|
+
if (char === 'd' && this.onDelete) {
|
|
275
|
+
this.confirmDelete = true;
|
|
276
|
+
this.confirmSelected = 1; // Default to "No"
|
|
277
|
+
return stay();
|
|
278
|
+
}
|
|
279
|
+
return stay(false);
|
|
280
|
+
}
|
|
281
|
+
async handleDelete() {
|
|
282
|
+
if (this.onDelete) {
|
|
283
|
+
await this.onDelete(this.item.sessionId);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Minimum height for stable rendering.
|
|
288
|
+
*/
|
|
289
|
+
getMinHeight() {
|
|
290
|
+
return 20;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
// =============================================================================
|
|
294
|
+
// Resume Overlay V2 Class
|
|
295
|
+
// =============================================================================
|
|
296
|
+
export class ResumeOverlayV2 extends TabbedListOverlayV2 {
|
|
297
|
+
type = 'inline';
|
|
298
|
+
id = 'resume-overlay-v2';
|
|
299
|
+
onDeleteSession;
|
|
300
|
+
constructor(options) {
|
|
301
|
+
const currentProjectId = options.currentProjectId;
|
|
302
|
+
const items = options.sessions.map((s) => toSessionItem(s, currentProjectId));
|
|
303
|
+
super({
|
|
304
|
+
title: 'Resume Session',
|
|
305
|
+
tabs: TABS,
|
|
306
|
+
items,
|
|
307
|
+
pageSize: 10,
|
|
308
|
+
filterByTab: (item, tabId) => {
|
|
309
|
+
if (tabId === 'all')
|
|
310
|
+
return true;
|
|
311
|
+
if (tabId === 'recent') {
|
|
312
|
+
// Show sessions from last 24 hours
|
|
313
|
+
const twentyFourHoursAgo = Date.now() - 24 * 60 * 60 * 1000;
|
|
314
|
+
return new Date(item.updatedAt).getTime() > twentyFourHoursAgo;
|
|
315
|
+
}
|
|
316
|
+
return true;
|
|
317
|
+
},
|
|
318
|
+
getSearchText: (item) => `${item.preview} ${item.sessionId} ${item.projectName ?? ''} ${item.terminalLabel ?? ''}`,
|
|
319
|
+
renderItem: (item, isSelected, styles) => {
|
|
320
|
+
const prefix = isSelected ? styles.primary('❯ ') : ' ';
|
|
321
|
+
// Fixed-width columns for alignment (visual character widths)
|
|
322
|
+
const PROJECT_COL_WIDTH = 18; // [Project Long Na..] or [Global]
|
|
323
|
+
const TERMINAL_COL_WIDTH = 16; // [Terminal 1 ●] or [Terminal d772]
|
|
324
|
+
const TIME_COL_WIDTH = 16; // "33 minutes ago"
|
|
325
|
+
const COUNT_COL_WIDTH = 10; // " 82 msgs " or " 2 agents"
|
|
326
|
+
// Project indicator (fixed width)
|
|
327
|
+
let projectName;
|
|
328
|
+
let isCurrentProj = false;
|
|
329
|
+
if (item.projectId !== null && item.projectId !== undefined) {
|
|
330
|
+
projectName = item.projectName ?? `Project ${String(item.projectId)}`;
|
|
331
|
+
isCurrentProj = item.isCurrentProject ?? false;
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
projectName = 'Global';
|
|
335
|
+
}
|
|
336
|
+
// Truncate project name to fit in brackets
|
|
337
|
+
const maxProjLen = PROJECT_COL_WIDTH - 2; // -2 for brackets
|
|
338
|
+
const truncatedProj = truncate(projectName, maxProjLen);
|
|
339
|
+
const projectStr = `[${truncatedProj}]`.padEnd(PROJECT_COL_WIDTH);
|
|
340
|
+
const projectIndicator = isCurrentProj
|
|
341
|
+
? styles.success(projectStr)
|
|
342
|
+
: styles.muted(projectStr);
|
|
343
|
+
// Terminal indicator (fixed width — pad inner label, then wrap + style)
|
|
344
|
+
let terminalStr = '';
|
|
345
|
+
if (item.terminalLabel) {
|
|
346
|
+
// Pad inner label to fixed width: TERMINAL_COL_WIDTH - 2 for brackets
|
|
347
|
+
const innerWidth = TERMINAL_COL_WIDTH - 2;
|
|
348
|
+
if (item.isActiveTerminal) {
|
|
349
|
+
const inner = `${item.terminalLabel} \u25CF`.padEnd(innerWidth);
|
|
350
|
+
terminalStr = styles.warning(`[${inner}]`);
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
const inner = item.terminalLabel.padEnd(innerWidth);
|
|
354
|
+
terminalStr = styles.muted(`[${inner}]`);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
else {
|
|
358
|
+
terminalStr = ''.padEnd(TERMINAL_COL_WIDTH);
|
|
359
|
+
}
|
|
360
|
+
// Time (fixed width)
|
|
361
|
+
const timeStr = item.relativeTime.padEnd(TIME_COL_WIDTH);
|
|
362
|
+
const timeStyled = isSelected ? styles.primary(timeStr) : styles.muted(timeStr);
|
|
363
|
+
// Message count or team-only indicator (fixed width, left-aligned)
|
|
364
|
+
let countStr;
|
|
365
|
+
if (item.messageCount === 0 && item.teamAgentCount && item.teamAgentCount > 1) {
|
|
366
|
+
countStr = `${String(item.teamAgentCount)} agents`.padEnd(COUNT_COL_WIDTH);
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
const label = item.messageCount !== 1 ? 'msgs' : 'msg';
|
|
370
|
+
countStr = `${String(item.messageCount)} ${label}`.padEnd(COUNT_COL_WIDTH);
|
|
371
|
+
}
|
|
372
|
+
const countStyled = isSelected ? styles.secondary(countStr) : styles.muted(countStr);
|
|
373
|
+
// Sanitize preview: remove newlines, carriage returns, and collapse whitespace
|
|
374
|
+
const sanitized = item.preview
|
|
375
|
+
.replace(/[\r\n]+/g, ' ')
|
|
376
|
+
.replace(/\s+/g, ' ')
|
|
377
|
+
.replace(/^#+\s*/g, '')
|
|
378
|
+
.trim();
|
|
379
|
+
// Calculate remaining space for preview
|
|
380
|
+
const usedWidth = 2 + PROJECT_COL_WIDTH + 1 + TERMINAL_COL_WIDTH + 1 + TIME_COL_WIDTH + COUNT_COL_WIDTH + 1;
|
|
381
|
+
const cols = terminal.getTerminalWidth();
|
|
382
|
+
const maxPreview = Math.max(20, cols - usedWidth - 2);
|
|
383
|
+
const preview = truncate(sanitized, maxPreview);
|
|
384
|
+
const previewStyled = isSelected ? styles.secondary(preview) : styles.muted(preview);
|
|
385
|
+
return `${prefix}${projectIndicator} ${terminalStr} ${timeStyled}${countStyled} ${previewStyled}`;
|
|
386
|
+
},
|
|
387
|
+
showCount: true,
|
|
388
|
+
emptyMessage: 'No saved sessions found.',
|
|
389
|
+
noResultsMessage: 'No sessions match the search.',
|
|
390
|
+
footerHints: (searchMode) => {
|
|
391
|
+
if (searchMode) {
|
|
392
|
+
return 'Type to search Enter Select Esc Exit search';
|
|
393
|
+
}
|
|
394
|
+
return 'j/k Navigate / Search Enter Resume d Delete q/Esc Close';
|
|
395
|
+
},
|
|
396
|
+
});
|
|
397
|
+
this.onDeleteSession = options.onDelete;
|
|
398
|
+
}
|
|
399
|
+
createDetailScreen(item) {
|
|
400
|
+
return new DetailScreen(item, this.getStyles(), this.onDeleteSession);
|
|
401
|
+
}
|
|
402
|
+
onItemSelected(item) {
|
|
403
|
+
// Active terminal sessions cannot be resumed (in use by another terminal)
|
|
404
|
+
if (item.isActiveTerminal) {
|
|
405
|
+
return undefined; // Stay on list - no action
|
|
406
|
+
}
|
|
407
|
+
// Cross-project sessions need confirmation - go to detail screen
|
|
408
|
+
if (!item.isCurrentProject && item.projectId !== null) {
|
|
409
|
+
return undefined; // Fall through to detail screen for confirmation
|
|
410
|
+
}
|
|
411
|
+
// Same project - resume directly
|
|
412
|
+
return { sessionId: item.sessionId };
|
|
413
|
+
}
|
|
414
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Mode Overlay V2
|
|
3
|
+
*
|
|
4
|
+
* Modal overlay shown at startup when projectSessionMode='ask' and a previous session exists.
|
|
5
|
+
* Gives the user control over how to handle the existing session:
|
|
6
|
+
* - Resume full: Continue where you left off (conversation + context)
|
|
7
|
+
* - Resume messages: Keep conversation, refresh project context
|
|
8
|
+
* - Start fresh: Clear conversation, fresh project context
|
|
9
|
+
*/
|
|
10
|
+
import { BaseOverlayV2 } from '../../base/index.js';
|
|
11
|
+
import type { RenderContext, OverlayAction, KeyEvent } from '../types.js';
|
|
12
|
+
export type SessionModeOption = 'resume-full' | 'resume-messages' | 'start-fresh';
|
|
13
|
+
interface SessionModeState {
|
|
14
|
+
/** Selected option index */
|
|
15
|
+
selectedIndex: number;
|
|
16
|
+
}
|
|
17
|
+
export interface SessionModeOverlayV2Options {
|
|
18
|
+
/** Project name for display */
|
|
19
|
+
projectName: string;
|
|
20
|
+
/** Number of messages in existing session */
|
|
21
|
+
messageCount: number;
|
|
22
|
+
/** Last activity timestamp */
|
|
23
|
+
lastActivity: Date;
|
|
24
|
+
/** Preview of last user message (optional) */
|
|
25
|
+
lastMessagePreview?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface SessionModeOverlayV2Result {
|
|
28
|
+
/** Selected option */
|
|
29
|
+
option: SessionModeOption;
|
|
30
|
+
}
|
|
31
|
+
export declare class SessionModeOverlayV2 extends BaseOverlayV2<SessionModeState, SessionModeOverlayV2Result> {
|
|
32
|
+
readonly type: "inline";
|
|
33
|
+
readonly id = "session-mode-overlay-v2";
|
|
34
|
+
private readonly projectName;
|
|
35
|
+
private readonly messageCount;
|
|
36
|
+
private readonly lastActivity;
|
|
37
|
+
private readonly lastMessagePreview?;
|
|
38
|
+
constructor(options: SessionModeOverlayV2Options);
|
|
39
|
+
protected renderContent(context: RenderContext): string[];
|
|
40
|
+
handleKey(key: KeyEvent): OverlayAction<SessionModeOverlayV2Result>;
|
|
41
|
+
private formatTimeAgo;
|
|
42
|
+
}
|
|
43
|
+
export {};
|