@calliopelabs/cli 2.5.0 → 3.1.0
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 +45 -661
- package/dist/acp.d.ts +78 -0
- package/dist/acp.d.ts.map +1 -0
- package/dist/acp.js +572 -0
- package/dist/acp.js.map +1 -0
- package/dist/bin.d.ts +3 -7
- package/dist/bin.d.ts.map +1 -1
- package/dist/bin.js +56 -79
- package/dist/bin.js.map +1 -1
- package/dist/budget.d.ts +64 -0
- package/dist/budget.d.ts.map +1 -0
- package/dist/budget.js +157 -0
- package/dist/budget.js.map +1 -0
- package/dist/checkpoint.d.ts +63 -30
- package/dist/checkpoint.d.ts.map +1 -1
- package/dist/checkpoint.js +247 -160
- package/dist/checkpoint.js.map +1 -1
- package/dist/circuit-breaker/breaker.d.ts.map +1 -1
- package/dist/circuit-breaker/breaker.js.map +1 -1
- package/dist/config.d.ts +86 -81
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +236 -304
- package/dist/config.js.map +1 -1
- package/dist/cost.d.ts +114 -0
- package/dist/cost.d.ts.map +1 -0
- package/dist/cost.js +499 -0
- package/dist/cost.js.map +1 -0
- package/dist/diff.d.ts.map +1 -1
- package/dist/diff.js +11 -7
- package/dist/diff.js.map +1 -1
- package/dist/env-expansion.js.map +1 -1
- package/dist/errors.js +3 -3
- package/dist/errors.js.map +1 -1
- package/dist/files.js.map +1 -1
- package/dist/fleet.d.ts +30 -0
- package/dist/fleet.d.ts.map +1 -0
- package/dist/fleet.js +86 -0
- package/dist/fleet.js.map +1 -0
- package/dist/fuzzy-search.d.ts.map +1 -1
- package/dist/fuzzy-search.js +2 -1
- package/dist/fuzzy-search.js.map +1 -1
- package/dist/git-status.js.map +1 -1
- package/dist/headless.d.ts +1 -2
- package/dist/headless.d.ts.map +1 -1
- package/dist/headless.js +166 -24
- package/dist/headless.js.map +1 -1
- package/dist/hud/api.d.ts +3 -18
- package/dist/hud/api.d.ts.map +1 -1
- package/dist/hud/api.js +9 -352
- package/dist/hud/api.js.map +1 -1
- package/dist/hud/palettes.d.ts.map +1 -1
- package/dist/hud/palettes.js +0 -180
- package/dist/hud/palettes.js.map +1 -1
- package/dist/hud/skins.d.ts.map +1 -1
- package/dist/hud/skins.js +0 -263
- package/dist/hud/skins.js.map +1 -1
- package/dist/hud/types.d.ts +2 -5
- package/dist/hud/types.d.ts.map +1 -1
- package/dist/index.d.ts +1 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -4
- package/dist/index.js.map +1 -1
- package/dist/iteration-ledger.d.ts.map +1 -1
- package/dist/iteration-ledger.js +3 -2
- package/dist/iteration-ledger.js.map +1 -1
- package/dist/local-model.d.ts +150 -0
- package/dist/local-model.d.ts.map +1 -0
- package/dist/local-model.js +408 -0
- package/dist/local-model.js.map +1 -0
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +5 -2
- package/dist/mcp.js.map +1 -1
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +6 -4
- package/dist/memory.js.map +1 -1
- package/dist/model-detection.js +2 -2
- package/dist/model-detection.js.map +1 -1
- package/dist/parallel-tools.js.map +1 -1
- package/dist/plugins.d.ts +32 -1
- package/dist/plugins.d.ts.map +1 -1
- package/dist/plugins.js +116 -5
- package/dist/plugins.js.map +1 -1
- package/dist/policy.d.ts +43 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +139 -0
- package/dist/policy.js.map +1 -0
- package/dist/project-config.d.ts +1 -2
- package/dist/project-config.d.ts.map +1 -1
- package/dist/project-config.js +0 -3
- package/dist/project-config.js.map +1 -1
- package/dist/providers/bedrock.d.ts.map +1 -1
- package/dist/providers/bedrock.js +2 -5
- package/dist/providers/bedrock.js.map +1 -1
- package/dist/providers/compat.d.ts +21 -0
- package/dist/providers/compat.d.ts.map +1 -1
- package/dist/providers/compat.js +176 -6
- package/dist/providers/compat.js.map +1 -1
- package/dist/providers/google.js.map +1 -1
- package/dist/providers/index.d.ts +19 -4
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +61 -10
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/ollama.d.ts +2 -2
- package/dist/providers/ollama.d.ts.map +1 -1
- package/dist/providers/ollama.js +26 -6
- package/dist/providers/ollama.js.map +1 -1
- package/dist/providers/openai.d.ts +10 -10
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +18 -10
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/types.d.ts +8 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js.map +1 -1
- package/dist/replay.d.ts +37 -0
- package/dist/replay.d.ts.map +1 -0
- package/dist/replay.js +168 -0
- package/dist/replay.js.map +1 -0
- package/dist/router.d.ts +133 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/{model-router.js → router.js} +329 -3
- package/dist/router.js.map +1 -0
- package/dist/runlog.d.ts +185 -0
- package/dist/runlog.d.ts.map +1 -0
- package/dist/runlog.js +398 -0
- package/dist/runlog.js.map +1 -0
- package/dist/{sandbox.d.ts → sandbox/docker.d.ts} +1 -1
- package/dist/sandbox/docker.d.ts.map +1 -0
- package/dist/{sandbox.js → sandbox/docker.js} +1 -1
- package/dist/sandbox/docker.js.map +1 -0
- package/dist/sandbox/index.d.ts +36 -0
- package/dist/sandbox/index.d.ts.map +1 -0
- package/dist/sandbox/index.js +62 -0
- package/dist/sandbox/index.js.map +1 -0
- package/dist/{sandbox-native.d.ts → sandbox/native.d.ts} +1 -1
- package/dist/sandbox/native.d.ts.map +1 -0
- package/dist/{sandbox-native.js → sandbox/native.js} +1 -1
- package/dist/sandbox/native.js.map +1 -0
- package/dist/scope.d.ts.map +1 -1
- package/dist/scope.js +1 -1
- package/dist/scope.js.map +1 -1
- package/dist/scuttlebot/client.d.ts.map +1 -1
- package/dist/scuttlebot/client.js.map +1 -1
- package/dist/scuttlebot/config.js.map +1 -1
- package/dist/scuttlebot/http-client.d.ts.map +1 -1
- package/dist/scuttlebot/irc-client.d.ts +5 -5
- package/dist/scuttlebot/irc-client.d.ts.map +1 -1
- package/dist/scuttlebot/irc-client.js.map +1 -1
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +25 -54
- package/dist/setup.js.map +1 -1
- package/dist/skills.d.ts +39 -0
- package/dist/skills.d.ts.map +1 -1
- package/dist/skills.js +90 -8
- package/dist/skills.js.map +1 -1
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +6 -3
- package/dist/storage.js.map +1 -1
- package/dist/streaming.d.ts +25 -0
- package/dist/streaming.d.ts.map +1 -1
- package/dist/streaming.js +59 -0
- package/dist/streaming.js.map +1 -1
- package/dist/styles.d.ts +62 -56
- package/dist/styles.d.ts.map +1 -1
- package/dist/styles.js +11 -0
- package/dist/styles.js.map +1 -1
- package/dist/summarization.d.ts.map +1 -1
- package/dist/summarization.js.map +1 -1
- package/dist/terminal-image.js +1 -1
- package/dist/terminal-image.js.map +1 -1
- package/dist/themes.d.ts +5 -4
- package/dist/themes.d.ts.map +1 -1
- package/dist/themes.js +35 -90
- package/dist/themes.js.map +1 -1
- package/dist/tools.d.ts +27 -3
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +128 -179
- package/dist/tools.js.map +1 -1
- package/dist/trust.js.map +1 -1
- package/dist/types.d.ts +4 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +21 -40
- package/dist/types.js.map +1 -1
- package/dist/ui/agent.d.ts +3 -6
- package/dist/ui/agent.d.ts.map +1 -1
- package/dist/ui/agent.js +328 -38
- package/dist/ui/agent.js.map +1 -1
- package/dist/ui/animations.d.ts +37 -0
- package/dist/ui/animations.d.ts.map +1 -0
- package/dist/ui/animations.js +227 -0
- package/dist/ui/animations.js.map +1 -0
- package/dist/ui/chat-input-keys.d.ts +42 -0
- package/dist/ui/chat-input-keys.d.ts.map +1 -0
- package/dist/ui/chat-input-keys.js +360 -0
- package/dist/ui/chat-input-keys.js.map +1 -0
- package/dist/ui/chat-input.d.ts +4 -2
- package/dist/ui/chat-input.d.ts.map +1 -1
- package/dist/ui/chat-input.js +31 -350
- package/dist/ui/chat-input.js.map +1 -1
- package/dist/ui/commands.d.ts +14 -46
- package/dist/ui/commands.d.ts.map +1 -1
- package/dist/ui/commands.js +416 -2899
- package/dist/ui/commands.js.map +1 -1
- package/dist/ui/completions.d.ts +1 -0
- package/dist/ui/completions.d.ts.map +1 -1
- package/dist/ui/completions.js +36 -107
- package/dist/ui/completions.js.map +1 -1
- package/dist/ui/components.d.ts +20 -12
- package/dist/ui/components.d.ts.map +1 -1
- package/dist/ui/components.js +17 -226
- package/dist/ui/components.js.map +1 -1
- package/dist/ui/context.js +6 -6
- package/dist/ui/context.js.map +1 -1
- package/dist/ui/debug-log.d.ts +11 -0
- package/dist/ui/debug-log.d.ts.map +1 -0
- package/dist/ui/debug-log.js +21 -0
- package/dist/ui/debug-log.js.map +1 -0
- package/dist/ui/error-boundary.d.ts +1 -1
- package/dist/ui/error-boundary.d.ts.map +1 -1
- package/dist/ui/error-boundary.js.map +1 -1
- package/dist/ui/frame.d.ts +1 -1
- package/dist/ui/frame.d.ts.map +1 -1
- package/dist/ui/frame.js +1 -3
- package/dist/ui/frame.js.map +1 -1
- package/dist/ui/index.d.ts +11 -3
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +45 -1076
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/messages.d.ts +5 -8
- package/dist/ui/messages.d.ts.map +1 -1
- package/dist/ui/messages.js +15 -30
- package/dist/ui/messages.js.map +1 -1
- package/dist/ui/modals/index.d.ts +11 -0
- package/dist/ui/modals/index.d.ts.map +1 -0
- package/dist/ui/modals/index.js +10 -0
- package/dist/ui/modals/index.js.map +1 -0
- package/dist/ui/modals/prompts.d.ts +38 -0
- package/dist/ui/modals/prompts.d.ts.map +1 -0
- package/dist/ui/modals/prompts.js +124 -0
- package/dist/ui/modals/prompts.js.map +1 -0
- package/dist/ui/modals/selectors.d.ts +34 -0
- package/dist/ui/modals/selectors.d.ts.map +1 -0
- package/dist/ui/modals/selectors.js +111 -0
- package/dist/ui/modals/selectors.js.map +1 -0
- package/dist/ui/modals/setup.d.ts +18 -0
- package/dist/ui/modals/setup.d.ts.map +1 -0
- package/dist/ui/modals/setup.js +51 -0
- package/dist/ui/modals/setup.js.map +1 -0
- package/dist/ui/regions/input-region.d.ts +40 -0
- package/dist/ui/regions/input-region.d.ts.map +1 -0
- package/dist/ui/regions/input-region.js +116 -0
- package/dist/ui/regions/input-region.js.map +1 -0
- package/dist/ui/regions/modal-host.d.ts +41 -0
- package/dist/ui/regions/modal-host.d.ts.map +1 -0
- package/dist/ui/regions/modal-host.js +51 -0
- package/dist/ui/regions/modal-host.js.map +1 -0
- package/dist/ui/regions/render-probe.d.ts +22 -0
- package/dist/ui/regions/render-probe.d.ts.map +1 -0
- package/dist/ui/regions/render-probe.js +45 -0
- package/dist/ui/regions/render-probe.js.map +1 -0
- package/dist/ui/regions/static-scrollback.d.ts +39 -0
- package/dist/ui/regions/static-scrollback.d.ts.map +1 -0
- package/dist/ui/regions/static-scrollback.js +68 -0
- package/dist/ui/regions/static-scrollback.js.map +1 -0
- package/dist/ui/regions/status-region.d.ts +24 -0
- package/dist/ui/regions/status-region.d.ts.map +1 -0
- package/dist/ui/regions/status-region.js +17 -0
- package/dist/ui/regions/status-region.js.map +1 -0
- package/dist/ui/regions/transcript-region.d.ts +41 -0
- package/dist/ui/regions/transcript-region.d.ts.map +1 -0
- package/dist/ui/regions/transcript-region.js +52 -0
- package/dist/ui/regions/transcript-region.js.map +1 -0
- package/dist/ui/self-restart.d.ts +9 -0
- package/dist/ui/self-restart.d.ts.map +1 -0
- package/dist/ui/self-restart.js +24 -0
- package/dist/ui/self-restart.js.map +1 -0
- package/dist/ui/state/use-chat-controller.d.ts +23 -0
- package/dist/ui/state/use-chat-controller.d.ts.map +1 -0
- package/dist/ui/state/use-chat-controller.js +643 -0
- package/dist/ui/state/use-chat-controller.js.map +1 -0
- package/dist/ui/state/use-loop-state.d.ts +23 -0
- package/dist/ui/state/use-loop-state.d.ts.map +1 -0
- package/dist/ui/state/use-loop-state.js +39 -0
- package/dist/ui/state/use-loop-state.js.map +1 -0
- package/dist/ui/state/use-modal-state.d.ts +52 -0
- package/dist/ui/state/use-modal-state.d.ts.map +1 -0
- package/dist/ui/state/use-modal-state.js +44 -0
- package/dist/ui/state/use-modal-state.js.map +1 -0
- package/dist/ui/state/use-model-state.d.ts +29 -0
- package/dist/ui/state/use-model-state.d.ts.map +1 -0
- package/dist/ui/state/use-model-state.js +47 -0
- package/dist/ui/state/use-model-state.js.map +1 -0
- package/dist/ui/state/use-processing-state.d.ts +24 -0
- package/dist/ui/state/use-processing-state.d.ts.map +1 -0
- package/dist/ui/state/use-processing-state.js +46 -0
- package/dist/ui/state/use-processing-state.js.map +1 -0
- package/dist/ui/state/use-queue-state.d.ts +19 -0
- package/dist/ui/state/use-queue-state.d.ts.map +1 -0
- package/dist/ui/state/use-queue-state.js +30 -0
- package/dist/ui/state/use-queue-state.js.map +1 -0
- package/dist/ui/state/use-session-init.d.ts +22 -0
- package/dist/ui/state/use-session-init.d.ts.map +1 -0
- package/dist/ui/state/use-session-init.js +77 -0
- package/dist/ui/state/use-session-init.js.map +1 -0
- package/dist/ui/state/use-session-stats.d.ts +16 -0
- package/dist/ui/state/use-session-stats.d.ts.map +1 -0
- package/dist/ui/state/use-session-stats.js +18 -0
- package/dist/ui/state/use-session-stats.js.map +1 -0
- package/dist/ui/state/use-terminal-width.d.ts +8 -0
- package/dist/ui/state/use-terminal-width.d.ts.map +1 -0
- package/dist/ui/state/use-terminal-width.js +22 -0
- package/dist/ui/state/use-terminal-width.js.map +1 -0
- package/dist/ui/state/use-transcript-state.d.ts +21 -0
- package/dist/ui/state/use-transcript-state.d.ts.map +1 -0
- package/dist/ui/state/use-transcript-state.js +49 -0
- package/dist/ui/state/use-transcript-state.js.map +1 -0
- package/dist/ui/status-bar.d.ts +1 -1
- package/dist/ui/status-bar.d.ts.map +1 -1
- package/dist/ui/status-bar.js +3 -4
- package/dist/ui/status-bar.js.map +1 -1
- package/dist/version-check.d.ts.map +1 -1
- package/dist/version-check.js +10 -0
- package/dist/version-check.js.map +1 -1
- package/package.json +17 -10
- package/dist/agents/agent-config-loader.d.ts +0 -60
- package/dist/agents/agent-config-loader.d.ts.map +0 -1
- package/dist/agents/agent-config-loader.js +0 -402
- package/dist/agents/agent-config-loader.js.map +0 -1
- package/dist/agents/agent-config-presets.d.ts +0 -10
- package/dist/agents/agent-config-presets.d.ts.map +0 -1
- package/dist/agents/agent-config-presets.js +0 -940
- package/dist/agents/agent-config-presets.js.map +0 -1
- package/dist/agents/agent-config-types.d.ts +0 -145
- package/dist/agents/agent-config-types.d.ts.map +0 -1
- package/dist/agents/agent-config-types.js +0 -12
- package/dist/agents/agent-config-types.js.map +0 -1
- package/dist/agents/agent-detection.d.ts +0 -35
- package/dist/agents/agent-detection.d.ts.map +0 -1
- package/dist/agents/agent-detection.js +0 -110
- package/dist/agents/agent-detection.js.map +0 -1
- package/dist/agents/aggregator.d.ts +0 -19
- package/dist/agents/aggregator.d.ts.map +0 -1
- package/dist/agents/aggregator.js +0 -141
- package/dist/agents/aggregator.js.map +0 -1
- package/dist/agents/cli-backend.d.ts +0 -32
- package/dist/agents/cli-backend.d.ts.map +0 -1
- package/dist/agents/cli-backend.js +0 -271
- package/dist/agents/cli-backend.js.map +0 -1
- package/dist/agents/council-types.d.ts +0 -115
- package/dist/agents/council-types.d.ts.map +0 -1
- package/dist/agents/council-types.js +0 -81
- package/dist/agents/council-types.js.map +0 -1
- package/dist/agents/council.d.ts +0 -112
- package/dist/agents/council.d.ts.map +0 -1
- package/dist/agents/council.js +0 -722
- package/dist/agents/council.js.map +0 -1
- package/dist/agents/decomposer.d.ts +0 -33
- package/dist/agents/decomposer.d.ts.map +0 -1
- package/dist/agents/decomposer.js +0 -138
- package/dist/agents/decomposer.js.map +0 -1
- package/dist/agents/dynamic-tools.d.ts +0 -52
- package/dist/agents/dynamic-tools.d.ts.map +0 -1
- package/dist/agents/dynamic-tools.js +0 -424
- package/dist/agents/dynamic-tools.js.map +0 -1
- package/dist/agents/index.d.ts +0 -29
- package/dist/agents/index.d.ts.map +0 -1
- package/dist/agents/index.js +0 -29
- package/dist/agents/index.js.map +0 -1
- package/dist/agents/installer.d.ts +0 -39
- package/dist/agents/installer.d.ts.map +0 -1
- package/dist/agents/installer.js +0 -205
- package/dist/agents/installer.js.map +0 -1
- package/dist/agents/orchestrator.d.ts +0 -106
- package/dist/agents/orchestrator.d.ts.map +0 -1
- package/dist/agents/orchestrator.js +0 -363
- package/dist/agents/orchestrator.js.map +0 -1
- package/dist/agents/sdk-backend.d.ts +0 -63
- package/dist/agents/sdk-backend.d.ts.map +0 -1
- package/dist/agents/sdk-backend.js +0 -489
- package/dist/agents/sdk-backend.js.map +0 -1
- package/dist/agents/swarm-types.d.ts +0 -84
- package/dist/agents/swarm-types.d.ts.map +0 -1
- package/dist/agents/swarm-types.js +0 -20
- package/dist/agents/swarm-types.js.map +0 -1
- package/dist/agents/swarm.d.ts +0 -79
- package/dist/agents/swarm.d.ts.map +0 -1
- package/dist/agents/swarm.js +0 -375
- package/dist/agents/swarm.js.map +0 -1
- package/dist/agents/tools.d.ts +0 -26
- package/dist/agents/tools.d.ts.map +0 -1
- package/dist/agents/tools.js +0 -776
- package/dist/agents/tools.js.map +0 -1
- package/dist/agents/types.d.ts +0 -108
- package/dist/agents/types.d.ts.map +0 -1
- package/dist/agents/types.js +0 -43
- package/dist/agents/types.js.map +0 -1
- package/dist/api-server.d.ts +0 -45
- package/dist/api-server.d.ts.map +0 -1
- package/dist/api-server.js +0 -326
- package/dist/api-server.js.map +0 -1
- package/dist/auto-checkpoint.d.ts +0 -35
- package/dist/auto-checkpoint.d.ts.map +0 -1
- package/dist/auto-checkpoint.js +0 -176
- package/dist/auto-checkpoint.js.map +0 -1
- package/dist/background-jobs.d.ts +0 -45
- package/dist/background-jobs.d.ts.map +0 -1
- package/dist/background-jobs.js +0 -127
- package/dist/background-jobs.js.map +0 -1
- package/dist/branching.d.ts +0 -56
- package/dist/branching.d.ts.map +0 -1
- package/dist/branching.js +0 -224
- package/dist/branching.js.map +0 -1
- package/dist/cli/agent.d.ts +0 -9
- package/dist/cli/agent.d.ts.map +0 -1
- package/dist/cli/agent.js +0 -330
- package/dist/cli/agent.js.map +0 -1
- package/dist/cli/commands.d.ts +0 -12
- package/dist/cli/commands.d.ts.map +0 -1
- package/dist/cli/commands.js +0 -1042
- package/dist/cli/commands.js.map +0 -1
- package/dist/cli/index.d.ts +0 -8
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js +0 -268
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/types.d.ts +0 -33
- package/dist/cli/types.d.ts.map +0 -1
- package/dist/cli/types.js +0 -21
- package/dist/cli/types.js.map +0 -1
- package/dist/companions.d.ts +0 -54
- package/dist/companions.d.ts.map +0 -1
- package/dist/companions.js +0 -440
- package/dist/companions.js.map +0 -1
- package/dist/file-watcher.d.ts +0 -91
- package/dist/file-watcher.d.ts.map +0 -1
- package/dist/file-watcher.js +0 -269
- package/dist/file-watcher.js.map +0 -1
- package/dist/hud/theme-packs/api.d.ts +0 -51
- package/dist/hud/theme-packs/api.d.ts.map +0 -1
- package/dist/hud/theme-packs/api.js +0 -145
- package/dist/hud/theme-packs/api.js.map +0 -1
- package/dist/hud/theme-packs/index.d.ts +0 -18
- package/dist/hud/theme-packs/index.d.ts.map +0 -1
- package/dist/hud/theme-packs/index.js +0 -38
- package/dist/hud/theme-packs/index.js.map +0 -1
- package/dist/hud/theme-packs/types.d.ts +0 -29
- package/dist/hud/theme-packs/types.d.ts.map +0 -1
- package/dist/hud/theme-packs/types.js +0 -9
- package/dist/hud/theme-packs/types.js.map +0 -1
- package/dist/idle-eviction.d.ts +0 -34
- package/dist/idle-eviction.d.ts.map +0 -1
- package/dist/idle-eviction.js +0 -85
- package/dist/idle-eviction.js.map +0 -1
- package/dist/model-router.d.ts +0 -67
- package/dist/model-router.d.ts.map +0 -1
- package/dist/model-router.js.map +0 -1
- package/dist/providers/openai-compat-shims.d.ts +0 -31
- package/dist/providers/openai-compat-shims.d.ts.map +0 -1
- package/dist/providers/openai-compat-shims.js +0 -179
- package/dist/providers/openai-compat-shims.js.map +0 -1
- package/dist/sandbox-native.d.ts.map +0 -1
- package/dist/sandbox-native.js.map +0 -1
- package/dist/sandbox.d.ts.map +0 -1
- package/dist/sandbox.js.map +0 -1
- package/dist/session-timeout.d.ts +0 -31
- package/dist/session-timeout.d.ts.map +0 -1
- package/dist/session-timeout.js +0 -100
- package/dist/session-timeout.js.map +0 -1
- package/dist/smart-router.d.ts +0 -73
- package/dist/smart-router.d.ts.map +0 -1
- package/dist/smart-router.js +0 -332
- package/dist/smart-router.js.map +0 -1
- package/dist/terminal-recording.d.ts +0 -55
- package/dist/terminal-recording.d.ts.map +0 -1
- package/dist/terminal-recording.js +0 -182
- package/dist/terminal-recording.js.map +0 -1
- package/dist/tmux.d.ts +0 -35
- package/dist/tmux.d.ts.map +0 -1
- package/dist/tmux.js +0 -106
- package/dist/tmux.js.map +0 -1
- package/dist/ui/modals.d.ts +0 -72
- package/dist/ui/modals.d.ts.map +0 -1
- package/dist/ui/modals.js +0 -266
- package/dist/ui/modals.js.map +0 -1
- package/dist/ui/pack-picker.d.ts +0 -12
- package/dist/ui/pack-picker.d.ts.map +0 -1
- package/dist/ui/pack-picker.js +0 -101
- package/dist/ui/pack-picker.js.map +0 -1
- package/dist/ui/theme-picker.d.ts +0 -24
- package/dist/ui/theme-picker.d.ts.map +0 -1
- package/dist/ui/theme-picker.js +0 -190
- package/dist/ui/theme-picker.js.map +0 -1
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* UI Module - Selector Modals
|
|
4
|
+
*
|
|
5
|
+
* List-based pickers: model selection, session management, provider selection.
|
|
6
|
+
*/
|
|
7
|
+
import { useState } from 'react';
|
|
8
|
+
import { Box, Text, useInput } from 'ink';
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Model Selector
|
|
11
|
+
// ============================================================================
|
|
12
|
+
export function ModelSelector({ models, onSelect, onCancel }) {
|
|
13
|
+
const [index, setIndex] = useState(0);
|
|
14
|
+
const pageSize = 10;
|
|
15
|
+
const start = Math.max(0, Math.min(index - Math.floor(pageSize / 2), models.length - pageSize));
|
|
16
|
+
const visible = models.slice(start, start + pageSize);
|
|
17
|
+
useInput((input, key) => {
|
|
18
|
+
if (key.upArrow)
|
|
19
|
+
setIndex(i => Math.max(0, i - 1));
|
|
20
|
+
else if (key.downArrow)
|
|
21
|
+
setIndex(i => Math.min(models.length - 1, i + 1));
|
|
22
|
+
else if (key.return && models.length > 0)
|
|
23
|
+
onSelect(models[index].id);
|
|
24
|
+
else if (key.escape || input === 'q')
|
|
25
|
+
onCancel();
|
|
26
|
+
});
|
|
27
|
+
return (_jsxs(Box, { flexDirection: "column", marginY: 1, children: [_jsx(Text, { color: "yellow", children: "Select model (\u2191/\u2193 navigate, Enter select, Esc cancel):" }), visible.map((model, i) => {
|
|
28
|
+
const globalIndex = start + i;
|
|
29
|
+
const isSelected = globalIndex === index;
|
|
30
|
+
const name = model.name || model.id;
|
|
31
|
+
const displayName = name.length > 50 ? name.slice(0, 47) + '...' : name;
|
|
32
|
+
return (_jsxs(Text, { color: isSelected ? 'cyan' : undefined, bold: isSelected, children: [isSelected ? '❯ ' : ' ', displayName] }, model.id));
|
|
33
|
+
}), models.length > pageSize && (_jsxs(Text, { dimColor: true, children: [" (", index + 1, "/", models.length, ")"] }))] }));
|
|
34
|
+
}
|
|
35
|
+
// ============================================================================
|
|
36
|
+
// Session Selector
|
|
37
|
+
// ============================================================================
|
|
38
|
+
export function SessionSelector({ sessions, onSelect, onDelete, onCancel }) {
|
|
39
|
+
const [index, setIndex] = useState(0);
|
|
40
|
+
const pageSize = 5;
|
|
41
|
+
// Keep selection visible - scroll window to follow selection
|
|
42
|
+
const start = Math.max(0, Math.min(index - pageSize + 1, sessions.length - pageSize));
|
|
43
|
+
const end = Math.min(start + pageSize, sessions.length);
|
|
44
|
+
const visible = sessions.slice(start, end);
|
|
45
|
+
const hasMore = sessions.length > pageSize;
|
|
46
|
+
const hasAbove = start > 0;
|
|
47
|
+
const hasBelow = end < sessions.length;
|
|
48
|
+
useInput((input, key) => {
|
|
49
|
+
if (key.upArrow)
|
|
50
|
+
setIndex(i => Math.max(0, i - 1));
|
|
51
|
+
else if (key.downArrow)
|
|
52
|
+
setIndex(i => Math.min(sessions.length - 1, i + 1));
|
|
53
|
+
else if (key.return && sessions.length > 0)
|
|
54
|
+
onSelect(sessions[index]);
|
|
55
|
+
else if ((key.backspace || key.delete) && sessions.length > 0)
|
|
56
|
+
onDelete(sessions[index]);
|
|
57
|
+
else if (key.escape || input === 'q')
|
|
58
|
+
onCancel();
|
|
59
|
+
});
|
|
60
|
+
const formatTimeAgo = (dateStr) => {
|
|
61
|
+
const diff = Date.now() - new Date(dateStr).getTime();
|
|
62
|
+
const hours = Math.floor(diff / (1000 * 60 * 60));
|
|
63
|
+
const days = Math.floor(hours / 24);
|
|
64
|
+
if (days > 0)
|
|
65
|
+
return `${days}d ago`;
|
|
66
|
+
if (hours > 0)
|
|
67
|
+
return `${hours}h ago`;
|
|
68
|
+
const minutes = Math.floor(diff / (1000 * 60));
|
|
69
|
+
return `${minutes}m ago`;
|
|
70
|
+
};
|
|
71
|
+
if (sessions.length === 0) {
|
|
72
|
+
return (_jsx(Box, { flexDirection: "column", marginY: 1, children: _jsx(Text, { dimColor: true, children: "No sessions found. Press Esc to close." }) }));
|
|
73
|
+
}
|
|
74
|
+
return (_jsxs(Box, { flexDirection: "column", marginY: 1, children: [_jsx(Text, { color: "yellow", children: "Sessions (\u2191/\u2193, Enter load, Del delete, Esc cancel):" }), hasMore && hasAbove && _jsx(Text, { dimColor: true, children: " \u2191 more" }), visible.map((session, i) => {
|
|
75
|
+
const globalIndex = start + i;
|
|
76
|
+
const isSelected = globalIndex === index;
|
|
77
|
+
const timeAgo = formatTimeAgo(session.lastAccessedAt);
|
|
78
|
+
const name = session.projectName.length > 30 ? session.projectName.slice(0, 27) + '...' : session.projectName;
|
|
79
|
+
return (_jsxs(Text, { color: isSelected ? 'cyan' : undefined, bold: isSelected, children: [isSelected ? '❯ ' : ' ', name, " ", _jsxs(Text, { dimColor: true, children: ["(", timeAgo, ", ", session.messageCount, " msgs)"] })] }, session.id));
|
|
80
|
+
}), hasMore && hasBelow && _jsx(Text, { dimColor: true, children: " \u2193 more" }), hasMore && _jsxs(Text, { dimColor: true, children: [" ", index + 1, "/", sessions.length] })] }));
|
|
81
|
+
}
|
|
82
|
+
export function ProviderSelector({ providers, onSelect, onCancel, }) {
|
|
83
|
+
const [index, setIndex] = useState(() => {
|
|
84
|
+
// Start on the first configured provider; fall back to 0.
|
|
85
|
+
const firstConfigured = providers.findIndex(p => p.configured);
|
|
86
|
+
return firstConfigured >= 0 ? firstConfigured : 0;
|
|
87
|
+
});
|
|
88
|
+
const pageSize = 12;
|
|
89
|
+
const start = Math.max(0, Math.min(index - Math.floor(pageSize / 2), providers.length - pageSize));
|
|
90
|
+
const visible = providers.slice(start, start + pageSize);
|
|
91
|
+
const anyConfigured = providers.some(p => p.configured);
|
|
92
|
+
useInput((input, key) => {
|
|
93
|
+
if (key.upArrow)
|
|
94
|
+
setIndex(i => Math.max(0, i - 1));
|
|
95
|
+
else if (key.downArrow)
|
|
96
|
+
setIndex(i => Math.min(providers.length - 1, i + 1));
|
|
97
|
+
else if (key.return && providers.length > 0)
|
|
98
|
+
onSelect(providers[index]);
|
|
99
|
+
else if (key.escape || input === 'q')
|
|
100
|
+
onCancel();
|
|
101
|
+
});
|
|
102
|
+
return (_jsxs(Box, { flexDirection: "column", marginY: 1, children: [_jsx(Text, { color: "yellow", children: "Select provider (\u2191/\u2193 navigate, Enter select, Esc cancel):" }), !anyConfigured && (_jsx(Text, { dimColor: true, children: " No providers configured. Ollama is the easiest starting point (local, free)." })), visible.map((p, i) => {
|
|
103
|
+
const globalIndex = start + i;
|
|
104
|
+
const isSelected = globalIndex === index;
|
|
105
|
+
const star = p.configured ? '★' : '☆';
|
|
106
|
+
const starColor = p.configured ? 'green' : 'gray';
|
|
107
|
+
const tag = p.recommended ? ' (recommended)' : '';
|
|
108
|
+
return (_jsxs(Box, { children: [_jsx(Text, { color: isSelected ? 'cyan' : undefined, bold: isSelected, children: isSelected ? '❯ ' : ' ' }), _jsxs(Text, { color: starColor, children: [star, " "] }), _jsx(Text, { color: isSelected ? 'cyan' : undefined, bold: isSelected, children: p.label }), p.note && _jsxs(Text, { dimColor: true, children: [" \u2014 ", p.note] }), tag && _jsx(Text, { color: "yellow", children: tag }), !p.configured && _jsxs(Text, { dimColor: true, children: [" (needs ", p.configHint, ")"] })] }, p.id));
|
|
109
|
+
}), providers.length > pageSize && (_jsxs(Text, { dimColor: true, children: [" (", index + 1, "/", providers.length, ")"] }))] }));
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=selectors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectors.js","sourceRoot":"","sources":["../../../src/ui/modals/selectors.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI Module - Setup & Info Modals
|
|
3
|
+
*
|
|
4
|
+
* Inline API-key configuration and the keybindings help overlay.
|
|
5
|
+
*/
|
|
6
|
+
import React from 'react';
|
|
7
|
+
import type { LLMProvider } from '../../types.js';
|
|
8
|
+
export declare function ApiKeySetup({ provider, configHint, onSubmit, onCancel, extraInstructions, }: {
|
|
9
|
+
provider: LLMProvider;
|
|
10
|
+
configHint: string;
|
|
11
|
+
onSubmit: (value: string) => void;
|
|
12
|
+
onCancel: () => void;
|
|
13
|
+
extraInstructions?: string;
|
|
14
|
+
}): React.JSX.Element;
|
|
15
|
+
export declare function KeybindingsModal({ onClose }: {
|
|
16
|
+
onClose: () => void;
|
|
17
|
+
}): React.JSX.Element;
|
|
18
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/ui/modals/setup.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAOlD,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,iBAAiB,GAClB,EAAE;IACD,QAAQ,EAAE,WAAW,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,qBA0CA;AAMD,wBAAgB,gBAAgB,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,qBAoCpE"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* UI Module - Setup & Info Modals
|
|
4
|
+
*
|
|
5
|
+
* Inline API-key configuration and the keybindings help overlay.
|
|
6
|
+
*/
|
|
7
|
+
import { useState } from 'react';
|
|
8
|
+
import { Box, Text, useInput } from 'ink';
|
|
9
|
+
import { shouldInsertInputChunk } from '../input-utils.js';
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Api Key Setup (inline configuration for unconfigured providers)
|
|
12
|
+
// ============================================================================
|
|
13
|
+
export function ApiKeySetup({ provider, configHint, onSubmit, onCancel, extraInstructions, }) {
|
|
14
|
+
const [value, setValue] = useState('');
|
|
15
|
+
useInput((input, key) => {
|
|
16
|
+
if (key.escape) {
|
|
17
|
+
onCancel();
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (key.return) {
|
|
21
|
+
const trimmed = value.trim();
|
|
22
|
+
if (trimmed)
|
|
23
|
+
onSubmit(trimmed);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (key.backspace || key.delete || input === '\x7f' || input === '\b' || (key.ctrl && input === 'h')) {
|
|
27
|
+
setValue(v => v.slice(0, -1));
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (key.ctrl && input === 'u') {
|
|
31
|
+
setValue('');
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (shouldInsertInputChunk(input, key)) {
|
|
35
|
+
setValue(v => v + input);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
const masked = value ? '•'.repeat(Math.min(value.length, 40)) : '';
|
|
39
|
+
return (_jsxs(Box, { flexDirection: "column", marginY: 1, borderStyle: "round", borderColor: "cyan", paddingX: 1, children: [_jsxs(Text, { color: "cyan", bold: true, children: ["\uD83D\uDD11 Configure ", provider] }), _jsx(Text, { children: " " }), _jsxs(Text, { dimColor: true, children: ["Paste your ", configHint, " and press Enter (Esc to cancel):"] }), extraInstructions && _jsx(Text, { dimColor: true, children: extraInstructions }), _jsx(Text, { children: " " }), _jsxs(Box, { children: [_jsxs(Text, { color: "yellow", children: [configHint, ": "] }), _jsx(Text, { children: masked }), _jsx(Text, { color: "cyan", children: "\u258C" })] })] }));
|
|
40
|
+
}
|
|
41
|
+
// ============================================================================
|
|
42
|
+
// Keybindings Modal
|
|
43
|
+
// ============================================================================
|
|
44
|
+
export function KeybindingsModal({ onClose }) {
|
|
45
|
+
useInput((input, key) => {
|
|
46
|
+
if (key.escape || key.return || input === 'q')
|
|
47
|
+
onClose();
|
|
48
|
+
});
|
|
49
|
+
return (_jsxs(Box, { flexDirection: "column", marginY: 1, borderStyle: "round", borderColor: "cyan", paddingX: 2, paddingY: 1, children: [_jsx(Text, { color: "cyan", bold: true, children: "\u2328\uFE0F Keyboard Shortcuts" }), _jsx(Text, { children: " " }), _jsx(Text, { bold: true, color: "yellow", children: "General:" }), _jsx(Text, { children: " Enter Submit message" }), _jsx(Text, { children: " Alt/Ctrl+Enter Insert newline (multiline)" }), _jsx(Text, { children: " Shift+Tab Cycle modes (plan/hybrid/work)" }), _jsx(Text, { children: " Esc Cancel operation / show hint" }), _jsx(Text, { children: " Ctrl+C Exit" }), _jsx(Text, { children: " \u2191/\u2193 Navigate input history" }), _jsx(Text, { children: " Tab Auto-complete commands/paths" }), _jsx(Text, { children: " Ctrl+U Clear input line" }), _jsx(Text, { children: " " }), _jsx(Text, { bold: true, color: "yellow", children: "During Processing (queue mode):" }), _jsx(Text, { children: " Enter Queue message for later" }), _jsx(Text, { children: " !message Send directly (interrupt agent)" }), _jsx(Text, { children: " \u2191/\u2193 Edit queued messages" }), _jsx(Text, { children: " Ctrl+D Delete queued message" }), _jsx(Text, { children: " " }), _jsx(Text, { bold: true, color: "yellow", children: "Quick Commands:" }), _jsx(Text, { children: " /keys This help" }), _jsx(Text, { children: " /work Switch to work mode" }), _jsx(Text, { children: " /plan Switch to plan mode" }), _jsx(Text, { children: " /flush Force-process queue" }), _jsx(Text, { children: " /unstick Reset stuck state" }), _jsx(Text, { children: " /debug on/off Toggle debug mode" }), _jsx(Text, { children: " " }), _jsx(Text, { dimColor: true, children: "Press any key to close..." })] }));
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/ui/modals/setup.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAE1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,+EAA+E;AAC/E,kEAAkE;AAClE,+EAA+E;AAE/E,MAAM,UAAU,WAAW,CAAC,EAC1B,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,iBAAiB,GAOlB;IACC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEvC,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,QAAQ,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAC7B,IAAI,OAAO;gBAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,GAAG,CAAC,EAAE,CAAC;YACrG,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAC9B,QAAQ,CAAC,EAAE,CAAC,CAAC;YACb,OAAO;QACT,CAAC;QACD,IAAI,sBAAsB,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;YACvC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnE,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,EAAE,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,QAAQ,EAAE,CAAC,aACxF,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,IAAI,8CAAe,QAAQ,IAAQ,EACtD,KAAC,IAAI,oBAAS,EACd,MAAC,IAAI,IAAC,QAAQ,kCAAa,UAAU,yCAAyC,EAC7E,iBAAiB,IAAI,KAAC,IAAI,IAAC,QAAQ,kBAAE,iBAAiB,GAAQ,EAC/D,KAAC,IAAI,oBAAS,EACd,MAAC,GAAG,eACF,MAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,aAAE,UAAU,UAAU,EAC1C,KAAC,IAAI,cAAE,MAAM,GAAQ,EACrB,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,uBAAS,IACvB,IACF,CACP,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,MAAM,UAAU,gBAAgB,CAAC,EAAE,OAAO,EAA2B;IACnE,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,KAAK,KAAK,GAAG;YAAE,OAAO,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,OAAO,EAAE,CAAC,EAAE,WAAW,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,aACrG,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,IAAI,uDAA8B,EACrD,KAAC,IAAI,oBAAS,EACd,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,QAAQ,yBAAgB,EACzC,KAAC,IAAI,kDAAuC,EAC5C,KAAC,IAAI,8DAAmD,EACxD,KAAC,IAAI,kEAAuD,EAC5D,KAAC,IAAI,gEAAqD,EAC1D,KAAC,IAAI,wCAA6B,EAClC,KAAC,IAAI,oEAA+C,EACpD,KAAC,IAAI,gEAAqD,EAC1D,KAAC,IAAI,oDAAyC,EAC9C,KAAC,IAAI,oBAAS,EACd,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,QAAQ,gDAAuC,EAChE,KAAC,IAAI,2DAAgD,EACrD,KAAC,IAAI,mEAAwD,EAC7D,KAAC,IAAI,kEAA6C,EAClD,KAAC,IAAI,yDAA8C,EACnD,KAAC,IAAI,oBAAS,EACd,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,QAAQ,gCAAuB,EAChD,KAAC,IAAI,6CAAkC,EACvC,KAAC,IAAI,uDAA4C,EACjD,KAAC,IAAI,uDAA4C,EACjD,KAAC,IAAI,uDAA4C,EACjD,KAAC,IAAI,qDAA0C,EAC/C,KAAC,IAAI,qDAA0C,EAC/C,KAAC,IAAI,oBAAS,EACd,KAAC,IAAI,IAAC,QAAQ,gDAAiC,IAC3C,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI region - input
|
|
3
|
+
*
|
|
4
|
+
* Owns every input-widget concern: the current value, tab-completion
|
|
5
|
+
* suggestions, up/down history navigation, and submit (which records history
|
|
6
|
+
* and clears the line before delegating message processing to the parent).
|
|
7
|
+
*
|
|
8
|
+
* This is where keystroke isolation lives. The value is held in a ref for the
|
|
9
|
+
* synchronous-paint pattern ChatInput relies on, and a version counter bumps on
|
|
10
|
+
* every change so ONLY this region re-renders while typing — the parent, the
|
|
11
|
+
* transcript, and the status bar are untouched.
|
|
12
|
+
*/
|
|
13
|
+
import React from 'react';
|
|
14
|
+
import type { Mode } from '../../types.js';
|
|
15
|
+
export interface InputRegionProps {
|
|
16
|
+
/** Process a submitted, trimmed, non-empty message (command/shell/agent routing). */
|
|
17
|
+
onSubmitMessage: (trimmed: string) => void;
|
|
18
|
+
/** Populated with the full submit fn (records history, clears, routes) so the
|
|
19
|
+
* parent can drive submissions from outside the widget (e.g. fleet polling). */
|
|
20
|
+
submitRef?: React.MutableRefObject<((value: string) => void) | null>;
|
|
21
|
+
disabled: boolean;
|
|
22
|
+
isProcessing: boolean;
|
|
23
|
+
queuedCount: number;
|
|
24
|
+
queuedMessages: string[];
|
|
25
|
+
editingQueueIndex: number | null;
|
|
26
|
+
onQueueMessage: (msg: string) => void;
|
|
27
|
+
onEditQueuedMessage: (index: number, msg: string) => void;
|
|
28
|
+
onSetEditingQueueIndex: (index: number | null) => void;
|
|
29
|
+
onDirectSend: (msg: string) => void;
|
|
30
|
+
onEscape: () => void;
|
|
31
|
+
onExit: () => void;
|
|
32
|
+
onCycleMode: () => void;
|
|
33
|
+
currentMode: Mode;
|
|
34
|
+
contextPercentage: number;
|
|
35
|
+
cwd: string;
|
|
36
|
+
}
|
|
37
|
+
declare function InputRegionInner(props: InputRegionProps): React.JSX.Element;
|
|
38
|
+
export declare const InputRegion: React.MemoExoticComponent<typeof InputRegionInner>;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=input-region.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-region.d.ts","sourceRoot":"","sources":["../../../src/ui/regions/input-region.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAA4D,MAAM,OAAO,CAAC;AAEjF,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAI3C,MAAM,WAAW,gBAAgB;IAC/B,qFAAqF;IACrF,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C;qFACiF;IACjF,SAAS,CAAC,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACrE,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,sBAAsB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACvD,YAAY,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,WAAW,EAAE,IAAI,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,iBAAS,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,qBAuIhD;AAED,eAAO,MAAM,WAAW,oDAA+B,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* UI region - input
|
|
4
|
+
*
|
|
5
|
+
* Owns every input-widget concern: the current value, tab-completion
|
|
6
|
+
* suggestions, up/down history navigation, and submit (which records history
|
|
7
|
+
* and clears the line before delegating message processing to the parent).
|
|
8
|
+
*
|
|
9
|
+
* This is where keystroke isolation lives. The value is held in a ref for the
|
|
10
|
+
* synchronous-paint pattern ChatInput relies on, and a version counter bumps on
|
|
11
|
+
* every change so ONLY this region re-renders while typing — the parent, the
|
|
12
|
+
* transcript, and the status bar are untouched.
|
|
13
|
+
*/
|
|
14
|
+
import React, { useState, useRef, useCallback, useEffect, useMemo } from 'react';
|
|
15
|
+
import * as fs from 'fs';
|
|
16
|
+
import { ChatInput } from '../chat-input.js';
|
|
17
|
+
import { probeRender } from './render-probe.js';
|
|
18
|
+
function InputRegionInner(props) {
|
|
19
|
+
probeRender('input');
|
|
20
|
+
const { onSubmitMessage, submitRef, disabled, isProcessing, queuedCount, queuedMessages, editingQueueIndex, onQueueMessage, onEditQueuedMessage, onSetEditingQueueIndex, onDirectSend, onEscape, onExit, onCycleMode, currentMode, contextPercentage, cwd, } = props;
|
|
21
|
+
// Input value is held in a ref for ChatInput's synchronous-paint pattern; the
|
|
22
|
+
// version counter bumps on every change so this region re-renders on a
|
|
23
|
+
// keystroke while the rest of the tree stays put.
|
|
24
|
+
const inputRef = useRef('');
|
|
25
|
+
const [inputVersion, setInputVersion] = useState(0);
|
|
26
|
+
const [suggestions, setSuggestions] = useState([]);
|
|
27
|
+
// Input history for up/down arrow navigation
|
|
28
|
+
const [inputHistory, setInputHistory] = useState([]);
|
|
29
|
+
const [historyIndex, setHistoryIndex] = useState(-1);
|
|
30
|
+
const [savedInput, setSavedInput] = useState(''); // Save current input when navigating
|
|
31
|
+
const [hasGitRepo] = useState(() => {
|
|
32
|
+
try {
|
|
33
|
+
return fs.existsSync('.git') || fs.existsSync('../.git');
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
const recentCommands = useMemo(() => inputHistory.filter(cmd => cmd.startsWith('/')).slice(-10), [inputHistory]);
|
|
40
|
+
const setInputValue = useCallback((value) => {
|
|
41
|
+
inputRef.current = value;
|
|
42
|
+
setInputVersion(v => v + 1);
|
|
43
|
+
}, []);
|
|
44
|
+
// Typing: keep the ref canonical and bump the version so this region repaints.
|
|
45
|
+
// Slash-suggestion and history-index resets bail out when already current.
|
|
46
|
+
const handleInputChange = useCallback((newValue) => {
|
|
47
|
+
inputRef.current = newValue;
|
|
48
|
+
setInputVersion(v => v + 1);
|
|
49
|
+
if (!newValue || !newValue.startsWith('/')) {
|
|
50
|
+
setSuggestions(prev => prev.length > 0 ? [] : prev);
|
|
51
|
+
}
|
|
52
|
+
setHistoryIndex(prev => prev === -1 ? prev : -1);
|
|
53
|
+
}, []);
|
|
54
|
+
// Navigate input history
|
|
55
|
+
const navigateHistory = useCallback((direction) => {
|
|
56
|
+
if (inputHistory.length === 0)
|
|
57
|
+
return;
|
|
58
|
+
if (direction === 'up') {
|
|
59
|
+
if (historyIndex === -1) {
|
|
60
|
+
// Save current input before navigating
|
|
61
|
+
setSavedInput(inputRef.current);
|
|
62
|
+
setHistoryIndex(inputHistory.length - 1);
|
|
63
|
+
setInputValue(inputHistory[inputHistory.length - 1]);
|
|
64
|
+
}
|
|
65
|
+
else if (historyIndex > 0) {
|
|
66
|
+
setHistoryIndex(historyIndex - 1);
|
|
67
|
+
setInputValue(inputHistory[historyIndex - 1]);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
if (historyIndex === -1)
|
|
72
|
+
return;
|
|
73
|
+
if (historyIndex < inputHistory.length - 1) {
|
|
74
|
+
setHistoryIndex(historyIndex + 1);
|
|
75
|
+
setInputValue(inputHistory[historyIndex + 1]);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
// Return to saved input
|
|
79
|
+
setHistoryIndex(-1);
|
|
80
|
+
setInputValue(savedInput);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}, [inputHistory, historyIndex, savedInput, setInputValue]);
|
|
84
|
+
// Add to history when submitting
|
|
85
|
+
const addToHistory = useCallback((value) => {
|
|
86
|
+
if (value.trim() && (inputHistory.length === 0 || inputHistory[inputHistory.length - 1] !== value)) {
|
|
87
|
+
setInputHistory(prev => [...prev.slice(-100), value]); // Keep last 100 entries
|
|
88
|
+
}
|
|
89
|
+
setHistoryIndex(-1);
|
|
90
|
+
setSavedInput('');
|
|
91
|
+
}, [inputHistory]);
|
|
92
|
+
// Submit: record history, clear the line, then hand off routing to the parent.
|
|
93
|
+
// (ChatInput queues rather than submitting while processing, and fleet checks
|
|
94
|
+
// isProcessingRef before calling, so the value is only ever submitted idle.)
|
|
95
|
+
const handleSubmit = useCallback((value) => {
|
|
96
|
+
const trimmed = value.trim();
|
|
97
|
+
if (!trimmed)
|
|
98
|
+
return;
|
|
99
|
+
addToHistory(trimmed);
|
|
100
|
+
setInputValue('');
|
|
101
|
+
onSubmitMessage(trimmed);
|
|
102
|
+
}, [addToHistory, setInputValue, onSubmitMessage]);
|
|
103
|
+
// Expose the full submit to the parent (fleet polling drives it directly).
|
|
104
|
+
useEffect(() => {
|
|
105
|
+
if (submitRef) {
|
|
106
|
+
submitRef.current = handleSubmit;
|
|
107
|
+
return () => { submitRef.current = null; };
|
|
108
|
+
}
|
|
109
|
+
return undefined;
|
|
110
|
+
}, [submitRef, handleSubmit]);
|
|
111
|
+
return (_jsx(ChatInput, { value: inputRef.current, valueVersion: inputVersion, onChange: handleInputChange, onSubmit: handleSubmit, onEscape: onEscape, onExit: onExit, onCycleMode: onCycleMode, disabled: disabled, isProcessing: isProcessing, queuedCount: queuedCount, queuedMessages: queuedMessages, editingQueueIndex: editingQueueIndex, onQueueMessage: onQueueMessage, onEditQueuedMessage: onEditQueuedMessage, onSetEditingQueueIndex: onSetEditingQueueIndex, onDirectSend: onDirectSend, cwd: cwd, suggestions: suggestions, onSuggestionsChange: setSuggestions, onNavigateHistory: navigateHistory,
|
|
112
|
+
// Smart suggestions context
|
|
113
|
+
currentMode: currentMode, contextPercentage: contextPercentage, recentCommands: recentCommands, hasGitRepo: hasGitRepo }));
|
|
114
|
+
}
|
|
115
|
+
export const InputRegion = React.memo(InputRegionInner);
|
|
116
|
+
//# sourceMappingURL=input-region.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-region.js","sourceRoot":"","sources":["../../../src/ui/regions/input-region.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI region - modal host
|
|
3
|
+
*
|
|
4
|
+
* Renders whichever modal `modalMode` selects. Purely presentational: every bit
|
|
5
|
+
* of logic (session loading, provider config, upgrade) is supplied by the
|
|
6
|
+
* controller as a stable callback. Memoized so it stays put on keystrokes.
|
|
7
|
+
*/
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import type { ModelInfo } from '../../model-detection.js';
|
|
10
|
+
import type { SessionInfo } from '../types.js';
|
|
11
|
+
import type { ProviderEntry } from '../modals/index.js';
|
|
12
|
+
import type { ModalMode, PendingComplexPrompt, PreviousSessionInfo } from '../state/use-modal-state.js';
|
|
13
|
+
export interface ModalHostProps {
|
|
14
|
+
modalMode: ModalMode;
|
|
15
|
+
availableModels: ModelInfo[];
|
|
16
|
+
onModelSelect: (model: string) => void;
|
|
17
|
+
onModalCancel: () => void;
|
|
18
|
+
availableSessions: SessionInfo[];
|
|
19
|
+
onSessionSelect: (session: SessionInfo) => void;
|
|
20
|
+
onSessionDelete: (session: SessionInfo) => void;
|
|
21
|
+
latestVersion: string | null;
|
|
22
|
+
onUpgradeConfirm: () => void;
|
|
23
|
+
previousSession: PreviousSessionInfo | null;
|
|
24
|
+
onSessionResume: () => void;
|
|
25
|
+
onSessionResumeNew: () => void;
|
|
26
|
+
pendingComplexPrompt: PendingComplexPrompt | null;
|
|
27
|
+
onComplexityProceed: () => void;
|
|
28
|
+
onComplexityPlan: () => void;
|
|
29
|
+
onComplexityCancel: () => void;
|
|
30
|
+
onKeybindingsClose: () => void;
|
|
31
|
+
providerEntries: ProviderEntry[];
|
|
32
|
+
onProviderSelect: (entry: ProviderEntry) => void;
|
|
33
|
+
onProviderCancel: () => void;
|
|
34
|
+
pendingSetupProvider: ProviderEntry | null;
|
|
35
|
+
onApiKeySubmit: (value: string) => void;
|
|
36
|
+
onApiKeyCancel: () => void;
|
|
37
|
+
}
|
|
38
|
+
declare function ModalHostInner(props: ModalHostProps): React.JSX.Element | null;
|
|
39
|
+
export declare const ModalHost: React.MemoExoticComponent<typeof ModalHostInner>;
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=modal-host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modal-host.d.ts","sourceRoot":"","sources":["../../../src/ui/regions/modal-host.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EACV,SAAS,EAAE,oBAAoB,EAAE,mBAAmB,EACrD,MAAM,6BAA6B,CAAC;AAGrC,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,SAAS,CAAC;IAErB,eAAe,EAAE,SAAS,EAAE,CAAC;IAC7B,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,aAAa,EAAE,MAAM,IAAI,CAAC;IAE1B,iBAAiB,EAAE,WAAW,EAAE,CAAC;IACjC,eAAe,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IAChD,eAAe,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IAEhD,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAE7B,eAAe,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC5C,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAE/B,oBAAoB,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAClD,mBAAmB,EAAE,MAAM,IAAI,CAAC;IAChC,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAE/B,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAE/B,eAAe,EAAE,aAAa,EAAE,CAAC;IACjC,gBAAgB,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IACjD,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAE7B,oBAAoB,EAAE,aAAa,GAAG,IAAI,CAAC;IAC3C,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED,iBAAS,cAAc,CAAC,KAAK,EAAE,cAAc,4BAgG5C;AAED,eAAO,MAAM,SAAS,kDAA6B,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* UI region - modal host
|
|
4
|
+
*
|
|
5
|
+
* Renders whichever modal `modalMode` selects. Purely presentational: every bit
|
|
6
|
+
* of logic (session loading, provider config, upgrade) is supplied by the
|
|
7
|
+
* controller as a stable callback. Memoized so it stays put on keystrokes.
|
|
8
|
+
*/
|
|
9
|
+
import React from 'react';
|
|
10
|
+
import { getVersion } from '../../version-check.js';
|
|
11
|
+
import { ModelSelector, SessionSelector, UpgradePrompt, ComplexityWarning, SessionResumePrompt, KeybindingsModal, ProviderSelector, ApiKeySetup, } from '../modals/index.js';
|
|
12
|
+
import { probeRender } from './render-probe.js';
|
|
13
|
+
function ModalHostInner(props) {
|
|
14
|
+
probeRender('modal');
|
|
15
|
+
const { modalMode } = props;
|
|
16
|
+
if (modalMode === 'model' && props.availableModels.length > 0) {
|
|
17
|
+
return (_jsx(ModelSelector, { models: props.availableModels, onSelect: props.onModelSelect, onCancel: props.onModalCancel }));
|
|
18
|
+
}
|
|
19
|
+
if (modalMode === 'sessions') {
|
|
20
|
+
return (_jsx(SessionSelector, { sessions: props.availableSessions, onSelect: props.onSessionSelect, onDelete: props.onSessionDelete, onCancel: props.onModalCancel }));
|
|
21
|
+
}
|
|
22
|
+
if (modalMode === 'upgrade' && props.latestVersion) {
|
|
23
|
+
return (_jsx(UpgradePrompt, { currentVersion: getVersion(), latestVersion: props.latestVersion, onConfirm: props.onUpgradeConfirm, onCancel: props.onModalCancel }));
|
|
24
|
+
}
|
|
25
|
+
if (modalMode === 'session-resume' && props.previousSession) {
|
|
26
|
+
return (_jsx(SessionResumePrompt, { session: props.previousSession, onResume: props.onSessionResume, onNew: props.onSessionResumeNew }));
|
|
27
|
+
}
|
|
28
|
+
if (modalMode === 'complexity-warning' && props.pendingComplexPrompt) {
|
|
29
|
+
const { pendingComplexPrompt } = props;
|
|
30
|
+
return (_jsx(ComplexityWarning, { reason: pendingComplexPrompt.complexity.reason || 'Complex operation detected', prompt: typeof pendingComplexPrompt.prompt === 'string' ? pendingComplexPrompt.prompt : undefined, onProceed: props.onComplexityProceed, onPlan: props.onComplexityPlan, onCancel: props.onComplexityCancel }));
|
|
31
|
+
}
|
|
32
|
+
if (modalMode === 'keys') {
|
|
33
|
+
return _jsx(KeybindingsModal, { onClose: props.onKeybindingsClose });
|
|
34
|
+
}
|
|
35
|
+
if (modalMode === 'provider' && props.providerEntries.length > 0) {
|
|
36
|
+
return (_jsx(ProviderSelector, { providers: props.providerEntries, onSelect: props.onProviderSelect, onCancel: props.onProviderCancel }));
|
|
37
|
+
}
|
|
38
|
+
if (modalMode === 'api-key-setup' && props.pendingSetupProvider) {
|
|
39
|
+
const { pendingSetupProvider } = props;
|
|
40
|
+
return (_jsx(ApiKeySetup, { provider: pendingSetupProvider.id, configHint: pendingSetupProvider.configHint, onSubmit: props.onApiKeySubmit, onCancel: props.onApiKeyCancel, extraInstructions: pendingSetupProvider.id === 'ollama'
|
|
41
|
+
? 'e.g. http://localhost:11434 (start with: ollama serve)'
|
|
42
|
+
: pendingSetupProvider.id === 'bedrock'
|
|
43
|
+
? 'Enter your AWS profile name. Ensure it exists in ~/.aws/credentials or ~/.aws/config.'
|
|
44
|
+
: pendingSetupProvider.id === 'litellm'
|
|
45
|
+
? 'e.g. http://localhost:4000'
|
|
46
|
+
: undefined }));
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
export const ModalHost = React.memo(ModalHostInner);
|
|
51
|
+
//# sourceMappingURL=modal-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modal-host.js","sourceRoot":"","sources":["../../../src/ui/regions/modal-host.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI Module - Render Probe (test/automation instrumentation)
|
|
3
|
+
*
|
|
4
|
+
* Region components call `probeRender(name)` at the top of their render and
|
|
5
|
+
* `probeMount(name)` from a mount effect. Both are no-ops in production (the
|
|
6
|
+
* probe is disabled), so the overhead is a single boolean check per render.
|
|
7
|
+
*
|
|
8
|
+
* The render-isolation test enables the probe, renders the decomposed tree,
|
|
9
|
+
* drives stdin, and asserts which regions re-rendered — this is how we prove a
|
|
10
|
+
* keystroke touches only the input region and that resetSession() resets state
|
|
11
|
+
* without remounting (mount count stays 1).
|
|
12
|
+
*/
|
|
13
|
+
/** Enable (and reset) or disable render/mount counting. */
|
|
14
|
+
export declare function enableRenderProbe(on?: boolean): void;
|
|
15
|
+
export declare function isRenderProbeEnabled(): boolean;
|
|
16
|
+
/** Count one render of the named component. No-op unless the probe is enabled. */
|
|
17
|
+
export declare function probeRender(name: string): void;
|
|
18
|
+
/** Count one mount of the named component. No-op unless the probe is enabled. */
|
|
19
|
+
export declare function probeMount(name: string): void;
|
|
20
|
+
export declare function getRenderCount(name: string): number;
|
|
21
|
+
export declare function getMountCount(name: string): number;
|
|
22
|
+
//# sourceMappingURL=render-probe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-probe.d.ts","sourceRoot":"","sources":["../../../src/ui/regions/render-probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,2DAA2D;AAC3D,wBAAgB,iBAAiB,CAAC,EAAE,UAAO,GAAG,IAAI,CAMjD;AAED,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C;AAED,kFAAkF;AAClF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,iFAAiF;AACjF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI Module - Render Probe (test/automation instrumentation)
|
|
3
|
+
*
|
|
4
|
+
* Region components call `probeRender(name)` at the top of their render and
|
|
5
|
+
* `probeMount(name)` from a mount effect. Both are no-ops in production (the
|
|
6
|
+
* probe is disabled), so the overhead is a single boolean check per render.
|
|
7
|
+
*
|
|
8
|
+
* The render-isolation test enables the probe, renders the decomposed tree,
|
|
9
|
+
* drives stdin, and asserts which regions re-rendered — this is how we prove a
|
|
10
|
+
* keystroke touches only the input region and that resetSession() resets state
|
|
11
|
+
* without remounting (mount count stays 1).
|
|
12
|
+
*/
|
|
13
|
+
let enabled = false;
|
|
14
|
+
const renderCounts = Object.create(null);
|
|
15
|
+
const mountCounts = Object.create(null);
|
|
16
|
+
/** Enable (and reset) or disable render/mount counting. */
|
|
17
|
+
export function enableRenderProbe(on = true) {
|
|
18
|
+
enabled = on;
|
|
19
|
+
if (on) {
|
|
20
|
+
for (const k of Object.keys(renderCounts))
|
|
21
|
+
delete renderCounts[k];
|
|
22
|
+
for (const k of Object.keys(mountCounts))
|
|
23
|
+
delete mountCounts[k];
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export function isRenderProbeEnabled() {
|
|
27
|
+
return enabled;
|
|
28
|
+
}
|
|
29
|
+
/** Count one render of the named component. No-op unless the probe is enabled. */
|
|
30
|
+
export function probeRender(name) {
|
|
31
|
+
if (enabled)
|
|
32
|
+
renderCounts[name] = (renderCounts[name] ?? 0) + 1;
|
|
33
|
+
}
|
|
34
|
+
/** Count one mount of the named component. No-op unless the probe is enabled. */
|
|
35
|
+
export function probeMount(name) {
|
|
36
|
+
if (enabled)
|
|
37
|
+
mountCounts[name] = (mountCounts[name] ?? 0) + 1;
|
|
38
|
+
}
|
|
39
|
+
export function getRenderCount(name) {
|
|
40
|
+
return renderCounts[name] ?? 0;
|
|
41
|
+
}
|
|
42
|
+
export function getMountCount(name) {
|
|
43
|
+
return mountCounts[name] ?? 0;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=render-probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-probe.js","sourceRoot":"","sources":["../../../src/ui/regions/render-probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,IAAI,OAAO,GAAG,KAAK,CAAC;AACpB,MAAM,YAAY,GAA2B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACjE,MAAM,WAAW,GAA2B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAEhE,2DAA2D;AAC3D,MAAM,UAAU,iBAAiB,CAAC,EAAE,GAAG,IAAI;IACzC,OAAO,GAAG,EAAE,CAAC;IACb,IAAI,EAAE,EAAE,CAAC;QACP,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;YAAE,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC;QAClE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;YAAE,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,IAAI,OAAO;QAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AAClE,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,OAAO;QAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI region - static scrollback
|
|
3
|
+
*
|
|
4
|
+
* Completed transcript entries rendered through Ink's <Static>. Static writes
|
|
5
|
+
* each item to stdout exactly once and never re-traverses it, so a growing
|
|
6
|
+
* scrollback and per-token streaming updates below no longer pay a full-frame
|
|
7
|
+
* redraw for history that hasn't changed.
|
|
8
|
+
*
|
|
9
|
+
* Two Static constraints shape this component:
|
|
10
|
+
*
|
|
11
|
+
* 1. APPEND-ONLY. Static tracks how many items it has emitted and only renders
|
|
12
|
+
* the tail beyond that count. Items must therefore be appended, never
|
|
13
|
+
* reordered or truncated. Every UIMessage is finalized before the next one
|
|
14
|
+
* is appended (streaming text lives in the separate live zone, not here), so
|
|
15
|
+
* `messages` is naturally append-only during a turn. Clearing/undo replace
|
|
16
|
+
* the array non-append-only; the parent remounts this component (keyed on
|
|
17
|
+
* clearCount) to reset Static's emitted-count rather than mutating it.
|
|
18
|
+
*
|
|
19
|
+
* 2. WRITE-ONCE COLLAPSE (tradeoff). A tool message's rendering depends on its
|
|
20
|
+
* ordinal among tools (collapseTools/toolDisplayLimit windowing). Under
|
|
21
|
+
* <Static> each item renders once, at append time, so that decision is
|
|
22
|
+
* FROZEN then: a tool shown expanded when it was the newest stays expanded
|
|
23
|
+
* even as newer tools arrive — the sliding collapse window no longer
|
|
24
|
+
* re-collapses already-printed tools. This only affects sessions that opt
|
|
25
|
+
* into collapseTools (default off; collapseThinking is currently always
|
|
26
|
+
* off), where the default configuration is byte-identical to the previous
|
|
27
|
+
* non-Static rendering. This is accepted, not worked around: a re-render
|
|
28
|
+
* escape hatch would defeat the write-once guarantee that is the point.
|
|
29
|
+
*/
|
|
30
|
+
import React from 'react';
|
|
31
|
+
import type { UIMessage, CollapseSettings } from '../types.js';
|
|
32
|
+
export interface StaticScrollbackProps {
|
|
33
|
+
messages: UIMessage[];
|
|
34
|
+
collapseSettings: CollapseSettings;
|
|
35
|
+
}
|
|
36
|
+
declare function StaticScrollbackInner({ messages, collapseSettings }: StaticScrollbackProps): React.JSX.Element;
|
|
37
|
+
export declare const StaticScrollback: React.MemoExoticComponent<typeof StaticScrollbackInner>;
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=static-scrollback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static-scrollback.d.ts","sourceRoot":"","sources":["../../../src/ui/regions/static-scrollback.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAoB,MAAM,OAAO,CAAC;AAEzC,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAI/D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAED,iBAAS,qBAAqB,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE,qBAAqB,qBAqCnF;AAMD,eAAO,MAAM,gBAAgB,yDAAoC,CAAC"}
|