@calliopelabs/cli 2.3.0 → 3.0.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 -644
- 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/auto-compressor.d.ts.map +1 -1
- package/dist/auto-compressor.js +9 -5
- package/dist/auto-compressor.js.map +1 -1
- package/dist/bin.d.ts +9 -5
- package/dist/bin.d.ts.map +1 -1
- package/dist/bin.js +108 -76
- 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 +249 -150
- package/dist/checkpoint.js.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 +237 -305
- 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 +53 -11
- package/dist/diff.js.map +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +33 -6
- 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 +222 -26
- package/dist/headless.js.map +1 -1
- package/dist/hooks.d.ts +8 -2
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +97 -11
- package/dist/hooks.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/markdown.d.ts.map +1 -1
- package/dist/markdown.js +32 -10
- package/dist/markdown.js.map +1 -1
- package/dist/mcp.d.ts +35 -5
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +190 -13
- 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.d.ts +14 -1
- package/dist/model-detection.d.ts.map +1 -1
- package/dist/model-detection.js +308 -115
- package/dist/model-detection.js.map +1 -1
- package/dist/parallel-tools.d.ts +9 -1
- package/dist/parallel-tools.d.ts.map +1 -1
- package/dist/parallel-tools.js +6 -5
- package/dist/parallel-tools.js.map +1 -1
- package/dist/plugins.d.ts +68 -0
- package/dist/plugins.d.ts.map +1 -1
- package/dist/plugins.js +201 -3
- 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/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +36 -2
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/bedrock.d.ts.map +1 -1
- package/dist/providers/bedrock.js +83 -22
- 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 +62 -9
- 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.map +1 -1
- package/dist/providers/openai.js +14 -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 +19 -10
- 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/risk.d.ts.map +1 -1
- package/dist/risk.js +15 -5
- package/dist/risk.js.map +1 -1
- package/dist/router.d.ts +133 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/{model-router.js → router.js} +336 -10
- 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} +2 -1
- package/dist/sandbox/native.d.ts.map +1 -0
- package/dist/{sandbox-native.js → sandbox/native.js} +38 -6
- package/dist/sandbox/native.js.map +1 -0
- package/dist/scope.d.ts +10 -0
- package/dist/scope.d.ts.map +1 -1
- package/dist/scope.js +76 -16
- package/dist/scope.js.map +1 -1
- package/dist/scuttlebot/client.d.ts +83 -0
- package/dist/scuttlebot/client.d.ts.map +1 -0
- package/dist/scuttlebot/client.js +350 -0
- package/dist/scuttlebot/client.js.map +1 -0
- package/dist/scuttlebot/config.d.ts +28 -0
- package/dist/scuttlebot/config.d.ts.map +1 -0
- package/dist/scuttlebot/config.js +91 -0
- package/dist/scuttlebot/config.js.map +1 -0
- package/dist/scuttlebot/http-client.d.ts +63 -0
- package/dist/scuttlebot/http-client.d.ts.map +1 -0
- package/dist/scuttlebot/http-client.js +124 -0
- package/dist/scuttlebot/http-client.js.map +1 -0
- package/dist/scuttlebot/index.d.ts +13 -0
- package/dist/scuttlebot/index.d.ts.map +1 -0
- package/dist/scuttlebot/index.js +10 -0
- package/dist/scuttlebot/index.js.map +1 -0
- package/dist/scuttlebot/irc-client.d.ts +124 -0
- package/dist/scuttlebot/irc-client.d.ts.map +1 -0
- package/dist/scuttlebot/irc-client.js +599 -0
- package/dist/scuttlebot/irc-client.js.map +1 -0
- package/dist/setup.d.ts.map +1 -1
- package/dist/setup.js +22 -54
- package/dist/setup.js.map +1 -1
- package/dist/skills.d.ts +58 -0
- package/dist/skills.d.ts.map +1 -1
- package/dist/skills.js +186 -16
- package/dist/skills.js.map +1 -1
- package/dist/storage.d.ts +0 -4
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +87 -8
- 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 +6 -0
- package/dist/styles.d.ts.map +1 -1
- package/dist/styles.js +11 -0
- package/dist/styles.js.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 +352 -209
- package/dist/tools.js.map +1 -1
- package/dist/trust.d.ts +16 -3
- package/dist/trust.d.ts.map +1 -1
- package/dist/trust.js +23 -4
- 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 +34 -44
- package/dist/types.js.map +1 -1
- package/dist/ui/agent.d.ts +4 -7
- package/dist/ui/agent.d.ts.map +1 -1
- package/dist/ui/agent.js +354 -73
- 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 +5 -2
- package/dist/ui/chat-input.d.ts.map +1 -1
- package/dist/ui/chat-input.js +54 -308
- package/dist/ui/chat-input.js.map +1 -1
- package/dist/ui/commands.d.ts +15 -45
- package/dist/ui/commands.d.ts.map +1 -1
- package/dist/ui/commands.js +461 -2636
- 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 +14 -6
- 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.map +1 -1
- package/dist/ui/error-boundary.js.map +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 +46 -887
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/input-utils.d.ts +20 -0
- package/dist/ui/input-utils.d.ts.map +1 -0
- package/dist/ui/input-utils.js +35 -0
- package/dist/ui/input-utils.js.map +1 -0
- package/dist/ui/messages.d.ts +8 -7
- package/dist/ui/messages.d.ts.map +1 -1
- package/dist/ui/messages.js +51 -35
- 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.d.ts → modals/prompts.d.ts} +5 -20
- package/dist/ui/modals/prompts.d.ts.map +1 -0
- package/dist/ui/{modals.js → modals/prompts.js} +14 -94
- package/dist/ui/modals/prompts.js.map +1 -0
- package/dist/ui/modals/selectors.d.ts +33 -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 +17 -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 +4 -1
- package/dist/ui/status-bar.d.ts.map +1 -1
- package/dist/ui/status-bar.js +13 -3
- package/dist/ui/status-bar.js.map +1 -1
- package/dist/ui/types.d.ts +3 -0
- package/dist/ui/types.d.ts.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 +12 -8
- 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 -395
- 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 -36
- package/dist/api-server.d.ts.map +0 -1
- package/dist/api-server.js +0 -255
- 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 -143
- 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 -211
- 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 -314
- 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 -943
- 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 -237
- 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/completion.d.ts +0 -75
- package/dist/completion.d.ts.map +0 -1
- package/dist/completion.js +0 -234
- package/dist/completion.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 -78
- package/dist/idle-eviction.js.map +0 -1
- package/dist/keyboard.d.ts +0 -57
- package/dist/keyboard.d.ts.map +0 -1
- package/dist/keyboard.js +0 -265
- package/dist/keyboard.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.map +0 -1
- 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
package/dist/hooks.js
CHANGED
|
@@ -18,19 +18,61 @@ function debugLog(message, ...args) {
|
|
|
18
18
|
// ============================================================================
|
|
19
19
|
const HOOKS_DIR = path.join(os.homedir(), '.calliope-cli', 'hooks');
|
|
20
20
|
const HOOKS_FILE = path.join(HOOKS_DIR, 'hooks.json');
|
|
21
|
+
/**
|
|
22
|
+
* Events on which a hook may veto an operation (exit code 42). For these
|
|
23
|
+
* events the hook MUST be awaited so its blocking result is honored, even
|
|
24
|
+
* if the hook is flagged `async`. Otherwise an `async: true` flag could
|
|
25
|
+
* silently neutralize a guardrail.
|
|
26
|
+
*/
|
|
27
|
+
const BLOCKING_EVENTS = new Set([
|
|
28
|
+
'pre-tool',
|
|
29
|
+
'pre-shell',
|
|
30
|
+
'pre-write',
|
|
31
|
+
'pre-read',
|
|
32
|
+
'session-start',
|
|
33
|
+
]);
|
|
21
34
|
function ensureHooksDir() {
|
|
22
35
|
if (!fs.existsSync(HOOKS_DIR)) {
|
|
23
|
-
fs.mkdirSync(HOOKS_DIR, { recursive: true });
|
|
36
|
+
fs.mkdirSync(HOOKS_DIR, { recursive: true, mode: 0o700 });
|
|
24
37
|
}
|
|
25
38
|
}
|
|
26
39
|
/**
|
|
27
|
-
*
|
|
40
|
+
* hooks.json is a trust boundary: its `command` strings run as arbitrary
|
|
41
|
+
* shell on routine events. Refuse to load it if it is writable by group or
|
|
42
|
+
* other, since any process that can write it gains persistent code-exec.
|
|
43
|
+
* Returns true if safe to load.
|
|
44
|
+
*/
|
|
45
|
+
function hooksFileIsSafe() {
|
|
46
|
+
try {
|
|
47
|
+
const mode = fs.statSync(HOOKS_FILE).mode;
|
|
48
|
+
// Reject if group-writable (0o020) or world-writable (0o002).
|
|
49
|
+
if (mode & 0o022) {
|
|
50
|
+
debugLog(`Refusing to load hooks.json: file is group/world-writable (mode ${(mode & 0o777).toString(8)}). ` +
|
|
51
|
+
`Run: chmod 600 ${HOOKS_FILE}`);
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Load hooks configuration.
|
|
62
|
+
*
|
|
63
|
+
* SECURITY: hooks.json is a trusted file — its `command` strings are executed
|
|
64
|
+
* as shell. It must not be writable by group/other, and the directory must
|
|
65
|
+
* never be agent-writable. Hooks are refused (not executed) if the file has
|
|
66
|
+
* loose permissions.
|
|
28
67
|
*/
|
|
29
68
|
export function loadHooks() {
|
|
30
69
|
ensureHooksDir();
|
|
31
70
|
if (!fs.existsSync(HOOKS_FILE)) {
|
|
32
71
|
return [];
|
|
33
72
|
}
|
|
73
|
+
if (!hooksFileIsSafe()) {
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
34
76
|
try {
|
|
35
77
|
return JSON.parse(fs.readFileSync(HOOKS_FILE, 'utf-8'));
|
|
36
78
|
}
|
|
@@ -39,11 +81,19 @@ export function loadHooks() {
|
|
|
39
81
|
}
|
|
40
82
|
}
|
|
41
83
|
/**
|
|
42
|
-
* Save hooks configuration
|
|
84
|
+
* Save hooks configuration. Written with restrictive (0600) permissions so the
|
|
85
|
+
* trusted command list is not exposed to or writable by other users.
|
|
43
86
|
*/
|
|
44
87
|
export function saveHooks(hooks) {
|
|
45
88
|
ensureHooksDir();
|
|
46
|
-
fs.writeFileSync(HOOKS_FILE, JSON.stringify(hooks, null, 2));
|
|
89
|
+
fs.writeFileSync(HOOKS_FILE, JSON.stringify(hooks, null, 2), { mode: 0o600 });
|
|
90
|
+
// writeFileSync `mode` only applies on create; enforce perms on existing files too.
|
|
91
|
+
try {
|
|
92
|
+
fs.chmodSync(HOOKS_FILE, 0o600);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
/* best effort */
|
|
96
|
+
}
|
|
47
97
|
}
|
|
48
98
|
// ============================================================================
|
|
49
99
|
// Hook Management
|
|
@@ -114,28 +164,58 @@ async function runHookCommand(hook, context) {
|
|
|
114
164
|
if (context.toolArgs) {
|
|
115
165
|
env.CALLIOPE_TOOL_ARGS = JSON.stringify(context.toolArgs);
|
|
116
166
|
}
|
|
167
|
+
// `detached` puts the shell and its children in their own process group so
|
|
168
|
+
// the timeout can kill the whole group (a shell child cannot escape it).
|
|
117
169
|
const proc = spawn('sh', ['-c', hook.command], {
|
|
118
170
|
env,
|
|
119
171
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
120
|
-
|
|
172
|
+
detached: true,
|
|
121
173
|
});
|
|
122
174
|
let stdout = '';
|
|
123
175
|
let stderr = '';
|
|
176
|
+
let timedOut = false;
|
|
177
|
+
let killTimer;
|
|
124
178
|
proc.stdout?.on('data', (data) => {
|
|
125
179
|
stdout += data.toString();
|
|
126
180
|
});
|
|
127
181
|
proc.stderr?.on('data', (data) => {
|
|
128
182
|
stderr += data.toString();
|
|
129
183
|
});
|
|
184
|
+
// Signal the whole process group (negative pid) so the shell's children die
|
|
185
|
+
// too. Fall back to signalling the process directly if the group is gone.
|
|
186
|
+
const signalGroup = (signal) => {
|
|
187
|
+
try {
|
|
188
|
+
if (proc.pid !== undefined) {
|
|
189
|
+
process.kill(-proc.pid, signal);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
try {
|
|
194
|
+
proc.kill(signal);
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
/* already dead */
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
// Hard timeout: SIGTERM, then SIGKILL after a short grace period so a
|
|
202
|
+
// command that traps/ignores SIGTERM cannot outlive its timeout.
|
|
130
203
|
const timer = setTimeout(() => {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
error: 'Hook timed out',
|
|
135
|
-
});
|
|
204
|
+
timedOut = true;
|
|
205
|
+
signalGroup('SIGTERM');
|
|
206
|
+
killTimer = setTimeout(() => signalGroup('SIGKILL'), 2000);
|
|
136
207
|
}, timeout);
|
|
137
208
|
proc.on('close', (code) => {
|
|
138
209
|
clearTimeout(timer);
|
|
210
|
+
if (killTimer)
|
|
211
|
+
clearTimeout(killTimer);
|
|
212
|
+
if (timedOut) {
|
|
213
|
+
resolve({
|
|
214
|
+
success: false,
|
|
215
|
+
error: 'Hook timed out',
|
|
216
|
+
});
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
139
219
|
// Exit code 42 means "block the operation"
|
|
140
220
|
const blocked = code === 42;
|
|
141
221
|
resolve({
|
|
@@ -147,6 +227,8 @@ async function runHookCommand(hook, context) {
|
|
|
147
227
|
});
|
|
148
228
|
proc.on('error', (err) => {
|
|
149
229
|
clearTimeout(timer);
|
|
230
|
+
if (killTimer)
|
|
231
|
+
clearTimeout(killTimer);
|
|
150
232
|
resolve({
|
|
151
233
|
success: false,
|
|
152
234
|
error: err.message,
|
|
@@ -187,7 +269,11 @@ export async function executeHooks(event, context) {
|
|
|
187
269
|
if (!matches)
|
|
188
270
|
continue;
|
|
189
271
|
}
|
|
190
|
-
|
|
272
|
+
// For blocking events, the exit-42 veto contract must be enforced, so the
|
|
273
|
+
// hook is always awaited regardless of its `async` flag. Allowing
|
|
274
|
+
// fire-and-forget here would let `async: true` silently neutralize a
|
|
275
|
+
// guardrail (the discarded result could never set `blocked`).
|
|
276
|
+
if (hook.async && !BLOCKING_EVENTS.has(event)) {
|
|
191
277
|
// Fire and forget with debug logging
|
|
192
278
|
runHookCommand(hook, fullContext).catch((err) => {
|
|
193
279
|
debugLog(`Async hook '${hook.id}' failed:`, err instanceof Error ? err.message : err);
|
package/dist/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,uBAAuB;AACvB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,GAAG,CAAC;AACjD,SAAS,QAAQ,CAAC,OAAe,EAAE,GAAG,IAAe;IACnD,IAAI,KAAK;QAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;AAC9D,CAAC;AAmDD,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;AACpE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AAEtD,SAAS,cAAc;IACrB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/hud/api.d.ts
CHANGED
|
@@ -1,35 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* HUD API
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Palette state management plus Ink/ANSI color helpers. The CLI ships a single
|
|
5
|
+
* built-in skin and three palettes (default / light / monochrome) mapped from
|
|
6
|
+
* the dark / light / no-color themes.
|
|
5
7
|
*/
|
|
6
8
|
import type { Skin, Palette, BoxChars, SemanticColorKey } from './types.js';
|
|
7
|
-
export declare function getSkin(name?: string): Skin;
|
|
8
|
-
export declare function applySkin(name: string): boolean;
|
|
9
9
|
export declare function getCurrentSkin(): Skin;
|
|
10
|
-
export declare function listSkins(): Array<{
|
|
11
|
-
name: string;
|
|
12
|
-
description: string;
|
|
13
|
-
custom: boolean;
|
|
14
|
-
}>;
|
|
15
10
|
export declare function getPalette(name?: string): Palette;
|
|
16
11
|
export declare function applyPalette(name: string): boolean;
|
|
17
12
|
export declare function getCurrentPalette(): Palette;
|
|
18
|
-
export declare function listPalettes(): Array<{
|
|
19
|
-
name: string;
|
|
20
|
-
description: string;
|
|
21
|
-
custom: boolean;
|
|
22
|
-
}>;
|
|
23
|
-
export declare function applyHUD(skinName: string, paletteName: string, _companionName?: string): void;
|
|
24
|
-
export declare function discoverSkins(): Skin[];
|
|
25
|
-
export declare function discoverPalettes(): Palette[];
|
|
26
13
|
export declare function getBoxChars(skin?: Skin): BoxChars;
|
|
27
14
|
export declare function getSpinnerFrames(skin?: Skin): string[];
|
|
28
15
|
export declare function getPaletteColor(key: SemanticColorKey): string;
|
|
29
16
|
export declare function paletteColorize(text: string, key: SemanticColorKey): string;
|
|
30
17
|
export declare function getInkColor(key: SemanticColorKey): string;
|
|
31
18
|
export declare function getInkBorderStyle(skin?: Skin): string;
|
|
32
|
-
export declare function saveCustomSkin(skin: Skin): void;
|
|
33
|
-
export declare function saveCustomPalette(palette: Palette): void;
|
|
34
19
|
export declare function clearHUDCache(): void;
|
|
35
20
|
//# sourceMappingURL=api.d.ts.map
|
package/dist/hud/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/hud/api.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/hud/api.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAc5E,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAMD,wBAAgB,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAKjD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMlD;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAMD,wBAAgB,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,QAAQ,CAMjD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,EAAE,CAMtD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,CAG7D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,GAAG,MAAM,CAG3E;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,CAGzD;AA0BD,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM,CAUrD;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC"}
|
package/dist/hud/api.js
CHANGED
|
@@ -1,284 +1,35 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* HUD API
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* Palette state management plus Ink/ANSI color helpers. The CLI ships a single
|
|
5
|
+
* built-in skin and three palettes (default / light / monochrome) mapped from
|
|
6
|
+
* the dark / light / no-color themes.
|
|
5
7
|
*/
|
|
6
|
-
import * as fs from 'fs';
|
|
7
|
-
import * as path from 'path';
|
|
8
|
-
import * as os from 'os';
|
|
9
8
|
import { colors as ANSI } from '../styles.js';
|
|
10
9
|
import { SKINS, BOX_STYLES, SPINNER_SETS } from './skins.js';
|
|
11
10
|
import { PALETTES } from './palettes.js';
|
|
12
11
|
// ============================================================================
|
|
13
|
-
// Schema Validation
|
|
14
|
-
// ============================================================================
|
|
15
|
-
/** Maximum size for a custom JSON file (1MB) */
|
|
16
|
-
const MAX_CUSTOM_FILE_SIZE = 1_048_576;
|
|
17
|
-
/** Maximum number of banner art lines */
|
|
18
|
-
const MAX_BANNER_ART_LINES = 100;
|
|
19
|
-
/** Maximum length of any single string field */
|
|
20
|
-
const MAX_STRING_LENGTH = 1000;
|
|
21
|
-
/**
|
|
22
|
-
* Strip ANSI escape sequences that could manipulate terminal state
|
|
23
|
-
* beyond standard color codes (CSI sequences for cursor movement, screen clear, etc.)
|
|
24
|
-
*/
|
|
25
|
-
function sanitizeString(s) {
|
|
26
|
-
// Remove OSC (Operating System Command) sequences - potential for title/clipboard injection
|
|
27
|
-
// Remove CSI sequences for cursor movement, erase, scroll (but keep SGR color codes \e[...m)
|
|
28
|
-
return s
|
|
29
|
-
.replace(/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)/g, '') // OSC sequences
|
|
30
|
-
.replace(/\x1b\[[\d;]*[ABCDEFGHJKSTfnsu]/g, '') // CSI cursor/erase sequences
|
|
31
|
-
.replace(/\x1b\[\?[\d;]*[hl]/g, ''); // CSI private mode set/reset
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Validate and sanitize a loaded custom Skin JSON object.
|
|
35
|
-
* Returns a validated Skin or null if the data is invalid.
|
|
36
|
-
*/
|
|
37
|
-
function validateSkin(data) {
|
|
38
|
-
if (typeof data !== 'object' || data === null)
|
|
39
|
-
return null;
|
|
40
|
-
const d = data;
|
|
41
|
-
// Required string fields
|
|
42
|
-
if (typeof d.name !== 'string' || d.name.length === 0 || d.name.length > MAX_STRING_LENGTH)
|
|
43
|
-
return null;
|
|
44
|
-
if (typeof d.description !== 'string' || d.description.length > MAX_STRING_LENGTH)
|
|
45
|
-
return null;
|
|
46
|
-
// banner
|
|
47
|
-
if (typeof d.banner !== 'object' || d.banner === null)
|
|
48
|
-
return null;
|
|
49
|
-
const banner = d.banner;
|
|
50
|
-
if (!Array.isArray(banner.art))
|
|
51
|
-
return null;
|
|
52
|
-
if (banner.art.length > MAX_BANNER_ART_LINES)
|
|
53
|
-
return null;
|
|
54
|
-
for (let i = 0; i < banner.art.length; i++) {
|
|
55
|
-
if (typeof banner.art[i] !== 'string')
|
|
56
|
-
return null;
|
|
57
|
-
if (banner.art[i].length > MAX_STRING_LENGTH)
|
|
58
|
-
return null;
|
|
59
|
-
banner.art[i] = sanitizeString(banner.art[i]);
|
|
60
|
-
}
|
|
61
|
-
const validBannerStyles = ['full', 'compact', 'none'];
|
|
62
|
-
if (typeof banner.style !== 'string' || !validBannerStyles.includes(banner.style))
|
|
63
|
-
return null;
|
|
64
|
-
// borders
|
|
65
|
-
if (typeof d.borders !== 'object' || d.borders === null)
|
|
66
|
-
return null;
|
|
67
|
-
const borders = d.borders;
|
|
68
|
-
const validBorderStyles = ['rounded', 'sharp', 'double', 'ascii', 'custom', 'none'];
|
|
69
|
-
if (typeof borders.style !== 'string' || !validBorderStyles.includes(borders.style))
|
|
70
|
-
return null;
|
|
71
|
-
// decorations
|
|
72
|
-
if (typeof d.decorations !== 'object' || d.decorations === null)
|
|
73
|
-
return null;
|
|
74
|
-
const decorations = d.decorations;
|
|
75
|
-
if (typeof decorations.promptPrefix !== 'string')
|
|
76
|
-
return null;
|
|
77
|
-
if (typeof decorations.assistantPrefix !== 'string')
|
|
78
|
-
return null;
|
|
79
|
-
if (typeof decorations.toolPrefix !== 'string')
|
|
80
|
-
return null;
|
|
81
|
-
if (typeof decorations.toolSuffix !== 'string')
|
|
82
|
-
return null;
|
|
83
|
-
if (typeof decorations.separator !== 'string')
|
|
84
|
-
return null;
|
|
85
|
-
const validSpinners = ['braille', 'dots', 'simple', 'blocks', 'custom'];
|
|
86
|
-
if (typeof decorations.spinner !== 'string' || !validSpinners.includes(decorations.spinner))
|
|
87
|
-
return null;
|
|
88
|
-
// Sanitize decoration strings
|
|
89
|
-
decorations.promptPrefix = sanitizeString(decorations.promptPrefix);
|
|
90
|
-
decorations.assistantPrefix = sanitizeString(decorations.assistantPrefix);
|
|
91
|
-
decorations.toolPrefix = sanitizeString(decorations.toolPrefix);
|
|
92
|
-
decorations.toolSuffix = sanitizeString(decorations.toolSuffix);
|
|
93
|
-
decorations.separator = sanitizeString(decorations.separator);
|
|
94
|
-
// diff
|
|
95
|
-
if (typeof d.diff !== 'object' || d.diff === null)
|
|
96
|
-
return null;
|
|
97
|
-
const diff = d.diff;
|
|
98
|
-
const validDiffStyles = ['inline', 'unified', 'side-by-side'];
|
|
99
|
-
if (typeof diff.style !== 'string' || !validDiffStyles.includes(diff.style))
|
|
100
|
-
return null;
|
|
101
|
-
if (typeof diff.showLineNumbers !== 'boolean')
|
|
102
|
-
return null;
|
|
103
|
-
if (typeof diff.contextLines !== 'number')
|
|
104
|
-
return null;
|
|
105
|
-
if (typeof diff.maxLineWidth !== 'number')
|
|
106
|
-
return null;
|
|
107
|
-
if (typeof diff.wordDiff !== 'boolean')
|
|
108
|
-
return null;
|
|
109
|
-
// density
|
|
110
|
-
const validDensities = ['normal', 'compact', 'spacious'];
|
|
111
|
-
if (typeof d.density !== 'string' || !validDensities.includes(d.density))
|
|
112
|
-
return null;
|
|
113
|
-
// responsive
|
|
114
|
-
if (typeof d.responsive !== 'object' || d.responsive === null)
|
|
115
|
-
return null;
|
|
116
|
-
const responsive = d.responsive;
|
|
117
|
-
if (typeof responsive.compact !== 'number' || typeof responsive.wide !== 'number')
|
|
118
|
-
return null;
|
|
119
|
-
return data;
|
|
120
|
-
}
|
|
121
|
-
/** Required keys for a PaletteColors object */
|
|
122
|
-
const PALETTE_COLOR_KEYS = [
|
|
123
|
-
'primary', 'secondary', 'accent',
|
|
124
|
-
'text', 'textDim', 'textBold',
|
|
125
|
-
'user', 'assistant', 'system', 'error',
|
|
126
|
-
'codeKeyword', 'codeString', 'codeNumber', 'codeComment', 'codeFunction',
|
|
127
|
-
'diffAdd', 'diffRemove', 'diffContext',
|
|
128
|
-
'success', 'warning', 'info',
|
|
129
|
-
'border', 'background', 'selection',
|
|
130
|
-
];
|
|
131
|
-
/**
|
|
132
|
-
* Validate and sanitize a loaded custom Palette JSON object.
|
|
133
|
-
* Returns a validated Palette or null if the data is invalid.
|
|
134
|
-
*/
|
|
135
|
-
function validatePalette(data) {
|
|
136
|
-
if (typeof data !== 'object' || data === null)
|
|
137
|
-
return null;
|
|
138
|
-
const d = data;
|
|
139
|
-
if (typeof d.name !== 'string' || d.name.length === 0 || d.name.length > MAX_STRING_LENGTH)
|
|
140
|
-
return null;
|
|
141
|
-
if (typeof d.description !== 'string' || d.description.length > MAX_STRING_LENGTH)
|
|
142
|
-
return null;
|
|
143
|
-
if (typeof d.colors !== 'object' || d.colors === null)
|
|
144
|
-
return null;
|
|
145
|
-
const colors = d.colors;
|
|
146
|
-
// Validate all required color keys exist and are strings (ANSI codes)
|
|
147
|
-
for (const key of PALETTE_COLOR_KEYS) {
|
|
148
|
-
if (typeof colors[key] !== 'string')
|
|
149
|
-
return null;
|
|
150
|
-
if (colors[key].length > MAX_STRING_LENGTH)
|
|
151
|
-
return null;
|
|
152
|
-
// Sanitize color values
|
|
153
|
-
colors[key] = sanitizeString(colors[key]);
|
|
154
|
-
}
|
|
155
|
-
return data;
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* Safely load and validate a custom JSON file with size limits.
|
|
159
|
-
*/
|
|
160
|
-
function loadCustomJSON(filePath) {
|
|
161
|
-
try {
|
|
162
|
-
const stat = fs.statSync(filePath);
|
|
163
|
-
if (stat.size > MAX_CUSTOM_FILE_SIZE) {
|
|
164
|
-
console.warn(`Custom theme file too large (${stat.size} bytes, max ${MAX_CUSTOM_FILE_SIZE}): ${filePath}`);
|
|
165
|
-
return null;
|
|
166
|
-
}
|
|
167
|
-
return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
168
|
-
}
|
|
169
|
-
catch {
|
|
170
|
-
return null;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
// ============================================================================
|
|
174
12
|
// State
|
|
175
13
|
// ============================================================================
|
|
176
|
-
let currentSkin = null;
|
|
177
14
|
let currentPalette = null;
|
|
178
15
|
// ============================================================================
|
|
179
|
-
//
|
|
180
|
-
// ============================================================================
|
|
181
|
-
const HUD_DIR = path.join(os.homedir(), '.calliope-cli');
|
|
182
|
-
const SKINS_DIR = path.join(HUD_DIR, 'skins');
|
|
183
|
-
const PALETTES_DIR = path.join(HUD_DIR, 'palettes');
|
|
184
|
-
function ensureDir(dir) {
|
|
185
|
-
if (!fs.existsSync(dir)) {
|
|
186
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
// ============================================================================
|
|
190
|
-
// Skin Management
|
|
16
|
+
// Skin (single built-in skin)
|
|
191
17
|
// ============================================================================
|
|
192
|
-
export function getSkin(name) {
|
|
193
|
-
if (!name) {
|
|
194
|
-
if (currentSkin)
|
|
195
|
-
return currentSkin;
|
|
196
|
-
return SKINS.clean;
|
|
197
|
-
}
|
|
198
|
-
if (SKINS[name])
|
|
199
|
-
return SKINS[name];
|
|
200
|
-
// Check custom skins directory
|
|
201
|
-
ensureDir(SKINS_DIR);
|
|
202
|
-
const customPath = path.join(SKINS_DIR, `${name}.json`);
|
|
203
|
-
if (fs.existsSync(customPath)) {
|
|
204
|
-
const raw = loadCustomJSON(customPath);
|
|
205
|
-
if (raw) {
|
|
206
|
-
const validated = validateSkin(raw);
|
|
207
|
-
if (validated)
|
|
208
|
-
return validated;
|
|
209
|
-
console.warn(`Custom skin "${name}" failed schema validation — using default`);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
return SKINS.clean;
|
|
213
|
-
}
|
|
214
|
-
export function applySkin(name) {
|
|
215
|
-
const skin = getSkin(name);
|
|
216
|
-
if (skin.name === name || SKINS[name]) {
|
|
217
|
-
currentSkin = skin;
|
|
218
|
-
return true;
|
|
219
|
-
}
|
|
220
|
-
return false;
|
|
221
|
-
}
|
|
222
18
|
export function getCurrentSkin() {
|
|
223
|
-
return
|
|
224
|
-
}
|
|
225
|
-
export function listSkins() {
|
|
226
|
-
const result = [];
|
|
227
|
-
for (const [name, skin] of Object.entries(SKINS)) {
|
|
228
|
-
result.push({ name, description: skin.description, custom: false });
|
|
229
|
-
}
|
|
230
|
-
ensureDir(SKINS_DIR);
|
|
231
|
-
try {
|
|
232
|
-
const files = fs.readdirSync(SKINS_DIR);
|
|
233
|
-
for (const file of files) {
|
|
234
|
-
if (file.endsWith('.json')) {
|
|
235
|
-
const name = file.slice(0, -5);
|
|
236
|
-
if (!SKINS[name]) {
|
|
237
|
-
const raw = loadCustomJSON(path.join(SKINS_DIR, file));
|
|
238
|
-
if (raw) {
|
|
239
|
-
const skin = validateSkin(raw);
|
|
240
|
-
if (skin) {
|
|
241
|
-
result.push({ name, description: skin.description || '', custom: true });
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
catch {
|
|
249
|
-
// Directory read failed
|
|
250
|
-
}
|
|
251
|
-
return result;
|
|
19
|
+
return SKINS.clean;
|
|
252
20
|
}
|
|
253
21
|
// ============================================================================
|
|
254
22
|
// Palette Management
|
|
255
23
|
// ============================================================================
|
|
256
24
|
export function getPalette(name) {
|
|
257
25
|
if (!name) {
|
|
258
|
-
|
|
259
|
-
return currentPalette;
|
|
260
|
-
return PALETTES.default;
|
|
261
|
-
}
|
|
262
|
-
if (PALETTES[name])
|
|
263
|
-
return PALETTES[name];
|
|
264
|
-
// Check custom palettes directory
|
|
265
|
-
ensureDir(PALETTES_DIR);
|
|
266
|
-
const customPath = path.join(PALETTES_DIR, `${name}.json`);
|
|
267
|
-
if (fs.existsSync(customPath)) {
|
|
268
|
-
const raw = loadCustomJSON(customPath);
|
|
269
|
-
if (raw) {
|
|
270
|
-
const validated = validatePalette(raw);
|
|
271
|
-
if (validated)
|
|
272
|
-
return validated;
|
|
273
|
-
console.warn(`Custom palette "${name}" failed schema validation — using default`);
|
|
274
|
-
}
|
|
26
|
+
return currentPalette || PALETTES.default;
|
|
275
27
|
}
|
|
276
|
-
return PALETTES.default;
|
|
28
|
+
return PALETTES[name] || PALETTES.default;
|
|
277
29
|
}
|
|
278
30
|
export function applyPalette(name) {
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
currentPalette = palette;
|
|
31
|
+
if (PALETTES[name]) {
|
|
32
|
+
currentPalette = PALETTES[name];
|
|
282
33
|
return true;
|
|
283
34
|
}
|
|
284
35
|
return false;
|
|
@@ -286,88 +37,6 @@ export function applyPalette(name) {
|
|
|
286
37
|
export function getCurrentPalette() {
|
|
287
38
|
return currentPalette || PALETTES.default;
|
|
288
39
|
}
|
|
289
|
-
export function listPalettes() {
|
|
290
|
-
const result = [];
|
|
291
|
-
for (const [name, palette] of Object.entries(PALETTES)) {
|
|
292
|
-
result.push({ name, description: palette.description, custom: false });
|
|
293
|
-
}
|
|
294
|
-
ensureDir(PALETTES_DIR);
|
|
295
|
-
try {
|
|
296
|
-
const files = fs.readdirSync(PALETTES_DIR);
|
|
297
|
-
for (const file of files) {
|
|
298
|
-
if (file.endsWith('.json')) {
|
|
299
|
-
const name = file.slice(0, -5);
|
|
300
|
-
if (!PALETTES[name]) {
|
|
301
|
-
const raw = loadCustomJSON(path.join(PALETTES_DIR, file));
|
|
302
|
-
if (raw) {
|
|
303
|
-
const palette = validatePalette(raw);
|
|
304
|
-
if (palette) {
|
|
305
|
-
result.push({ name, description: palette.description || '', custom: true });
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
catch {
|
|
313
|
-
// Directory read failed
|
|
314
|
-
}
|
|
315
|
-
return result;
|
|
316
|
-
}
|
|
317
|
-
// ============================================================================
|
|
318
|
-
// HUD Apply
|
|
319
|
-
// ============================================================================
|
|
320
|
-
export function applyHUD(skinName, paletteName, _companionName) {
|
|
321
|
-
applySkin(skinName);
|
|
322
|
-
applyPalette(paletteName);
|
|
323
|
-
}
|
|
324
|
-
// ============================================================================
|
|
325
|
-
// Discovery
|
|
326
|
-
// ============================================================================
|
|
327
|
-
export function discoverSkins() {
|
|
328
|
-
const result = Object.values(SKINS);
|
|
329
|
-
ensureDir(SKINS_DIR);
|
|
330
|
-
try {
|
|
331
|
-
const files = fs.readdirSync(SKINS_DIR);
|
|
332
|
-
for (const file of files) {
|
|
333
|
-
if (file.endsWith('.json')) {
|
|
334
|
-
const raw = loadCustomJSON(path.join(SKINS_DIR, file));
|
|
335
|
-
if (raw) {
|
|
336
|
-
const skin = validateSkin(raw);
|
|
337
|
-
if (skin && skin.name && !SKINS[skin.name]) {
|
|
338
|
-
result.push(skin);
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
catch {
|
|
345
|
-
// Directory read failed
|
|
346
|
-
}
|
|
347
|
-
return result;
|
|
348
|
-
}
|
|
349
|
-
export function discoverPalettes() {
|
|
350
|
-
const result = Object.values(PALETTES);
|
|
351
|
-
ensureDir(PALETTES_DIR);
|
|
352
|
-
try {
|
|
353
|
-
const files = fs.readdirSync(PALETTES_DIR);
|
|
354
|
-
for (const file of files) {
|
|
355
|
-
if (file.endsWith('.json')) {
|
|
356
|
-
const raw = loadCustomJSON(path.join(PALETTES_DIR, file));
|
|
357
|
-
if (raw) {
|
|
358
|
-
const palette = validatePalette(raw);
|
|
359
|
-
if (palette && palette.name && !PALETTES[palette.name]) {
|
|
360
|
-
result.push(palette);
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
catch {
|
|
367
|
-
// Directory read failed
|
|
368
|
-
}
|
|
369
|
-
return result;
|
|
370
|
-
}
|
|
371
40
|
// ============================================================================
|
|
372
41
|
// Helpers
|
|
373
42
|
// ============================================================================
|
|
@@ -430,19 +99,7 @@ export function getInkBorderStyle(skin) {
|
|
|
430
99
|
};
|
|
431
100
|
return map[s.borders.style] || 'round';
|
|
432
101
|
}
|
|
433
|
-
// ============================================================================
|
|
434
|
-
// Save custom skin/palette
|
|
435
|
-
// ============================================================================
|
|
436
|
-
export function saveCustomSkin(skin) {
|
|
437
|
-
ensureDir(SKINS_DIR);
|
|
438
|
-
fs.writeFileSync(path.join(SKINS_DIR, `${skin.name}.json`), JSON.stringify(skin, null, 2));
|
|
439
|
-
}
|
|
440
|
-
export function saveCustomPalette(palette) {
|
|
441
|
-
ensureDir(PALETTES_DIR);
|
|
442
|
-
fs.writeFileSync(path.join(PALETTES_DIR, `${palette.name}.json`), JSON.stringify(palette, null, 2));
|
|
443
|
-
}
|
|
444
102
|
export function clearHUDCache() {
|
|
445
|
-
currentSkin = null;
|
|
446
103
|
currentPalette = null;
|
|
447
104
|
}
|
|
448
105
|
//# sourceMappingURL=api.js.map
|