@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,431 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Footer renderer.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from TerminalUI — owns render state (line height tracking,
|
|
5
|
+
* spinner animation) and the render pipeline (clear, render, line builders).
|
|
6
|
+
* Reads application state through the host's getRenderData() snapshot.
|
|
7
|
+
*/
|
|
8
|
+
import * as terminal from './terminal.js';
|
|
9
|
+
import { getPhysicalLineCount, getVisibleLength } from './line-utils.js';
|
|
10
|
+
import { getStyles } from '../themes/index.js';
|
|
11
|
+
import { formatTokens } from './base/index.js';
|
|
12
|
+
import { formatInputText } from './terminal-autocomplete-utils.js';
|
|
13
|
+
import { buildTodoLine, formatDuration } from './terminal-line-builders.js';
|
|
14
|
+
import { getDefaultShellManager } from '@compilr-dev/sdk';
|
|
15
|
+
import { MASCOT } from './terminal-types.js';
|
|
16
|
+
import { MODE_INFO } from './types.js';
|
|
17
|
+
import { getPendingRequestsManager } from '../multi-agent/index.js';
|
|
18
|
+
import { getSessionRegistry } from '../multi-agent/session-registry.js';
|
|
19
|
+
import { getNotificationManager } from '../multi-agent/notification-manager.js';
|
|
20
|
+
export class FooterRenderer {
|
|
21
|
+
lastRenderHeight = 0;
|
|
22
|
+
cursorLineFromBottom = 0;
|
|
23
|
+
spinnerFrame = 0;
|
|
24
|
+
spinnerTimer = null;
|
|
25
|
+
spinnerFrames = MASCOT.crt;
|
|
26
|
+
host;
|
|
27
|
+
constructor(host) {
|
|
28
|
+
this.host = host;
|
|
29
|
+
}
|
|
30
|
+
// ===========================================================================
|
|
31
|
+
// Clear / Render
|
|
32
|
+
// ===========================================================================
|
|
33
|
+
clear() {
|
|
34
|
+
if (this.lastRenderHeight === 0) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
terminal.moveCursorToLineStart();
|
|
38
|
+
// Move cursor to TOP of footer
|
|
39
|
+
// cursorRowFromTop = which row the cursor is on (1-indexed from top of footer)
|
|
40
|
+
const cursorRowFromTop = this.lastRenderHeight - this.cursorLineFromBottom;
|
|
41
|
+
const rowsToMoveUp = cursorRowFromTop - 1;
|
|
42
|
+
if (rowsToMoveUp > 0) {
|
|
43
|
+
terminal.moveCursorUp(rowsToMoveUp);
|
|
44
|
+
}
|
|
45
|
+
terminal.clearToEndOfScreen();
|
|
46
|
+
this.lastRenderHeight = 0;
|
|
47
|
+
this.cursorLineFromBottom = 0;
|
|
48
|
+
}
|
|
49
|
+
render() {
|
|
50
|
+
if (!this.host.isFooterRenderAllowed()) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const data = this.host.getRenderData();
|
|
54
|
+
const termWidth = terminal.getTerminalWidth();
|
|
55
|
+
const s = getStyles();
|
|
56
|
+
// Build all lines in order
|
|
57
|
+
const lines = [];
|
|
58
|
+
// 0. LiveRegion (if has items) - rendered at top of footer
|
|
59
|
+
if (data.liveRegion.hasItems()) {
|
|
60
|
+
const liveLines = data.liveRegion.render({
|
|
61
|
+
width: termWidth,
|
|
62
|
+
verbose: data.liveVerbose,
|
|
63
|
+
showTokens: true,
|
|
64
|
+
});
|
|
65
|
+
for (const line of liveLines) {
|
|
66
|
+
lines.push({
|
|
67
|
+
content: line,
|
|
68
|
+
physicalLines: getPhysicalLineCount(line, termWidth),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
// Blank line after live region for spacing
|
|
72
|
+
if (liveLines.length > 0) {
|
|
73
|
+
lines.push({ content: '', physicalLines: 1 });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// 1. Header: Spinner (when running) or "Todos" (when idle with todos)
|
|
77
|
+
if (data.agentRunning) {
|
|
78
|
+
const spinnerLine = this.buildSpinnerLine(data);
|
|
79
|
+
lines.push({
|
|
80
|
+
content: spinnerLine,
|
|
81
|
+
physicalLines: getPhysicalLineCount(spinnerLine, termWidth),
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
else if (data.todos.length > 0) {
|
|
85
|
+
const headerLine = s.muted('Todos');
|
|
86
|
+
lines.push({
|
|
87
|
+
content: headerLine,
|
|
88
|
+
physicalLines: 1,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
// 2. Todo list (show if there are todos AND showTodos is true)
|
|
92
|
+
// Sort: in_progress → pending → completed (completed sink to bottom)
|
|
93
|
+
// Stable sort preserves original order within each status group.
|
|
94
|
+
if (data.todos.length > 0 && data.showTodos) {
|
|
95
|
+
const indexed = data.todos.map((todo, i) => ({ todo, taskNumber: i + 1 }));
|
|
96
|
+
const statusOrder = { in_progress: 0, pending: 1, completed: 2 };
|
|
97
|
+
const sorted = [...indexed].sort((a, b) => (statusOrder[a.todo.status] ?? 1) - (statusOrder[b.todo.status] ?? 1));
|
|
98
|
+
for (const { todo, taskNumber } of sorted) {
|
|
99
|
+
const todoLine = buildTodoLine(todo, taskNumber);
|
|
100
|
+
lines.push({
|
|
101
|
+
content: todoLine,
|
|
102
|
+
physicalLines: getPhysicalLineCount(todoLine, termWidth),
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
// Blank line after todos for spacing
|
|
106
|
+
lines.push({ content: '', physicalLines: 1 });
|
|
107
|
+
}
|
|
108
|
+
// 3. Queued inputs (show multiline as single line with ↵ indicator)
|
|
109
|
+
for (const queued of data.queuedInputs) {
|
|
110
|
+
const displayText = queued.replace(/\n/g, ' ↵ ');
|
|
111
|
+
const queuedLine = s.muted(`queued: "${displayText}"`);
|
|
112
|
+
lines.push({
|
|
113
|
+
content: queuedLine,
|
|
114
|
+
physicalLines: getPhysicalLineCount(queuedLine, termWidth),
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
// 4. Top separator
|
|
118
|
+
const separator = '─'.repeat(termWidth);
|
|
119
|
+
lines.push({ content: separator, physicalLines: 1 });
|
|
120
|
+
// 5. Input prompt (multiline support)
|
|
121
|
+
const continuationPrompt = s.muted(' \\ ');
|
|
122
|
+
const continuationPromptLen = getVisibleLength(continuationPrompt);
|
|
123
|
+
const cursorLineIndex = lines.length + data.currentLine; // Index where cursor is
|
|
124
|
+
for (let i = 0; i < data.lines.length; i++) {
|
|
125
|
+
const linePrompt = i === 0 ? data.promptPrefix : continuationPrompt;
|
|
126
|
+
const linePromptLen = i === 0 ? data.promptPrefixLen : continuationPromptLen;
|
|
127
|
+
const lineContent = data.lines[i];
|
|
128
|
+
// Show ghost text on first line when input is empty and no autocomplete
|
|
129
|
+
let fullLine;
|
|
130
|
+
let totalLen;
|
|
131
|
+
if (i === 0 &&
|
|
132
|
+
lineContent === '' &&
|
|
133
|
+
data.lines.length === 1 &&
|
|
134
|
+
data.suggestion &&
|
|
135
|
+
!data.ac.isActive()) {
|
|
136
|
+
// Build: [prompt][suggestion]...[↵ send]
|
|
137
|
+
const rightHint = '↵ send';
|
|
138
|
+
const leftContent = linePrompt + s.muted(data.suggestion);
|
|
139
|
+
const leftLen = linePromptLen + data.suggestion.length;
|
|
140
|
+
const rightLen = rightHint.length;
|
|
141
|
+
const padding = Math.max(1, termWidth - leftLen - rightLen);
|
|
142
|
+
fullLine = leftContent + ' '.repeat(padding) + s.muted(rightHint);
|
|
143
|
+
totalLen = termWidth; // Full width
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
// Format special prefixes: $agent, @path, /command
|
|
147
|
+
const formattedContent = formatInputText(lineContent);
|
|
148
|
+
fullLine = linePrompt + formattedContent;
|
|
149
|
+
totalLen = linePromptLen + getVisibleLength(lineContent);
|
|
150
|
+
}
|
|
151
|
+
const physicalLines = totalLen === 0 ? 1 : Math.ceil(totalLen / termWidth) || 1;
|
|
152
|
+
lines.push({
|
|
153
|
+
content: fullLine,
|
|
154
|
+
physicalLines,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
// 6. Bottom separator
|
|
158
|
+
lines.push({ content: separator, physicalLines: 1 });
|
|
159
|
+
// 7. Mode indicator
|
|
160
|
+
const modeLine = this.buildModeLine(data, termWidth);
|
|
161
|
+
lines.push({
|
|
162
|
+
content: modeLine,
|
|
163
|
+
physicalLines: getPhysicalLineCount(modeLine, termWidth),
|
|
164
|
+
});
|
|
165
|
+
// 7b. Status bar indicators (single horizontal line)
|
|
166
|
+
const statusItems = data.statusBar.getItems();
|
|
167
|
+
if (statusItems.length > 0) {
|
|
168
|
+
const pendingCount = getPendingRequestsManager().getCount();
|
|
169
|
+
const terminalCount = getSessionRegistry()?.getProjectScopedSessionCount() ?? 0;
|
|
170
|
+
const notifCount = getNotificationManager()?.getUnreadCount() ?? 0;
|
|
171
|
+
const segments = [];
|
|
172
|
+
for (let idx = 0; idx < statusItems.length; idx++) {
|
|
173
|
+
const item = statusItems[idx];
|
|
174
|
+
const isSelected = data.statusBar.navActive && data.statusBar.selectedIndex === idx;
|
|
175
|
+
let label;
|
|
176
|
+
if (item.id === 'notifications') {
|
|
177
|
+
label = `[!] ${String(notifCount)} notif`;
|
|
178
|
+
}
|
|
179
|
+
else if (item.id === 'pending') {
|
|
180
|
+
label = `pending: ${String(pendingCount)}`;
|
|
181
|
+
}
|
|
182
|
+
else if (item.id === 'terminals') {
|
|
183
|
+
label = `terminals: ${String(terminalCount)}`;
|
|
184
|
+
}
|
|
185
|
+
else if (item.id === 'mcp') {
|
|
186
|
+
label = 'mcp: connecting...';
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
label = `bg: ${String(data.statusBar.backgroundAgentCount)}`;
|
|
190
|
+
}
|
|
191
|
+
if (isSelected) {
|
|
192
|
+
segments.push(s.inverse(` ${label} `));
|
|
193
|
+
}
|
|
194
|
+
else if (data.statusBar.navActive) {
|
|
195
|
+
segments.push(s.muted(label));
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
segments.push(s.warning(label));
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
let statusLine = segments.join(' ');
|
|
202
|
+
if (data.statusBar.navActive) {
|
|
203
|
+
statusLine += ' ' + s.muted('[Enter]');
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
statusLine += ' ' + s.muted('[↓]');
|
|
207
|
+
}
|
|
208
|
+
lines.push({
|
|
209
|
+
content: statusLine,
|
|
210
|
+
physicalLines: getPhysicalLineCount(statusLine, termWidth),
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
// 8. Autocomplete dropdown (if active) - agent > file > command priority
|
|
214
|
+
const agentAutocompleteLines = data.ac.buildAgentLines(termWidth);
|
|
215
|
+
const fileAutocompleteLines = data.ac.buildFileLines(termWidth);
|
|
216
|
+
const autocompleteLines = agentAutocompleteLines.length > 0
|
|
217
|
+
? agentAutocompleteLines
|
|
218
|
+
: fileAutocompleteLines.length > 0
|
|
219
|
+
? fileAutocompleteLines
|
|
220
|
+
: data.ac.buildCommandLines(termWidth);
|
|
221
|
+
for (const line of autocompleteLines) {
|
|
222
|
+
lines.push({
|
|
223
|
+
content: line,
|
|
224
|
+
physicalLines: getPhysicalLineCount(line, termWidth),
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
// Calculate total physical height
|
|
228
|
+
let totalPhysicalLines = 0;
|
|
229
|
+
for (const line of lines) {
|
|
230
|
+
totalPhysicalLines += line.physicalLines;
|
|
231
|
+
}
|
|
232
|
+
// Clear existing footer
|
|
233
|
+
this.clear();
|
|
234
|
+
// Write all lines
|
|
235
|
+
for (let i = 0; i < lines.length; i++) {
|
|
236
|
+
terminal.write(lines[i].content);
|
|
237
|
+
if (i < lines.length - 1) {
|
|
238
|
+
terminal.write('\n');
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// Calculate cursor position (for multiline, position on the line where cursor is)
|
|
242
|
+
let rowsAfterCursor = 0;
|
|
243
|
+
for (let i = cursorLineIndex + 1; i < lines.length; i++) {
|
|
244
|
+
rowsAfterCursor += lines[i].physicalLines;
|
|
245
|
+
}
|
|
246
|
+
if (rowsAfterCursor > 0) {
|
|
247
|
+
terminal.moveCursorUp(rowsAfterCursor);
|
|
248
|
+
}
|
|
249
|
+
// Calculate column within current line
|
|
250
|
+
const currentLinePromptLen = data.currentLine === 0 ? data.promptPrefixLen : continuationPromptLen;
|
|
251
|
+
const totalPos = currentLinePromptLen + data.cursorPos;
|
|
252
|
+
const cursorCol = (totalPos % termWidth) + 1;
|
|
253
|
+
terminal.moveCursorToColumn(cursorCol);
|
|
254
|
+
terminal.showCursor();
|
|
255
|
+
this.lastRenderHeight = totalPhysicalLines;
|
|
256
|
+
this.cursorLineFromBottom = rowsAfterCursor;
|
|
257
|
+
}
|
|
258
|
+
// ===========================================================================
|
|
259
|
+
// Render state reset
|
|
260
|
+
// ===========================================================================
|
|
261
|
+
resetRenderState() {
|
|
262
|
+
this.lastRenderHeight = 0;
|
|
263
|
+
this.cursorLineFromBottom = 0;
|
|
264
|
+
}
|
|
265
|
+
// ===========================================================================
|
|
266
|
+
// Spinner animation
|
|
267
|
+
// ===========================================================================
|
|
268
|
+
startSpinnerAnimation(onTick) {
|
|
269
|
+
if (this.spinnerTimer)
|
|
270
|
+
return;
|
|
271
|
+
this.spinnerTimer = setInterval(() => {
|
|
272
|
+
this.spinnerFrame++;
|
|
273
|
+
onTick();
|
|
274
|
+
}, 200); // Slower, more relaxed animation
|
|
275
|
+
}
|
|
276
|
+
stopSpinnerAnimation() {
|
|
277
|
+
if (this.spinnerTimer) {
|
|
278
|
+
clearInterval(this.spinnerTimer);
|
|
279
|
+
this.spinnerTimer = null;
|
|
280
|
+
}
|
|
281
|
+
this.spinnerFrame = 0;
|
|
282
|
+
}
|
|
283
|
+
// ===========================================================================
|
|
284
|
+
// Line builders (private)
|
|
285
|
+
// ===========================================================================
|
|
286
|
+
buildSpinnerLine(data) {
|
|
287
|
+
const s = getStyles();
|
|
288
|
+
const frame = this.spinnerFrames[this.spinnerFrame % this.spinnerFrames.length];
|
|
289
|
+
const text = data.currentTool ?? data.spinnerText ?? 'Thinking...';
|
|
290
|
+
// Build hints (Claude Code style: ctrl+c to interrupt · time · tokens · thinking)
|
|
291
|
+
const hints = ['esc to interrupt'];
|
|
292
|
+
// Show "ctrl+b to background" hint if bash running for more than 3 seconds
|
|
293
|
+
if (data.activeBashInfo && (Date.now() - data.activeBashInfo.startTime) > 3000) {
|
|
294
|
+
hints.push('ctrl+b to background');
|
|
295
|
+
}
|
|
296
|
+
// Add elapsed time
|
|
297
|
+
if (data.turnMetrics.startTime > 0) {
|
|
298
|
+
const elapsedMs = Date.now() - data.turnMetrics.startTime;
|
|
299
|
+
hints.push(formatDuration(elapsedMs));
|
|
300
|
+
}
|
|
301
|
+
// Add token counts (↓ input ↑ output) with thinking/cache tokens and API call count
|
|
302
|
+
if (data.turnMetrics.inputTokens > 0 || data.turnMetrics.outputTokens > 0) {
|
|
303
|
+
const inputStr = formatTokens(data.turnMetrics.inputTokens);
|
|
304
|
+
const outputStr = formatTokens(data.turnMetrics.outputTokens);
|
|
305
|
+
let tokenDisplay = `↓ ${inputStr} ↑ ${outputStr}`;
|
|
306
|
+
// Build parenthetical for thinking/cache tokens
|
|
307
|
+
const extras = [];
|
|
308
|
+
if (data.turnMetrics.thinkingTokens > 0) {
|
|
309
|
+
extras.push(`think: ${formatTokens(data.turnMetrics.thinkingTokens)}`);
|
|
310
|
+
}
|
|
311
|
+
if (data.turnMetrics.cacheReadTokens > 0) {
|
|
312
|
+
extras.push(`cache: ${formatTokens(data.turnMetrics.cacheReadTokens)}`);
|
|
313
|
+
}
|
|
314
|
+
if (extras.length > 0) {
|
|
315
|
+
tokenDisplay += ` (${extras.join(', ')})`;
|
|
316
|
+
}
|
|
317
|
+
// Add API call count if multiple calls
|
|
318
|
+
if (data.turnMetrics.apiCalls > 1) {
|
|
319
|
+
tokenDisplay += ` (${String(data.turnMetrics.apiCalls)} calls)`;
|
|
320
|
+
}
|
|
321
|
+
hints.push(tokenDisplay);
|
|
322
|
+
}
|
|
323
|
+
// Add "thinking" indicator when extended thinking is active
|
|
324
|
+
if (data.turnMetrics.isThinking) {
|
|
325
|
+
hints.push('thinking');
|
|
326
|
+
}
|
|
327
|
+
// Add background task count
|
|
328
|
+
const bgTaskCount = getDefaultShellManager().listRunning().length;
|
|
329
|
+
if (bgTaskCount > 0) {
|
|
330
|
+
hints.push(`bg: ${String(bgTaskCount)}`);
|
|
331
|
+
}
|
|
332
|
+
if (data.todos.length > 0 && data.showTodos) {
|
|
333
|
+
hints.push('ctrl+t to hide todos');
|
|
334
|
+
}
|
|
335
|
+
else if (data.todos.length > 0 && !data.showTodos) {
|
|
336
|
+
hints.push('ctrl+t to show todos');
|
|
337
|
+
}
|
|
338
|
+
const hintsText = hints.length > 0 ? ` (${hints.join(' · ')})` : '';
|
|
339
|
+
// Format: [CRT scanner] text (hints)
|
|
340
|
+
return s.muted(`${frame} ${text}${hintsText}`);
|
|
341
|
+
}
|
|
342
|
+
buildModeLine(data, termWidth) {
|
|
343
|
+
const s = getStyles();
|
|
344
|
+
const modeInfo = MODE_INFO[data.mode];
|
|
345
|
+
// Build mode part (left)
|
|
346
|
+
let modePart;
|
|
347
|
+
let modePartLen;
|
|
348
|
+
switch (data.mode) {
|
|
349
|
+
case 'normal':
|
|
350
|
+
modePart = s.muted(`mode: ${modeInfo.label}`);
|
|
351
|
+
modePartLen = `mode: ${modeInfo.label}`.length;
|
|
352
|
+
break;
|
|
353
|
+
case 'auto-accept':
|
|
354
|
+
modePart = s.warning(`mode: ${modeInfo.label}`);
|
|
355
|
+
modePartLen = `mode: ${modeInfo.label}`.length;
|
|
356
|
+
break;
|
|
357
|
+
case 'plan':
|
|
358
|
+
if (data.activePlanName) {
|
|
359
|
+
modePart = s.info(`mode: ${modeInfo.label}`) + s.secondary(` [${data.activePlanName}]`);
|
|
360
|
+
modePartLen = `mode: ${modeInfo.label} [${data.activePlanName}]`.length;
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
modePart = s.info(`mode: ${modeInfo.label}`);
|
|
364
|
+
modePartLen = `mode: ${modeInfo.label}`.length;
|
|
365
|
+
}
|
|
366
|
+
break;
|
|
367
|
+
default:
|
|
368
|
+
modePart = s.muted(`mode: ${modeInfo.label}`);
|
|
369
|
+
modePartLen = `mode: ${modeInfo.label}`.length;
|
|
370
|
+
}
|
|
371
|
+
// Add background task count indicator after mode (if any running)
|
|
372
|
+
const bgCount = getDefaultShellManager().listRunning().length;
|
|
373
|
+
if (bgCount > 0) {
|
|
374
|
+
modePart += ' ' + s.info(`[bg: ${String(bgCount)}]`);
|
|
375
|
+
modePartLen += 1 + `[bg: ${String(bgCount)}]`.length;
|
|
376
|
+
}
|
|
377
|
+
// Add conversation filter indicator (if active)
|
|
378
|
+
if (data.conversationFilterActive) {
|
|
379
|
+
const filterText = '[/f: on]';
|
|
380
|
+
modePart += ' ' + s.secondary(filterText);
|
|
381
|
+
modePartLen += 1 + filterText.length;
|
|
382
|
+
}
|
|
383
|
+
// Add restored history hint (if available, only when not running)
|
|
384
|
+
if (!data.agentRunning && data.hasRestoredHistory) {
|
|
385
|
+
const histHint = '[ctrl+r: history]';
|
|
386
|
+
modePart += ' ' + s.muted(histHint);
|
|
387
|
+
modePartLen += 1 + histHint.length;
|
|
388
|
+
}
|
|
389
|
+
// Build agent part (center) - only if not default
|
|
390
|
+
let agentPart = '';
|
|
391
|
+
let agentPartLen = 0;
|
|
392
|
+
if (data.activeTeamAgent && data.activeTeamAgent.id !== 'default') {
|
|
393
|
+
const agent = data.activeTeamAgent;
|
|
394
|
+
agentPart = s.secondary(`${agent.mascot} $${agent.id}`) + s.muted(` (${agent.displayName})`);
|
|
395
|
+
agentPartLen = `${agent.mascot} $${agent.id} (${agent.displayName})`.length;
|
|
396
|
+
}
|
|
397
|
+
// Build project part (right)
|
|
398
|
+
let projectPart = '';
|
|
399
|
+
let projectPartLen = 0;
|
|
400
|
+
if (data.projectName) {
|
|
401
|
+
const projectText = `Project: ${data.projectName}`;
|
|
402
|
+
projectPart = s.muted(projectText);
|
|
403
|
+
projectPartLen = projectText.length;
|
|
404
|
+
}
|
|
405
|
+
// Calculate layout
|
|
406
|
+
const totalContentLen = modePartLen + agentPartLen + projectPartLen;
|
|
407
|
+
const availableSpace = termWidth - totalContentLen;
|
|
408
|
+
if (availableSpace < 4) {
|
|
409
|
+
// Not enough space - just put mode on left, project on right, skip agent
|
|
410
|
+
if (!data.projectName) {
|
|
411
|
+
return modePart;
|
|
412
|
+
}
|
|
413
|
+
const padding = Math.max(2, termWidth - modePartLen - projectPartLen);
|
|
414
|
+
return modePart + ' '.repeat(padding) + projectPart;
|
|
415
|
+
}
|
|
416
|
+
// Distribute space: split between left-center and center-right gaps
|
|
417
|
+
if (agentPartLen > 0) {
|
|
418
|
+
const leftGap = Math.floor(availableSpace / 2);
|
|
419
|
+
const rightGap = availableSpace - leftGap;
|
|
420
|
+
return modePart + ' '.repeat(Math.max(2, leftGap)) + agentPart + ' '.repeat(Math.max(2, rightGap)) + projectPart;
|
|
421
|
+
}
|
|
422
|
+
else {
|
|
423
|
+
// No agent, just mode and project
|
|
424
|
+
if (!data.projectName) {
|
|
425
|
+
return modePart;
|
|
426
|
+
}
|
|
427
|
+
const padding = Math.max(2, termWidth - modePartLen - projectPartLen);
|
|
428
|
+
return modePart + ' '.repeat(padding) + projectPart;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|
package/dist/ui/footer.d.ts
CHANGED
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
+
* @deprecated DEAD CODE — This class is never instantiated. Do NOT modify this file.
|
|
3
|
+
*
|
|
4
|
+
* The active footer/render pipeline is in TerminalUI (src/ui/terminal-ui.ts).
|
|
5
|
+
* TerminalUI has its own inline render loop with numbered sections (1-8),
|
|
6
|
+
* status bar items, mode indicator, etc. All footer changes should go there.
|
|
7
|
+
*
|
|
8
|
+
* This file is kept only because it is type-imported by terminal-renderer.ts
|
|
9
|
+
* and memory-handler.ts. It can be safely deleted once those imports are removed.
|
|
10
|
+
*
|
|
11
|
+
* --- Original description ---
|
|
2
12
|
* Footer Orchestrator
|
|
3
13
|
*
|
|
4
14
|
* Manages all persistent UI elements below the scrolling zone:
|
|
5
15
|
* - TodoZone (spinner + todo list)
|
|
6
16
|
* - Queued input display
|
|
7
17
|
* - InputPrompt
|
|
8
|
-
*
|
|
9
|
-
* Handles:
|
|
10
|
-
* - Coordinated rendering via single render loop
|
|
11
|
-
* - Event forwarding from InputPrompt
|
|
12
|
-
* - Clearing for scrolling output
|
|
13
|
-
* - State management for agent running/idle modes
|
|
14
18
|
*/
|
|
15
19
|
import { EventEmitter } from 'events';
|
|
16
20
|
import type { TodoItem, AgentMode } from './types.js';
|
|
@@ -30,12 +34,17 @@ export interface FooterOptions {
|
|
|
30
34
|
export declare class Footer extends EventEmitter {
|
|
31
35
|
private readonly todoZone;
|
|
32
36
|
private readonly inputPrompt;
|
|
37
|
+
private readonly subagentRenderer;
|
|
33
38
|
private agentRunning;
|
|
34
39
|
private mode;
|
|
35
40
|
private lastRenderHeight;
|
|
36
41
|
private isRunning;
|
|
37
42
|
private isPaused;
|
|
43
|
+
private isRendering;
|
|
38
44
|
private cursorLineFromBottom;
|
|
45
|
+
private projectName;
|
|
46
|
+
private externalRendererEnabled;
|
|
47
|
+
private activeTeamAgent;
|
|
39
48
|
private readonly renderInterval;
|
|
40
49
|
private renderTimer;
|
|
41
50
|
private needsRender;
|
|
@@ -65,6 +74,39 @@ export declare class Footer extends EventEmitter {
|
|
|
65
74
|
* Get the current mode
|
|
66
75
|
*/
|
|
67
76
|
getMode(): AgentMode;
|
|
77
|
+
/**
|
|
78
|
+
* Set the current project name (displayed in footer)
|
|
79
|
+
*/
|
|
80
|
+
setProjectName(name: string | null): void;
|
|
81
|
+
/**
|
|
82
|
+
* Get the current project name
|
|
83
|
+
*/
|
|
84
|
+
getProjectName(): string | null;
|
|
85
|
+
/**
|
|
86
|
+
* Set the active team agent (displayed in footer)
|
|
87
|
+
* Pass null to clear (default agent or no team)
|
|
88
|
+
*/
|
|
89
|
+
setActiveTeamAgent(agent: {
|
|
90
|
+
id: string;
|
|
91
|
+
displayName: string;
|
|
92
|
+
mascot: string;
|
|
93
|
+
} | null): void;
|
|
94
|
+
/**
|
|
95
|
+
* Set the callback to get available team agents for $ autocomplete
|
|
96
|
+
*/
|
|
97
|
+
setAgentSuggestionsCallback(callback: (() => {
|
|
98
|
+
id: string;
|
|
99
|
+
displayName: string;
|
|
100
|
+
mascot: string;
|
|
101
|
+
}[]) | undefined): void;
|
|
102
|
+
/**
|
|
103
|
+
* Get the active team agent
|
|
104
|
+
*/
|
|
105
|
+
getActiveTeamAgent(): {
|
|
106
|
+
id: string;
|
|
107
|
+
displayName: string;
|
|
108
|
+
mascot: string;
|
|
109
|
+
} | null;
|
|
68
110
|
/**
|
|
69
111
|
* Update the todo list
|
|
70
112
|
*/
|
|
@@ -83,9 +125,69 @@ export declare class Footer extends EventEmitter {
|
|
|
83
125
|
*/
|
|
84
126
|
setSpinnerText(text: string | null): void;
|
|
85
127
|
/**
|
|
86
|
-
* Add tokens to the spinner counter
|
|
128
|
+
* Add tokens to the spinner counter (legacy)
|
|
87
129
|
*/
|
|
88
130
|
addTokens(count: number): void;
|
|
131
|
+
/**
|
|
132
|
+
* Add input/output tokens separately (new API for live display)
|
|
133
|
+
*/
|
|
134
|
+
addTokensDetailed(inputTokens: number, outputTokens: number): void;
|
|
135
|
+
/**
|
|
136
|
+
* Get current token counts
|
|
137
|
+
*/
|
|
138
|
+
getTokenCounts(): {
|
|
139
|
+
input: number;
|
|
140
|
+
output: number;
|
|
141
|
+
total: number;
|
|
142
|
+
};
|
|
143
|
+
/**
|
|
144
|
+
* Set whether extended thinking mode is active
|
|
145
|
+
* Shows "thinking" indicator in status line
|
|
146
|
+
*/
|
|
147
|
+
setThinking(thinking: boolean): void;
|
|
148
|
+
/**
|
|
149
|
+
* Called when a subagent starts
|
|
150
|
+
*/
|
|
151
|
+
onSubagentStart(agentId: string, agentType: string, description: string): void;
|
|
152
|
+
/**
|
|
153
|
+
* Called when a subagent uses a tool
|
|
154
|
+
*/
|
|
155
|
+
onSubagentToolUse(agentId: string, toolName: string, summary?: string): void;
|
|
156
|
+
/**
|
|
157
|
+
* Called when a subagent completes
|
|
158
|
+
*
|
|
159
|
+
* CRITICAL (legacy mode only): We must pause rendering immediately to prevent a race condition.
|
|
160
|
+
* The render loop could fire between onSubagentEnd and clearForOutput, which would:
|
|
161
|
+
* 1. See the subagent as 'done'
|
|
162
|
+
* 2. Render with 0 subagent lines
|
|
163
|
+
* 3. Update lastRenderHeight to a smaller value
|
|
164
|
+
* 4. Then clearForOutput would not clear enough lines → ghost lines!
|
|
165
|
+
*
|
|
166
|
+
* In external renderer mode: No pause needed since the internal render loop is disabled.
|
|
167
|
+
*/
|
|
168
|
+
onSubagentEnd(agentId: string, success: boolean, tokenCount: number, error?: string): void;
|
|
169
|
+
/**
|
|
170
|
+
* Toggle expanded view for subagents (Ctrl+O)
|
|
171
|
+
*/
|
|
172
|
+
toggleSubagentExpand(): void;
|
|
173
|
+
/**
|
|
174
|
+
* Check if there are active subagents
|
|
175
|
+
*/
|
|
176
|
+
hasActiveSubagents(): boolean;
|
|
177
|
+
/**
|
|
178
|
+
* Clear subagent tracking (after completion displayed)
|
|
179
|
+
*/
|
|
180
|
+
clearSubagents(): void;
|
|
181
|
+
/**
|
|
182
|
+
* Get the last subagent's stats before clearing
|
|
183
|
+
*/
|
|
184
|
+
getLastSubagentStats(): {
|
|
185
|
+
type: string;
|
|
186
|
+
description: string;
|
|
187
|
+
toolCount: number;
|
|
188
|
+
tokenCount: number;
|
|
189
|
+
durationMs: number;
|
|
190
|
+
} | null;
|
|
89
191
|
/**
|
|
90
192
|
* Get queued inputs
|
|
91
193
|
*/
|
|
@@ -105,12 +207,26 @@ export declare class Footer extends EventEmitter {
|
|
|
105
207
|
/**
|
|
106
208
|
* Clear footer before scrolling output
|
|
107
209
|
* Call this before writing to the scrolling zone
|
|
210
|
+
* Pauses interval rendering to prevent ghost lines during output
|
|
211
|
+
*
|
|
212
|
+
* When external renderer is enabled (scroll region mode):
|
|
213
|
+
* - Footer doesn't need clearing (it's in a separate scroll region)
|
|
214
|
+
* - Just mark that we need a re-render
|
|
108
215
|
*/
|
|
109
216
|
clearForOutput(): void;
|
|
110
217
|
/**
|
|
111
218
|
* Force an immediate render
|
|
219
|
+
* Resumes interval rendering after clearForOutput()
|
|
220
|
+
*
|
|
221
|
+
* When external renderer is enabled (scroll region mode):
|
|
222
|
+
* - Just mark that we need a re-render (TerminalRenderer's loop will pick it up)
|
|
112
223
|
*/
|
|
113
224
|
forceRender(): void;
|
|
225
|
+
/**
|
|
226
|
+
* Restart input prompt after a command completes
|
|
227
|
+
* Use this for non-overlay commands where finishInput() stopped the prompt
|
|
228
|
+
*/
|
|
229
|
+
restartInput(): void;
|
|
114
230
|
/**
|
|
115
231
|
* Pause footer completely (for overlays)
|
|
116
232
|
* Stops render loop, input capture, and animation
|
|
@@ -125,6 +241,37 @@ export declare class Footer extends EventEmitter {
|
|
|
125
241
|
* Get the height of last render
|
|
126
242
|
*/
|
|
127
243
|
getLastRenderHeight(): number;
|
|
244
|
+
/**
|
|
245
|
+
* Get all footer lines for rendering (for TerminalRenderer integration)
|
|
246
|
+
* Returns the lines WITHOUT writing to terminal
|
|
247
|
+
*/
|
|
248
|
+
getFooterLines(): string[];
|
|
249
|
+
/**
|
|
250
|
+
* Get cursor position within footer content (for TerminalRenderer)
|
|
251
|
+
* Returns { row, col } where row is 0-indexed from start of footer lines
|
|
252
|
+
*/
|
|
253
|
+
getFooterCursorPosition(): {
|
|
254
|
+
row: number;
|
|
255
|
+
col: number;
|
|
256
|
+
};
|
|
257
|
+
/**
|
|
258
|
+
* Enable external renderer mode (TerminalRenderer manages rendering)
|
|
259
|
+
* When enabled:
|
|
260
|
+
* - Footer's internal render loop is disabled
|
|
261
|
+
* - Input capture remains active
|
|
262
|
+
* - Event forwarding remains active
|
|
263
|
+
* - TerminalRenderer calls getFooterLines() and renders
|
|
264
|
+
*/
|
|
265
|
+
setExternalRenderer(enabled: boolean): void;
|
|
266
|
+
/**
|
|
267
|
+
* Check if external renderer is enabled
|
|
268
|
+
*/
|
|
269
|
+
isExternalRendererEnabled(): boolean;
|
|
270
|
+
/**
|
|
271
|
+
* Request a render from external renderer
|
|
272
|
+
* Call this to notify TerminalRenderer that footer needs re-rendering
|
|
273
|
+
*/
|
|
274
|
+
requestExternalRender(): void;
|
|
128
275
|
/**
|
|
129
276
|
* Refresh the prompt with current theme colors
|
|
130
277
|
* Call after theme changes to apply new colors immediately
|
|
@@ -132,6 +279,12 @@ export declare class Footer extends EventEmitter {
|
|
|
132
279
|
refreshPrompt(): void;
|
|
133
280
|
/**
|
|
134
281
|
* Clear the footer area
|
|
282
|
+
*
|
|
283
|
+
* Strategy: Simply move to the top of the CURRENT footer and clear to end.
|
|
284
|
+
* - When footer SHRINKS: clearToEndOfScreen handles the extra lines
|
|
285
|
+
* - When footer GROWS: terminal scrolls naturally when we write more lines
|
|
286
|
+
*
|
|
287
|
+
* We NEVER move up into the scrolling zone - that would eat content!
|
|
135
288
|
*/
|
|
136
289
|
private clear;
|
|
137
290
|
/**
|
|
@@ -142,8 +295,29 @@ export declare class Footer extends EventEmitter {
|
|
|
142
295
|
* Render mode indicator line
|
|
143
296
|
*/
|
|
144
297
|
private renderModeIndicator;
|
|
298
|
+
/**
|
|
299
|
+
* Render agent indicator line (only when team agent is active and not default)
|
|
300
|
+
* Returns empty string if no team agent or default agent.
|
|
301
|
+
* Format: "[◈_◈] $arch (Solution Architect) /team to switch"
|
|
302
|
+
*/
|
|
303
|
+
private renderAgentIndicator;
|
|
304
|
+
/**
|
|
305
|
+
* Render pending requests indicator (Phase 3b: Background Agents)
|
|
306
|
+
* Shows count of pending requests from background agents if any.
|
|
307
|
+
* Format: "⚠ 2 pending requests [/pending to view]"
|
|
308
|
+
* Returns empty string if no pending requests.
|
|
309
|
+
*/
|
|
310
|
+
private renderPendingRequestsIndicator;
|
|
311
|
+
/**
|
|
312
|
+
* Render terminal count indicator (multi-terminal awareness).
|
|
313
|
+
* Shows count of active terminal sessions if more than 1.
|
|
314
|
+
* Format: "+ 2 terminals [/terminals]"
|
|
315
|
+
* Returns empty string if only this terminal is active.
|
|
316
|
+
*/
|
|
317
|
+
private renderTerminalCountIndicator;
|
|
145
318
|
/**
|
|
146
319
|
* Calculate how many terminal rows a line takes (accounting for wrapping)
|
|
320
|
+
* Uses unified line-utils for consistent calculation across all components.
|
|
147
321
|
*/
|
|
148
322
|
private getTerminalRowsForLine;
|
|
149
323
|
/**
|