@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,819 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TerminalUI - Single Renderer for Terminal Applications
|
|
3
|
+
*
|
|
4
|
+
* Single point of control for all terminal UI:
|
|
5
|
+
* - Owns all rendering decisions (when to clear, when to render)
|
|
6
|
+
* - Owns all UI state (agentRunning, todos, currentTool, etc.)
|
|
7
|
+
* - Provides output methods that handle clear/render automatically
|
|
8
|
+
* - Manages overlays (render, input routing)
|
|
9
|
+
* - REPL emits events, doesn't manage rendering timing
|
|
10
|
+
*
|
|
11
|
+
* Key principles:
|
|
12
|
+
* - NO scroll regions (preserves terminal scrollback)
|
|
13
|
+
* - Deterministic render cycle
|
|
14
|
+
* - All output goes through TerminalUI (no external console.log)
|
|
15
|
+
*/
|
|
16
|
+
import { EventEmitter } from 'events';
|
|
17
|
+
import { getVisibleLength } from './line-utils.js';
|
|
18
|
+
import { getStyles } from '../themes/index.js';
|
|
19
|
+
import { renderItem } from './terminal-render-item.js';
|
|
20
|
+
import { TurnMetrics } from './turn-metrics.js';
|
|
21
|
+
import { StatusBarController } from './status-bar-controller.js';
|
|
22
|
+
import { ConversationStore } from './conversation-store.js';
|
|
23
|
+
import { AutocompleteController } from './autocomplete-controller.js';
|
|
24
|
+
import { InputController } from './input-controller.js';
|
|
25
|
+
import { LiveRegionFacade } from './live-region-facade.js';
|
|
26
|
+
import { OverlayManager } from './overlay-manager.js';
|
|
27
|
+
import { FooterRenderer } from './footer-renderer.js';
|
|
28
|
+
import { KeyboardHandler } from './keyboard-handler.js';
|
|
29
|
+
import { DEFAULT_TERMINAL_UI_CONFIG, } from './terminal-types.js';
|
|
30
|
+
export { DEFAULT_TERMINAL_UI_CONFIG, MASCOT } from './terminal-types.js';
|
|
31
|
+
import { getPendingRequestsManager } from '../multi-agent/index.js';
|
|
32
|
+
import { getSessionRegistry } from '../multi-agent/session-registry.js';
|
|
33
|
+
import { getNotificationManager } from '../multi-agent/notification-manager.js';
|
|
34
|
+
// =============================================================================
|
|
35
|
+
// Footer V2 Class
|
|
36
|
+
// =============================================================================
|
|
37
|
+
export class TerminalUI extends EventEmitter {
|
|
38
|
+
// Configuration
|
|
39
|
+
promptPrefix;
|
|
40
|
+
promptPrefixLen;
|
|
41
|
+
config;
|
|
42
|
+
// Conversation history, restored history, and filtering
|
|
43
|
+
conversation = new ConversationStore();
|
|
44
|
+
// Input state (delegated to InputController)
|
|
45
|
+
input = new InputController();
|
|
46
|
+
get lines() { return this.input.lines; }
|
|
47
|
+
set lines(v) { this.input.lines = v; }
|
|
48
|
+
get currentLine() { return this.input.currentLine; }
|
|
49
|
+
set currentLine(v) { this.input.currentLine = v; }
|
|
50
|
+
get cursorPos() { return this.input.cursorPos; }
|
|
51
|
+
set cursorPos(v) { this.input.cursorPos = v; }
|
|
52
|
+
get suggestion() { return this.input.suggestion; }
|
|
53
|
+
set suggestion(v) { this.input.suggestion = v; }
|
|
54
|
+
get queuedInputs() { return this.input.queuedInputs; }
|
|
55
|
+
set queuedInputs(v) { this.input.queuedInputs = v; }
|
|
56
|
+
mode;
|
|
57
|
+
projectName = null;
|
|
58
|
+
todos = [];
|
|
59
|
+
// Plan mode state
|
|
60
|
+
activePlanId = null;
|
|
61
|
+
activePlanName = null;
|
|
62
|
+
spinnerText = null;
|
|
63
|
+
agentRunning = false;
|
|
64
|
+
agentMessageQueue = [];
|
|
65
|
+
currentTool = null;
|
|
66
|
+
// Per-turn token and tool call tracking
|
|
67
|
+
turnMetrics = new TurnMetrics();
|
|
68
|
+
// LiveRegion for running tools (bash, subagents)
|
|
69
|
+
live = new LiveRegionFacade({
|
|
70
|
+
requestRender: () => { this.needsRender = true; },
|
|
71
|
+
print: (item) => { this.print(item); },
|
|
72
|
+
emit: (event, ...args) => { this.emit(event, ...args); },
|
|
73
|
+
setSpinnerText: (text) => { this.spinnerText = text; },
|
|
74
|
+
});
|
|
75
|
+
// Autocomplete controller (command, file, agent)
|
|
76
|
+
ac = new AutocompleteController();
|
|
77
|
+
// Render tracking
|
|
78
|
+
isRunning = false;
|
|
79
|
+
isPaused = false;
|
|
80
|
+
renderTimer = null;
|
|
81
|
+
needsRender = false;
|
|
82
|
+
// Active team agent (for multi-agent footer display)
|
|
83
|
+
activeTeamAgent = null;
|
|
84
|
+
// Todo visibility (Ctrl+T to toggle)
|
|
85
|
+
showTodos = true;
|
|
86
|
+
// View mode (Ctrl+O to toggle verbose view)
|
|
87
|
+
// normal: compact output
|
|
88
|
+
// verbose-temp: temporarily show last N items verbose (any key returns to normal)
|
|
89
|
+
viewMode = 'normal';
|
|
90
|
+
// Status bar navigation (down arrow into footer indicators)
|
|
91
|
+
statusBar = new StatusBarController({
|
|
92
|
+
requestRender: () => { this.needsRender = true; },
|
|
93
|
+
emit: (event, ...args) => { this.emit(event, ...args); },
|
|
94
|
+
});
|
|
95
|
+
// Overlay lifecycle (stack, resolvers, render state, print buffer)
|
|
96
|
+
overlay = new OverlayManager({
|
|
97
|
+
clearFooter: () => { this.footer.clear(); },
|
|
98
|
+
renderFooter: () => { this.footer.render(); },
|
|
99
|
+
print: (item) => { this.print(item); },
|
|
100
|
+
renderItemToConsole: (item) => { this.renderItemToConsole(item); },
|
|
101
|
+
});
|
|
102
|
+
// Footer renderer (clear, render, spinner animation, line builders)
|
|
103
|
+
footer = new FooterRenderer({
|
|
104
|
+
isFooterRenderAllowed: () => this.isRunning && !this.isPaused && !this.overlay.hasActiveOverlay(),
|
|
105
|
+
getRenderData: () => ({
|
|
106
|
+
liveRegion: this.live.region,
|
|
107
|
+
liveVerbose: this.config.verbose,
|
|
108
|
+
agentRunning: this.agentRunning,
|
|
109
|
+
currentTool: this.currentTool,
|
|
110
|
+
spinnerText: this.spinnerText,
|
|
111
|
+
activeBashInfo: this.live.getActiveBashInfo(),
|
|
112
|
+
turnMetrics: this.turnMetrics,
|
|
113
|
+
todos: this.todos,
|
|
114
|
+
showTodos: this.showTodos,
|
|
115
|
+
lines: this.lines,
|
|
116
|
+
currentLine: this.currentLine,
|
|
117
|
+
cursorPos: this.cursorPos,
|
|
118
|
+
queuedInputs: this.queuedInputs,
|
|
119
|
+
suggestion: this.suggestion,
|
|
120
|
+
promptPrefix: this.promptPrefix,
|
|
121
|
+
promptPrefixLen: this.promptPrefixLen,
|
|
122
|
+
ac: this.ac,
|
|
123
|
+
statusBar: this.statusBar,
|
|
124
|
+
mode: this.mode,
|
|
125
|
+
activePlanName: this.activePlanName,
|
|
126
|
+
activeTeamAgent: this.activeTeamAgent,
|
|
127
|
+
projectName: this.projectName,
|
|
128
|
+
conversationFilterActive: this.conversation.isFilterActive,
|
|
129
|
+
hasRestoredHistory: this.conversation.hasRestoredHistory(),
|
|
130
|
+
config: this.config,
|
|
131
|
+
}),
|
|
132
|
+
});
|
|
133
|
+
// Keyboard input handler (capture, escape, overlay routing, keypress dispatch)
|
|
134
|
+
keyboard = new KeyboardHandler({
|
|
135
|
+
isGuardActive: () => !this.isRunning || this.isPaused,
|
|
136
|
+
isAgentRunning: () => this.agentRunning,
|
|
137
|
+
getViewMode: () => this.viewMode,
|
|
138
|
+
setViewMode: (mode) => { this.viewMode = mode; },
|
|
139
|
+
requestRender: () => { this.needsRender = true; },
|
|
140
|
+
emit: (event, ...args) => { this.emit(event, ...args); },
|
|
141
|
+
input: this.input,
|
|
142
|
+
ac: this.ac,
|
|
143
|
+
overlay: this.overlay,
|
|
144
|
+
statusBar: this.statusBar,
|
|
145
|
+
getActiveOverlay: () => this.overlay.getActiveOverlay(),
|
|
146
|
+
hasActiveOverlay: () => this.overlay.hasActiveOverlay(),
|
|
147
|
+
hasActiveBash: () => this.live.hasActiveBash(),
|
|
148
|
+
backgroundBashCommand: () => { this.backgroundBashCommand(); },
|
|
149
|
+
hasRestoredHistory: () => this.conversation.hasRestoredHistory(),
|
|
150
|
+
showRestoredHistory: () => { this.showRestoredHistory(); },
|
|
151
|
+
toggleVerboseView: () => { this.toggleVerboseView(); },
|
|
152
|
+
toggleLiveRegionExpanded: () => { this.toggleLiveRegionExpanded(); },
|
|
153
|
+
toggleTodos: () => { this.toggleTodos(); },
|
|
154
|
+
reRenderConversationVerbose: (verbose) => { this.reRenderConversationVerbose(verbose); },
|
|
155
|
+
});
|
|
156
|
+
constructor(options = {}) {
|
|
157
|
+
super();
|
|
158
|
+
const s = getStyles();
|
|
159
|
+
this.promptPrefix = options.prompt ?? s.primaryBold('compilr>') + ' ';
|
|
160
|
+
this.promptPrefixLen = getVisibleLength(this.promptPrefix);
|
|
161
|
+
this.mode = options.initialMode ?? 'normal';
|
|
162
|
+
this.config = { ...DEFAULT_TERMINAL_UI_CONFIG, ...options.config };
|
|
163
|
+
}
|
|
164
|
+
// ===========================================================================
|
|
165
|
+
// Status bar navigation (delegated to StatusBarController)
|
|
166
|
+
// ===========================================================================
|
|
167
|
+
/** Set background agent count (called by REPL to keep UI in sync). */
|
|
168
|
+
setBackgroundAgentCount(count) {
|
|
169
|
+
this.statusBar.setBackgroundAgentCount(count);
|
|
170
|
+
}
|
|
171
|
+
/** Set MCP loading state for status bar indicator. */
|
|
172
|
+
setMCPLoading(loading, toolCount) {
|
|
173
|
+
this.statusBar.setMCPLoading(loading, toolCount);
|
|
174
|
+
}
|
|
175
|
+
// ===========================================================================
|
|
176
|
+
// Lifecycle
|
|
177
|
+
// ===========================================================================
|
|
178
|
+
start(skipInitialRender) {
|
|
179
|
+
if (this.isRunning)
|
|
180
|
+
return;
|
|
181
|
+
this.isRunning = true;
|
|
182
|
+
this.isPaused = false;
|
|
183
|
+
// Start keyboard input handling
|
|
184
|
+
this.keyboard.startCapture();
|
|
185
|
+
// Initial render (skip when a startup overlay will be shown immediately)
|
|
186
|
+
if (!skipInitialRender) {
|
|
187
|
+
this.footer.render();
|
|
188
|
+
}
|
|
189
|
+
// Phase 3b: Listen for pending requests changes to trigger re-render
|
|
190
|
+
const pendingManager = getPendingRequestsManager();
|
|
191
|
+
pendingManager.on('count-changed', () => {
|
|
192
|
+
this.needsRender = true;
|
|
193
|
+
});
|
|
194
|
+
// Multi-terminal: Listen for session count changes (other terminals joining/leaving)
|
|
195
|
+
const registry = getSessionRegistry();
|
|
196
|
+
if (registry) {
|
|
197
|
+
registry.onCountChange(() => {
|
|
198
|
+
this.needsRender = true;
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
// Cross-session notifications: re-render when count changes
|
|
202
|
+
const notifMgr = getNotificationManager();
|
|
203
|
+
if (notifMgr) {
|
|
204
|
+
notifMgr.on('count-changed', () => {
|
|
205
|
+
this.needsRender = true;
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
// Start render loop (60ms = ~16fps)
|
|
209
|
+
this.renderTimer = setInterval(() => {
|
|
210
|
+
if (this.needsRender && !this.isPaused) {
|
|
211
|
+
this.footer.render();
|
|
212
|
+
this.needsRender = false;
|
|
213
|
+
}
|
|
214
|
+
}, 60);
|
|
215
|
+
}
|
|
216
|
+
stop() {
|
|
217
|
+
if (!this.isRunning)
|
|
218
|
+
return;
|
|
219
|
+
this.isRunning = false;
|
|
220
|
+
// Stop render loop
|
|
221
|
+
if (this.renderTimer) {
|
|
222
|
+
clearInterval(this.renderTimer);
|
|
223
|
+
this.renderTimer = null;
|
|
224
|
+
}
|
|
225
|
+
// Stop spinner
|
|
226
|
+
this.footer.stopSpinnerAnimation();
|
|
227
|
+
// Stop keyboard capture
|
|
228
|
+
this.keyboard.stopCapture();
|
|
229
|
+
// Clear footer
|
|
230
|
+
this.footer.clear();
|
|
231
|
+
}
|
|
232
|
+
// ===========================================================================
|
|
233
|
+
// Public API - Output (THE KEY METHODS)
|
|
234
|
+
// ===========================================================================
|
|
235
|
+
/**
|
|
236
|
+
* Print a semantic item to the scrolling zone.
|
|
237
|
+
* Items are stored in conversation history for re-rendering when config changes.
|
|
238
|
+
*
|
|
239
|
+
* IMPORTANT: When an overlay is active, items are buffered and rendered after
|
|
240
|
+
* the overlay closes. This prevents cursor position corruption that causes
|
|
241
|
+
* ghost lines and visual artifacts.
|
|
242
|
+
*/
|
|
243
|
+
print(item) {
|
|
244
|
+
// Store in history for re-render capability
|
|
245
|
+
this.conversation.addItem(item);
|
|
246
|
+
// Check if item should be shown based on current filter
|
|
247
|
+
if (!this.conversation.shouldShowItem(item)) {
|
|
248
|
+
return; // Filtered out - stored but not displayed
|
|
249
|
+
}
|
|
250
|
+
// If overlay is active, buffer the item to render later
|
|
251
|
+
// This prevents output from corrupting overlay cursor tracking
|
|
252
|
+
if (this.overlay.hasActiveOverlay()) {
|
|
253
|
+
this.overlay.bufferItem(item);
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
// IMPORTANT: If needsRender is true, render FIRST to update lastRenderHeight.
|
|
257
|
+
// This prevents ghost lines when footer height changed (e.g., spinner started)
|
|
258
|
+
// but render loop hasn't fired yet. Without this, clear() uses stale height.
|
|
259
|
+
if (this.needsRender) {
|
|
260
|
+
this.footer.render();
|
|
261
|
+
this.needsRender = false;
|
|
262
|
+
}
|
|
263
|
+
// Clear footer, render item, re-render footer
|
|
264
|
+
this.footer.clear();
|
|
265
|
+
this.renderItemToConsole(item);
|
|
266
|
+
this.footer.render();
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Render a single item to the console.
|
|
270
|
+
* Config-aware: respects verbose, showMascot settings.
|
|
271
|
+
* Delegates to standalone renderItem() function.
|
|
272
|
+
*/
|
|
273
|
+
renderItemToConsole(item) {
|
|
274
|
+
const suggestion = renderItem(item, this.config);
|
|
275
|
+
if (suggestion !== null) {
|
|
276
|
+
this.setSuggestion(suggestion);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Execute a callback that outputs to terminal.
|
|
281
|
+
* Handles clear → callback → render automatically.
|
|
282
|
+
* Use this for complex output that needs multiple console.log calls.
|
|
283
|
+
* @deprecated Prefer using print() with PrintableItem
|
|
284
|
+
*/
|
|
285
|
+
output(callback) {
|
|
286
|
+
this.footer.clear();
|
|
287
|
+
callback();
|
|
288
|
+
this.footer.render();
|
|
289
|
+
}
|
|
290
|
+
// ===========================================================================
|
|
291
|
+
// Public API - State setters
|
|
292
|
+
// ===========================================================================
|
|
293
|
+
setAgentRunning(running) {
|
|
294
|
+
const wasRunning = this.agentRunning;
|
|
295
|
+
this.agentRunning = running;
|
|
296
|
+
if (running && !wasRunning) {
|
|
297
|
+
this.footer.startSpinnerAnimation(() => { this.needsRender = true; });
|
|
298
|
+
// Let render loop handle it
|
|
299
|
+
}
|
|
300
|
+
else if (!running && wasRunning) {
|
|
301
|
+
this.footer.stopSpinnerAnimation();
|
|
302
|
+
this.currentTool = null;
|
|
303
|
+
}
|
|
304
|
+
this.needsRender = true;
|
|
305
|
+
}
|
|
306
|
+
isAgentRunning() {
|
|
307
|
+
return this.agentRunning;
|
|
308
|
+
}
|
|
309
|
+
setTodos(todos) {
|
|
310
|
+
this.todos = todos;
|
|
311
|
+
this.needsRender = true;
|
|
312
|
+
}
|
|
313
|
+
getTodos() {
|
|
314
|
+
return [...this.todos];
|
|
315
|
+
}
|
|
316
|
+
setSpinnerText(text) {
|
|
317
|
+
this.spinnerText = text;
|
|
318
|
+
this.needsRender = true;
|
|
319
|
+
}
|
|
320
|
+
setCurrentTool(tool) {
|
|
321
|
+
this.currentTool = tool;
|
|
322
|
+
if (tool) {
|
|
323
|
+
this.spinnerText = tool;
|
|
324
|
+
}
|
|
325
|
+
this.needsRender = true;
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Set whether extended thinking mode is active
|
|
329
|
+
* Shows "thinking" indicator in status line
|
|
330
|
+
*/
|
|
331
|
+
setThinking(thinking) {
|
|
332
|
+
this.turnMetrics.isThinking = thinking;
|
|
333
|
+
this.needsRender = true;
|
|
334
|
+
}
|
|
335
|
+
// ===========================================================================
|
|
336
|
+
// Token Tracking (per-turn metrics)
|
|
337
|
+
// ===========================================================================
|
|
338
|
+
/**
|
|
339
|
+
* Add input/output tokens for live display
|
|
340
|
+
* @param thinkingTokens - Optional thinking tokens (Gemini 2.5+ models)
|
|
341
|
+
* @param cacheReadTokens - Optional cache read tokens (Anthropic/Gemini)
|
|
342
|
+
* @param debugPayload - Optional debug payload sizes (char counts)
|
|
343
|
+
*/
|
|
344
|
+
addTokens(inputTokens, outputTokens, thinkingTokens, cacheReadTokens, debugPayload) {
|
|
345
|
+
this.turnMetrics.addTokens(inputTokens, outputTokens, thinkingTokens, cacheReadTokens, debugPayload);
|
|
346
|
+
this.needsRender = true;
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Increment tool call counter
|
|
350
|
+
*/
|
|
351
|
+
incrementToolCalls() {
|
|
352
|
+
this.turnMetrics.incrementToolCalls();
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Increment API call counter (called on each LLM request completion)
|
|
356
|
+
*/
|
|
357
|
+
incrementApiCalls() {
|
|
358
|
+
this.turnMetrics.incrementApiCalls();
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Reset turn metrics (call when agent starts a new turn)
|
|
362
|
+
*/
|
|
363
|
+
resetTurnMetrics() {
|
|
364
|
+
this.turnMetrics.reset();
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Get current turn metrics
|
|
368
|
+
*/
|
|
369
|
+
getTurnMetrics() {
|
|
370
|
+
return this.turnMetrics.getSnapshot();
|
|
371
|
+
}
|
|
372
|
+
setMode(mode) {
|
|
373
|
+
this.mode = mode;
|
|
374
|
+
this.needsRender = true;
|
|
375
|
+
}
|
|
376
|
+
getMode() {
|
|
377
|
+
return this.mode;
|
|
378
|
+
}
|
|
379
|
+
setProjectName(name) {
|
|
380
|
+
this.projectName = name;
|
|
381
|
+
this.needsRender = true;
|
|
382
|
+
}
|
|
383
|
+
getProjectName() {
|
|
384
|
+
return this.projectName;
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Set the active team agent (displayed in footer)
|
|
388
|
+
* Pass null to clear (default agent or no team)
|
|
389
|
+
*/
|
|
390
|
+
setActiveTeamAgent(agent) {
|
|
391
|
+
this.activeTeamAgent = agent;
|
|
392
|
+
this.needsRender = true;
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Get the active team agent
|
|
396
|
+
*/
|
|
397
|
+
getActiveTeamAgent() {
|
|
398
|
+
return this.activeTeamAgent;
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Set the callback to get available team agents for $ autocomplete
|
|
402
|
+
*/
|
|
403
|
+
setAgentSuggestionsCallback(callback) {
|
|
404
|
+
this.ac.getAgentSuggestions = callback;
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Set the callback to get available commands for / autocomplete
|
|
408
|
+
*/
|
|
409
|
+
setCommandsCallback(callback) {
|
|
410
|
+
this.ac.getCommands = callback;
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Set the active plan (for Plan Mode display in footer)
|
|
414
|
+
*/
|
|
415
|
+
setActivePlan(planId, planName) {
|
|
416
|
+
this.activePlanId = planId;
|
|
417
|
+
this.activePlanName = planName;
|
|
418
|
+
this.needsRender = true;
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Get the active plan info
|
|
422
|
+
*/
|
|
423
|
+
getActivePlan() {
|
|
424
|
+
return { id: this.activePlanId, name: this.activePlanName };
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Clear the active plan
|
|
428
|
+
*/
|
|
429
|
+
clearActivePlan() {
|
|
430
|
+
this.activePlanId = null;
|
|
431
|
+
this.activePlanName = null;
|
|
432
|
+
this.needsRender = true;
|
|
433
|
+
}
|
|
434
|
+
/**
|
|
435
|
+
* Set ghost text suggestion (shown when input is empty)
|
|
436
|
+
*/
|
|
437
|
+
setSuggestion(text) {
|
|
438
|
+
this.input.suggestion = text;
|
|
439
|
+
this.needsRender = true;
|
|
440
|
+
}
|
|
441
|
+
getSuggestion() {
|
|
442
|
+
return this.input.suggestion;
|
|
443
|
+
}
|
|
444
|
+
clearSuggestion() {
|
|
445
|
+
this.input.suggestion = null;
|
|
446
|
+
this.needsRender = true;
|
|
447
|
+
}
|
|
448
|
+
// ===========================================================================
|
|
449
|
+
// Public API - LiveRegion (subagents, bash commands)
|
|
450
|
+
// ===========================================================================
|
|
451
|
+
addSubagent(id, agentType, description) {
|
|
452
|
+
this.live.addSubagent(id, agentType, description);
|
|
453
|
+
}
|
|
454
|
+
updateSubagentTool(id, toolName, summary) {
|
|
455
|
+
this.live.updateSubagentTool(id, toolName, summary);
|
|
456
|
+
}
|
|
457
|
+
completeSubagent(id, success, tokenCount, _error) {
|
|
458
|
+
this.live.completeSubagent(id, success, tokenCount, _error);
|
|
459
|
+
}
|
|
460
|
+
removeSubagent(id) {
|
|
461
|
+
return this.live.removeSubagent(id);
|
|
462
|
+
}
|
|
463
|
+
clearLiveRegion() {
|
|
464
|
+
this.live.clearLiveRegion();
|
|
465
|
+
}
|
|
466
|
+
toggleLiveRegionExpanded() {
|
|
467
|
+
this.live.toggleLiveRegionExpanded();
|
|
468
|
+
}
|
|
469
|
+
hasLiveItems() {
|
|
470
|
+
return this.live.hasLiveItems();
|
|
471
|
+
}
|
|
472
|
+
getLiveRegion() {
|
|
473
|
+
return this.live.getLiveRegion();
|
|
474
|
+
}
|
|
475
|
+
addBashCommand(id, command) {
|
|
476
|
+
this.live.addBashCommand(id, command);
|
|
477
|
+
}
|
|
478
|
+
updateBashOutput(id, line) {
|
|
479
|
+
this.live.updateBashOutput(id, line);
|
|
480
|
+
}
|
|
481
|
+
completeBashCommand(id, exitCode) {
|
|
482
|
+
this.live.completeBashCommand(id, exitCode);
|
|
483
|
+
}
|
|
484
|
+
commitBashCommand(id) {
|
|
485
|
+
this.live.commitBashCommand(id);
|
|
486
|
+
}
|
|
487
|
+
backgroundBashCommand() {
|
|
488
|
+
this.live.backgroundBashCommand();
|
|
489
|
+
}
|
|
490
|
+
hasActiveBash() {
|
|
491
|
+
return this.live.hasActiveBash();
|
|
492
|
+
}
|
|
493
|
+
getActiveBashInfo() {
|
|
494
|
+
return this.live.getActiveBashInfo();
|
|
495
|
+
}
|
|
496
|
+
commitSubagent(id, resultContent, success) {
|
|
497
|
+
return this.live.commitSubagent(id, resultContent, success);
|
|
498
|
+
}
|
|
499
|
+
/**
|
|
500
|
+
* Toggle todo list visibility (Ctrl+T)
|
|
501
|
+
*/
|
|
502
|
+
toggleTodos() {
|
|
503
|
+
this.showTodos = !this.showTodos;
|
|
504
|
+
this.needsRender = true;
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Set todo list visibility
|
|
508
|
+
*/
|
|
509
|
+
setShowTodos(show) {
|
|
510
|
+
this.showTodos = show;
|
|
511
|
+
this.needsRender = true;
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* Get todo list visibility
|
|
515
|
+
*/
|
|
516
|
+
getShowTodos() {
|
|
517
|
+
return this.showTodos;
|
|
518
|
+
}
|
|
519
|
+
/**
|
|
520
|
+
* Toggle verbose view mode (Ctrl+O)
|
|
521
|
+
* Shows conversation in verbose mode temporarily.
|
|
522
|
+
* Any key returns to normal view.
|
|
523
|
+
*/
|
|
524
|
+
toggleVerboseView() {
|
|
525
|
+
if (this.viewMode === 'normal') {
|
|
526
|
+
this.viewMode = 'verbose-temp';
|
|
527
|
+
this.reRenderConversationVerbose(true);
|
|
528
|
+
}
|
|
529
|
+
else {
|
|
530
|
+
this.viewMode = 'normal';
|
|
531
|
+
this.reRenderConversationVerbose(false);
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
/**
|
|
535
|
+
* Re-render conversation with temporary verbose setting.
|
|
536
|
+
*/
|
|
537
|
+
reRenderConversationVerbose(verbose) {
|
|
538
|
+
const s = getStyles();
|
|
539
|
+
// Clear screen and scrollback buffer
|
|
540
|
+
process.stdout.write('\x1b[2J\x1b[3J\x1b[H');
|
|
541
|
+
// Reset footer state
|
|
542
|
+
this.footer.resetRenderState();
|
|
543
|
+
// Show mode indicator at top
|
|
544
|
+
if (verbose) {
|
|
545
|
+
console.log(s.info(`[Verbose View Mode] Press any key to return to normal view`));
|
|
546
|
+
console.log('');
|
|
547
|
+
}
|
|
548
|
+
// Re-render all items with temporary verbose override
|
|
549
|
+
const originalVerbose = this.config.verbose;
|
|
550
|
+
this.config.verbose = verbose;
|
|
551
|
+
for (const item of this.conversation.history) {
|
|
552
|
+
this.renderItemToConsole(item);
|
|
553
|
+
}
|
|
554
|
+
// Restore original config
|
|
555
|
+
this.config.verbose = originalVerbose;
|
|
556
|
+
// Footer will be re-rendered by the render loop
|
|
557
|
+
this.needsRender = true;
|
|
558
|
+
}
|
|
559
|
+
// ===========================================================================
|
|
560
|
+
// Public API - Restored History (Ctrl+R)
|
|
561
|
+
// ===========================================================================
|
|
562
|
+
/**
|
|
563
|
+
* Store restored conversation items for Ctrl+R history view.
|
|
564
|
+
* Called when a session is resumed/restored.
|
|
565
|
+
*/
|
|
566
|
+
setRestoredHistory(items) {
|
|
567
|
+
this.conversation.setRestoredHistory(items);
|
|
568
|
+
}
|
|
569
|
+
/**
|
|
570
|
+
* Check if there is restored history available.
|
|
571
|
+
*/
|
|
572
|
+
hasRestoredHistory() {
|
|
573
|
+
return this.conversation.hasRestoredHistory();
|
|
574
|
+
}
|
|
575
|
+
/**
|
|
576
|
+
* Show restored conversation history (Ctrl+R).
|
|
577
|
+
* Renders items permanently into the scrollback buffer.
|
|
578
|
+
* Stays in normal mode — the output persists like any other printed content.
|
|
579
|
+
*/
|
|
580
|
+
showRestoredHistory() {
|
|
581
|
+
const s = getStyles();
|
|
582
|
+
// Clear existing footer to make room for output
|
|
583
|
+
this.footer.clear();
|
|
584
|
+
// Print header
|
|
585
|
+
console.log('');
|
|
586
|
+
console.log(s.info(`── Conversation History (${String(this.conversation.restoredHistory.length)} items) ──`));
|
|
587
|
+
console.log('');
|
|
588
|
+
// Render each restored item into the scrollback
|
|
589
|
+
for (const item of this.conversation.restoredHistory) {
|
|
590
|
+
this.renderItemToConsole(item);
|
|
591
|
+
}
|
|
592
|
+
console.log('');
|
|
593
|
+
console.log(s.muted(`── End of history ──`));
|
|
594
|
+
console.log('');
|
|
595
|
+
// Reset footer state so it re-renders cleanly below the output
|
|
596
|
+
this.footer.resetRenderState();
|
|
597
|
+
this.needsRender = true;
|
|
598
|
+
}
|
|
599
|
+
// ===========================================================================
|
|
600
|
+
// Public API - Config
|
|
601
|
+
// ===========================================================================
|
|
602
|
+
/**
|
|
603
|
+
* Update configuration at runtime.
|
|
604
|
+
* If verbose changes, re-renders the entire conversation.
|
|
605
|
+
*/
|
|
606
|
+
setConfig(newConfig) {
|
|
607
|
+
const oldVerbose = this.config.verbose;
|
|
608
|
+
this.config = { ...this.config, ...newConfig };
|
|
609
|
+
// If verbose changed, re-render entire conversation
|
|
610
|
+
if (newConfig.verbose !== undefined && newConfig.verbose !== oldVerbose) {
|
|
611
|
+
this.reRenderConversation();
|
|
612
|
+
}
|
|
613
|
+
// Theme change requires prompt refresh
|
|
614
|
+
if (newConfig.theme !== undefined) {
|
|
615
|
+
this.refreshPrompt();
|
|
616
|
+
}
|
|
617
|
+
this.needsRender = true;
|
|
618
|
+
}
|
|
619
|
+
/**
|
|
620
|
+
* Get current configuration.
|
|
621
|
+
*/
|
|
622
|
+
getConfig() {
|
|
623
|
+
return { ...this.config };
|
|
624
|
+
}
|
|
625
|
+
/**
|
|
626
|
+
* Re-render entire conversation with current config.
|
|
627
|
+
* Called when verbose mode changes.
|
|
628
|
+
*/
|
|
629
|
+
reRenderConversation() {
|
|
630
|
+
// Clear screen AND scrollback buffer, then move to home
|
|
631
|
+
process.stdout.write('\x1b[2J\x1b[3J\x1b[H');
|
|
632
|
+
// Reset footer state since we cleared everything
|
|
633
|
+
this.footer.resetRenderState();
|
|
634
|
+
// Show filter indicator if active
|
|
635
|
+
if (this.conversation.isFilterActive) {
|
|
636
|
+
const agentList = [...this.conversation.filterAgentIds].map(id => `$${id}`).join(', ');
|
|
637
|
+
const s = getStyles();
|
|
638
|
+
console.log(s.muted(`── Showing messages from: ${agentList} ──`));
|
|
639
|
+
console.log('');
|
|
640
|
+
}
|
|
641
|
+
// Re-render all items with new config (applying filter)
|
|
642
|
+
for (const item of this.conversation.history) {
|
|
643
|
+
if (this.conversation.shouldShowItem(item)) {
|
|
644
|
+
this.renderItemToConsole(item);
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
// Footer will be re-rendered by the render loop
|
|
648
|
+
this.needsRender = true;
|
|
649
|
+
}
|
|
650
|
+
// ===========================================================================
|
|
651
|
+
// Public API - Conversation History
|
|
652
|
+
// ===========================================================================
|
|
653
|
+
/**
|
|
654
|
+
* Clear conversation history.
|
|
655
|
+
* Called by /clear command.
|
|
656
|
+
*/
|
|
657
|
+
clearConversationHistory() {
|
|
658
|
+
this.conversation.clearHistory();
|
|
659
|
+
}
|
|
660
|
+
/**
|
|
661
|
+
* Get conversation history (copy).
|
|
662
|
+
*/
|
|
663
|
+
getConversationHistory() {
|
|
664
|
+
return this.conversation.getHistory();
|
|
665
|
+
}
|
|
666
|
+
// ===========================================================================
|
|
667
|
+
// Public API - Conversation Filter (delegated to ConversationStore)
|
|
668
|
+
// ===========================================================================
|
|
669
|
+
setConversationFilter(agentIds) {
|
|
670
|
+
this.conversation.setFilter(agentIds);
|
|
671
|
+
this.reRenderConversation();
|
|
672
|
+
}
|
|
673
|
+
clearConversationFilter() {
|
|
674
|
+
this.conversation.clearFilter();
|
|
675
|
+
this.reRenderConversation();
|
|
676
|
+
}
|
|
677
|
+
getConversationFilter() {
|
|
678
|
+
return this.conversation.getFilter();
|
|
679
|
+
}
|
|
680
|
+
addToConversationFilter(agentId) {
|
|
681
|
+
return this.conversation.addToFilter(agentId);
|
|
682
|
+
}
|
|
683
|
+
isAgentInFilter(agentId) {
|
|
684
|
+
return this.conversation.isAgentInFilter(agentId);
|
|
685
|
+
}
|
|
686
|
+
// ===========================================================================
|
|
687
|
+
// Public API - Overlays (delegated to OverlayManager)
|
|
688
|
+
// ===========================================================================
|
|
689
|
+
hasActiveOverlay() {
|
|
690
|
+
return this.overlay.hasActiveOverlay();
|
|
691
|
+
}
|
|
692
|
+
getActiveOverlay() {
|
|
693
|
+
return this.overlay.getActiveOverlay();
|
|
694
|
+
}
|
|
695
|
+
async showOverlay(overlay) {
|
|
696
|
+
return this.overlay.showOverlay(overlay);
|
|
697
|
+
}
|
|
698
|
+
requestOverlayRender() {
|
|
699
|
+
this.overlay.requestOverlayRender();
|
|
700
|
+
}
|
|
701
|
+
// ===========================================================================
|
|
702
|
+
// Public API - Input queue
|
|
703
|
+
// ===========================================================================
|
|
704
|
+
getQueuedInputs() {
|
|
705
|
+
return this.input.getQueuedInputs();
|
|
706
|
+
}
|
|
707
|
+
popQueuedInput() {
|
|
708
|
+
const result = this.input.popQueuedInput();
|
|
709
|
+
if (result !== null)
|
|
710
|
+
this.needsRender = true;
|
|
711
|
+
return result;
|
|
712
|
+
}
|
|
713
|
+
hasQueuedInput() {
|
|
714
|
+
return this.input.hasQueuedInput();
|
|
715
|
+
}
|
|
716
|
+
clearQueue() {
|
|
717
|
+
this.input.clearQueue();
|
|
718
|
+
this.needsRender = true;
|
|
719
|
+
}
|
|
720
|
+
// ===========================================================================
|
|
721
|
+
// Public API - Agent message queue
|
|
722
|
+
// ===========================================================================
|
|
723
|
+
/**
|
|
724
|
+
* Queue a message to be sent to the agent.
|
|
725
|
+
* Used by commands that need to invoke the agent programmatically.
|
|
726
|
+
*/
|
|
727
|
+
queueAgentMessage(options) {
|
|
728
|
+
this.agentMessageQueue.push(options);
|
|
729
|
+
}
|
|
730
|
+
/**
|
|
731
|
+
* Pop the next agent message from the queue.
|
|
732
|
+
*/
|
|
733
|
+
popAgentMessage() {
|
|
734
|
+
return this.agentMessageQueue.shift() ?? null;
|
|
735
|
+
}
|
|
736
|
+
/**
|
|
737
|
+
* Check if there are queued agent messages.
|
|
738
|
+
*/
|
|
739
|
+
hasAgentMessage() {
|
|
740
|
+
return this.agentMessageQueue.length > 0;
|
|
741
|
+
}
|
|
742
|
+
/**
|
|
743
|
+
* Clear all queued agent messages.
|
|
744
|
+
*/
|
|
745
|
+
clearAgentMessageQueue() {
|
|
746
|
+
this.agentMessageQueue = [];
|
|
747
|
+
}
|
|
748
|
+
// ===========================================================================
|
|
749
|
+
// Public API - Animation control (for overlays)
|
|
750
|
+
// ===========================================================================
|
|
751
|
+
/**
|
|
752
|
+
* Pause footer completely (for overlays)
|
|
753
|
+
*/
|
|
754
|
+
pauseAnimation() {
|
|
755
|
+
this.isPaused = true;
|
|
756
|
+
// Stop render loop
|
|
757
|
+
if (this.renderTimer) {
|
|
758
|
+
clearInterval(this.renderTimer);
|
|
759
|
+
this.renderTimer = null;
|
|
760
|
+
}
|
|
761
|
+
// Stop spinner
|
|
762
|
+
this.footer.stopSpinnerAnimation();
|
|
763
|
+
// Stop keyboard capture
|
|
764
|
+
this.keyboard.stopCapture();
|
|
765
|
+
// Clear footer from screen
|
|
766
|
+
this.footer.clear();
|
|
767
|
+
}
|
|
768
|
+
/**
|
|
769
|
+
* Resume footer after pause
|
|
770
|
+
*/
|
|
771
|
+
resumeAnimation() {
|
|
772
|
+
this.isPaused = false;
|
|
773
|
+
// Resume spinner if agent running
|
|
774
|
+
if (this.agentRunning) {
|
|
775
|
+
this.footer.startSpinnerAnimation(() => { this.needsRender = true; });
|
|
776
|
+
}
|
|
777
|
+
// Restart keyboard capture
|
|
778
|
+
this.keyboard.startCapture();
|
|
779
|
+
// Restart render loop
|
|
780
|
+
this.footer.render();
|
|
781
|
+
this.renderTimer = setInterval(() => {
|
|
782
|
+
if (this.needsRender && !this.isPaused) {
|
|
783
|
+
this.footer.render();
|
|
784
|
+
this.needsRender = false;
|
|
785
|
+
}
|
|
786
|
+
}, 60);
|
|
787
|
+
}
|
|
788
|
+
/**
|
|
789
|
+
* Restart input after command
|
|
790
|
+
*/
|
|
791
|
+
restartInput() {
|
|
792
|
+
this.footer.render();
|
|
793
|
+
}
|
|
794
|
+
/**
|
|
795
|
+
* Refresh prompt with theme colors
|
|
796
|
+
*/
|
|
797
|
+
refreshPrompt() {
|
|
798
|
+
const s = getStyles();
|
|
799
|
+
this.promptPrefix = s.primaryBold('compilr>') + ' ';
|
|
800
|
+
this.promptPrefixLen = getVisibleLength(this.promptPrefix);
|
|
801
|
+
this.needsRender = true;
|
|
802
|
+
}
|
|
803
|
+
// ===========================================================================
|
|
804
|
+
// Public API - Legacy compatibility (for gradual migration)
|
|
805
|
+
// ===========================================================================
|
|
806
|
+
/**
|
|
807
|
+
* @deprecated Use print() or output() instead
|
|
808
|
+
*/
|
|
809
|
+
clearForOutput() {
|
|
810
|
+
this.footer.clear();
|
|
811
|
+
}
|
|
812
|
+
/**
|
|
813
|
+
* @deprecated Use print() or output() instead
|
|
814
|
+
*/
|
|
815
|
+
forceRender() {
|
|
816
|
+
this.footer.render();
|
|
817
|
+
this.needsRender = false;
|
|
818
|
+
}
|
|
819
|
+
}
|