@earendil-works/pi-coding-agent 0.87.1 → 0.99.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +97 -0
- package/dist/bun/cli.d.ts.map +1 -1
- package/dist/bun/restore-sandbox-env.d.ts.map +1 -1
- package/dist/bun/restore-sandbox-env.js.map +1 -1
- package/dist/bun/runtime-setup.d.ts.map +1 -1
- package/dist/bun/runtime-setup.js +4 -1
- package/dist/bun/runtime-setup.js.map +1 -1
- package/dist/bun/sandbox-env-setup.d.ts.map +1 -1
- package/dist/bundle/chunks/anthropic-messages-A6EXUBG6.js +6 -0
- package/dist/bundle/chunks/anthropic.js +2 -2
- package/dist/bundle/chunks/azure-openai-responses-EN5WOBET.js +2 -0
- package/dist/bundle/chunks/bedrock-converse-stream.js +2 -2
- package/dist/bundle/chunks/chunk-7JGR3GZN.js +11 -0
- package/dist/bundle/chunks/chunk-AXPY26X7.js +146 -0
- package/dist/bundle/chunks/chunk-GOPCREV2.js +4 -0
- package/dist/bundle/chunks/chunk-GUORCHFS.js +1435 -0
- package/dist/bundle/chunks/chunk-H3QXYIF7.js +31 -0
- package/dist/bundle/chunks/{chunk-S7SZN6Z3.js → chunk-HSPCVFST.js} +1 -1
- package/dist/bundle/chunks/chunk-IMTXZUO7.js +82 -0
- package/dist/bundle/chunks/chunk-J4CWPC4N.js +2 -0
- package/dist/bundle/chunks/chunk-LLMKQWZS.js +21 -0
- package/dist/bundle/chunks/{chunk-WIUZI2CJ.js → chunk-LRS5S6EK.js} +3 -3
- package/dist/bundle/chunks/chunk-PEHWOV5U.js +187 -0
- package/dist/bundle/chunks/{chunk-XDUWOHPL.js → chunk-S3GGRYIO.js} +2 -2
- package/dist/bundle/chunks/chunk-SLDA2X2H.js +2 -0
- package/dist/bundle/chunks/chunk-UTB4DTYQ.js +2 -0
- package/dist/bundle/chunks/{chunk-FUXEF6JQ.js → chunk-W2DOMZSC.js} +1 -1
- package/dist/bundle/chunks/cli-AZXNGIZH.js +49 -0
- package/dist/bundle/chunks/cloudflare-workers-ai-system-one-XJQQYGGU.js +2 -0
- package/dist/bundle/chunks/codemode-worker.js +295 -0
- package/dist/bundle/chunks/execute-7XXPZAWW.js +308 -0
- package/dist/bundle/chunks/github-copilot.js +1 -1
- package/dist/bundle/chunks/google-generative-ai-CQAKKJTA.js +2 -0
- package/dist/bundle/chunks/google-vertex-AE36YXJU.js +2 -0
- package/dist/bundle/chunks/{lib-HGQMNYVT.js → lib-TEDK3E5I.js} +2 -2
- package/dist/bundle/chunks/llama-cpp-classify-PJJYKPLD.js +22 -0
- package/dist/bundle/chunks/mistral-conversations-KEYTXJM7.js +5 -0
- package/dist/bundle/chunks/openai-chatgpt.js +75 -0
- package/dist/bundle/chunks/{openai-codex-responses-QDSOTBBO.js → openai-codex-responses-JQTCOVEG.js} +2 -2
- package/dist/bundle/chunks/openai-codex.js +2 -2
- package/dist/bundle/chunks/{openai-completions-OBX42CLD.js → openai-completions-XW2Q5HVC.js} +2 -2
- package/dist/bundle/chunks/openai-responses-6AXWFL75.js +3 -0
- package/dist/bundle/chunks/{openrouter-images-N4XVVFSD.js → openrouter-images-TPQ4V6OR.js} +1 -1
- package/dist/bundle/chunks/openrouter.js +2 -2
- package/dist/bundle/chunks/{pi-messages-GFKBWJHZ.js → pi-messages-TM5SOOIW.js} +2 -2
- package/dist/bundle/chunks/radius.js +2 -2
- package/dist/bundle/chunks/runtime-G5WJPRBM.js +2 -0
- package/dist/bundle/chunks/typesafe-system-one-E7A4HNJI.js +2 -0
- package/dist/bundle/chunks/virtual-modules-CSWRO37N.js +2 -0
- package/dist/bundle/cli-runtime.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +4 -3
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/auth-check.d.ts.map +1 -1
- package/dist/cli/auth-check.js.map +1 -1
- package/dist/cli/auth-command.d.ts.map +1 -1
- package/dist/cli/auth-command.js.map +1 -1
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/credential-print.d.ts.map +1 -1
- package/dist/cli/credential-print.js.map +1 -1
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/cli/initial-message.d.ts +1 -1
- package/dist/cli/initial-message.d.ts.map +1 -1
- package/dist/cli/initial-message.js.map +1 -1
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli/project-trust.d.ts.map +1 -1
- package/dist/cli/project-trust.js.map +1 -1
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/startup-ui.d.ts.map +1 -1
- package/dist/cli/startup-ui.js +38 -30
- package/dist/cli/startup-ui.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/config.d.ts +18 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +30 -4
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +1 -1
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +13 -0
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +135 -11
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +509 -253
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-guidance.d.ts.map +1 -1
- package/dist/core/auth-guidance.js.map +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/bug-report-upload.d.ts.map +1 -1
- package/dist/core/bug-report-upload.js.map +1 -1
- package/dist/core/bug-report.d.ts +1 -1
- package/dist/core/bug-report.d.ts.map +1 -1
- package/dist/core/bug-report.js +1 -1
- package/dist/core/bug-report.js.map +1 -1
- package/dist/core/cache-stats.d.ts.map +1 -1
- package/dist/core/cache-stats.js.map +1 -1
- package/dist/core/cache-warmer.d.ts.map +1 -1
- package/dist/core/cache-warmer.js.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +1 -22
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/index.d.ts.map +1 -1
- package/dist/core/compaction/utils.d.ts +2 -1
- package/dist/core/compaction/utils.d.ts.map +1 -1
- package/dist/core/compaction/utils.js +25 -18
- package/dist/core/compaction/utils.js.map +1 -1
- package/dist/core/crash-log.d.ts.map +1 -1
- package/dist/core/crash-log.js +2 -1
- package/dist/core/crash-log.js.map +1 -1
- package/dist/core/defaults.d.ts.map +1 -1
- package/dist/core/diagnostics.d.ts.map +1 -1
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/exec.d.ts.map +1 -1
- package/dist/core/exec.js.map +1 -1
- package/dist/core/experimental.d.ts.map +1 -1
- package/dist/core/experimental.js.map +1 -1
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
- package/dist/core/export-html/ansi-to-html.js.map +1 -1
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/export-html/template.css +10 -0
- package/dist/core/export-html/template.js +66 -17
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/jiti-loader.d.ts.map +1 -1
- package/dist/core/extensions/jiti-static-loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +55 -5
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +18 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +99 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +296 -22
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/virtual-modules.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.d.ts +2 -2
- package/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.js +3 -3
- package/dist/core/extensions/wrapper.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/keybindings.d.ts +1 -1
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +1 -1
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/mcp-servers.d.ts +98 -0
- package/dist/core/mcp-servers.d.ts.map +1 -0
- package/dist/core/mcp-servers.js +157 -0
- package/dist/core/mcp-servers.js.map +1 -0
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-registry.d.ts +13 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +25 -0
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +2 -2
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +5 -5
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts +41 -3
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +167 -17
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/models-store.d.ts.map +1 -1
- package/dist/core/models-store.js.map +1 -1
- package/dist/core/nested-tool-calls.d.ts +102 -0
- package/dist/core/nested-tool-calls.d.ts.map +1 -0
- package/dist/core/nested-tool-calls.js +178 -0
- package/dist/core/nested-tool-calls.js.map +1 -0
- package/dist/core/output-guard.d.ts.map +1 -1
- package/dist/core/output-guard.js.map +1 -1
- package/dist/core/package-manager.d.ts +4 -0
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +59 -12
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/pi-manifest.d.ts.map +1 -1
- package/dist/core/pi-manifest.js.map +1 -1
- package/dist/core/project-trust.d.ts.map +1 -1
- package/dist/core/project-trust.js.map +1 -1
- package/dist/core/prompt-templates.d.ts.map +1 -1
- package/dist/core/prompt-templates.js.map +1 -1
- package/dist/core/provider-attribution.d.ts.map +1 -1
- package/dist/core/provider-attribution.js.map +1 -1
- package/dist/core/provider-composer.d.ts +40 -21
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js +92 -40
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/core/radius.d.ts.map +1 -1
- package/dist/core/radius.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts +8 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +18 -3
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/resolve-config-value.d.ts.map +1 -1
- package/dist/core/resolve-config-value.js.map +1 -1
- package/dist/core/resource-loader.d.ts +7 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +161 -35
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/runtime-credentials.d.ts.map +1 -1
- package/dist/core/runtime-credentials.js.map +1 -1
- package/dist/core/sdk.d.ts +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +24 -6
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-cwd.d.ts.map +1 -1
- package/dist/core/session-cwd.js.map +1 -1
- package/dist/core/session-export.d.ts.map +1 -1
- package/dist/core/session-export.js.map +1 -1
- package/dist/core/session-manager.d.ts +9 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +22 -22
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-diagnostics.d.ts.map +1 -1
- package/dist/core/settings-diagnostics.js.map +1 -1
- package/dist/core/settings-manager.d.ts +31 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +72 -2
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/source-info.d.ts +8 -0
- package/dist/core/source-info.d.ts.map +1 -1
- package/dist/core/source-info.js +16 -0
- package/dist/core/source-info.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +1 -1
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/telemetry.d.ts.map +1 -1
- package/dist/core/telemetry.js.map +1 -1
- package/dist/core/timings.d.ts.map +1 -1
- package/dist/core/timings.js.map +1 -1
- package/dist/core/tools/bash.d.ts +12 -0
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +35 -2
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-queue.js.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts +11 -0
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +36 -0
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/core/tools/path-utils.d.ts.map +1 -1
- package/dist/core/tools/path-utils.js.map +1 -1
- package/dist/core/tools/powershell.d.ts.map +1 -1
- package/dist/core/tools/powershell.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts +6 -0
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js +26 -0
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/renderers/bash.d.ts.map +1 -1
- package/dist/core/tools/renderers/bash.js +9 -10
- package/dist/core/tools/renderers/bash.js.map +1 -1
- package/dist/core/tools/renderers/edit.d.ts.map +1 -1
- package/dist/core/tools/renderers/edit.js.map +1 -1
- package/dist/core/tools/renderers/find.d.ts.map +1 -1
- package/dist/core/tools/renderers/find.js.map +1 -1
- package/dist/core/tools/renderers/grep.d.ts.map +1 -1
- package/dist/core/tools/renderers/grep.js.map +1 -1
- package/dist/core/tools/renderers/index.d.ts.map +1 -1
- package/dist/core/tools/renderers/index.js.map +1 -1
- package/dist/core/tools/renderers/ls.d.ts.map +1 -1
- package/dist/core/tools/renderers/ls.js.map +1 -1
- package/dist/core/tools/renderers/read.d.ts.map +1 -1
- package/dist/core/tools/renderers/read.js +3 -2
- package/dist/core/tools/renderers/read.js.map +1 -1
- package/dist/core/tools/renderers/write.d.ts.map +1 -1
- package/dist/core/tools/renderers/write.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts +5 -3
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js +3 -1
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/tools/truncate.d.ts +14 -0
- package/dist/core/tools/truncate.d.ts.map +1 -1
- package/dist/core/tools/truncate.js +29 -0
- package/dist/core/tools/truncate.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js.map +1 -1
- package/dist/core/trust-manager.d.ts.map +1 -1
- package/dist/core/trust-manager.js +1 -0
- package/dist/core/trust-manager.js.map +1 -1
- package/dist/core/usage-totals.d.ts +2 -0
- package/dist/core/usage-totals.d.ts.map +1 -1
- package/dist/core/usage-totals.js +23 -0
- package/dist/core/usage-totals.js.map +1 -1
- package/dist/core/virtual-models.d.ts +115 -0
- package/dist/core/virtual-models.d.ts.map +1 -0
- package/dist/core/virtual-models.js +117 -0
- package/dist/core/virtual-models.js.map +1 -0
- package/dist/extensions/codemode/execute.d.ts +16 -0
- package/dist/extensions/codemode/execute.d.ts.map +1 -0
- package/dist/extensions/codemode/execute.js +390 -0
- package/dist/extensions/codemode/execute.js.map +1 -0
- package/dist/extensions/codemode/execute.lazy.d.ts +3 -0
- package/dist/extensions/codemode/execute.lazy.d.ts.map +1 -0
- package/dist/extensions/codemode/execute.lazy.js +3 -0
- package/dist/extensions/codemode/execute.lazy.js.map +1 -0
- package/dist/extensions/codemode/index.d.ts +21 -0
- package/dist/extensions/codemode/index.d.ts.map +1 -0
- package/dist/extensions/codemode/index.js +31 -0
- package/dist/extensions/codemode/index.js.map +1 -0
- package/dist/extensions/codemode/renderer.d.ts +12 -0
- package/dist/extensions/codemode/renderer.d.ts.map +1 -0
- package/dist/extensions/codemode/renderer.js +119 -0
- package/dist/extensions/codemode/renderer.js.map +1 -0
- package/dist/extensions/codemode/tool.d.ts +122 -0
- package/dist/extensions/codemode/tool.d.ts.map +1 -0
- package/dist/extensions/codemode/tool.js +324 -0
- package/dist/extensions/codemode/tool.js.map +1 -0
- package/dist/extensions/codemode/worker.d.ts +7 -0
- package/dist/extensions/codemode/worker.d.ts.map +1 -0
- package/dist/extensions/codemode/worker.js +7 -0
- package/dist/extensions/codemode/worker.js.map +1 -0
- package/dist/extensions/index.d.ts.map +1 -1
- package/dist/extensions/index.js +11 -1
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/llama/client.d.ts.map +1 -1
- package/dist/extensions/llama/client.js.map +1 -1
- package/dist/extensions/llama/huggingface.d.ts.map +1 -1
- package/dist/extensions/llama/huggingface.js.map +1 -1
- package/dist/extensions/llama/index.d.ts.map +1 -1
- package/dist/extensions/llama/index.js.map +1 -1
- package/dist/extensions/llama/provider.d.ts +1 -1
- package/dist/extensions/llama/provider.d.ts.map +1 -1
- package/dist/extensions/llama/provider.js +65 -13
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/extensions/llama/ui.d.ts.map +1 -1
- package/dist/extensions/llama/ui.js.map +1 -1
- package/dist/extensions/mcp/cli.d.ts +21 -0
- package/dist/extensions/mcp/cli.d.ts.map +1 -0
- package/dist/extensions/mcp/cli.js +485 -0
- package/dist/extensions/mcp/cli.js.map +1 -0
- package/dist/extensions/mcp/cli.lazy.d.ts +3 -0
- package/dist/extensions/mcp/cli.lazy.d.ts.map +1 -0
- package/dist/extensions/mcp/cli.lazy.js +3 -0
- package/dist/extensions/mcp/cli.lazy.js.map +1 -0
- package/dist/extensions/mcp/config.d.ts +70 -0
- package/dist/extensions/mcp/config.d.ts.map +1 -0
- package/dist/extensions/mcp/config.js +146 -0
- package/dist/extensions/mcp/config.js.map +1 -0
- package/dist/extensions/mcp/index.d.ts +52 -0
- package/dist/extensions/mcp/index.d.ts.map +1 -0
- package/dist/extensions/mcp/index.js +902 -0
- package/dist/extensions/mcp/index.js.map +1 -0
- package/dist/extensions/mcp/log.d.ts +16 -0
- package/dist/extensions/mcp/log.d.ts.map +1 -0
- package/dist/extensions/mcp/log.js +66 -0
- package/dist/extensions/mcp/log.js.map +1 -0
- package/dist/extensions/mcp/oauth.d.ts +94 -0
- package/dist/extensions/mcp/oauth.d.ts.map +1 -0
- package/dist/extensions/mcp/oauth.js +333 -0
- package/dist/extensions/mcp/oauth.js.map +1 -0
- package/dist/extensions/mcp/resources.d.ts +43 -0
- package/dist/extensions/mcp/resources.d.ts.map +1 -0
- package/dist/extensions/mcp/resources.js +262 -0
- package/dist/extensions/mcp/resources.js.map +1 -0
- package/dist/extensions/mcp/runtime.d.ts +96 -0
- package/dist/extensions/mcp/runtime.d.ts.map +1 -0
- package/dist/extensions/mcp/runtime.js +388 -0
- package/dist/extensions/mcp/runtime.js.map +1 -0
- package/dist/extensions/mcp/runtime.lazy.d.ts +3 -0
- package/dist/extensions/mcp/runtime.lazy.d.ts.map +1 -0
- package/dist/extensions/mcp/runtime.lazy.js +3 -0
- package/dist/extensions/mcp/runtime.lazy.js.map +1 -0
- package/dist/extensions/mcp/tools.d.ts +83 -0
- package/dist/extensions/mcp/tools.d.ts.map +1 -0
- package/dist/extensions/mcp/tools.js +233 -0
- package/dist/extensions/mcp/tools.js.map +1 -0
- package/dist/extensions/mcp/ui.d.ts +60 -0
- package/dist/extensions/mcp/ui.d.ts.map +1 -0
- package/dist/extensions/mcp/ui.js +172 -0
- package/dist/extensions/mcp/ui.js.map +1 -0
- package/dist/extensions/tool-search/index.d.ts +12 -0
- package/dist/extensions/tool-search/index.d.ts.map +1 -0
- package/dist/extensions/tool-search/index.js +15 -0
- package/dist/extensions/tool-search/index.js.map +1 -0
- package/dist/extensions/tool-search/tool.d.ts +72 -0
- package/dist/extensions/tool-search/tool.d.ts.map +1 -0
- package/dist/extensions/tool-search/tool.js +210 -0
- package/dist/extensions/tool-search/tool.js.map +1 -0
- package/dist/index.d.ts +9 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +10 -0
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js.map +1 -1
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/interactive/bug-report.d.ts.map +1 -1
- package/dist/modes/interactive/bug-report.js.map +1 -1
- package/dist/modes/interactive/chat-viewport.d.ts.map +1 -1
- package/dist/modes/interactive/chat-viewport.js.map +1 -1
- package/dist/modes/interactive/components/armin.d.ts.map +1 -1
- package/dist/modes/interactive/components/armin.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +13 -3
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-entry.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
- package/dist/modes/interactive/components/daxnuts.js.map +1 -1
- package/dist/modes/interactive/components/diff.d.ts.map +1 -1
- package/dist/modes/interactive/components/diff.js.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.d.ts +4 -4
- package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.js +8 -2
- package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +7 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +43 -3
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -1
- package/dist/modes/interactive/components/markdown-transform.js.map +1 -1
- package/dist/modes/interactive/components/mermaid.d.ts.map +1 -1
- package/dist/modes/interactive/components/mermaid.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/pi-logo.d.ts +12 -0
- package/dist/modes/interactive/components/pi-logo.d.ts.map +1 -0
- package/dist/modes/interactive/components/pi-logo.js +25 -0
- package/dist/modes/interactive/components/pi-logo.js.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +28 -6
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-submenu.js.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-indicator.js.map +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.js.map +1 -1
- package/dist/modes/interactive/components/themed-text.d.ts +17 -0
- package/dist/modes/interactive/components/themed-text.d.ts.map +1 -0
- package/dist/modes/interactive/components/themed-text.js +29 -0
- package/dist/modes/interactive/components/themed-text.js.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +2 -2
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/trust-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
- package/dist/modes/interactive/external-editor.d.ts.map +1 -1
- package/dist/modes/interactive/external-editor.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +11 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +199 -161
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -1
- package/dist/modes/interactive/model-catalog-refresh.js.map +1 -1
- package/dist/modes/interactive/model-search.d.ts.map +1 -1
- package/dist/modes/interactive/model-search.js.map +1 -1
- package/dist/modes/interactive/session-share.d.ts.map +1 -1
- package/dist/modes/interactive/session-share.js.map +1 -1
- package/dist/modes/interactive/theme/dark.json +59 -72
- package/dist/modes/interactive/theme/light.json +57 -69
- package/dist/modes/interactive/theme/system-theme.d.ts +54 -0
- package/dist/modes/interactive/theme/system-theme.d.ts.map +1 -0
- package/dist/modes/interactive/theme/system-theme.js +535 -0
- package/dist/modes/interactive/theme/system-theme.js.map +1 -0
- package/dist/modes/interactive/theme/theme-controller.d.ts +46 -6
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.js +127 -47
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
- package/dist/modes/interactive/theme/theme-json.d.ts +1 -0
- package/dist/modes/interactive/theme/theme-json.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-json.js +3 -1
- package/dist/modes/interactive/theme/theme-json.js.map +1 -1
- package/dist/modes/interactive/theme/theme-schema.json +7 -2
- package/dist/modes/interactive/theme/theme.d.ts +66 -39
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +238 -317
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/interactive/tui-renderer.d.ts +2 -1
- package/dist/modes/interactive/tui-renderer.d.ts.map +1 -1
- package/dist/modes/interactive/tui-renderer.js +1 -0
- package/dist/modes/interactive/tui-renderer.js.map +1 -1
- package/dist/modes/json-event.d.ts.map +1 -1
- package/dist/modes/json-event.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/jsonl.d.ts.map +1 -1
- package/dist/modes/rpc/jsonl.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +6 -6
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +12 -8
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +7 -9
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +10 -1
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +6 -2
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/rpc-entry.d.ts.map +1 -1
- package/dist/rpc-entry.js.map +1 -1
- package/dist/utils/abort.d.ts.map +1 -1
- package/dist/utils/abort.js.map +1 -1
- package/dist/utils/ansi.d.ts.map +1 -1
- package/dist/utils/ansi.js.map +1 -1
- package/dist/utils/changelog.d.ts.map +1 -1
- package/dist/utils/changelog.js.map +1 -1
- package/dist/utils/child-process.d.ts.map +1 -1
- package/dist/utils/child-process.js.map +1 -1
- package/dist/utils/clipboard-command.d.ts.map +1 -1
- package/dist/utils/clipboard-command.js.map +1 -1
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js +14 -17
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/clipboard.d.ts +2 -0
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +5 -0
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/deprecation.d.ts.map +1 -1
- package/dist/utils/deprecation.js.map +1 -1
- package/dist/utils/exif-orientation.d.ts.map +1 -1
- package/dist/utils/exif-orientation.js.map +1 -1
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/fs-watch.d.ts.map +1 -1
- package/dist/utils/fs-watch.js.map +1 -1
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/html.d.ts.map +1 -1
- package/dist/utils/html.js.map +1 -1
- package/dist/utils/image-convert.d.ts.map +1 -1
- package/dist/utils/image-convert.js.map +1 -1
- package/dist/utils/image-process.d.ts.map +1 -1
- package/dist/utils/image-process.js.map +1 -1
- package/dist/utils/image-resize-core.d.ts.map +1 -1
- package/dist/utils/image-resize-core.js.map +1 -1
- package/dist/utils/image-resize-worker.d.ts.map +1 -1
- package/dist/utils/image-resize-worker.js.map +1 -1
- package/dist/utils/image-resize.d.ts.map +1 -1
- package/dist/utils/image-resize.js.map +1 -1
- package/dist/utils/json.d.ts.map +1 -1
- package/dist/utils/json.js.map +1 -1
- package/dist/utils/management-http.d.ts.map +1 -1
- package/dist/utils/management-http.js.map +1 -1
- package/dist/utils/mime.d.ts.map +1 -1
- package/dist/utils/mime.js.map +1 -1
- package/dist/utils/open-browser.d.ts.map +1 -1
- package/dist/utils/open-browser.js.map +1 -1
- package/dist/utils/paths.d.ts +3 -3
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +5 -4
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/photon.d.ts.map +1 -1
- package/dist/utils/photon.js.map +1 -1
- package/dist/utils/pi-user-agent.d.ts.map +1 -1
- package/dist/utils/pi-user-agent.js.map +1 -1
- package/dist/utils/shell.d.ts +1 -3
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +3 -30
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/sleep.d.ts.map +1 -1
- package/dist/utils/sleep.js.map +1 -1
- package/dist/utils/syntax-highlight.d.ts.map +1 -1
- package/dist/utils/syntax-highlight.js +2 -0
- package/dist/utils/syntax-highlight.js.map +1 -1
- package/dist/utils/text.d.ts.map +1 -1
- package/dist/utils/text.js.map +1 -1
- package/dist/utils/tool-result-images.d.ts.map +1 -1
- package/dist/utils/tool-result-images.js.map +1 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js.map +1 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js.map +1 -1
- package/dist/utils/windows-self-update.d.ts.map +1 -1
- package/dist/utils/windows-self-update.js.map +1 -1
- package/dist/utils/wsl.d.ts.map +1 -1
- package/dist/utils/wsl.js.map +1 -1
- package/dist/utils/zip.d.ts.map +1 -1
- package/dist/utils/zip.js.map +1 -1
- package/docs/cli.md +64 -3
- package/docs/configuration.md +2 -0
- package/docs/custom-provider.md +43 -4
- package/docs/docs.json +8 -0
- package/docs/extensions.md +55 -0
- package/docs/keybindings.md +1 -1
- package/docs/llama-cpp.md +13 -0
- package/docs/mcp.md +188 -0
- package/docs/models.md +35 -0
- package/docs/packages.md +4 -2
- package/docs/providers.md +1 -0
- package/docs/rpc-commands.md +9 -3
- package/docs/rpc.md +3 -1
- package/docs/sdk.md +7 -2
- package/docs/security.md +2 -0
- package/docs/session-format.md +5 -1
- package/docs/settings.md +20 -3
- package/docs/themes.md +33 -7
- package/docs/tui.md +18 -0
- package/docs/virtual-models.md +114 -0
- package/docs/windows.md +2 -0
- package/examples/README.md +1 -1
- package/examples/extensions/README.md +2 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +5 -5
- package/examples/extensions/debug-provider.ts +90 -0
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/jev-router.ts +113 -0
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/rpc-client.ts +1 -1
- package/examples/rpc-extension-ui.ts +1 -1
- package/examples/sdk/14-codemode-mcp.ts +61 -0
- package/examples/sdk/README.md +2 -1
- package/npm-shrinkwrap.json +89 -39
- package/package.json +14 -12
- package/dist/bundle/chunks/anthropic-messages-J5WXPPPC.js +0 -6
- package/dist/bundle/chunks/azure-openai-responses-HUSQ3GP2.js +0 -2
- package/dist/bundle/chunks/chunk-65HAU2C5.js +0 -2
- package/dist/bundle/chunks/chunk-6R7UI4IY.js +0 -2
- package/dist/bundle/chunks/chunk-NUHFSC37.js +0 -25
- package/dist/bundle/chunks/chunk-OJP47DM6.js +0 -1568
- package/dist/bundle/chunks/chunk-RCZIEVGO.js +0 -11
- package/dist/bundle/chunks/google-generative-ai-IMS5EK2Y.js +0 -2
- package/dist/bundle/chunks/google-vertex-O4YJEQUW.js +0 -2
- package/dist/bundle/chunks/mistral-conversations-NOSQHBEY.js +0 -5
- package/dist/bundle/chunks/openai-responses-HWEUZ6WZ.js +0 -2
- package/dist/bundle/chunks/virtual-modules-VHMJYYWQ.js +0 -2
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import * as fs from "node:fs";
|
|
2
2
|
import * as path from "node:path";
|
|
3
|
-
import {
|
|
3
|
+
import { backgroundAnsi, colorToHex, colorToOklch, foregroundAnsi, getTerminalColorMode, indexedColor, mixColors, parseColor, rgbColor, styleTextWithAnsi, } from "@earendil-works/pi-tui";
|
|
4
4
|
import chalk from "chalk";
|
|
5
5
|
import { getCustomThemesDir, getThemesDir } from "../../../config.js";
|
|
6
6
|
import { closeWatcher, watchWithErrorHandler } from "../../../utils/fs-watch.js";
|
|
7
7
|
import { highlight, supportsLanguage } from "../../../utils/syntax-highlight.js";
|
|
8
8
|
import { stripBom } from "../../../utils/text.js";
|
|
9
|
+
import { generateSystemThemeColors, SYSTEM_THEME_NAME, terminalAppearance } from "./system-theme.js";
|
|
10
|
+
export { SYSTEM_THEME_NAME } from "./system-theme.js";
|
|
9
11
|
let themeJsonValidator;
|
|
10
12
|
/**
|
|
11
13
|
* Install full theme validation. Without it, documents are accepted as-is, which is what built-in
|
|
@@ -18,122 +20,8 @@ export function setThemeJsonValidator(validator) {
|
|
|
18
20
|
// ============================================================================
|
|
19
21
|
// Color Utilities
|
|
20
22
|
// ============================================================================
|
|
21
|
-
function hexToRgb(hex) {
|
|
22
|
-
const cleaned = hex.replace("#", "");
|
|
23
|
-
if (cleaned.length !== 6) {
|
|
24
|
-
throw new Error(`Invalid hex color: ${hex}`);
|
|
25
|
-
}
|
|
26
|
-
const r = parseInt(cleaned.substring(0, 2), 16);
|
|
27
|
-
const g = parseInt(cleaned.substring(2, 4), 16);
|
|
28
|
-
const b = parseInt(cleaned.substring(4, 6), 16);
|
|
29
|
-
if (Number.isNaN(r) || Number.isNaN(g) || Number.isNaN(b)) {
|
|
30
|
-
throw new Error(`Invalid hex color: ${hex}`);
|
|
31
|
-
}
|
|
32
|
-
return { r, g, b };
|
|
33
|
-
}
|
|
34
|
-
// The 6x6x6 color cube channel values (indices 0-5)
|
|
35
|
-
const CUBE_VALUES = [0, 95, 135, 175, 215, 255];
|
|
36
|
-
// Grayscale ramp values (indices 232-255, 24 grays from 8 to 238)
|
|
37
|
-
const GRAY_VALUES = Array.from({ length: 24 }, (_, i) => 8 + i * 10);
|
|
38
|
-
function findClosestCubeIndex(value) {
|
|
39
|
-
let minDist = Infinity;
|
|
40
|
-
let minIdx = 0;
|
|
41
|
-
for (let i = 0; i < CUBE_VALUES.length; i++) {
|
|
42
|
-
const dist = Math.abs(value - CUBE_VALUES[i]);
|
|
43
|
-
if (dist < minDist) {
|
|
44
|
-
minDist = dist;
|
|
45
|
-
minIdx = i;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return minIdx;
|
|
49
|
-
}
|
|
50
|
-
function findClosestGrayIndex(gray) {
|
|
51
|
-
let minDist = Infinity;
|
|
52
|
-
let minIdx = 0;
|
|
53
|
-
for (let i = 0; i < GRAY_VALUES.length; i++) {
|
|
54
|
-
const dist = Math.abs(gray - GRAY_VALUES[i]);
|
|
55
|
-
if (dist < minDist) {
|
|
56
|
-
minDist = dist;
|
|
57
|
-
minIdx = i;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
return minIdx;
|
|
61
|
-
}
|
|
62
|
-
function colorDistance(r1, g1, b1, r2, g2, b2) {
|
|
63
|
-
// Weighted Euclidean distance (human eye is more sensitive to green)
|
|
64
|
-
const dr = r1 - r2;
|
|
65
|
-
const dg = g1 - g2;
|
|
66
|
-
const db = b1 - b2;
|
|
67
|
-
return dr * dr * 0.299 + dg * dg * 0.587 + db * db * 0.114;
|
|
68
|
-
}
|
|
69
|
-
function rgbTo256(r, g, b) {
|
|
70
|
-
// Find closest color in the 6x6x6 cube
|
|
71
|
-
const rIdx = findClosestCubeIndex(r);
|
|
72
|
-
const gIdx = findClosestCubeIndex(g);
|
|
73
|
-
const bIdx = findClosestCubeIndex(b);
|
|
74
|
-
const cubeR = CUBE_VALUES[rIdx];
|
|
75
|
-
const cubeG = CUBE_VALUES[gIdx];
|
|
76
|
-
const cubeB = CUBE_VALUES[bIdx];
|
|
77
|
-
const cubeIndex = 16 + 36 * rIdx + 6 * gIdx + bIdx;
|
|
78
|
-
const cubeDist = colorDistance(r, g, b, cubeR, cubeG, cubeB);
|
|
79
|
-
// Find closest grayscale
|
|
80
|
-
const gray = Math.round(0.299 * r + 0.587 * g + 0.114 * b);
|
|
81
|
-
const grayIdx = findClosestGrayIndex(gray);
|
|
82
|
-
const grayValue = GRAY_VALUES[grayIdx];
|
|
83
|
-
const grayIndex = 232 + grayIdx;
|
|
84
|
-
const grayDist = colorDistance(r, g, b, grayValue, grayValue, grayValue);
|
|
85
|
-
// Check if color has noticeable saturation (hue matters)
|
|
86
|
-
// If max-min spread is significant, prefer cube to preserve tint
|
|
87
|
-
const maxC = Math.max(r, g, b);
|
|
88
|
-
const minC = Math.min(r, g, b);
|
|
89
|
-
const spread = maxC - minC;
|
|
90
|
-
// Only consider grayscale if color is nearly neutral (spread < 10)
|
|
91
|
-
// AND grayscale is actually closer
|
|
92
|
-
if (spread < 10 && grayDist < cubeDist) {
|
|
93
|
-
return grayIndex;
|
|
94
|
-
}
|
|
95
|
-
return cubeIndex;
|
|
96
|
-
}
|
|
97
|
-
function hexTo256(hex) {
|
|
98
|
-
const { r, g, b } = hexToRgb(hex);
|
|
99
|
-
return rgbTo256(r, g, b);
|
|
100
|
-
}
|
|
101
|
-
function fgAnsi(color, mode) {
|
|
102
|
-
if (color === "")
|
|
103
|
-
return "\x1b[39m";
|
|
104
|
-
if (typeof color === "number")
|
|
105
|
-
return `\x1b[38;5;${color}m`;
|
|
106
|
-
if (color.startsWith("#")) {
|
|
107
|
-
if (mode === "truecolor") {
|
|
108
|
-
const { r, g, b } = hexToRgb(color);
|
|
109
|
-
return `\x1b[38;2;${r};${g};${b}m`;
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
const index = hexTo256(color);
|
|
113
|
-
return `\x1b[38;5;${index}m`;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
throw new Error(`Invalid color value: ${color}`);
|
|
117
|
-
}
|
|
118
|
-
function bgAnsi(color, mode) {
|
|
119
|
-
if (color === "")
|
|
120
|
-
return "\x1b[49m";
|
|
121
|
-
if (typeof color === "number")
|
|
122
|
-
return `\x1b[48;5;${color}m`;
|
|
123
|
-
if (color.startsWith("#")) {
|
|
124
|
-
if (mode === "truecolor") {
|
|
125
|
-
const { r, g, b } = hexToRgb(color);
|
|
126
|
-
return `\x1b[48;2;${r};${g};${b}m`;
|
|
127
|
-
}
|
|
128
|
-
else {
|
|
129
|
-
const index = hexTo256(color);
|
|
130
|
-
return `\x1b[48;5;${index}m`;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
throw new Error(`Invalid color value: ${color}`);
|
|
134
|
-
}
|
|
135
23
|
function resolveVarRefs(value, vars, visited = new Set()) {
|
|
136
|
-
if (typeof value === "number" || value === "" || value.startsWith("#")) {
|
|
24
|
+
if (typeof value === "number" || value === "" || value.startsWith("#") || /^ok(lch|hsl)\(/i.test(value)) {
|
|
137
25
|
return value;
|
|
138
26
|
}
|
|
139
27
|
if (visited.has(value)) {
|
|
@@ -162,6 +50,53 @@ function withThemeColorFallbacks(colors) {
|
|
|
162
50
|
searchMatchText: colors.searchMatchText ?? colors.text,
|
|
163
51
|
};
|
|
164
52
|
}
|
|
53
|
+
// The terminal's reported colors. Replaced (never mutated) on update, so themes can cache resolved colors
|
|
54
|
+
// by identity.
|
|
55
|
+
let terminalColors = {};
|
|
56
|
+
// While the terminal color query is in flight, the system theme renders in grayscale.
|
|
57
|
+
let terminalColorsPending = false;
|
|
58
|
+
// The terminal's last light/dark report (mode 2031). Only used while it has not reported a background.
|
|
59
|
+
let terminalColorScheme;
|
|
60
|
+
/**
|
|
61
|
+
* Record the terminal's reported colors. Themes use the default colors for tokens set to "" (terminal
|
|
62
|
+
* default); the system theme is generated from all of them. Ends the pending state.
|
|
63
|
+
*/
|
|
64
|
+
export function setTerminalColors(colors) {
|
|
65
|
+
terminalColors = { ...colors };
|
|
66
|
+
terminalColorsPending = false;
|
|
67
|
+
}
|
|
68
|
+
/** Record the terminal's light/dark report, the fallback for terminals that do not report their background. */
|
|
69
|
+
export function setTerminalColorScheme(scheme) {
|
|
70
|
+
terminalColorScheme = scheme;
|
|
71
|
+
}
|
|
72
|
+
/** Render the system theme in grayscale until `setTerminalColors()` reports the terminal's colors. */
|
|
73
|
+
export function markTerminalColorsPending() {
|
|
74
|
+
terminalColorsPending = true;
|
|
75
|
+
}
|
|
76
|
+
/** Assumed terminal default colors when the terminal does not report them. */
|
|
77
|
+
const GUESSED_DEFAULT_COLORS = {
|
|
78
|
+
dark: { foreground: parseColor("#e5e5e7"), background: parseColor("#000000") },
|
|
79
|
+
light: { foreground: parseColor("#000000"), background: parseColor("#ffffff") },
|
|
80
|
+
};
|
|
81
|
+
function averageLightness(colors) {
|
|
82
|
+
// Palette colors 0-15 follow the user's terminal palette, so they say nothing about the theme.
|
|
83
|
+
const fixed = colors.filter((color) => color.kind !== "indexed" || color.index >= 16);
|
|
84
|
+
if (fixed.length === 0)
|
|
85
|
+
return undefined;
|
|
86
|
+
return fixed.reduce((sum, color) => sum + colorToOklch(color).l, 0) / fixed.length;
|
|
87
|
+
}
|
|
88
|
+
/** Detect the background a theme is designed for from the lightness of its own colors. */
|
|
89
|
+
function detectAppearance(foregrounds, backgrounds) {
|
|
90
|
+
const fg = averageLightness(foregrounds);
|
|
91
|
+
const bg = averageLightness(backgrounds);
|
|
92
|
+
if (fg !== undefined && bg !== undefined)
|
|
93
|
+
return bg < fg ? "dark" : "light";
|
|
94
|
+
if (bg !== undefined)
|
|
95
|
+
return bg < 0.5 ? "dark" : "light";
|
|
96
|
+
if (fg !== undefined)
|
|
97
|
+
return fg > 0.5 ? "dark" : "light";
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
165
100
|
// ============================================================================
|
|
166
101
|
// Theme Class
|
|
167
102
|
// ============================================================================
|
|
@@ -169,45 +104,115 @@ export class Theme {
|
|
|
169
104
|
name;
|
|
170
105
|
sourcePath;
|
|
171
106
|
sourceInfo;
|
|
172
|
-
fgColors;
|
|
173
|
-
bgColors;
|
|
174
107
|
mode;
|
|
108
|
+
// Precomputed escape sequences keep fg()/bg() on the render hot path to a lookup and concat.
|
|
109
|
+
fgAnsi = new Map();
|
|
110
|
+
bgAnsi = new Map();
|
|
111
|
+
// Tokens set to "" have no color of their own; `colors` fills them from the terminal defaults.
|
|
112
|
+
concreteColors = {};
|
|
113
|
+
defaultForegroundTokens = [];
|
|
114
|
+
defaultBackgroundTokens = [];
|
|
115
|
+
// Foreground tokens rendered faint (SGR 2) on top of their color.
|
|
116
|
+
dimTokens;
|
|
117
|
+
ownAppearance;
|
|
118
|
+
resolvedColors;
|
|
175
119
|
constructor(fgColors, bgColors, mode, options = {}) {
|
|
176
120
|
this.name = options.name;
|
|
177
121
|
this.sourcePath = options.sourcePath;
|
|
178
122
|
this.sourceInfo = options.sourceInfo;
|
|
179
123
|
this.mode = mode;
|
|
180
|
-
this.
|
|
181
|
-
const
|
|
124
|
+
this.dimTokens = new Set(options.dim);
|
|
125
|
+
const foregrounds = {
|
|
182
126
|
...fgColors,
|
|
183
127
|
scrollbarTrack: fgColors.scrollbarTrack ?? fgColors.muted,
|
|
184
128
|
scrollbarThumb: fgColors.scrollbarThumb ?? fgColors.text,
|
|
185
129
|
thinkingMax: fgColors.thinkingMax ?? fgColors.thinkingXhigh,
|
|
186
130
|
searchMatchText: fgColors.searchMatchText ?? fgColors.text,
|
|
187
131
|
};
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
const
|
|
193
|
-
|
|
194
|
-
|
|
132
|
+
const backgrounds = { ...bgColors, searchMatchBg: bgColors.searchMatchBg ?? bgColors.selectedBg };
|
|
133
|
+
const concreteForegrounds = [];
|
|
134
|
+
const concreteBackgrounds = [];
|
|
135
|
+
// Returns the escape sequence for the token's own slot.
|
|
136
|
+
const addToken = (token, value, isBackground) => {
|
|
137
|
+
if (value === "") {
|
|
138
|
+
(isBackground ? this.defaultBackgroundTokens : this.defaultForegroundTokens).push(token);
|
|
139
|
+
return isBackground ? "\x1b[49m" : "\x1b[39m";
|
|
140
|
+
}
|
|
141
|
+
const color = parseColor(value);
|
|
142
|
+
this.concreteColors[token] = color;
|
|
143
|
+
(isBackground ? concreteBackgrounds : concreteForegrounds).push(color);
|
|
144
|
+
return isBackground ? backgroundAnsi(color, mode) : foregroundAnsi(color, mode);
|
|
195
145
|
};
|
|
196
|
-
for (const [
|
|
197
|
-
this.
|
|
146
|
+
for (const [token, value] of Object.entries(foregrounds)) {
|
|
147
|
+
this.fgAnsi.set(token, addToken(token, value, false));
|
|
148
|
+
}
|
|
149
|
+
for (const [token, value] of Object.entries(backgrounds)) {
|
|
150
|
+
this.bgAnsi.set(token, addToken(token, value, true));
|
|
198
151
|
}
|
|
152
|
+
this.ownAppearance = options.appearance ?? detectAppearance(concreteForegrounds, concreteBackgrounds);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* The background the theme is designed for: declared in the theme JSON, detected from its colors,
|
|
156
|
+
* or, for themes without usable colors, the terminal's appearance.
|
|
157
|
+
*/
|
|
158
|
+
get appearance() {
|
|
159
|
+
return this.ownAppearance ?? getTerminalTheme();
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Concrete colors for all tokens. Tokens set to "" (terminal default) use the terminal's reported
|
|
163
|
+
* default colors, or a guess based on `appearance` when the terminal did not report them. Faint
|
|
164
|
+
* tokens are approximated by mixing their color toward the background.
|
|
165
|
+
*/
|
|
166
|
+
get colors() {
|
|
167
|
+
const terminal = terminalColors;
|
|
168
|
+
if (this.resolvedColors?.terminal !== terminal) {
|
|
169
|
+
const guess = GUESSED_DEFAULT_COLORS[this.appearance];
|
|
170
|
+
const toColor = (rgb, fallback) => rgb ? rgbColor(rgb.r, rgb.g, rgb.b) : fallback;
|
|
171
|
+
const foreground = toColor(terminal.foreground, guess.foreground);
|
|
172
|
+
const background = toColor(terminal.background, guess.background);
|
|
173
|
+
const colors = { ...this.concreteColors };
|
|
174
|
+
for (const token of this.defaultForegroundTokens)
|
|
175
|
+
colors[token] = foreground;
|
|
176
|
+
for (const token of this.defaultBackgroundTokens)
|
|
177
|
+
colors[token] = background;
|
|
178
|
+
for (const token of this.dimTokens) {
|
|
179
|
+
const color = colors[token];
|
|
180
|
+
if (color)
|
|
181
|
+
colors[token] = mixColors(color, background, 0.4);
|
|
182
|
+
}
|
|
183
|
+
this.resolvedColors = { terminal, colors: Object.freeze(colors) };
|
|
184
|
+
}
|
|
185
|
+
return this.resolvedColors.colors;
|
|
186
|
+
}
|
|
187
|
+
style(text, options) {
|
|
188
|
+
const { fg, bg } = options;
|
|
189
|
+
if (typeof fg === "string" && this.dimTokens.has(fg))
|
|
190
|
+
options = { ...options, dim: true };
|
|
191
|
+
return styleTextWithAnsi(text, fg === undefined
|
|
192
|
+
? undefined
|
|
193
|
+
: typeof fg === "string"
|
|
194
|
+
? this.tokenAnsi(this.fgAnsi, fg)
|
|
195
|
+
: foregroundAnsi(fg, this.mode), bg === undefined
|
|
196
|
+
? undefined
|
|
197
|
+
: typeof bg === "string"
|
|
198
|
+
? this.tokenAnsi(this.bgAnsi, bg)
|
|
199
|
+
: backgroundAnsi(bg, this.mode), options);
|
|
199
200
|
}
|
|
200
201
|
fg(color, text) {
|
|
201
|
-
const ansi = this.
|
|
202
|
-
if (
|
|
203
|
-
|
|
204
|
-
return `${ansi}${text}\x1b[39m`;
|
|
202
|
+
const ansi = this.tokenAnsi(this.fgAnsi, color);
|
|
203
|
+
if (this.dimTokens.has(color))
|
|
204
|
+
return `${ansi}\x1b[2m${text}\x1b[22;39m`;
|
|
205
|
+
return `${ansi}${text}\x1b[39m`;
|
|
205
206
|
}
|
|
206
207
|
bg(color, text) {
|
|
207
|
-
const ansi = this.
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
208
|
+
const ansi = this.tokenAnsi(this.bgAnsi, color);
|
|
209
|
+
return `${ansi}${text}\x1b[49m`;
|
|
210
|
+
}
|
|
211
|
+
tokenAnsi(ansi, token) {
|
|
212
|
+
const value = ansi.get(token);
|
|
213
|
+
if (value === undefined)
|
|
214
|
+
throw new Error(`Unknown theme color: ${token}`);
|
|
215
|
+
return value;
|
|
211
216
|
}
|
|
212
217
|
bold(text) {
|
|
213
218
|
return chalk.bold(text);
|
|
@@ -224,17 +229,13 @@ export class Theme {
|
|
|
224
229
|
strikethrough(text) {
|
|
225
230
|
return chalk.strikethrough(text);
|
|
226
231
|
}
|
|
232
|
+
/** Opening escape sequence for a foreground token. Faint tokens include SGR 2, which `\x1b[22m` closes. */
|
|
227
233
|
getFgAnsi(color) {
|
|
228
|
-
const ansi = this.
|
|
229
|
-
|
|
230
|
-
throw new Error(`Unknown theme color: ${color}`);
|
|
231
|
-
return ansi;
|
|
234
|
+
const ansi = this.tokenAnsi(this.fgAnsi, color);
|
|
235
|
+
return this.dimTokens.has(color) ? `${ansi}\x1b[2m` : ansi;
|
|
232
236
|
}
|
|
233
237
|
getBgAnsi(color) {
|
|
234
|
-
|
|
235
|
-
if (!ansi)
|
|
236
|
-
throw new Error(`Unknown theme background color: ${color}`);
|
|
237
|
-
return ansi;
|
|
238
|
+
return this.tokenAnsi(this.bgAnsi, color);
|
|
238
239
|
}
|
|
239
240
|
getColorMode() {
|
|
240
241
|
return this.mode;
|
|
@@ -294,7 +295,8 @@ export function getAvailableThemesWithPaths() {
|
|
|
294
295
|
seen.add(themeInfo.name);
|
|
295
296
|
result.push(themeInfo);
|
|
296
297
|
};
|
|
297
|
-
// Built-in themes
|
|
298
|
+
// Built-in themes. The system theme is generated, so it has no file.
|
|
299
|
+
addTheme({ name: SYSTEM_THEME_NAME, path: undefined });
|
|
298
300
|
for (const name of Object.keys(getBuiltinThemes())) {
|
|
299
301
|
addTheme({ name, path: path.join(themesDir, `${name}.json`) });
|
|
300
302
|
}
|
|
@@ -305,7 +307,8 @@ export function getAvailableThemesWithPaths() {
|
|
|
305
307
|
for (const [name, theme] of registeredThemes.entries()) {
|
|
306
308
|
addTheme({ name, path: theme.sourcePath });
|
|
307
309
|
}
|
|
308
|
-
|
|
310
|
+
// The system theme comes first: it is the default and adapts to every terminal.
|
|
311
|
+
return result.sort((a, b) => a.name === SYSTEM_THEME_NAME ? -1 : b.name === SYSTEM_THEME_NAME ? 1 : a.name.localeCompare(b.name));
|
|
309
312
|
}
|
|
310
313
|
function getCustomThemeInfos() {
|
|
311
314
|
const customThemesDir = getCustomThemesDir();
|
|
@@ -375,31 +378,50 @@ function loadThemeJson(name) {
|
|
|
375
378
|
const content = fs.readFileSync(themePath, "utf-8");
|
|
376
379
|
return parseThemeJsonContent(name, content);
|
|
377
380
|
}
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
+
const BACKGROUND_TOKENS = new Set([
|
|
382
|
+
"selectedBg",
|
|
383
|
+
"searchMatchBg",
|
|
384
|
+
"userMessageBg",
|
|
385
|
+
"customMessageBg",
|
|
386
|
+
"toolPendingBg",
|
|
387
|
+
"toolSuccessBg",
|
|
388
|
+
"toolErrorBg",
|
|
389
|
+
]);
|
|
390
|
+
function splitThemeColors(colors) {
|
|
381
391
|
const fgColors = {};
|
|
382
392
|
const bgColors = {};
|
|
383
|
-
const
|
|
384
|
-
|
|
385
|
-
"searchMatchBg",
|
|
386
|
-
"userMessageBg",
|
|
387
|
-
"customMessageBg",
|
|
388
|
-
"toolPendingBg",
|
|
389
|
-
"toolSuccessBg",
|
|
390
|
-
"toolErrorBg",
|
|
391
|
-
]);
|
|
392
|
-
for (const [key, value] of Object.entries(resolvedColors)) {
|
|
393
|
-
if (bgColorKeys.has(key)) {
|
|
393
|
+
for (const [key, value] of Object.entries(colors)) {
|
|
394
|
+
if (BACKGROUND_TOKENS.has(key)) {
|
|
394
395
|
bgColors[key] = value;
|
|
395
396
|
}
|
|
396
397
|
else {
|
|
397
398
|
fgColors[key] = value;
|
|
398
399
|
}
|
|
399
400
|
}
|
|
401
|
+
return { fgColors, bgColors };
|
|
402
|
+
}
|
|
403
|
+
function createTheme(themeJson, mode, sourcePath) {
|
|
404
|
+
const colorMode = mode ?? getTerminalColorMode();
|
|
405
|
+
const resolvedColors = resolveThemeColors(withThemeColorFallbacks(themeJson.colors), themeJson.vars);
|
|
406
|
+
const { fgColors, bgColors } = splitThemeColors(resolvedColors);
|
|
400
407
|
return new Theme(fgColors, bgColors, colorMode, {
|
|
401
408
|
name: themeJson.name,
|
|
402
409
|
sourcePath,
|
|
410
|
+
appearance: themeJson.appearance,
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
/** Generate the system theme from the terminal's reported colors (grayscale while they are pending). */
|
|
414
|
+
function createSystemTheme(mode) {
|
|
415
|
+
const generated = generateSystemThemeColors({
|
|
416
|
+
...terminalColors,
|
|
417
|
+
saturation: terminalColorsPending ? 0 : 1,
|
|
418
|
+
appearanceHint: getTerminalTheme(),
|
|
419
|
+
});
|
|
420
|
+
const { fgColors, bgColors } = splitThemeColors(generated.colors);
|
|
421
|
+
return new Theme(fgColors, bgColors, mode ?? getTerminalColorMode(), {
|
|
422
|
+
name: SYSTEM_THEME_NAME,
|
|
423
|
+
appearance: generated.appearance,
|
|
424
|
+
dim: generated.dim,
|
|
403
425
|
});
|
|
404
426
|
}
|
|
405
427
|
export function loadThemeFromPath(themePath, mode) {
|
|
@@ -408,6 +430,9 @@ export function loadThemeFromPath(themePath, mode) {
|
|
|
408
430
|
return createTheme(themeJson, mode, themePath);
|
|
409
431
|
}
|
|
410
432
|
function loadTheme(name, mode) {
|
|
433
|
+
// The system theme name is reserved: it takes precedence over custom themes of the same name.
|
|
434
|
+
if (name === SYSTEM_THEME_NAME)
|
|
435
|
+
return createSystemTheme(mode);
|
|
411
436
|
const registeredTheme = registeredThemes.get(name);
|
|
412
437
|
if (registeredTheme) {
|
|
413
438
|
return registeredTheme;
|
|
@@ -448,95 +473,45 @@ export function resolveThemeSetting(themeSetting, terminalTheme) {
|
|
|
448
473
|
return themeSetting;
|
|
449
474
|
return undefined;
|
|
450
475
|
}
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
const
|
|
463
|
-
|
|
464
|
-
return
|
|
465
|
-
|
|
466
|
-
return 0.2126 * toLinear(r) + 0.7152 * toLinear(g) + 0.0722 * toLinear(b);
|
|
467
|
-
}
|
|
468
|
-
function getAnsiColorLuminance(index) {
|
|
469
|
-
return getRgbColorLuminance(hexToRgb(ansi256ToHex(index)));
|
|
470
|
-
}
|
|
471
|
-
export function getThemeForRgbColor(rgb) {
|
|
472
|
-
return getRgbColorLuminance(rgb) >= 0.5 ? "light" : "dark";
|
|
473
|
-
}
|
|
474
|
-
export function detectTerminalBackgroundFromEnv(options = {}) {
|
|
475
|
-
const env = options.env ?? process.env;
|
|
476
|
-
const colorfgbg = env.COLORFGBG || "";
|
|
477
|
-
const bg = getColorFgBgBackgroundIndex(colorfgbg);
|
|
478
|
-
if (bg !== undefined) {
|
|
479
|
-
return {
|
|
480
|
-
theme: getAnsiColorLuminance(bg) >= 0.5 ? "light" : "dark",
|
|
481
|
-
source: "COLORFGBG",
|
|
482
|
-
detail: `background color index ${bg}`,
|
|
483
|
-
confidence: "high",
|
|
484
|
-
};
|
|
485
|
-
}
|
|
486
|
-
return {
|
|
487
|
-
theme: "dark",
|
|
488
|
-
source: "fallback",
|
|
489
|
-
detail: "no terminal background hint found",
|
|
490
|
-
confidence: "low",
|
|
491
|
-
};
|
|
492
|
-
}
|
|
493
|
-
export async function detectTerminalBackgroundTheme({ ui, timeoutMs, env, }) {
|
|
494
|
-
try {
|
|
495
|
-
const rgb = await ui.queryTerminalBackgroundColor({ timeoutMs });
|
|
496
|
-
if (rgb) {
|
|
497
|
-
return {
|
|
498
|
-
theme: getThemeForRgbColor(rgb),
|
|
499
|
-
source: "terminal background",
|
|
500
|
-
detail: `OSC 11 background rgb(${rgb.r}, ${rgb.g}, ${rgb.b})`,
|
|
501
|
-
confidence: "high",
|
|
502
|
-
};
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
catch {
|
|
506
|
-
// Fall back to environment-based detection when the terminal query fails.
|
|
507
|
-
}
|
|
508
|
-
return detectTerminalBackgroundFromEnv({ env });
|
|
476
|
+
/**
|
|
477
|
+
* Dark or light from the `COLORFGBG` environment variable some terminals set, or undefined without a
|
|
478
|
+
* usable background index. The value is `fg;bg` or `fg;xpm;bg` (rxvt), where a field is an ANSI color
|
|
479
|
+
* index or `default` when the color is not in the palette. The index refers to the terminal's own palette,
|
|
480
|
+
* whose colors are unknown here, so it is classified by index like Vim does: 0-6 and 8 (bright black, e.g.
|
|
481
|
+
* Solarized Dark's background) are dark, 7 and 9-15 are light.
|
|
482
|
+
*/
|
|
483
|
+
export function detectColorFgBgTheme(env = process.env) {
|
|
484
|
+
const bg = env.COLORFGBG?.split(";").at(-1)?.trim();
|
|
485
|
+
if (!bg || !/^\d{1,2}$/.test(bg))
|
|
486
|
+
return undefined;
|
|
487
|
+
const index = Number(bg);
|
|
488
|
+
if (index > 15)
|
|
489
|
+
return undefined;
|
|
490
|
+
return index <= 6 || index === 8 ? "dark" : "light";
|
|
509
491
|
}
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
const colorScheme = await colorSchemePromise;
|
|
521
|
-
if (colorScheme)
|
|
522
|
-
return colorScheme;
|
|
523
|
-
}
|
|
524
|
-
catch {
|
|
525
|
-
// Fall back to the concurrently queried OSC 11 / COLORFGBG detection.
|
|
526
|
-
}
|
|
527
|
-
return (await backgroundThemePromise).theme;
|
|
492
|
+
/**
|
|
493
|
+
* Whether the terminal is dark or light. The background it renders decides, classified the same way the
|
|
494
|
+
* system theme does. Without a reported background: the terminal's light/dark report, then COLORFGBG,
|
|
495
|
+
* then dark.
|
|
496
|
+
*/
|
|
497
|
+
export function detectTerminalTheme(colors = {}, reportedScheme, env = process.env) {
|
|
498
|
+
const { background, foreground } = colors;
|
|
499
|
+
if (background)
|
|
500
|
+
return terminalAppearance(background, foreground);
|
|
501
|
+
return reportedScheme ?? detectColorFgBgTheme(env) ?? "dark";
|
|
528
502
|
}
|
|
529
|
-
|
|
530
|
-
|
|
503
|
+
/** Whether the terminal is dark or light, from everything it reported so far. See `detectTerminalTheme()`. */
|
|
504
|
+
export function getTerminalTheme() {
|
|
505
|
+
return detectTerminalTheme(terminalColors, terminalColorScheme);
|
|
531
506
|
}
|
|
532
507
|
// ============================================================================
|
|
533
508
|
// Global Theme Instance
|
|
534
509
|
// ============================================================================
|
|
535
|
-
// Use globalThis to share theme across module loaders (
|
|
510
|
+
// Use globalThis to share theme across module loaders (node + jiti in dev mode)
|
|
536
511
|
const THEME_KEY = Symbol.for("@earendil-works/pi-coding-agent:theme");
|
|
537
512
|
const THEME_KEY_OLD = Symbol.for("@mariozechner/pi-coding-agent:theme");
|
|
538
513
|
// Export theme as a getter that reads from globalThis
|
|
539
|
-
// This ensures all module instances (
|
|
514
|
+
// This ensures all module instances (node, jiti) see the same theme
|
|
540
515
|
export const theme = new Proxy({}, {
|
|
541
516
|
get(_target, prop) {
|
|
542
517
|
const t = globalThis[THEME_KEY];
|
|
@@ -564,7 +539,7 @@ export function setRegisteredThemes(themes) {
|
|
|
564
539
|
}
|
|
565
540
|
}
|
|
566
541
|
export function initTheme(themeName, enableWatcher = false) {
|
|
567
|
-
const name = themeName ??
|
|
542
|
+
const name = themeName ?? SYSTEM_THEME_NAME;
|
|
568
543
|
currentThemeName = name;
|
|
569
544
|
try {
|
|
570
545
|
setGlobalTheme(loadTheme(name));
|
|
@@ -573,9 +548,9 @@ export function initTheme(themeName, enableWatcher = false) {
|
|
|
573
548
|
}
|
|
574
549
|
}
|
|
575
550
|
catch (_error) {
|
|
576
|
-
// Theme is invalid - fall back to
|
|
577
|
-
currentThemeName =
|
|
578
|
-
setGlobalTheme(loadTheme(
|
|
551
|
+
// Theme is invalid - fall back to the system theme silently
|
|
552
|
+
currentThemeName = SYSTEM_THEME_NAME;
|
|
553
|
+
setGlobalTheme(loadTheme(SYSTEM_THEME_NAME));
|
|
579
554
|
// Don't start watcher for fallback theme
|
|
580
555
|
}
|
|
581
556
|
}
|
|
@@ -592,9 +567,9 @@ export function setTheme(name, enableWatcher = false) {
|
|
|
592
567
|
return { success: true };
|
|
593
568
|
}
|
|
594
569
|
catch (error) {
|
|
595
|
-
// Theme is invalid - fall back to
|
|
596
|
-
currentThemeName =
|
|
597
|
-
setGlobalTheme(loadTheme(
|
|
570
|
+
// Theme is invalid - fall back to the system theme
|
|
571
|
+
currentThemeName = SYSTEM_THEME_NAME;
|
|
572
|
+
setGlobalTheme(loadTheme(SYSTEM_THEME_NAME));
|
|
598
573
|
// Don't start watcher for fallback theme
|
|
599
574
|
return {
|
|
600
575
|
success: false,
|
|
@@ -616,7 +591,10 @@ export function onThemeChange(callback) {
|
|
|
616
591
|
function startThemeWatcher() {
|
|
617
592
|
stopThemeWatcher();
|
|
618
593
|
// Only watch if it's a custom theme (not built-in)
|
|
619
|
-
if (!currentThemeName ||
|
|
594
|
+
if (!currentThemeName ||
|
|
595
|
+
currentThemeName === "dark" ||
|
|
596
|
+
currentThemeName === "light" ||
|
|
597
|
+
currentThemeName === SYSTEM_THEME_NAME) {
|
|
620
598
|
return;
|
|
621
599
|
}
|
|
622
600
|
const customThemesDir = getCustomThemesDir();
|
|
@@ -685,102 +663,45 @@ export function stopThemeWatcher() {
|
|
|
685
663
|
// ============================================================================
|
|
686
664
|
// HTML Export Helpers
|
|
687
665
|
// ============================================================================
|
|
688
|
-
/**
|
|
689
|
-
* Convert a 256-color index to hex string.
|
|
690
|
-
* Indices 0-15: basic colors (approximate)
|
|
691
|
-
* Indices 16-231: 6x6x6 color cube
|
|
692
|
-
* Indices 232-255: grayscale ramp
|
|
693
|
-
*/
|
|
694
|
-
function ansi256ToHex(index) {
|
|
695
|
-
// Basic colors (0-15) - approximate common terminal values
|
|
696
|
-
const basicColors = [
|
|
697
|
-
"#000000",
|
|
698
|
-
"#800000",
|
|
699
|
-
"#008000",
|
|
700
|
-
"#808000",
|
|
701
|
-
"#000080",
|
|
702
|
-
"#800080",
|
|
703
|
-
"#008080",
|
|
704
|
-
"#c0c0c0",
|
|
705
|
-
"#808080",
|
|
706
|
-
"#ff0000",
|
|
707
|
-
"#00ff00",
|
|
708
|
-
"#ffff00",
|
|
709
|
-
"#0000ff",
|
|
710
|
-
"#ff00ff",
|
|
711
|
-
"#00ffff",
|
|
712
|
-
"#ffffff",
|
|
713
|
-
];
|
|
714
|
-
if (index < 16) {
|
|
715
|
-
return basicColors[index];
|
|
716
|
-
}
|
|
717
|
-
// Color cube (16-231): 6x6x6 = 216 colors
|
|
718
|
-
if (index < 232) {
|
|
719
|
-
const cubeIndex = index - 16;
|
|
720
|
-
const r = Math.floor(cubeIndex / 36);
|
|
721
|
-
const g = Math.floor((cubeIndex % 36) / 6);
|
|
722
|
-
const b = cubeIndex % 6;
|
|
723
|
-
const toHex = (n) => (n === 0 ? 0 : 55 + n * 40).toString(16).padStart(2, "0");
|
|
724
|
-
return `#${toHex(r)}${toHex(g)}${toHex(b)}`;
|
|
725
|
-
}
|
|
726
|
-
// Grayscale (232-255): 24 shades
|
|
727
|
-
const gray = 8 + (index - 232) * 10;
|
|
728
|
-
const grayHex = gray.toString(16).padStart(2, "0");
|
|
729
|
-
return `#${grayHex}${grayHex}${grayHex}`;
|
|
730
|
-
}
|
|
731
666
|
/**
|
|
732
667
|
* Get resolved theme colors as CSS-compatible hex strings.
|
|
733
668
|
* Used by HTML export to generate CSS custom properties.
|
|
734
669
|
*/
|
|
735
670
|
export function getResolvedThemeColors(themeName) {
|
|
736
|
-
const
|
|
737
|
-
|
|
738
|
-
const themeJson = loadThemeJson(name);
|
|
739
|
-
const resolved = resolveThemeColors(withThemeColorFallbacks(themeJson.colors), themeJson.vars);
|
|
740
|
-
// Default text color for empty values (terminal uses default fg color)
|
|
741
|
-
const defaultText = isLight ? "#000000" : "#e5e5e7";
|
|
742
|
-
const cssColors = {};
|
|
743
|
-
for (const [key, value] of Object.entries(resolved)) {
|
|
744
|
-
if (typeof value === "number") {
|
|
745
|
-
cssColors[key] = ansi256ToHex(value);
|
|
746
|
-
}
|
|
747
|
-
else if (value === "") {
|
|
748
|
-
// Empty means default terminal color - use sensible fallback for HTML
|
|
749
|
-
cssColors[key] = defaultText;
|
|
750
|
-
}
|
|
751
|
-
else {
|
|
752
|
-
cssColors[key] = value;
|
|
753
|
-
}
|
|
754
|
-
}
|
|
755
|
-
return cssColors;
|
|
671
|
+
const colors = loadTheme(themeName ?? currentThemeName ?? SYSTEM_THEME_NAME).colors;
|
|
672
|
+
return Object.fromEntries(Object.entries(colors).map(([token, color]) => [token, colorToHex(color)]));
|
|
756
673
|
}
|
|
757
674
|
/**
|
|
758
675
|
* Check if a theme is a "light" theme (for CSS that needs light/dark variants).
|
|
759
676
|
*/
|
|
760
677
|
export function isLightTheme(themeName) {
|
|
761
|
-
|
|
762
|
-
return themeName === "light";
|
|
678
|
+
return loadTheme(themeName ?? currentThemeName ?? SYSTEM_THEME_NAME).appearance === "light";
|
|
763
679
|
}
|
|
764
680
|
/**
|
|
765
681
|
* Get explicit export colors from theme JSON, if specified.
|
|
766
682
|
* Returns undefined for each color that isn't explicitly set.
|
|
767
683
|
*/
|
|
768
684
|
export function getThemeExportColors(themeName) {
|
|
769
|
-
const name = themeName ?? currentThemeName ??
|
|
685
|
+
const name = themeName ?? currentThemeName ?? SYSTEM_THEME_NAME;
|
|
686
|
+
if (name === SYSTEM_THEME_NAME)
|
|
687
|
+
return {};
|
|
770
688
|
try {
|
|
771
689
|
const themeJson = loadThemeJson(name);
|
|
772
690
|
const exportSection = themeJson.export;
|
|
773
691
|
if (!exportSection)
|
|
774
692
|
return {};
|
|
775
693
|
const vars = themeJson.vars ?? {};
|
|
694
|
+
// Export colors end up in CSS, which understands hex and oklch() values directly but not okhsl().
|
|
776
695
|
const resolve = (value) => {
|
|
777
696
|
if (value === undefined)
|
|
778
697
|
return undefined;
|
|
779
698
|
const resolved = resolveVarRefs(value, vars);
|
|
780
699
|
if (typeof resolved === "number")
|
|
781
|
-
return
|
|
700
|
+
return colorToHex(indexedColor(resolved));
|
|
782
701
|
if (resolved === "")
|
|
783
702
|
return undefined;
|
|
703
|
+
if (/^okhsl\(/i.test(resolved))
|
|
704
|
+
return colorToHex(parseColor(resolved));
|
|
784
705
|
return resolved;
|
|
785
706
|
};
|
|
786
707
|
return {
|
|
@@ -940,7 +861,7 @@ export function getMarkdownTheme() {
|
|
|
940
861
|
bold: (text) => theme.bold(text),
|
|
941
862
|
italic: (text) => theme.italic(text),
|
|
942
863
|
underline: (text) => theme.underline(text),
|
|
943
|
-
strikethrough: (text) =>
|
|
864
|
+
strikethrough: (text) => theme.strikethrough(text),
|
|
944
865
|
highlightCode: (code, lang) => {
|
|
945
866
|
// Validate language before highlighting to avoid stderr spam from cli-highlight
|
|
946
867
|
const validLang = lang && supportsLanguage(lang) ? lang : undefined;
|