@pellux/goodvibes-tui 0.18.4
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/.goodvibes/GOODVIBES.md +35 -0
- package/.goodvibes/agents/reviewer.md +89 -0
- package/.goodvibes/skills/add-provider/SKILL.md +199 -0
- package/CHANGELOG.md +1681 -0
- package/README.md +1607 -0
- package/bin/goodvibes +66 -0
- package/docs/README.md +32 -0
- package/docs/foundation-artifacts/README.md +16 -0
- package/docs/foundation-artifacts/knowledge-graphql.graphql +397 -0
- package/docs/foundation-artifacts/knowledge-store.sql +183 -0
- package/docs/foundation-artifacts/operator-contract.json +55157 -0
- package/docs/foundation-artifacts/peer-contract.json +2384 -0
- package/package.json +114 -0
- package/scripts/postinstall.mjs +203 -0
- package/src/acp/connection.ts +447 -0
- package/src/acp/index.ts +7 -0
- package/src/acp/manager.ts +133 -0
- package/src/adapters/bluebubbles/index.ts +127 -0
- package/src/adapters/discord/index.ts +297 -0
- package/src/adapters/github/index.ts +73 -0
- package/src/adapters/google-chat/index.ts +119 -0
- package/src/adapters/imessage/index.ts +92 -0
- package/src/adapters/index.ts +15 -0
- package/src/adapters/matrix/index.ts +116 -0
- package/src/adapters/mattermost/index.ts +151 -0
- package/src/adapters/msteams/index.ts +180 -0
- package/src/adapters/ntfy/index.ts +118 -0
- package/src/adapters/signal/index.ts +92 -0
- package/src/adapters/slack/index.ts +323 -0
- package/src/adapters/telegram/index.ts +160 -0
- package/src/adapters/types.ts +97 -0
- package/src/adapters/webhook/index.ts +178 -0
- package/src/adapters/whatsapp/index.ts +135 -0
- package/src/agents/message-bus-core.ts +312 -0
- package/src/agents/message-bus.ts +2 -0
- package/src/agents/orchestrator-prompts.ts +351 -0
- package/src/agents/orchestrator-runner.ts +668 -0
- package/src/agents/orchestrator.ts +437 -0
- package/src/agents/session.ts +108 -0
- package/src/agents/worktree.ts +153 -0
- package/src/agents/wrfc-config.ts +47 -0
- package/src/agents/wrfc-controller.ts +747 -0
- package/src/agents/wrfc-gate-runtime.ts +75 -0
- package/src/agents/wrfc-reporting.ts +284 -0
- package/src/agents/wrfc-runtime-events.ts +150 -0
- package/src/agents/wrfc-types.ts +67 -0
- package/src/automation/delivery-manager.ts +368 -0
- package/src/automation/index.ts +72 -0
- package/src/automation/manager-runtime-delivery.ts +139 -0
- package/src/automation/manager-runtime-events.ts +131 -0
- package/src/automation/manager-runtime-execution.ts +511 -0
- package/src/automation/manager-runtime-helpers.ts +433 -0
- package/src/automation/manager-runtime-job-mutations.ts +175 -0
- package/src/automation/manager-runtime-reconcile.ts +148 -0
- package/src/automation/manager-runtime-scheduling.ts +189 -0
- package/src/automation/manager-runtime-sync.ts +54 -0
- package/src/automation/manager-runtime.ts +721 -0
- package/src/automation/manager.ts +10 -0
- package/src/automation/service.ts +242 -0
- package/src/channels/builtin/account-actions.ts +490 -0
- package/src/channels/builtin/accounts.ts +433 -0
- package/src/channels/builtin/contracts.ts +405 -0
- package/src/channels/builtin/plugins.ts +308 -0
- package/src/channels/builtin/rendering.ts +174 -0
- package/src/channels/builtin/setup-schema.ts +504 -0
- package/src/channels/builtin/shared.ts +96 -0
- package/src/channels/builtin/surfaces.ts +57 -0
- package/src/channels/builtin/targets.ts +693 -0
- package/src/channels/builtin-runtime.ts +443 -0
- package/src/channels/delivery/shared.ts +199 -0
- package/src/channels/delivery/strategies-bridge.ts +246 -0
- package/src/channels/delivery/strategies-core.ts +299 -0
- package/src/channels/delivery/strategies-enterprise.ts +178 -0
- package/src/channels/delivery/types.ts +59 -0
- package/src/channels/delivery-router.ts +127 -0
- package/src/channels/index.ts +77 -0
- package/src/channels/plugin-registry.ts +551 -0
- package/src/channels/provider-runtime.ts +330 -0
- package/src/channels/reply-pipeline.ts +522 -0
- package/src/channels/route-manager.ts +340 -0
- package/src/channels/surface-registry.ts +186 -0
- package/src/config/helper-model.ts +233 -0
- package/src/config/index.ts +193 -0
- package/src/config/manager.ts +404 -0
- package/src/config/secrets.ts +547 -0
- package/src/config/service-registry.ts +329 -0
- package/src/config/subscription-auth.ts +31 -0
- package/src/config/subscription-providers.ts +127 -0
- package/src/config/tool-llm.ts +110 -0
- package/src/control-plane/approval-broker.ts +351 -0
- package/src/control-plane/gateway.ts +713 -0
- package/src/control-plane/index.ts +54 -0
- package/src/control-plane/media-contract-schemas.ts +208 -0
- package/src/control-plane/method-catalog-admin.ts +136 -0
- package/src/control-plane/method-catalog-channels.ts +591 -0
- package/src/control-plane/method-catalog-control-automation.ts +475 -0
- package/src/control-plane/method-catalog-control-core.ts +594 -0
- package/src/control-plane/method-catalog-control.ts +8 -0
- package/src/control-plane/method-catalog-events.ts +74 -0
- package/src/control-plane/method-catalog-knowledge.ts +531 -0
- package/src/control-plane/method-catalog-media.ts +279 -0
- package/src/control-plane/method-catalog-runtime.ts +304 -0
- package/src/control-plane/method-catalog-shared.ts +223 -0
- package/src/control-plane/method-catalog.ts +242 -0
- package/src/control-plane/operator-contract-schemas-admin.ts +639 -0
- package/src/control-plane/operator-contract-schemas-channels.ts +375 -0
- package/src/control-plane/operator-contract-schemas-control.ts +226 -0
- package/src/control-plane/operator-contract-schemas-domains.ts +4 -0
- package/src/control-plane/operator-contract-schemas-knowledge.ts +582 -0
- package/src/control-plane/operator-contract-schemas-media.ts +297 -0
- package/src/control-plane/operator-contract-schemas-permissions.ts +100 -0
- package/src/control-plane/operator-contract-schemas-remote.ts +38 -0
- package/src/control-plane/operator-contract-schemas-runtime.ts +563 -0
- package/src/control-plane/operator-contract-schemas-shared.ts +85 -0
- package/src/control-plane/operator-contract-schemas-telemetry.ts +349 -0
- package/src/control-plane/operator-contract-schemas.ts +6 -0
- package/src/control-plane/operator-contract.ts +163 -0
- package/src/control-plane/session-broker.ts +780 -0
- package/src/core/compaction-sections.ts +492 -0
- package/src/core/compaction-types.ts +147 -0
- package/src/core/composer-state.ts +59 -0
- package/src/core/context-compaction.ts +542 -0
- package/src/core/conversation-compaction.ts +68 -0
- package/src/core/conversation-diff.ts +55 -0
- package/src/core/conversation-rendering.ts +343 -0
- package/src/core/conversation-utils.ts +72 -0
- package/src/core/conversation.ts +775 -0
- package/src/core/event-replay.ts +287 -0
- package/src/core/orchestrator-context-runtime.ts +407 -0
- package/src/core/orchestrator-follow-up-runtime.ts +134 -0
- package/src/core/orchestrator-runtime.ts +132 -0
- package/src/core/orchestrator-tool-runtime.ts +468 -0
- package/src/core/orchestrator-turn-helpers.ts +355 -0
- package/src/core/orchestrator-turn-loop.ts +443 -0
- package/src/core/orchestrator.ts +733 -0
- package/src/core/plan-command-handler.ts +169 -0
- package/src/core/system-message-router.ts +210 -0
- package/src/core/transcript-events/classify.ts +95 -0
- package/src/core/transcript-events/index.ts +15 -0
- package/src/daemon/cli.ts +88 -0
- package/src/daemon/control-plane.ts +522 -0
- package/src/daemon/facade-composition.ts +397 -0
- package/src/daemon/facade.ts +638 -0
- package/src/daemon/helpers.ts +74 -0
- package/src/daemon/http/router-route-contexts.ts +370 -0
- package/src/daemon/http/router.ts +531 -0
- package/src/daemon/http-listener.ts +301 -0
- package/src/daemon/index.ts +3 -0
- package/src/daemon/server.ts +1 -0
- package/src/daemon/service-manager.ts +413 -0
- package/src/daemon/surface-actions.ts +183 -0
- package/src/daemon/surface-delivery.ts +530 -0
- package/src/daemon/surface-policy.ts +60 -0
- package/src/daemon/transport-events.ts +110 -0
- package/src/daemon/types.ts +191 -0
- package/src/export/markdown.ts +213 -0
- package/src/export/session-export.ts +633 -0
- package/src/git/index.ts +1 -0
- package/src/git/service.ts +414 -0
- package/src/hooks/chain-engine.ts +414 -0
- package/src/hooks/dispatcher.ts +414 -0
- package/src/hooks/hook-api.ts +170 -0
- package/src/hooks/index.ts +48 -0
- package/src/hooks/runners/agent.ts +93 -0
- package/src/hooks/runners/prompt.ts +69 -0
- package/src/hooks/workbench.ts +360 -0
- package/src/input/autocomplete.ts +96 -0
- package/src/input/bookmark-modal.ts +115 -0
- package/src/input/command-registry.ts +300 -0
- package/src/input/commands/branch-runtime.ts +72 -0
- package/src/input/commands/config.ts +515 -0
- package/src/input/commands/control-room-runtime.ts +255 -0
- package/src/input/commands/conversation-runtime.ts +207 -0
- package/src/input/commands/diff-runtime.ts +161 -0
- package/src/input/commands/discovery-runtime.ts +45 -0
- package/src/input/commands/eval.ts +204 -0
- package/src/input/commands/experience-runtime.ts +278 -0
- package/src/input/commands/git-runtime.ts +81 -0
- package/src/input/commands/guidance-runtime.ts +101 -0
- package/src/input/commands/health-runtime.ts +434 -0
- package/src/input/commands/hooks-runtime.ts +148 -0
- package/src/input/commands/incident-runtime.ts +95 -0
- package/src/input/commands/integration-runtime.ts +394 -0
- package/src/input/commands/intelligence-runtime.ts +223 -0
- package/src/input/commands/knowledge.ts +368 -0
- package/src/input/commands/local-auth-runtime.ts +105 -0
- package/src/input/commands/local-provider-runtime.ts +170 -0
- package/src/input/commands/local-runtime.ts +458 -0
- package/src/input/commands/local-setup-review.ts +192 -0
- package/src/input/commands/local-setup-transfer.ts +134 -0
- package/src/input/commands/local-setup.ts +292 -0
- package/src/input/commands/managed-runtime.ts +208 -0
- package/src/input/commands/marketplace-runtime.ts +290 -0
- package/src/input/commands/mcp-runtime.ts +202 -0
- package/src/input/commands/memory-product-runtime.ts +111 -0
- package/src/input/commands/memory.ts +151 -0
- package/src/input/commands/notify-runtime.ts +83 -0
- package/src/input/commands/operator-panel-runtime.ts +141 -0
- package/src/input/commands/operator-runtime.ts +392 -0
- package/src/input/commands/permissions-runtime.ts +104 -0
- package/src/input/commands/planning-runtime.ts +97 -0
- package/src/input/commands/platform-access-runtime.ts +422 -0
- package/src/input/commands/platform-runtime.ts +6 -0
- package/src/input/commands/platform-sandbox-qemu.ts +137 -0
- package/src/input/commands/platform-sandbox-runtime.ts +406 -0
- package/src/input/commands/platform-sandbox-session.ts +128 -0
- package/src/input/commands/platform-services-runtime.ts +246 -0
- package/src/input/commands/policy-dispatch.ts +339 -0
- package/src/input/commands/policy.ts +17 -0
- package/src/input/commands/product-runtime.ts +351 -0
- package/src/input/commands/profile-sync-runtime.ts +99 -0
- package/src/input/commands/provider-accounts-runtime.ts +113 -0
- package/src/input/commands/provider.ts +363 -0
- package/src/input/commands/quit-shared.ts +162 -0
- package/src/input/commands/recall-bundle.ts +132 -0
- package/src/input/commands/recall-capture.ts +152 -0
- package/src/input/commands/recall-query.ts +229 -0
- package/src/input/commands/recall-review.ts +98 -0
- package/src/input/commands/recall-shared.ts +22 -0
- package/src/input/commands/remote-runtime-pool.ts +106 -0
- package/src/input/commands/remote-runtime-setup.ts +199 -0
- package/src/input/commands/remote-runtime.ts +531 -0
- package/src/input/commands/replay-runtime.ts +18 -0
- package/src/input/commands/runtime-services.ts +279 -0
- package/src/input/commands/schedule-runtime.ts +332 -0
- package/src/input/commands/services-runtime.ts +207 -0
- package/src/input/commands/session-content.ts +408 -0
- package/src/input/commands/session-workflow.ts +464 -0
- package/src/input/commands/session.ts +376 -0
- package/src/input/commands/settings-sync-runtime.ts +173 -0
- package/src/input/commands/share-runtime.ts +114 -0
- package/src/input/commands/shell-core.ts +320 -0
- package/src/input/commands/skills-runtime.ts +221 -0
- package/src/input/commands/subscription-runtime.ts +434 -0
- package/src/input/commands/tasks-runtime.ts +230 -0
- package/src/input/commands/teamwork-runtime.ts +374 -0
- package/src/input/commands/teleport-runtime.ts +57 -0
- package/src/input/commands/worktree-runtime.ts +137 -0
- package/src/input/commands.ts +127 -0
- package/src/input/file-picker.ts +192 -0
- package/src/input/handler-command-route.ts +106 -0
- package/src/input/handler-content-actions.ts +465 -0
- package/src/input/handler-feed-routes.ts +541 -0
- package/src/input/handler-feed.ts +361 -0
- package/src/input/handler-modal-routes.ts +335 -0
- package/src/input/handler-modal-stack.ts +237 -0
- package/src/input/handler-modal-token-routes.ts +272 -0
- package/src/input/handler-picker-routes.ts +416 -0
- package/src/input/handler-prompt-buffer.ts +320 -0
- package/src/input/handler-shortcuts.ts +195 -0
- package/src/input/handler-ui-state.ts +294 -0
- package/src/input/handler.ts +798 -0
- package/src/input/input-history.ts +267 -0
- package/src/input/keybindings.ts +256 -0
- package/src/input/model-picker.ts +730 -0
- package/src/input/panel-integration-actions.ts +77 -0
- package/src/input/profile-picker-modal.ts +222 -0
- package/src/input/search.ts +100 -0
- package/src/input/selection-modal.ts +163 -0
- package/src/input/selection.ts +135 -0
- package/src/input/session-picker-modal.ts +136 -0
- package/src/input/settings-modal.ts +718 -0
- package/src/input/submission-intent.ts +18 -0
- package/src/input/submission-router.ts +64 -0
- package/src/integrations/index.ts +42 -0
- package/src/integrations/notifier.ts +206 -0
- package/src/integrations/webhooks.ts +177 -0
- package/src/knowledge/consolidation.ts +346 -0
- package/src/knowledge/graphql.ts +324 -0
- package/src/knowledge/index.ts +60 -0
- package/src/knowledge/ingest-compile.ts +386 -0
- package/src/knowledge/ingest-context.ts +18 -0
- package/src/knowledge/ingest-inputs.ts +387 -0
- package/src/knowledge/ingest.ts +20 -0
- package/src/knowledge/internal.ts +257 -0
- package/src/knowledge/knowledge-api.ts +432 -0
- package/src/knowledge/lint.ts +121 -0
- package/src/knowledge/memory-sync.ts +62 -0
- package/src/knowledge/packet.ts +370 -0
- package/src/knowledge/scheduling.ts +283 -0
- package/src/knowledge/service.ts +715 -0
- package/src/main.ts +798 -0
- package/src/mcp/client.ts +383 -0
- package/src/mcp/index.ts +12 -0
- package/src/mcp/mcp-api.ts +90 -0
- package/src/mcp/registry.ts +508 -0
- package/src/media/builtin-image-understanding.ts +303 -0
- package/src/media/builtin-providers.ts +26 -0
- package/src/media/index.ts +18 -0
- package/src/multimodal/index.ts +13 -0
- package/src/multimodal/service.ts +492 -0
- package/src/panels/agent-inspector-panel.ts +515 -0
- package/src/panels/agent-inspector-shared.ts +94 -0
- package/src/panels/agent-logs-panel.ts +539 -0
- package/src/panels/agent-logs-shared.ts +129 -0
- package/src/panels/approval-panel.ts +169 -0
- package/src/panels/automation-control-panel.ts +253 -0
- package/src/panels/base-panel.ts +72 -0
- package/src/panels/builtin/agent.ts +88 -0
- package/src/panels/builtin/development.ts +111 -0
- package/src/panels/builtin/knowledge.ts +26 -0
- package/src/panels/builtin/operations.ts +385 -0
- package/src/panels/builtin/session.ts +61 -0
- package/src/panels/builtin/shared.ts +240 -0
- package/src/panels/builtin-panels.ts +23 -0
- package/src/panels/cockpit-panel.ts +183 -0
- package/src/panels/communication-panel.ts +191 -0
- package/src/panels/context-visualizer-panel.ts +199 -0
- package/src/panels/control-plane-panel.ts +266 -0
- package/src/panels/cost-tracker-panel.ts +444 -0
- package/src/panels/debug-panel.ts +432 -0
- package/src/panels/diff-panel.ts +518 -0
- package/src/panels/docs-panel.ts +283 -0
- package/src/panels/eval-panel.ts +399 -0
- package/src/panels/file-explorer-panel.ts +556 -0
- package/src/panels/file-preview-panel.ts +412 -0
- package/src/panels/forensics-panel.ts +364 -0
- package/src/panels/git-panel.ts +630 -0
- package/src/panels/hooks-panel.ts +274 -0
- package/src/panels/incident-review-panel.ts +247 -0
- package/src/panels/index.ts +48 -0
- package/src/panels/intelligence-panel.ts +176 -0
- package/src/panels/knowledge-panel.ts +328 -0
- package/src/panels/local-auth-panel.ts +146 -0
- package/src/panels/marketplace-panel.ts +223 -0
- package/src/panels/mcp-panel.ts +260 -0
- package/src/panels/memory-panel.ts +293 -0
- package/src/panels/ops-control-panel.ts +184 -0
- package/src/panels/ops-strategy-panel.ts +235 -0
- package/src/panels/orchestration-panel.ts +254 -0
- package/src/panels/panel-list-panel.ts +508 -0
- package/src/panels/panel-manager.ts +538 -0
- package/src/panels/panel-picker.ts +106 -0
- package/src/panels/plan-dashboard-panel.ts +272 -0
- package/src/panels/plugins-panel.ts +201 -0
- package/src/panels/policy-panel.ts +308 -0
- package/src/panels/polish.ts +668 -0
- package/src/panels/provider-account-snapshot.ts +259 -0
- package/src/panels/provider-accounts-panel.ts +221 -0
- package/src/panels/provider-health-domains.ts +211 -0
- package/src/panels/provider-health-panel.ts +725 -0
- package/src/panels/provider-health-tracker.ts +115 -0
- package/src/panels/provider-stats-panel.ts +366 -0
- package/src/panels/remote-panel.ts +449 -0
- package/src/panels/routes-panel.ts +228 -0
- package/src/panels/sandbox-panel.ts +289 -0
- package/src/panels/schedule-panel.ts +344 -0
- package/src/panels/search-focus.ts +32 -0
- package/src/panels/security-panel.ts +329 -0
- package/src/panels/services-panel.ts +271 -0
- package/src/panels/session-browser-panel.ts +399 -0
- package/src/panels/session-maintenance.ts +125 -0
- package/src/panels/settings-sync-panel.ts +164 -0
- package/src/panels/skills-panel.ts +475 -0
- package/src/panels/subscription-panel.ts +273 -0
- package/src/panels/symbol-outline-panel.ts +486 -0
- package/src/panels/system-messages-panel.ts +224 -0
- package/src/panels/tasks-panel.ts +448 -0
- package/src/panels/thinking-panel.ts +304 -0
- package/src/panels/token-budget-panel.ts +469 -0
- package/src/panels/tool-inspector-panel.ts +434 -0
- package/src/panels/types.ts +44 -0
- package/src/panels/watchers-panel.ts +241 -0
- package/src/panels/welcome-panel.ts +64 -0
- package/src/panels/worktree-panel.ts +180 -0
- package/src/panels/wrfc-panel.ts +480 -0
- package/src/permissions/briefs/build.ts +88 -0
- package/src/permissions/manager.ts +356 -0
- package/src/permissions/prompt.ts +184 -0
- package/src/plugins/api.ts +383 -0
- package/src/plugins/loader.ts +304 -0
- package/src/plugins/manager.ts +481 -0
- package/src/profiles/shape.ts +58 -0
- package/src/providers/amazon-bedrock-mantle.ts +50 -0
- package/src/providers/amazon-bedrock.ts +61 -0
- package/src/providers/anthropic-compat.ts +373 -0
- package/src/providers/anthropic-sdk-provider.ts +230 -0
- package/src/providers/anthropic-vertex.ts +59 -0
- package/src/providers/anthropic.ts +469 -0
- package/src/providers/auto-register.ts +417 -0
- package/src/providers/builtin-catalog.ts +326 -0
- package/src/providers/builtin-registry.ts +575 -0
- package/src/providers/cache-planner.ts +258 -0
- package/src/providers/capabilities.ts +601 -0
- package/src/providers/custom-loader.ts +425 -0
- package/src/providers/discovered-compat.ts +18 -0
- package/src/providers/discovered-factory.ts +61 -0
- package/src/providers/discovered-traits.ts +138 -0
- package/src/providers/gemini.ts +462 -0
- package/src/providers/github-copilot.ts +254 -0
- package/src/providers/index.ts +47 -0
- package/src/providers/interface.ts +185 -0
- package/src/providers/llama-cpp.ts +402 -0
- package/src/providers/lm-studio-helpers.ts +367 -0
- package/src/providers/lm-studio.ts +484 -0
- package/src/providers/model-catalog-cache.ts +221 -0
- package/src/providers/model-catalog-notifications.ts +97 -0
- package/src/providers/model-catalog-synthetic.ts +202 -0
- package/src/providers/model-catalog.ts +211 -0
- package/src/providers/model-limits.ts +280 -0
- package/src/providers/ollama.ts +469 -0
- package/src/providers/openai-codex.ts +472 -0
- package/src/providers/openai-compat.ts +615 -0
- package/src/providers/openai.ts +231 -0
- package/src/providers/optimizer.ts +381 -0
- package/src/providers/provider-api.ts +553 -0
- package/src/providers/registry-helpers.ts +34 -0
- package/src/providers/registry-models.ts +77 -0
- package/src/providers/registry-types.ts +67 -0
- package/src/providers/registry.ts +729 -0
- package/src/providers/runtime-metadata.ts +149 -0
- package/src/providers/runtime-snapshot.ts +130 -0
- package/src/providers/synthetic.ts +561 -0
- package/src/providers/tier-prompts.ts +84 -0
- package/src/providers/tool-formats.ts +414 -0
- package/src/renderer/agent-detail-modal.ts +285 -0
- package/src/renderer/autocomplete-overlay.ts +154 -0
- package/src/renderer/block-actions.ts +76 -0
- package/src/renderer/bookmark-modal.ts +101 -0
- package/src/renderer/bottom-bar.ts +58 -0
- package/src/renderer/buffer.ts +34 -0
- package/src/renderer/code-block.ts +373 -0
- package/src/renderer/compositor.ts +261 -0
- package/src/renderer/context-inspector.ts +219 -0
- package/src/renderer/conversation-layout.ts +67 -0
- package/src/renderer/conversation-overlays.ts +123 -0
- package/src/renderer/conversation-surface.ts +260 -0
- package/src/renderer/diff-view.ts +132 -0
- package/src/renderer/diff.ts +122 -0
- package/src/renderer/file-picker-overlay.ts +101 -0
- package/src/renderer/file-tree.ts +153 -0
- package/src/renderer/git-status.ts +89 -0
- package/src/renderer/help-overlay.ts +247 -0
- package/src/renderer/history-search-overlay.ts +73 -0
- package/src/renderer/layout-engine.ts +97 -0
- package/src/renderer/layout.ts +32 -0
- package/src/renderer/live-tail-modal.ts +156 -0
- package/src/renderer/markdown.ts +777 -0
- package/src/renderer/modal-factory.ts +467 -0
- package/src/renderer/modal-utils.ts +24 -0
- package/src/renderer/model-picker-overlay.ts +396 -0
- package/src/renderer/overlay-box.ts +165 -0
- package/src/renderer/overlay-viewport.ts +104 -0
- package/src/renderer/panel-composite.ts +80 -0
- package/src/renderer/panel-picker-overlay.ts +202 -0
- package/src/renderer/panel-tab-bar.ts +69 -0
- package/src/renderer/panel-workspace-bar.ts +38 -0
- package/src/renderer/process-indicator.ts +96 -0
- package/src/renderer/process-modal.ts +295 -0
- package/src/renderer/profile-picker-modal.ts +129 -0
- package/src/renderer/progress.ts +98 -0
- package/src/renderer/search-overlay.ts +54 -0
- package/src/renderer/selection-modal-overlay.ts +214 -0
- package/src/renderer/semantic-diff.ts +369 -0
- package/src/renderer/session-picker-modal.ts +127 -0
- package/src/renderer/settings-modal.ts +701 -0
- package/src/renderer/shell-surface.ts +88 -0
- package/src/renderer/surface-layout.ts +101 -0
- package/src/renderer/syntax-highlighter.ts +542 -0
- package/src/renderer/system-message.ts +83 -0
- package/src/renderer/tab-strip.ts +108 -0
- package/src/renderer/text-layout.ts +31 -0
- package/src/renderer/thinking.ts +17 -0
- package/src/renderer/tool-call.ts +233 -0
- package/src/renderer/ui-factory.ts +524 -0
- package/src/renderer/ui-primitives.ts +96 -0
- package/src/runtime/auth/inspection.ts +125 -0
- package/src/runtime/bootstrap-background.ts +147 -0
- package/src/runtime/bootstrap-command-context.ts +265 -0
- package/src/runtime/bootstrap-command-parts.ts +357 -0
- package/src/runtime/bootstrap-core.ts +375 -0
- package/src/runtime/bootstrap-helpers.ts +88 -0
- package/src/runtime/bootstrap-hook-bridge.ts +271 -0
- package/src/runtime/bootstrap-runtime-events.ts +254 -0
- package/src/runtime/bootstrap-services.ts +197 -0
- package/src/runtime/bootstrap-shell.ts +262 -0
- package/src/runtime/bootstrap.ts +488 -0
- package/src/runtime/compaction/index.ts +90 -0
- package/src/runtime/compaction/lifecycle.ts +167 -0
- package/src/runtime/compaction/manager.ts +474 -0
- package/src/runtime/compaction/quality-score.ts +279 -0
- package/src/runtime/compaction/resume-repair.ts +183 -0
- package/src/runtime/compaction/strategies/autocompact.ts +65 -0
- package/src/runtime/compaction/strategies/boundary-commit.ts +106 -0
- package/src/runtime/compaction/strategies/collapse.ts +90 -0
- package/src/runtime/compaction/strategies/index.ts +23 -0
- package/src/runtime/compaction/strategies/microcompact.ts +74 -0
- package/src/runtime/compaction/strategies/reactive.ts +89 -0
- package/src/runtime/compaction/types.ts +221 -0
- package/src/runtime/context.ts +158 -0
- package/src/runtime/diagnostics/actions.ts +776 -0
- package/src/runtime/diagnostics/index.ts +99 -0
- package/src/runtime/diagnostics/panels/agents.ts +252 -0
- package/src/runtime/diagnostics/panels/events.ts +188 -0
- package/src/runtime/diagnostics/panels/health.ts +242 -0
- package/src/runtime/diagnostics/panels/index.ts +24 -0
- package/src/runtime/diagnostics/panels/ops.ts +156 -0
- package/src/runtime/diagnostics/panels/policy.ts +176 -0
- package/src/runtime/diagnostics/panels/tasks.ts +251 -0
- package/src/runtime/diagnostics/panels/tool-calls.ts +267 -0
- package/src/runtime/diagnostics/provider.ts +262 -0
- package/src/runtime/ecosystem/catalog.ts +606 -0
- package/src/runtime/ecosystem/recommendations.ts +117 -0
- package/src/runtime/emitters/agents.ts +96 -0
- package/src/runtime/emitters/automation.ts +112 -0
- package/src/runtime/emitters/communication.ts +53 -0
- package/src/runtime/emitters/compaction.ts +161 -0
- package/src/runtime/emitters/control-plane.ts +65 -0
- package/src/runtime/emitters/deliveries.ts +65 -0
- package/src/runtime/emitters/forensics.ts +17 -0
- package/src/runtime/emitters/index.ts +59 -0
- package/src/runtime/emitters/knowledge.ts +129 -0
- package/src/runtime/emitters/mcp.ts +95 -0
- package/src/runtime/emitters/ops.ts +163 -0
- package/src/runtime/emitters/orchestration.ts +87 -0
- package/src/runtime/emitters/permissions.ts +98 -0
- package/src/runtime/emitters/planner.ts +23 -0
- package/src/runtime/emitters/plugins.ts +78 -0
- package/src/runtime/emitters/providers.ts +30 -0
- package/src/runtime/emitters/routes.ts +57 -0
- package/src/runtime/emitters/security.ts +53 -0
- package/src/runtime/emitters/session.ts +93 -0
- package/src/runtime/emitters/surfaces.ts +57 -0
- package/src/runtime/emitters/tasks.ts +69 -0
- package/src/runtime/emitters/tools.ts +140 -0
- package/src/runtime/emitters/transport.ts +78 -0
- package/src/runtime/emitters/turn.ts +155 -0
- package/src/runtime/emitters/ui.ts +57 -0
- package/src/runtime/emitters/watchers.ts +57 -0
- package/src/runtime/emitters/workflows.ts +79 -0
- package/src/runtime/eval/index.ts +48 -0
- package/src/runtime/eval/runner.ts +163 -0
- package/src/runtime/eval/suites.ts +264 -0
- package/src/runtime/events/domain-map.ts +148 -0
- package/src/runtime/events/index.ts +194 -0
- package/src/runtime/events/turn.ts +60 -0
- package/src/runtime/events/workflows.ts +17 -0
- package/src/runtime/forensics/collector.ts +693 -0
- package/src/runtime/forensics/index.ts +23 -0
- package/src/runtime/foundation-clients.ts +78 -0
- package/src/runtime/foundation-services.ts +96 -0
- package/src/runtime/guidance.ts +183 -0
- package/src/runtime/health/effect-handlers.ts +189 -0
- package/src/runtime/health/index.ts +70 -0
- package/src/runtime/health/wiring.ts +115 -0
- package/src/runtime/index.ts +174 -0
- package/src/runtime/integration/helpers.ts +640 -0
- package/src/runtime/lifecycle.ts +107 -0
- package/src/runtime/mcp/index.ts +68 -0
- package/src/runtime/mcp/manager.ts +513 -0
- package/src/runtime/network/inbound.ts +131 -0
- package/src/runtime/network/index.ts +30 -0
- package/src/runtime/network/outbound.ts +292 -0
- package/src/runtime/network/shared.ts +82 -0
- package/src/runtime/operator-client.ts +235 -0
- package/src/runtime/ops/control-plane.ts +363 -0
- package/src/runtime/ops/index.ts +122 -0
- package/src/runtime/ops/playbooks/index.ts +10 -0
- package/src/runtime/ops/playbooks/session-unrecoverable.ts +196 -0
- package/src/runtime/ops/playbooks/stuck-turn.ts +197 -0
- package/src/runtime/ops/runtime-context.ts +100 -0
- package/src/runtime/ops-api.ts +27 -0
- package/src/runtime/orchestration/spawn-policy.ts +83 -0
- package/src/runtime/peer-client.ts +404 -0
- package/src/runtime/perf/index.ts +57 -0
- package/src/runtime/perf/slo-collector.ts +375 -0
- package/src/runtime/permissions/index.ts +190 -0
- package/src/runtime/permissions/policy-runtime.ts +175 -0
- package/src/runtime/permissions/preflight.ts +101 -0
- package/src/runtime/permissions/rule-suggestions.ts +36 -0
- package/src/runtime/plugins/hot-reload.ts +221 -0
- package/src/runtime/plugins/index.ts +84 -0
- package/src/runtime/plugins/lifecycle.ts +95 -0
- package/src/runtime/plugins/manager.ts +474 -0
- package/src/runtime/plugins/manifest.ts +167 -0
- package/src/runtime/plugins/quarantine.ts +202 -0
- package/src/runtime/plugins/trust.ts +291 -0
- package/src/runtime/plugins/types.ts +205 -0
- package/src/runtime/provider-accounts/registry.ts +326 -0
- package/src/runtime/remote/distributed-runtime-contract-schemas.ts +386 -0
- package/src/runtime/remote/index.ts +488 -0
- package/src/runtime/remote/runner-registry.ts +438 -0
- package/src/runtime/remote/supervisor.ts +70 -0
- package/src/runtime/runtime-hook-api.ts +5 -0
- package/src/runtime/runtime-knowledge-api.ts +14 -0
- package/src/runtime/runtime-mcp-api.ts +5 -0
- package/src/runtime/runtime-ops-api.ts +86 -0
- package/src/runtime/runtime-provider-api.ts +18 -0
- package/src/runtime/sandbox/backend.ts +291 -0
- package/src/runtime/sandbox/manager.ts +364 -0
- package/src/runtime/sandbox/provisioning.ts +422 -0
- package/src/runtime/sandbox/session-registry.ts +289 -0
- package/src/runtime/services.ts +541 -0
- package/src/runtime/session-maintenance.ts +188 -0
- package/src/runtime/session-persistence.ts +288 -0
- package/src/runtime/session-return-context.ts +195 -0
- package/src/runtime/settings/control-plane-store.ts +258 -0
- package/src/runtime/settings/control-plane.ts +599 -0
- package/src/runtime/shell-command-extensions.ts +54 -0
- package/src/runtime/shell-command-ops.ts +207 -0
- package/src/runtime/shell-command-platform.ts +47 -0
- package/src/runtime/shell-command-services.ts +143 -0
- package/src/runtime/shell-command-workspace.ts +31 -0
- package/src/runtime/store/domains/conversation.ts +181 -0
- package/src/runtime/store/domains/domain-read-matrix.ts +17 -0
- package/src/runtime/store/domains/index.ts +222 -0
- package/src/runtime/store/domains/panels.ts +117 -0
- package/src/runtime/store/domains/permissions.ts +143 -0
- package/src/runtime/store/domains/ui-perf.ts +103 -0
- package/src/runtime/store/helpers/reducers/conversation.ts +228 -0
- package/src/runtime/store/helpers/reducers/lifecycle.ts +440 -0
- package/src/runtime/store/helpers/reducers/shared.ts +60 -0
- package/src/runtime/store/helpers/reducers/sync.ts +555 -0
- package/src/runtime/store/helpers/reducers.ts +30 -0
- package/src/runtime/store/index.ts +304 -0
- package/src/runtime/store/selectors/index.ts +354 -0
- package/src/runtime/store/state.ts +137 -0
- package/src/runtime/tasks/adapters/acp-adapter.ts +211 -0
- package/src/runtime/tasks/adapters/agent-adapter.ts +208 -0
- package/src/runtime/tasks/adapters/index.ts +16 -0
- package/src/runtime/tasks/adapters/process-adapter.ts +214 -0
- package/src/runtime/tasks/adapters/scheduler-adapter.ts +193 -0
- package/src/runtime/tasks/index.ts +68 -0
- package/src/runtime/tasks/manager.ts +415 -0
- package/src/runtime/telemetry/api-helpers.ts +517 -0
- package/src/runtime/telemetry/api.ts +768 -0
- package/src/runtime/telemetry/index.ts +178 -0
- package/src/runtime/telemetry/instrumentation/domain-bridge-agent-session.ts +440 -0
- package/src/runtime/telemetry/instrumentation/domain-bridge-plugin-mcp.ts +200 -0
- package/src/runtime/telemetry/instrumentation/domain-bridge-shared.ts +18 -0
- package/src/runtime/telemetry/instrumentation/domain-bridge-transport-task.ts +204 -0
- package/src/runtime/telemetry/instrumentation/domain-bridge.ts +125 -0
- package/src/runtime/telemetry/instrumentation/index.ts +67 -0
- package/src/runtime/tools/context.ts +114 -0
- package/src/runtime/tools/index.ts +46 -0
- package/src/runtime/tools/phased-executor.ts +448 -0
- package/src/runtime/tools/phases/budget.ts +130 -0
- package/src/runtime/tools/phases/execute.ts +69 -0
- package/src/runtime/tools/phases/index.ts +13 -0
- package/src/runtime/tools/phases/map-output.ts +98 -0
- package/src/runtime/tools/phases/permission.ts +133 -0
- package/src/runtime/tools/phases/posthook.ts +57 -0
- package/src/runtime/tools/phases/prehook.ts +68 -0
- package/src/runtime/tools/phases/validate.ts +53 -0
- package/src/runtime/transports/direct.ts +73 -0
- package/src/runtime/transports/http-helpers.ts +218 -0
- package/src/runtime/transports/http-types.ts +364 -0
- package/src/runtime/transports/http.ts +629 -0
- package/src/runtime/transports/realtime.ts +50 -0
- package/src/runtime/transports/remote-events.ts +16 -0
- package/src/runtime/transports/shared.ts +39 -0
- package/src/runtime/transports/ui-runtime-events.ts +35 -0
- package/src/runtime/ui/index.ts +39 -0
- package/src/runtime/ui/model-picker/data-provider.ts +182 -0
- package/src/runtime/ui/model-picker/health-enrichment.ts +228 -0
- package/src/runtime/ui/model-picker/index.ts +59 -0
- package/src/runtime/ui/model-picker/types.ts +149 -0
- package/src/runtime/ui/provider-health/data-provider.ts +244 -0
- package/src/runtime/ui/provider-health/fallback-visualizer.ts +69 -0
- package/src/runtime/ui/provider-health/index.ts +46 -0
- package/src/runtime/ui/provider-health/types.ts +146 -0
- package/src/runtime/ui-events.ts +46 -0
- package/src/runtime/ui-read-model-helpers.ts +32 -0
- package/src/runtime/ui-read-models-core.ts +95 -0
- package/src/runtime/ui-read-models-observability-maintenance.ts +81 -0
- package/src/runtime/ui-read-models-observability-options.ts +5 -0
- package/src/runtime/ui-read-models-observability-remote.ts +73 -0
- package/src/runtime/ui-read-models-observability-security.ts +172 -0
- package/src/runtime/ui-read-models-observability-system.ts +217 -0
- package/src/runtime/ui-read-models-observability.ts +59 -0
- package/src/runtime/ui-read-models-operations.ts +203 -0
- package/src/runtime/ui-read-models.ts +61 -0
- package/src/runtime/ui-service-queries.ts +114 -0
- package/src/runtime/ui-services.ts +163 -0
- package/src/runtime/worktree/registry.ts +252 -0
- package/src/scripts/process-messages.ts +42 -0
- package/src/sessions/manager.ts +388 -0
- package/src/shell/blocking-input.ts +89 -0
- package/src/shell/ui-openers.ts +163 -0
- package/src/state/file-watcher.ts +294 -0
- package/src/state/index.ts +56 -0
- package/src/state/knowledge-injection.ts +214 -0
- package/src/state/memory-embedding-http.ts +642 -0
- package/src/state/memory-embeddings.ts +312 -0
- package/src/state/memory-ingest.ts +132 -0
- package/src/state/memory-registry.ts +111 -0
- package/src/state/memory-store-helpers.ts +160 -0
- package/src/state/memory-store.ts +728 -0
- package/src/state/memory-vector-store.ts +418 -0
- package/src/templates/manager.ts +187 -0
- package/src/tools/agent/index.ts +610 -0
- package/src/tools/agent/manager.ts +476 -0
- package/src/tools/analyze/git-modes.ts +380 -0
- package/src/tools/analyze/index.ts +128 -0
- package/src/tools/channel/agent-tools.ts +16 -0
- package/src/tools/channel/index.ts +268 -0
- package/src/tools/control/index.ts +90 -0
- package/src/tools/edit/core.ts +619 -0
- package/src/tools/edit/index.ts +4 -0
- package/src/tools/edit/phased.ts +33 -0
- package/src/tools/fetch/index.ts +3 -0
- package/src/tools/fetch/phased.ts +34 -0
- package/src/tools/fetch/runtime.ts +499 -0
- package/src/tools/index.ts +186 -0
- package/src/tools/mcp/index.ts +190 -0
- package/src/tools/remote-trigger/index.ts +130 -0
- package/src/tools/repl/index.ts +318 -0
- package/src/tools/shared/auto-heal.ts +282 -0
- package/src/tools/state/index.ts +688 -0
- package/src/tools/web-search/index.ts +38 -0
- package/src/tools/write/index.ts +604 -0
- package/src/tools/write/phased.ts +41 -0
- package/src/types/generated/foundation-client-types.ts +22 -0
- package/src/types/sql-js.d.ts +15 -0
- package/src/utils/splash-lines.ts +46 -0
- package/src/version.ts +17 -0
- package/src/watchers/index.ts +11 -0
- package/src/watchers/registry.ts +517 -0
- package/src/web-search/index.ts +26 -0
- package/src/web-search/provider-registry.ts +64 -0
- package/src/web-search/providers/brave.ts +100 -0
- package/src/web-search/providers/duckduckgo.ts +270 -0
- package/src/web-search/providers/exa.ts +77 -0
- package/src/web-search/providers/firecrawl.ts +90 -0
- package/src/web-search/providers/perplexity.ts +86 -0
- package/src/web-search/providers/searxng.ts +88 -0
- package/src/web-search/providers/shared.ts +249 -0
- package/src/web-search/providers/tavily.ts +90 -0
- package/src/web-search/service.ts +142 -0
- package/src/widget/index.ts +2 -0
- package/src/widget/types.ts +9 -0
- package/src/widget/widget.ts +8 -0
|
@@ -0,0 +1,798 @@
|
|
|
1
|
+
import { InputTokenizer } from '@pellux/goodvibes-sdk/platform/core/tokenizer';
|
|
2
|
+
import { SelectionManager } from './selection.ts';
|
|
3
|
+
import type { InfiniteBuffer } from '@pellux/goodvibes-sdk/platform/core/history';
|
|
4
|
+
import type { CommandRegistry, CommandContext } from './command-registry.ts';
|
|
5
|
+
import { AutocompleteEngine } from './autocomplete.ts';
|
|
6
|
+
import { FilePickerModal } from './file-picker.ts';
|
|
7
|
+
import { ModelPickerModal } from './model-picker.ts';
|
|
8
|
+
import { SelectionModal } from './selection-modal.ts';
|
|
9
|
+
import type { SelectionResult, SelectionAction } from './selection-modal.ts';
|
|
10
|
+
import { SearchManager } from './search.ts';
|
|
11
|
+
import { InputHistory, HistorySearch } from './input-history.ts';
|
|
12
|
+
import type { BlockMeta, ConversationManager } from '../core/conversation.ts';
|
|
13
|
+
import { ProcessModal } from '../renderer/process-modal.ts';
|
|
14
|
+
import { LiveTailModal } from '../renderer/live-tail-modal.ts';
|
|
15
|
+
import { BlockActionsMenu } from '../renderer/block-actions.ts';
|
|
16
|
+
import { AgentDetailModal } from '../renderer/agent-detail-modal.ts';
|
|
17
|
+
import { ContextInspectorModal } from '../renderer/context-inspector.ts';
|
|
18
|
+
import { BookmarkModal } from './bookmark-modal.ts';
|
|
19
|
+
import { SettingsModal } from './settings-modal.ts';
|
|
20
|
+
import { SessionPickerModal } from './session-picker-modal.ts';
|
|
21
|
+
import { ProfilePickerModal } from './profile-picker-modal.ts';
|
|
22
|
+
import {
|
|
23
|
+
IMAGE_EXTENSIONS,
|
|
24
|
+
cleanupMarkerRegistry,
|
|
25
|
+
expandPrompt,
|
|
26
|
+
findMarkerAtPos,
|
|
27
|
+
formatFileSize,
|
|
28
|
+
handleBlockCopy,
|
|
29
|
+
handleBlockRerun,
|
|
30
|
+
handleBlockSave,
|
|
31
|
+
handleBlockToggle,
|
|
32
|
+
handleBookmark,
|
|
33
|
+
handleClipboardPaste,
|
|
34
|
+
handleCopy,
|
|
35
|
+
handleCtrlC,
|
|
36
|
+
handleDiffApply,
|
|
37
|
+
mediaTypeFromExt,
|
|
38
|
+
registerPaste,
|
|
39
|
+
} from './handler-content-actions.ts';
|
|
40
|
+
import {
|
|
41
|
+
handleIndicatorFocusToken,
|
|
42
|
+
handleMouseToken,
|
|
43
|
+
handlePanelFocusToken,
|
|
44
|
+
handlePromptKeyToken,
|
|
45
|
+
handlePromptTextToken,
|
|
46
|
+
} from './handler-feed-routes.ts';
|
|
47
|
+
import {
|
|
48
|
+
ensureInputCursorVisible,
|
|
49
|
+
findPathToken,
|
|
50
|
+
getWrappedPromptInfo,
|
|
51
|
+
handlePathCompletion,
|
|
52
|
+
moveCursorVertical,
|
|
53
|
+
redoPromptState,
|
|
54
|
+
saveUndoState,
|
|
55
|
+
undoPromptState,
|
|
56
|
+
wordWrapLine,
|
|
57
|
+
type WrappedPromptInfo,
|
|
58
|
+
} from './handler-prompt-buffer.ts';
|
|
59
|
+
import { clearModalStack, handleEscape, modalOpened } from './handler-modal-stack.ts';
|
|
60
|
+
import { handleModalTokenRoutes } from './handler-modal-token-routes.ts';
|
|
61
|
+
import {
|
|
62
|
+
handleHistorySearchToken,
|
|
63
|
+
handleOverlayToken,
|
|
64
|
+
handleSearchModeToken,
|
|
65
|
+
} from './handler-ui-state.ts';
|
|
66
|
+
import {
|
|
67
|
+
handleBookmarkModalToken,
|
|
68
|
+
handleProfilePickerToken,
|
|
69
|
+
handleSelectionModalToken,
|
|
70
|
+
handleSessionPickerToken,
|
|
71
|
+
handleSettingsModalToken,
|
|
72
|
+
} from './handler-modal-routes.ts';
|
|
73
|
+
import { handleCommandModeToken } from './handler-command-route.ts';
|
|
74
|
+
import {
|
|
75
|
+
handleBlockActionsToken,
|
|
76
|
+
handleEscapeOnlyModalToken,
|
|
77
|
+
handleFilePickerToken,
|
|
78
|
+
handleLiveTailToken,
|
|
79
|
+
handleModelPickerToken,
|
|
80
|
+
handleProcessModalToken,
|
|
81
|
+
} from './handler-picker-routes.ts';
|
|
82
|
+
import { handleGlobalShortcutToken } from './handler-shortcuts.ts';
|
|
83
|
+
import { feedInputTokens } from './handler-feed.ts';
|
|
84
|
+
import { handlePanelIntegrationAction as runPanelIntegrationAction } from './panel-integration-actions.ts';
|
|
85
|
+
import type { Panel } from '../panels/types.ts';
|
|
86
|
+
import type { UiRuntimeServices } from '../runtime/ui-services.ts';
|
|
87
|
+
export { handlePanelIntegrationAction } from './panel-integration-actions.ts';
|
|
88
|
+
|
|
89
|
+
type SelectionModalCallback = (result: SelectionResult | null) => void;
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* InputHandler - Owns prompt text, paste registry, and keyboard/mouse handling.
|
|
93
|
+
* Extracted from main.ts and StateManager.
|
|
94
|
+
*/
|
|
95
|
+
export class InputHandler {
|
|
96
|
+
public prompt = '';
|
|
97
|
+
public cursorPos = 0;
|
|
98
|
+
public showExitNotice = false;
|
|
99
|
+
/** Max visible rows for the input area. Content beyond this scrolls internally. */
|
|
100
|
+
public static readonly MAX_INPUT_ROWS = 8;
|
|
101
|
+
/** Internal scroll offset for the input area when content exceeds MAX_INPUT_ROWS. */
|
|
102
|
+
public inputScrollTop = 0;
|
|
103
|
+
public lastCopyTime = 0;
|
|
104
|
+
/** True when the user has entered slash-command mode (prompt starts with '/'). */
|
|
105
|
+
public commandMode = false;
|
|
106
|
+
/** True when the process indicator bar has keyboard focus. */
|
|
107
|
+
public indicatorFocused = false;
|
|
108
|
+
/** True when keyboard focus is on the active panel (arrow/enter go to panel, not prompt). */
|
|
109
|
+
public panelFocused = false;
|
|
110
|
+
|
|
111
|
+
private tokenizer = new InputTokenizer();
|
|
112
|
+
private pasteRegistry = new Map<string, string>();
|
|
113
|
+
private nextPasteId = 1;
|
|
114
|
+
private lastCtrlCTime = 0;
|
|
115
|
+
private commandRegistry: CommandRegistry | null = null;
|
|
116
|
+
private commandContext: CommandContext | undefined = undefined;
|
|
117
|
+
public autocomplete: AutocompleteEngine | null = null;
|
|
118
|
+
public modelPicker: ModelPickerModal;
|
|
119
|
+
public selectionModal = new SelectionModal();
|
|
120
|
+
public searchManager = new SearchManager();
|
|
121
|
+
public processModal: ProcessModal;
|
|
122
|
+
public liveTailModal: LiveTailModal;
|
|
123
|
+
public agentDetailModal: AgentDetailModal;
|
|
124
|
+
public contextInspectorModal = new ContextInspectorModal();
|
|
125
|
+
public bookmarkModal: BookmarkModal;
|
|
126
|
+
public blockActionsMenu = new BlockActionsMenu();
|
|
127
|
+
public settingsModal = new SettingsModal();
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Modal navigation stack. Each element is the name of an open modal.
|
|
131
|
+
* Used to support back-navigation via Escape.
|
|
132
|
+
*/
|
|
133
|
+
public modalStack: string[] = [];
|
|
134
|
+
public modalReturnFocus: 'prompt' | 'panel' | 'indicator' = 'prompt';
|
|
135
|
+
public sessionPickerModal: SessionPickerModal;
|
|
136
|
+
public profilePickerModal: ProfilePickerModal;
|
|
137
|
+
/** True when the help overlay is visible. */
|
|
138
|
+
public helpOverlayActive = false;
|
|
139
|
+
public helpScrollOffset = 0;
|
|
140
|
+
public shortcutsOverlayActive = false;
|
|
141
|
+
public shortcutsScrollOffset = 0;
|
|
142
|
+
private inputHistory: InputHistory | null = null;
|
|
143
|
+
public filePicker: FilePickerModal;
|
|
144
|
+
public historySearch: HistorySearch = new HistorySearch(() => this.inputHistory?.getEntries() ?? []);
|
|
145
|
+
private conversationManager: ConversationManager | null = null;
|
|
146
|
+
private selectionCallback: SelectionModalCallback | null = null;
|
|
147
|
+
private syncFeedSelectionCallback: ((callback: SelectionModalCallback | null) => void) | null = null;
|
|
148
|
+
/** Time of last [COPIED] block feedback, for brief display. */
|
|
149
|
+
public lastBlockCopyTime = 0;
|
|
150
|
+
private mouseDownRow = -1;
|
|
151
|
+
private mouseDownCol = -1;
|
|
152
|
+
|
|
153
|
+
/** Pasted images: maps marker IDs to base64 image data. */
|
|
154
|
+
private imageRegistry = new Map<string, { data: string; mediaType: string }>();
|
|
155
|
+
private nextImageId = 1;
|
|
156
|
+
|
|
157
|
+
// ── Undo / Redo ────────────────────────────────────────────────────────────
|
|
158
|
+
private undoStack: Array<{ prompt: string; cursorPos: number }> = [];
|
|
159
|
+
private redoStack: Array<{ prompt: string; cursorPos: number }> = [];
|
|
160
|
+
private static readonly MAX_UNDO = 50;
|
|
161
|
+
|
|
162
|
+
// ── Path completion (Tab on path-like token) ───────────────────────────────
|
|
163
|
+
/** Current list of path completions cycling on repeated Tab presses. */
|
|
164
|
+
private pathCompletions: string[] = [];
|
|
165
|
+
/** Index into pathCompletions for Tab cycling. */
|
|
166
|
+
private pathCompletionIndex = -1;
|
|
167
|
+
/** The raw prefix that triggered path completion (e.g. 'src/in'). */
|
|
168
|
+
private pathCompletionPrefix = '';
|
|
169
|
+
/** Start offset in prompt where the path token begins. */
|
|
170
|
+
private pathCompletionStart = 0;
|
|
171
|
+
|
|
172
|
+
constructor(
|
|
173
|
+
private requestRender: () => void,
|
|
174
|
+
private selection: SelectionManager,
|
|
175
|
+
private getScrollTop: () => number,
|
|
176
|
+
private getViewportHeight: () => number,
|
|
177
|
+
private getHistory: () => InfiniteBuffer,
|
|
178
|
+
private scroll: (delta: number) => void,
|
|
179
|
+
private exitApp: () => void,
|
|
180
|
+
private readonly uiServices: Pick<UiRuntimeServices,
|
|
181
|
+
'agents'
|
|
182
|
+
| 'environment'
|
|
183
|
+
| 'providers'
|
|
184
|
+
| 'sessions'
|
|
185
|
+
| 'shell'
|
|
186
|
+
>,
|
|
187
|
+
) {
|
|
188
|
+
this.filePicker = new FilePickerModal(uiServices.environment.shellPaths);
|
|
189
|
+
this.modelPicker = new ModelPickerModal(
|
|
190
|
+
uiServices.providers.favoritesStore,
|
|
191
|
+
uiServices.providers.benchmarkStore,
|
|
192
|
+
uiServices.providers.providerRegistry,
|
|
193
|
+
);
|
|
194
|
+
this.processModal = new ProcessModal({
|
|
195
|
+
agentManager: uiServices.agents.agentManager,
|
|
196
|
+
processManager: uiServices.shell.processManager,
|
|
197
|
+
wrfcController: uiServices.agents.wrfcController,
|
|
198
|
+
});
|
|
199
|
+
this.liveTailModal = new LiveTailModal({
|
|
200
|
+
agentManager: uiServices.agents.agentManager,
|
|
201
|
+
processManager: uiServices.shell.processManager,
|
|
202
|
+
});
|
|
203
|
+
this.agentDetailModal = new AgentDetailModal({
|
|
204
|
+
agentManager: uiServices.agents.agentManager,
|
|
205
|
+
agentMessageBus: uiServices.agents.agentMessageBus,
|
|
206
|
+
sessionLogPathResolver: (agentId) => uiServices.environment.shellPaths.resolveProjectPath('tui', 'sessions', `${agentId}.jsonl`),
|
|
207
|
+
});
|
|
208
|
+
this.bookmarkModal = new BookmarkModal(uiServices.shell.bookmarkManager);
|
|
209
|
+
this.sessionPickerModal = new SessionPickerModal(uiServices.sessions.sessionManager);
|
|
210
|
+
this.profilePickerModal = new ProfilePickerModal(uiServices.shell.profileManager);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* setHistory - Wire in the InputHistory instance.
|
|
215
|
+
* Optional; if not set, history navigation is disabled.
|
|
216
|
+
*/
|
|
217
|
+
public setHistory(history: InputHistory): void {
|
|
218
|
+
this.inputHistory = history;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* setCommandRegistry - Wire in the slash command registry and context.
|
|
223
|
+
* Must be called before commands can be processed.
|
|
224
|
+
*/
|
|
225
|
+
public setCommandRegistry(registry: CommandRegistry, context: CommandContext): void {
|
|
226
|
+
this.commandRegistry = registry;
|
|
227
|
+
this.commandContext = context;
|
|
228
|
+
this.autocomplete = new AutocompleteEngine(registry);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* setConversationManager - Wire in the conversation manager for block copy/apply/collapse.
|
|
233
|
+
*/
|
|
234
|
+
public setConversationManager(cm: ConversationManager): void {
|
|
235
|
+
this.conversationManager = cm;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* openSelection - Open the generic selection modal with a callback.
|
|
240
|
+
* The callback receives SelectionResult on selection, or null on cancel/escape.
|
|
241
|
+
*/
|
|
242
|
+
public openSelection(
|
|
243
|
+
title: string,
|
|
244
|
+
items: import('./selection-modal.ts').SelectionItem[],
|
|
245
|
+
opts: {
|
|
246
|
+
preSelectId?: string;
|
|
247
|
+
allowSearch?: boolean;
|
|
248
|
+
customActions?: Map<string, SelectionAction>;
|
|
249
|
+
} | undefined,
|
|
250
|
+
callback: SelectionModalCallback,
|
|
251
|
+
): void {
|
|
252
|
+
this.modalOpened('selection');
|
|
253
|
+
this.selectionModal.open(title, items, opts);
|
|
254
|
+
this.selectionCallback = callback;
|
|
255
|
+
this.syncFeedSelectionCallback?.(callback);
|
|
256
|
+
this.requestRender();
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
public registerPaste(content: string): string {
|
|
260
|
+
const result = registerPaste({
|
|
261
|
+
pasteRegistry: this.pasteRegistry,
|
|
262
|
+
nextPasteId: this.nextPasteId,
|
|
263
|
+
imageRegistry: this.imageRegistry,
|
|
264
|
+
nextImageId: this.nextImageId,
|
|
265
|
+
}, content, this.uiServices.environment.shellPaths.workingDirectory);
|
|
266
|
+
this.nextPasteId = result.nextPasteId;
|
|
267
|
+
this.nextImageId = result.nextImageId;
|
|
268
|
+
return result.marker;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* expandPrompt - Replaces paste markers with actual content.
|
|
273
|
+
* If image markers are present, returns ContentPart[] for multimodal delivery.
|
|
274
|
+
* Otherwise returns a plain string.
|
|
275
|
+
*/
|
|
276
|
+
private expandPrompt(text: string) {
|
|
277
|
+
return expandPrompt(this.pasteRegistry, this.imageRegistry, text, this.uiServices.environment.shellPaths.workingDirectory);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* getImageAttachments - Returns a copy of the current image registry.
|
|
282
|
+
* Callers can use this to attach images when building LLM messages.
|
|
283
|
+
*/
|
|
284
|
+
public getImageAttachments(): Map<string, { data: string; mediaType: string }> {
|
|
285
|
+
return new Map(this.imageRegistry);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* findMarkerAtPos - Returns the start/end of an atomic marker if pos is inside one.
|
|
290
|
+
* Used to make backspace/delete/arrow treat markers as single units.
|
|
291
|
+
*/
|
|
292
|
+
/**
|
|
293
|
+
* cleanupMarkerRegistry - If the given marker text is an IMAGE marker,
|
|
294
|
+
* parses its ID and removes it from imageRegistry.
|
|
295
|
+
*/
|
|
296
|
+
private cleanupMarkerRegistry(markerText: string): void {
|
|
297
|
+
cleanupMarkerRegistry(this.imageRegistry, markerText);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
private findMarkerAtPos(pos: number): { start: number; end: number } | null {
|
|
301
|
+
return findMarkerAtPos(this.prompt, pos);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
private handleCopy(): void {
|
|
305
|
+
handleCopy(this.selection, this.getHistory, this.requestRender, () => {
|
|
306
|
+
this.lastCopyTime = Date.now();
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* handleBlockCopy - Ctrl+Y: Copy the content of the nearest code/tool block.
|
|
312
|
+
*/
|
|
313
|
+
private handleBlockCopy(): void {
|
|
314
|
+
handleBlockCopy(this.conversationManager, this.getScrollTop, this.requestRender, () => {
|
|
315
|
+
this.lastBlockCopyTime = Date.now();
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* handleBookmark - Ctrl+B: Toggle bookmark on the nearest block.
|
|
321
|
+
*/
|
|
322
|
+
private handleBookmark(): void {
|
|
323
|
+
handleBookmark(this.conversationManager, this.getScrollTop, this.requestRender, this.uiServices.shell.bookmarkManager);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* handleBlockSave - Ctrl+S: Save nearest block content to a file.
|
|
328
|
+
*/
|
|
329
|
+
private handleBlockSave(): void {
|
|
330
|
+
handleBlockSave(this.conversationManager, this.getScrollTop, this.requestRender, this.uiServices.shell.bookmarkManager);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/**
|
|
334
|
+
* executeBlockAction - Execute a block action ID on the nearest block.
|
|
335
|
+
* Called when the user selects an action from the BlockActionsMenu.
|
|
336
|
+
*/
|
|
337
|
+
private executeBlockAction(actionId: string): void {
|
|
338
|
+
switch (actionId) {
|
|
339
|
+
case 'copy': this.handleBlockCopy(); break;
|
|
340
|
+
case 'bookmark': this.handleBookmark(); break;
|
|
341
|
+
case 'toggle': this.handleBlockToggle(); break;
|
|
342
|
+
case 'apply': this.handleDiffApply(); break;
|
|
343
|
+
case 'rerun': this.handleBlockRerun(); break;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* handleBlockRerun - Re-run the tool call for the nearest tool block.
|
|
349
|
+
* Emits a tool-rerun event for the orchestrator to handle.
|
|
350
|
+
*/
|
|
351
|
+
private handleBlockRerun(): void {
|
|
352
|
+
handleBlockRerun(this.conversationManager, this.getScrollTop, this.requestRender);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* handleBlockToggle - Tab (non-command mode): Toggle collapse of nearest block.
|
|
357
|
+
*/
|
|
358
|
+
private handleBlockToggle(): void {
|
|
359
|
+
handleBlockToggle(this.conversationManager, this.getScrollTop, this.requestRender);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/**
|
|
363
|
+
* handleDiffApply - Ctrl+A when a diff block is nearest: request approval and apply the diff.
|
|
364
|
+
* Returns true if a diff was found and applied (so caller can skip default Ctrl+A).
|
|
365
|
+
*/
|
|
366
|
+
private handleDiffApply(): boolean {
|
|
367
|
+
return handleDiffApply(
|
|
368
|
+
this.conversationManager,
|
|
369
|
+
this.getScrollTop,
|
|
370
|
+
this.commandContext,
|
|
371
|
+
this.requestRender,
|
|
372
|
+
() => `diff-apply-${Date.now()}`,
|
|
373
|
+
'write',
|
|
374
|
+
);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* Handle Ctrl+C:
|
|
379
|
+
* - If prompt has text: clear it
|
|
380
|
+
* - If prompt is empty and LLM is thinking: cancel generation
|
|
381
|
+
* - If prompt is empty and idle: show exit notice (double = exit)
|
|
382
|
+
*/
|
|
383
|
+
private handleCtrlC(): void {
|
|
384
|
+
handleCtrlC(
|
|
385
|
+
this.prompt,
|
|
386
|
+
() => this.saveUndoState(),
|
|
387
|
+
(value) => { this.prompt = value; },
|
|
388
|
+
(value) => { this.cursorPos = value; },
|
|
389
|
+
this.commandContext?.cancelGeneration,
|
|
390
|
+
this.exitApp,
|
|
391
|
+
this.requestRender,
|
|
392
|
+
this.lastCtrlCTime,
|
|
393
|
+
(value) => { this.lastCtrlCTime = value; },
|
|
394
|
+
(value) => { this.showExitNotice = value; },
|
|
395
|
+
);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/**
|
|
399
|
+
* Handle Escape:
|
|
400
|
+
* - If prompt has text: clear it
|
|
401
|
+
* - If prompt is empty: cancel generation (double-tap not needed)
|
|
402
|
+
*/
|
|
403
|
+
/**
|
|
404
|
+
* Record that a modal has been opened and push it onto the navigation stack.
|
|
405
|
+
* Call this EVERY time a modal opens (except inside openModal()).
|
|
406
|
+
*
|
|
407
|
+
* @param name - The modal identifier (e.g. 'settings', 'help', 'process').
|
|
408
|
+
*/
|
|
409
|
+
public modalOpened(name: string): void {
|
|
410
|
+
modalOpened(this, name);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/**
|
|
414
|
+
* Clear the modal navigation stack on non-modal user input (e.g. submit).
|
|
415
|
+
*/
|
|
416
|
+
public clearModalStack(): void {
|
|
417
|
+
clearModalStack(this.modalStack);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
private handleEscape(): void {
|
|
421
|
+
const result = handleEscape({
|
|
422
|
+
helpOverlayActive: this.helpOverlayActive,
|
|
423
|
+
shortcutsOverlayActive: this.shortcutsOverlayActive,
|
|
424
|
+
bookmarkModal: this.bookmarkModal,
|
|
425
|
+
agentDetailModal: this.agentDetailModal,
|
|
426
|
+
liveTailModal: this.liveTailModal,
|
|
427
|
+
settingsModal: this.settingsModal,
|
|
428
|
+
sessionPickerModal: this.sessionPickerModal,
|
|
429
|
+
profilePickerModal: this.profilePickerModal,
|
|
430
|
+
contextInspectorModal: this.contextInspectorModal,
|
|
431
|
+
processModal: this.processModal,
|
|
432
|
+
modelPicker: this.modelPicker,
|
|
433
|
+
filePicker: this.filePicker,
|
|
434
|
+
blockActionsMenu: this.blockActionsMenu,
|
|
435
|
+
selectionModal: this.selectionModal,
|
|
436
|
+
commandMode: this.commandMode,
|
|
437
|
+
modalStack: this.modalStack,
|
|
438
|
+
modalReturnFocus: this.modalReturnFocus,
|
|
439
|
+
panelFocused: this.panelFocused,
|
|
440
|
+
indicatorFocused: this.indicatorFocused,
|
|
441
|
+
prompt: this.prompt,
|
|
442
|
+
cursorPos: this.cursorPos,
|
|
443
|
+
requestRender: this.requestRender,
|
|
444
|
+
saveUndoState: () => this.saveUndoState(),
|
|
445
|
+
cancelGeneration: this.commandContext?.cancelGeneration,
|
|
446
|
+
selectionCallback: this.selectionCallback,
|
|
447
|
+
autocompleteReset: () => this.autocomplete?.reset(),
|
|
448
|
+
autocompleteUpdate: (query: string) => this.autocomplete?.update(query),
|
|
449
|
+
helpScrollOffset: this.helpScrollOffset,
|
|
450
|
+
shortcutsScrollOffset: this.shortcutsScrollOffset,
|
|
451
|
+
});
|
|
452
|
+
this.prompt = result.prompt;
|
|
453
|
+
this.cursorPos = result.cursorPos;
|
|
454
|
+
this.commandMode = result.commandMode;
|
|
455
|
+
this.helpOverlayActive = result.helpOverlayActive;
|
|
456
|
+
this.helpScrollOffset = result.helpScrollOffset;
|
|
457
|
+
this.shortcutsOverlayActive = result.shortcutsOverlayActive;
|
|
458
|
+
this.shortcutsScrollOffset = result.shortcutsScrollOffset;
|
|
459
|
+
this.selectionCallback = result.selectionCallback;
|
|
460
|
+
this.panelFocused = result.panelFocused;
|
|
461
|
+
this.indicatorFocused = result.indicatorFocused;
|
|
462
|
+
this.modalReturnFocus = 'prompt';
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
/**
|
|
466
|
+
* feed - Process raw stdin data through the tokenizer.
|
|
467
|
+
*/
|
|
468
|
+
public feed(data: string): void {
|
|
469
|
+
const immediateRequestRender = this.requestRender;
|
|
470
|
+
let renderRequested = false;
|
|
471
|
+
let isFeeding = true;
|
|
472
|
+
const bufferedRequestRender = (): void => {
|
|
473
|
+
if (isFeeding) {
|
|
474
|
+
renderRequested = true;
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
immediateRequestRender();
|
|
478
|
+
};
|
|
479
|
+
|
|
480
|
+
this.requestRender = bufferedRequestRender;
|
|
481
|
+
try {
|
|
482
|
+
let context!: import('./handler-feed.ts').InputFeedContext;
|
|
483
|
+
const syncFeedContextFromHandler = (): void => {
|
|
484
|
+
context.prompt = this.prompt;
|
|
485
|
+
context.cursorPos = this.cursorPos;
|
|
486
|
+
context.commandMode = this.commandMode;
|
|
487
|
+
context.panelFocused = this.panelFocused;
|
|
488
|
+
context.indicatorFocused = this.indicatorFocused;
|
|
489
|
+
context.helpOverlayActive = this.helpOverlayActive;
|
|
490
|
+
context.helpScrollOffset = this.helpScrollOffset;
|
|
491
|
+
context.shortcutsOverlayActive = this.shortcutsOverlayActive;
|
|
492
|
+
context.shortcutsScrollOffset = this.shortcutsScrollOffset;
|
|
493
|
+
context.selectionCallback = this.selectionCallback;
|
|
494
|
+
context.nextPasteId = this.nextPasteId;
|
|
495
|
+
context.nextImageId = this.nextImageId;
|
|
496
|
+
context.mouseDownRow = this.mouseDownRow;
|
|
497
|
+
context.mouseDownCol = this.mouseDownCol;
|
|
498
|
+
};
|
|
499
|
+
|
|
500
|
+
context = {
|
|
501
|
+
prompt: this.prompt,
|
|
502
|
+
cursorPos: this.cursorPos,
|
|
503
|
+
commandMode: this.commandMode,
|
|
504
|
+
panelFocused: this.panelFocused,
|
|
505
|
+
indicatorFocused: this.indicatorFocused,
|
|
506
|
+
helpOverlayActive: this.helpOverlayActive,
|
|
507
|
+
helpScrollOffset: this.helpScrollOffset,
|
|
508
|
+
shortcutsOverlayActive: this.shortcutsOverlayActive,
|
|
509
|
+
shortcutsScrollOffset: this.shortcutsScrollOffset,
|
|
510
|
+
nextPasteId: this.nextPasteId,
|
|
511
|
+
nextImageId: this.nextImageId,
|
|
512
|
+
mouseDownRow: this.mouseDownRow,
|
|
513
|
+
mouseDownCol: this.mouseDownCol,
|
|
514
|
+
contentWidth: this.contentWidth,
|
|
515
|
+
pasteRegistry: this.pasteRegistry,
|
|
516
|
+
imageRegistry: this.imageRegistry,
|
|
517
|
+
selection: this.selection,
|
|
518
|
+
selectionModal: this.selectionModal,
|
|
519
|
+
selectionCallback: this.selectionCallback,
|
|
520
|
+
bookmarkModal: this.bookmarkModal,
|
|
521
|
+
settingsModal: this.settingsModal,
|
|
522
|
+
sessionPickerModal: this.sessionPickerModal,
|
|
523
|
+
profilePickerModal: this.profilePickerModal,
|
|
524
|
+
historySearch: this.historySearch,
|
|
525
|
+
commandRegistry: this.commandRegistry,
|
|
526
|
+
commandContext: this.commandContext,
|
|
527
|
+
autocomplete: this.autocomplete,
|
|
528
|
+
filePicker: this.filePicker,
|
|
529
|
+
modelPicker: this.modelPicker,
|
|
530
|
+
processModal: this.processModal,
|
|
531
|
+
liveTailModal: this.liveTailModal,
|
|
532
|
+
agentDetailModal: this.agentDetailModal,
|
|
533
|
+
contextInspectorModal: this.contextInspectorModal,
|
|
534
|
+
blockActionsMenu: this.blockActionsMenu,
|
|
535
|
+
searchManager: this.searchManager,
|
|
536
|
+
modalStack: this.modalStack,
|
|
537
|
+
inputHistory: this.inputHistory,
|
|
538
|
+
conversationManager: this.conversationManager,
|
|
539
|
+
getHistory: this.getHistory,
|
|
540
|
+
getViewportHeight: this.getViewportHeight,
|
|
541
|
+
getScrollTop: this.getScrollTop,
|
|
542
|
+
scroll: this.scroll,
|
|
543
|
+
requestRender: bufferedRequestRender,
|
|
544
|
+
modalOpened: (name: string) => this.modalOpened(name),
|
|
545
|
+
handleEscape: () => {
|
|
546
|
+
this.handleEscape();
|
|
547
|
+
syncFeedContextFromHandler();
|
|
548
|
+
},
|
|
549
|
+
handleCopy: () => this.handleCopy(),
|
|
550
|
+
handleCtrlC: () => {
|
|
551
|
+
this.handleCtrlC();
|
|
552
|
+
syncFeedContextFromHandler();
|
|
553
|
+
},
|
|
554
|
+
handleBlockCopy: () => this.handleBlockCopy(),
|
|
555
|
+
handleBookmark: () => this.handleBookmark(),
|
|
556
|
+
handleBlockSave: () => this.handleBlockSave(),
|
|
557
|
+
handleDiffApply: () => this.handleDiffApply(),
|
|
558
|
+
handleUndo: () => {
|
|
559
|
+
this.handleUndo();
|
|
560
|
+
syncFeedContextFromHandler();
|
|
561
|
+
},
|
|
562
|
+
handleRedo: () => {
|
|
563
|
+
this.handleRedo();
|
|
564
|
+
syncFeedContextFromHandler();
|
|
565
|
+
},
|
|
566
|
+
handlePaste: () => {
|
|
567
|
+
this.handlePaste();
|
|
568
|
+
syncFeedContextFromHandler();
|
|
569
|
+
},
|
|
570
|
+
saveUndoState: () => this.saveUndoState(),
|
|
571
|
+
ensureInputCursorVisible: (contentWidth?: number) => this.ensureInputCursorVisible(contentWidth),
|
|
572
|
+
registerPaste: (content: string) => this.registerPaste(content),
|
|
573
|
+
executeBlockAction: (id: string) => this.executeBlockAction(id),
|
|
574
|
+
cyclePanelTab: (direction: 'next' | 'prev') => this.cyclePanelTab(direction),
|
|
575
|
+
onPanelInputConsumed: (activePanel: Panel | null, key: string) => this.handlePanelIntegrationAction(activePanel, key),
|
|
576
|
+
panelManager: this.uiServices.shell.panelManager,
|
|
577
|
+
keybindingsManager: this.uiServices.shell.keybindingsManager,
|
|
578
|
+
getWrappedPromptInfo: (contentWidth: number) => this.getWrappedPromptInfo(contentWidth),
|
|
579
|
+
moveCursorVertical: (direction: -1 | 1) => this.moveCursorVertical(direction),
|
|
580
|
+
handlePathCompletion: () => this.handlePathCompletion(),
|
|
581
|
+
handleBlockToggle: () => this.handleBlockToggle(),
|
|
582
|
+
findMarkerAtPos: (pos: number) => this.findMarkerAtPos(pos),
|
|
583
|
+
cleanupMarkerRegistry: (text: string) => this.cleanupMarkerRegistry(text),
|
|
584
|
+
expandPrompt: (text: string) => this.expandPrompt(text),
|
|
585
|
+
exitApp: this.exitApp,
|
|
586
|
+
};
|
|
587
|
+
this.syncFeedSelectionCallback = (callback) => {
|
|
588
|
+
context.selectionCallback = callback;
|
|
589
|
+
};
|
|
590
|
+
feedInputTokens(context, this.tokenizer.feed(data));
|
|
591
|
+
this.prompt = context.prompt;
|
|
592
|
+
this.cursorPos = context.cursorPos;
|
|
593
|
+
this.commandMode = context.commandMode;
|
|
594
|
+
this.panelFocused = context.panelFocused;
|
|
595
|
+
this.indicatorFocused = context.indicatorFocused;
|
|
596
|
+
this.helpOverlayActive = context.helpOverlayActive;
|
|
597
|
+
this.helpScrollOffset = context.helpScrollOffset;
|
|
598
|
+
this.shortcutsOverlayActive = context.shortcutsOverlayActive;
|
|
599
|
+
this.shortcutsScrollOffset = context.shortcutsScrollOffset;
|
|
600
|
+
this.selectionCallback = context.selectionCallback;
|
|
601
|
+
this.nextPasteId = context.nextPasteId;
|
|
602
|
+
this.nextImageId = context.nextImageId;
|
|
603
|
+
this.mouseDownRow = context.mouseDownRow;
|
|
604
|
+
this.mouseDownCol = context.mouseDownCol;
|
|
605
|
+
} finally {
|
|
606
|
+
this.syncFeedSelectionCallback = null;
|
|
607
|
+
isFeeding = false;
|
|
608
|
+
this.requestRender = immediateRequestRender;
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
if (renderRequested) {
|
|
612
|
+
immediateRequestRender();
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
/**
|
|
617
|
+
* handlePaste - Shared paste logic for Ctrl+V and middle-click.
|
|
618
|
+
* Tries image clipboard first, falls back to text paste.
|
|
619
|
+
*/
|
|
620
|
+
private handlePaste(): void {
|
|
621
|
+
const result = handleClipboardPaste({
|
|
622
|
+
prompt: this.prompt,
|
|
623
|
+
cursorPos: this.cursorPos,
|
|
624
|
+
pasteRegistry: this.pasteRegistry,
|
|
625
|
+
nextPasteId: this.nextPasteId,
|
|
626
|
+
imageRegistry: this.imageRegistry,
|
|
627
|
+
nextImageId: this.nextImageId,
|
|
628
|
+
saveUndoState: () => this.saveUndoState(),
|
|
629
|
+
ensureInputCursorVisible: () => this.ensureInputCursorVisible(),
|
|
630
|
+
requestRender: this.requestRender,
|
|
631
|
+
}, this.uiServices.environment.shellPaths.workingDirectory);
|
|
632
|
+
this.prompt = result.prompt;
|
|
633
|
+
this.cursorPos = result.cursorPos;
|
|
634
|
+
this.nextImageId = result.nextImageId;
|
|
635
|
+
this.nextPasteId = result.nextPasteId;
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
/** Content width for wrapping — set by main.ts via setContentWidth(). */
|
|
639
|
+
private contentWidth = 76;
|
|
640
|
+
|
|
641
|
+
/** Set the content width used for wrapping calculations. Call from main.ts. */
|
|
642
|
+
public setContentWidth(w: number): void {
|
|
643
|
+
this.contentWidth = w;
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
/**
|
|
647
|
+
* Move cursor up or down by one WRAPPED line.
|
|
648
|
+
* Uses the segment table to navigate visual lines, not raw \n lines.
|
|
649
|
+
* Returns true if the cursor moved, false if at boundary.
|
|
650
|
+
*/
|
|
651
|
+
private moveCursorVertical(direction: -1 | 1): boolean {
|
|
652
|
+
const result = moveCursorVertical(
|
|
653
|
+
this.prompt,
|
|
654
|
+
this.cursorPos,
|
|
655
|
+
this.inputScrollTop,
|
|
656
|
+
this.contentWidth,
|
|
657
|
+
InputHandler.MAX_INPUT_ROWS,
|
|
658
|
+
direction,
|
|
659
|
+
);
|
|
660
|
+
this.cursorPos = result.cursorPos;
|
|
661
|
+
this.inputScrollTop = result.inputScrollTop;
|
|
662
|
+
return result.moved;
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
/**
|
|
666
|
+
* Ensure the cursor's wrapped line is visible within the input scroll window.
|
|
667
|
+
*/
|
|
668
|
+
public ensureInputCursorVisible(contentWidth?: number): void {
|
|
669
|
+
this.inputScrollTop = ensureInputCursorVisible(
|
|
670
|
+
this.prompt,
|
|
671
|
+
this.cursorPos,
|
|
672
|
+
this.inputScrollTop,
|
|
673
|
+
contentWidth ?? this.contentWidth,
|
|
674
|
+
InputHandler.MAX_INPUT_ROWS,
|
|
675
|
+
);
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
/**
|
|
679
|
+
* Get the number of visible prompt lines (capped at MAX_INPUT_ROWS),
|
|
680
|
+
* accounting for word-wrapping within the content width.
|
|
681
|
+
*/
|
|
682
|
+
public getVisiblePromptLineCount(contentWidth?: number): number {
|
|
683
|
+
const info = this.getWrappedPromptInfo(contentWidth ?? 76);
|
|
684
|
+
return Math.min(info.wrappedLines.length, InputHandler.MAX_INPUT_ROWS);
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
/**
|
|
688
|
+
* Word-wrap the prompt and compute cursor display coordinates.
|
|
689
|
+
* Returns wrapped lines, the cursor's position in wrapped coordinates,
|
|
690
|
+
* and the visible slice respecting inputScrollTop.
|
|
691
|
+
*/
|
|
692
|
+
public getWrappedPromptInfo(contentWidth: number): WrappedPromptInfo {
|
|
693
|
+
return getWrappedPromptInfo(
|
|
694
|
+
this.prompt,
|
|
695
|
+
this.cursorPos,
|
|
696
|
+
this.inputScrollTop,
|
|
697
|
+
contentWidth,
|
|
698
|
+
InputHandler.MAX_INPUT_ROWS,
|
|
699
|
+
);
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
// ── Undo / Redo methods ─────────────────────────────────────────────────
|
|
703
|
+
|
|
704
|
+
/**
|
|
705
|
+
* saveUndoState - Snapshot current prompt + cursor onto the undo stack.
|
|
706
|
+
* Clears the redo stack because a new edit invalidates future states.
|
|
707
|
+
*/
|
|
708
|
+
private saveUndoState(): void {
|
|
709
|
+
saveUndoState(this.undoStack, this.redoStack, this.prompt, this.cursorPos, InputHandler.MAX_UNDO);
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
/**
|
|
713
|
+
* handleUndo - Ctrl+Z: pop from undo stack, push current to redo stack.
|
|
714
|
+
*/
|
|
715
|
+
private handleUndo(): void {
|
|
716
|
+
const state = undoPromptState(this.undoStack, this.redoStack, this.prompt, this.cursorPos);
|
|
717
|
+
if (!state) return;
|
|
718
|
+
this.prompt = state.prompt;
|
|
719
|
+
this.cursorPos = state.cursorPos;
|
|
720
|
+
this.ensureInputCursorVisible();
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
/**
|
|
724
|
+
* handleRedo - Ctrl+Shift+Z: pop from redo stack, push current to undo stack.
|
|
725
|
+
*/
|
|
726
|
+
private handleRedo(): void {
|
|
727
|
+
const state = redoPromptState(this.undoStack, this.redoStack, this.prompt, this.cursorPos);
|
|
728
|
+
if (!state) return;
|
|
729
|
+
this.prompt = state.prompt;
|
|
730
|
+
this.cursorPos = state.cursorPos;
|
|
731
|
+
this.ensureInputCursorVisible();
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
// ── Path completion methods ─────────────────────────────────────────────
|
|
735
|
+
|
|
736
|
+
/**
|
|
737
|
+
* findPathToken - Scan backward from cursor to find a path-like token.
|
|
738
|
+
* Detects:
|
|
739
|
+
* - !@<partial> (inject mode)
|
|
740
|
+
* - @<partial> (normal file ref)
|
|
741
|
+
* - plain word containing '/'
|
|
742
|
+
* Returns { start, prefix } or null if no path token found.
|
|
743
|
+
*/
|
|
744
|
+
/**
|
|
745
|
+
* handlePathCompletion - Tab on a path-like token: fuzzy-complete from filePicker.allFiles.
|
|
746
|
+
* Repeated Tab cycles through matches.
|
|
747
|
+
* Returns true if path completion was performed.
|
|
748
|
+
*/
|
|
749
|
+
private findPathToken(): { start: number; prefix: string } | null {
|
|
750
|
+
return findPathToken(this.prompt, this.cursorPos);
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
private handlePathCompletion(): boolean {
|
|
754
|
+
const result = handlePathCompletion({
|
|
755
|
+
prompt: this.prompt,
|
|
756
|
+
cursorPos: this.cursorPos,
|
|
757
|
+
inputScrollTop: this.inputScrollTop,
|
|
758
|
+
contentWidth: this.contentWidth,
|
|
759
|
+
maxRows: InputHandler.MAX_INPUT_ROWS,
|
|
760
|
+
pathCompletions: this.pathCompletions,
|
|
761
|
+
pathCompletionIndex: this.pathCompletionIndex,
|
|
762
|
+
pathCompletionPrefix: this.pathCompletionPrefix,
|
|
763
|
+
pathCompletionStart: this.pathCompletionStart,
|
|
764
|
+
allFiles: this.filePicker.allFiles,
|
|
765
|
+
saveUndoState: () => this.saveUndoState(),
|
|
766
|
+
});
|
|
767
|
+
if (!result.handled) return false;
|
|
768
|
+
this.prompt = result.prompt;
|
|
769
|
+
this.cursorPos = result.cursorPos;
|
|
770
|
+
this.inputScrollTop = result.inputScrollTop;
|
|
771
|
+
this.pathCompletions = result.pathCompletions;
|
|
772
|
+
this.pathCompletionIndex = result.pathCompletionIndex;
|
|
773
|
+
this.pathCompletionPrefix = result.pathCompletionPrefix;
|
|
774
|
+
this.pathCompletionStart = result.pathCompletionStart;
|
|
775
|
+
return true;
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
/**
|
|
779
|
+
* Word-wrap a single line to fit within maxW columns.
|
|
780
|
+
* Breaks at spaces; words wider than maxW are force-broken.
|
|
781
|
+
*/
|
|
782
|
+
private cyclePanelTab(direction: 'next' | 'prev'): void {
|
|
783
|
+
const pm = this.uiServices.shell.panelManager;
|
|
784
|
+
if (pm.isVisible()) {
|
|
785
|
+
if (direction === 'next') pm.nextWorkspaceTab();
|
|
786
|
+
else pm.prevWorkspaceTab();
|
|
787
|
+
this.requestRender();
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
private handlePanelIntegrationAction(activePanel: Panel | null, key: string): void {
|
|
792
|
+
runPanelIntegrationAction(this.uiServices.shell.panelManager, activePanel, key, this.commandContext);
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
private wordWrapLine(line: string, maxW: number): string[] {
|
|
796
|
+
return wordWrapLine(line, maxW);
|
|
797
|
+
}
|
|
798
|
+
}
|