@astralyn/pi 1.0.5 → 1.2.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/CHANGELOG.md +79 -0
- package/dist/bundle/chunks/anthropic-messages-NVP5OPIM.js +6 -0
- package/dist/bundle/chunks/anthropic.js +1 -1
- package/dist/bundle/chunks/{azure-openai-responses-LDW4FGAQ.js → azure-openai-responses-IBTOZ5MH.js} +1 -1
- package/dist/bundle/chunks/bedrock-converse-stream.js +2 -2
- package/dist/bundle/chunks/chunk-4XZYHGVN.js +11 -0
- package/dist/bundle/chunks/{chunk-GIG5IHES.js → chunk-5KJH3GGH.js} +1 -1
- package/dist/bundle/chunks/chunk-6VYRLG5F.js +2 -0
- package/dist/bundle/chunks/{chunk-UCXU7KLO.js → chunk-7HJ6CHUB.js} +1 -1
- package/dist/bundle/chunks/chunk-7UBIBLPN.js +2 -0
- package/dist/bundle/chunks/{chunk-IE3Z7ESB.js → chunk-A5HU4TE6.js} +418 -362
- package/dist/bundle/chunks/{chunk-HDHRZ7GT.js → chunk-B2UOWO4A.js} +1 -1
- package/dist/bundle/chunks/chunk-J75WV3FL.js +2 -0
- package/dist/bundle/chunks/{chunk-A6ALEEY5.js → chunk-LHSPN2IO.js} +1 -1
- package/dist/bundle/chunks/chunk-Q74S7ILH.js +2 -0
- package/dist/bundle/chunks/chunk-QDDSFJ35.js +2 -0
- package/dist/bundle/chunks/{chunk-IFELM7MW.js → chunk-UQECUCUH.js} +1 -1
- package/dist/bundle/chunks/cloudflare-workers-ai-system-one-HGOVFZDC.js +2 -0
- package/dist/bundle/chunks/codemode-worker.js +18 -10
- package/dist/bundle/chunks/github-copilot.js +1 -1
- package/dist/bundle/chunks/{google-generative-ai-S5A5IBU4.js → google-generative-ai-M44TSMAN.js} +1 -1
- package/dist/bundle/chunks/{google-vertex-UBRQFDB4.js → google-vertex-3C4OWLFX.js} +1 -1
- package/dist/bundle/chunks/image-resize-worker.js +1 -1
- package/dist/bundle/chunks/{llama-cpp-classify-R7DQLTQN.js → llama-cpp-classify-H3IZDR5O.js} +2 -2
- package/dist/bundle/chunks/mistral-conversations-I5PL4VCZ.js +5 -0
- package/dist/bundle/chunks/openai-chatgpt.js +1 -1
- package/dist/bundle/chunks/openai-codex-responses-O5EUDL54.js +10 -0
- package/dist/bundle/chunks/openai-codex.js +1 -1
- package/dist/bundle/chunks/{openai-completions-H4VMO7AU.js → openai-completions-X3SSG5BQ.js} +1 -1
- package/dist/bundle/chunks/openai-decisions-TVCDIPZX.js +5 -0
- package/dist/bundle/chunks/{openai-responses-G4PGNM2H.js → openai-responses-NYPNKVDV.js} +1 -1
- package/dist/bundle/chunks/{openrouter-images-YP3YVB54.js → openrouter-images-TDLJV5N4.js} +1 -1
- package/dist/bundle/chunks/{pi-messages-HZZ7GEEW.js → pi-messages-ZXNERWJG.js} +1 -1
- package/dist/bundle/chunks/typesafe-system-one-LWPJYTJP.js +2 -0
- package/dist/bundle/chunks/{virtual-modules-46MSJGKO.js → virtual-modules-OZTPKGU7.js} +1 -1
- package/dist/bundle/cli.js +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/rpc-entry.js +1 -1
- package/dist/cli/args.d.ts +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +13 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/core/agent-session.d.ts +26 -7
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +190 -183
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +20 -13
- 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 +40 -45
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/bug-report.d.ts +9 -1
- package/dist/core/bug-report.d.ts.map +1 -1
- package/dist/core/compaction/utils.d.ts +6 -0
- package/dist/core/compaction/utils.d.ts.map +1 -1
- package/dist/core/compaction/utils.js +7 -8
- package/dist/core/compaction/utils.js.map +1 -1
- package/dist/core/context-snapshot.d.ts +4 -1
- package/dist/core/context-snapshot.d.ts.map +1 -1
- package/dist/core/context-snapshot.js +45 -0
- package/dist/core/context-snapshot.js.map +1 -1
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js +2 -0
- 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/runner.d.ts +4 -2
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +2 -3
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +42 -7
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/key-id-schema.d.ts +6 -0
- package/dist/core/key-id-schema.d.ts.map +1 -0
- package/dist/core/key-id-schema.js +16 -0
- package/dist/core/key-id-schema.js.map +1 -0
- package/dist/core/keybinding-registry.d.ts +4 -3
- package/dist/core/keybinding-registry.d.ts.map +1 -1
- package/dist/core/keybinding-registry.js +4 -3
- package/dist/core/keybinding-registry.js.map +1 -1
- package/dist/core/keybindings-schema.d.ts +4 -0
- package/dist/core/keybindings-schema.d.ts.map +1 -0
- package/dist/core/keybindings-schema.js +16 -0
- package/dist/core/keybindings-schema.js.map +1 -0
- package/dist/core/keybindings.d.ts +258 -81
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +27 -24
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-config.d.ts +713 -180
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +18 -179
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +13 -7
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/nested-tool-calls.d.ts +1 -0
- package/dist/core/nested-tool-calls.d.ts.map +1 -1
- package/dist/core/nested-tool-calls.js +1 -0
- package/dist/core/nested-tool-calls.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +3 -3
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/project-trust.d.ts.map +1 -1
- package/dist/core/project-trust.js +2 -1
- package/dist/core/project-trust.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts +12 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +82 -24
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +7 -2
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/sdk.d.ts +4 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +17 -5
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/settings-defaults.d.ts +65 -0
- package/dist/core/settings-defaults.d.ts.map +1 -0
- package/dist/core/settings-defaults.js +66 -0
- package/dist/core/settings-defaults.js.map +1 -0
- package/dist/core/settings-manager.d.ts +15 -147
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +85 -57
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/settings-schema.d.ts +231 -0
- package/dist/core/settings-schema.d.ts.map +1 -0
- package/dist/core/settings-schema.js +294 -0
- package/dist/core/settings-schema.js.map +1 -0
- package/dist/core/tasks/session.d.ts +9 -0
- package/dist/core/tasks/session.d.ts.map +1 -1
- package/dist/core/tasks/session.js +21 -0
- package/dist/core/tasks/session.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts +18 -0
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js +46 -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 +21 -45
- package/dist/core/tools/renderers/bash.js.map +1 -1
- package/dist/core/tools/renderers/edit.js +1 -1
- package/dist/core/tools/renderers/edit.js.map +1 -1
- package/dist/extensions/btw/keybindings.d.ts +2 -2
- package/dist/extensions/btw/keybindings.d.ts.map +1 -1
- package/dist/extensions/btw/keybindings.js.map +1 -1
- package/dist/extensions/codemode/execute.d.ts.map +1 -1
- package/dist/extensions/codemode/execute.js +115 -40
- package/dist/extensions/codemode/execute.js.map +1 -1
- package/dist/extensions/codemode/index.d.ts.map +1 -1
- package/dist/extensions/codemode/index.js +3 -7
- package/dist/extensions/codemode/index.js.map +1 -1
- package/dist/extensions/codemode/renderer.d.ts +2 -2
- package/dist/extensions/codemode/renderer.d.ts.map +1 -1
- package/dist/extensions/codemode/renderer.js +9 -3
- package/dist/extensions/codemode/renderer.js.map +1 -1
- package/dist/extensions/codemode/tool.d.ts +6 -12
- package/dist/extensions/codemode/tool.d.ts.map +1 -1
- package/dist/extensions/codemode/tool.js +46 -34
- package/dist/extensions/codemode/tool.js.map +1 -1
- package/dist/extensions/index.js +2 -2
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/list-keybindings.d.ts +2 -2
- package/dist/extensions/list-keybindings.d.ts.map +1 -1
- package/dist/extensions/list-keybindings.js.map +1 -1
- package/dist/extensions/llama/provider.d.ts.map +1 -1
- package/dist/extensions/llama/provider.js +34 -11
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/extensions/mcp/cli.js +22 -31
- package/dist/extensions/mcp/cli.js.map +1 -1
- package/dist/extensions/mcp/index.d.ts.map +1 -1
- package/dist/extensions/mcp/index.js +187 -95
- package/dist/extensions/mcp/index.js.map +1 -1
- package/dist/extensions/mcp/oauth.d.ts +5 -3
- package/dist/extensions/mcp/oauth.d.ts.map +1 -1
- package/dist/extensions/mcp/oauth.js +36 -10
- package/dist/extensions/mcp/oauth.js.map +1 -1
- package/dist/extensions/mcp/resources.d.ts +0 -6
- package/dist/extensions/mcp/resources.d.ts.map +1 -1
- package/dist/extensions/mcp/resources.js +1 -1
- package/dist/extensions/mcp/resources.js.map +1 -1
- package/dist/extensions/mcp/runtime.d.ts +3 -6
- package/dist/extensions/mcp/runtime.d.ts.map +1 -1
- package/dist/extensions/mcp/runtime.js +4 -39
- package/dist/extensions/mcp/runtime.js.map +1 -1
- package/dist/extensions/mcp/tools.d.ts +2 -3
- package/dist/extensions/mcp/tools.d.ts.map +1 -1
- package/dist/extensions/mcp/tools.js +62 -6
- package/dist/extensions/mcp/tools.js.map +1 -1
- package/dist/extensions/mcp/ui.d.ts +3 -3
- package/dist/extensions/mcp/ui.d.ts.map +1 -1
- package/dist/extensions/mcp/ui.js +10 -2
- package/dist/extensions/mcp/ui.js.map +1 -1
- package/dist/extensions/provider/keybindings.d.ts +2 -2
- package/dist/extensions/provider/keybindings.d.ts.map +1 -1
- package/dist/extensions/provider/keybindings.js.map +1 -1
- package/dist/extensions/search/code-search.d.ts +27 -0
- package/dist/extensions/search/code-search.d.ts.map +1 -0
- package/dist/extensions/search/code-search.js +120 -0
- package/dist/extensions/search/code-search.js.map +1 -0
- package/dist/extensions/search/command.d.ts +5 -0
- package/dist/extensions/search/command.d.ts.map +1 -0
- package/dist/extensions/search/command.js +69 -0
- package/dist/extensions/search/command.js.map +1 -0
- package/dist/extensions/search/credential.d.ts +25 -0
- package/dist/extensions/search/credential.d.ts.map +1 -0
- package/dist/extensions/search/credential.js +117 -0
- package/dist/extensions/search/credential.js.map +1 -0
- package/dist/extensions/search/devin.d.ts +34 -0
- package/dist/extensions/search/devin.d.ts.map +1 -0
- package/dist/extensions/search/devin.js +210 -0
- package/dist/extensions/search/devin.js.map +1 -0
- package/dist/extensions/search/index.d.ts +5 -0
- package/dist/extensions/search/index.d.ts.map +1 -0
- package/dist/extensions/search/index.js +113 -0
- package/dist/extensions/search/index.js.map +1 -0
- package/dist/extensions/search/panel.d.ts +53 -0
- package/dist/extensions/search/panel.d.ts.map +1 -0
- package/dist/extensions/search/panel.js +157 -0
- package/dist/extensions/search/panel.js.map +1 -0
- package/dist/extensions/search/prompt.d.ts +14 -0
- package/dist/extensions/search/prompt.d.ts.map +1 -0
- package/dist/extensions/search/prompt.js +221 -0
- package/dist/extensions/search/prompt.js.map +1 -0
- package/dist/extensions/search/render.d.ts +28 -0
- package/dist/extensions/search/render.d.ts.map +1 -0
- package/dist/extensions/search/render.js +86 -0
- package/dist/extensions/search/render.js.map +1 -0
- package/dist/extensions/search/workspace.d.ts +39 -0
- package/dist/extensions/search/workspace.d.ts.map +1 -0
- package/dist/extensions/search/workspace.js +363 -0
- package/dist/extensions/search/workspace.js.map +1 -0
- package/dist/extensions/tool-search/index.d.ts.map +1 -1
- package/dist/extensions/tool-search/index.js +1 -6
- package/dist/extensions/tool-search/index.js.map +1 -1
- package/dist/extensions/tool-search/tool.d.ts +0 -2
- package/dist/extensions/tool-search/tool.d.ts.map +1 -1
- package/dist/extensions/tool-search/tool.js +2 -4
- package/dist/extensions/tool-search/tool.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.js +3 -3
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts +5 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +14 -14
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts +2 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +5 -2
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +5 -2
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/custom-entry.d.ts +3 -1
- package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-entry.js +7 -2
- 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 +1 -0
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +4 -3
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +5 -2
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-indicator.js +2 -2
- package/dist/modes/interactive/components/status-indicator.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +63 -64
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/program-status-reporter.d.ts +34 -0
- package/dist/modes/interactive/program-status-reporter.d.ts.map +1 -0
- package/dist/modes/interactive/program-status-reporter.js +107 -0
- package/dist/modes/interactive/program-status-reporter.js.map +1 -0
- package/dist/modes/interactive/tasks/host-hooks.d.ts +14 -0
- package/dist/modes/interactive/tasks/host-hooks.d.ts.map +1 -0
- package/dist/modes/interactive/tasks/host-hooks.js +31 -0
- package/dist/modes/interactive/tasks/host-hooks.js.map +1 -0
- package/dist/modes/interactive/theme/dark.json +1 -1
- package/dist/modes/interactive/theme/light.json +1 -1
- package/dist/modes/interactive/theme/theme-schema.d.ts +28 -0
- package/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme-schema.js +105 -0
- package/dist/modes/interactive/theme/theme-schema.js.map +1 -0
- package/dist/modes/interactive/theme/theme-tokens.d.ts +257 -0
- package/dist/modes/interactive/theme/theme-tokens.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme-tokens.js +94 -0
- package/dist/modes/interactive/theme/theme-tokens.js.map +1 -0
- package/dist/modes/interactive/theme/theme.d.ts +13 -16
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +23 -31
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/interactive/tool-view/tool-execution.d.ts +5 -0
- package/dist/modes/interactive/tool-view/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/tool-view/tool-execution.js +7 -0
- package/dist/modes/interactive/tool-view/tool-execution.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +4 -0
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +24 -0
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/utils/ansi.d.ts +8 -0
- package/dist/utils/ansi.d.ts.map +1 -1
- package/dist/utils/ansi.js +30 -11
- package/dist/utils/ansi.js.map +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +18 -12
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/image-resize-core.d.ts +12 -0
- package/dist/utils/image-resize-core.d.ts.map +1 -1
- package/dist/utils/image-resize-core.js +5 -0
- package/dist/utils/image-resize-core.js.map +1 -1
- package/dist/utils/image-resize-worker.js +3 -2
- 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 +9 -10
- package/dist/utils/image-resize.js.map +1 -1
- package/docs/bundled/README.md +1 -1
- package/docs/bundled/extensions/provider.md +1 -1
- package/docs/bundled/extensions/question.md +1 -1
- package/docs/bundled/extensions/search.md +51 -0
- package/docs/bundled/extensions/statusline.md +15 -41
- package/docs/codemode.md +24 -4
- package/docs/compaction.md +2 -2
- package/docs/docs.json +0 -4
- package/docs/environment-variables.md +3 -1
- package/docs/extensions.md +15 -5
- package/docs/json.md +2 -2
- package/docs/keybindings.md +1 -0
- package/docs/llama-cpp.md +8 -1
- package/docs/mcp.md +1 -1
- package/docs/models.md +5 -1
- package/docs/providers.md +33 -0
- package/docs/rpc.md +6 -3
- package/docs/session-format.md +1 -0
- package/docs/settings.md +5 -5
- package/docs/terminal-setup.md +14 -0
- package/docs/themes.md +4 -2
- package/docs/tui.md +1 -1
- package/docs/usage.md +7 -3
- 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/dynamic-resources/dynamic.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/overlay-test.ts +2 -2
- package/examples/extensions/plan-mode/index.ts +6 -2
- 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/npm-shrinkwrap.json +54 -102
- package/package.json +10 -20
- package/schemas/keybindings.schema.json +453 -0
- package/schemas/models.schema.json +1157 -0
- package/schemas/settings.schema.json +782 -0
- package/schemas/theme.schema.json +365 -0
- package/dist/bundle/chunks/anthropic-messages-YIOJIMVL.js +0 -6
- package/dist/bundle/chunks/chunk-57XI7YJH.js +0 -2
- package/dist/bundle/chunks/chunk-JI4WGISU.js +0 -2
- package/dist/bundle/chunks/chunk-TCQ4HHQD.js +0 -2
- package/dist/bundle/chunks/chunk-TXJO4AJ7.js +0 -11
- package/dist/bundle/chunks/cloudflare-workers-ai-system-one-OWU5SM6J.js +0 -2
- package/dist/bundle/chunks/mistral-conversations-A2N5FSOV.js +0 -5
- package/dist/bundle/chunks/openai-codex-responses-Q6JHCWLE.js +0 -10
- package/dist/bundle/chunks/typesafe-system-one-KYKKNU3E.js +0 -2
- package/dist/extensions/web-search/auth.d.ts +0 -12
- package/dist/extensions/web-search/auth.d.ts.map +0 -1
- package/dist/extensions/web-search/auth.js +0 -90
- package/dist/extensions/web-search/auth.js.map +0 -1
- package/dist/extensions/web-search/constants.d.ts +0 -13
- package/dist/extensions/web-search/constants.d.ts.map +0 -1
- package/dist/extensions/web-search/constants.js +0 -26
- package/dist/extensions/web-search/constants.js.map +0 -1
- package/dist/extensions/web-search/execute.d.ts +0 -9
- package/dist/extensions/web-search/execute.d.ts.map +0 -1
- package/dist/extensions/web-search/execute.js +0 -96
- package/dist/extensions/web-search/execute.js.map +0 -1
- package/dist/extensions/web-search/format.d.ts +0 -21
- package/dist/extensions/web-search/format.d.ts.map +0 -1
- package/dist/extensions/web-search/format.js +0 -117
- package/dist/extensions/web-search/format.js.map +0 -1
- package/dist/extensions/web-search/index.d.ts +0 -6
- package/dist/extensions/web-search/index.d.ts.map +0 -1
- package/dist/extensions/web-search/index.js +0 -50
- package/dist/extensions/web-search/index.js.map +0 -1
- package/dist/extensions/web-search/providers/deepseek.d.ts +0 -13
- package/dist/extensions/web-search/providers/deepseek.d.ts.map +0 -1
- package/dist/extensions/web-search/providers/deepseek.js +0 -110
- package/dist/extensions/web-search/providers/deepseek.js.map +0 -1
- package/dist/extensions/web-search/providers/http.d.ts +0 -4
- package/dist/extensions/web-search/providers/http.d.ts.map +0 -1
- package/dist/extensions/web-search/providers/http.js +0 -42
- package/dist/extensions/web-search/providers/http.js.map +0 -1
- package/dist/extensions/web-search/providers/minimax.d.ts +0 -12
- package/dist/extensions/web-search/providers/minimax.d.ts.map +0 -1
- package/dist/extensions/web-search/providers/minimax.js +0 -61
- package/dist/extensions/web-search/providers/minimax.js.map +0 -1
- package/dist/extensions/web-search/render.d.ts +0 -15
- package/dist/extensions/web-search/render.d.ts.map +0 -1
- package/dist/extensions/web-search/render.js +0 -142
- package/dist/extensions/web-search/render.js.map +0 -1
- package/dist/extensions/web-search/results.d.ts +0 -35
- package/dist/extensions/web-search/results.d.ts.map +0 -1
- package/dist/extensions/web-search/results.js +0 -167
- package/dist/extensions/web-search/results.js.map +0 -1
- package/dist/extensions/web-search/schema.d.ts +0 -10
- package/dist/extensions/web-search/schema.d.ts.map +0 -1
- package/dist/extensions/web-search/schema.js +0 -36
- package/dist/extensions/web-search/schema.js.map +0 -1
- package/dist/extensions/web-search/types.d.ts +0 -51
- package/dist/extensions/web-search/types.d.ts.map +0 -1
- package/dist/extensions/web-search/types.js +0 -5
- package/dist/extensions/web-search/types.js.map +0 -1
- package/dist/modes/interactive/theme/theme-json.d.ts +0 -85
- package/dist/modes/interactive/theme/theme-json.d.ts.map +0 -1
- package/dist/modes/interactive/theme/theme-json.js +0 -132
- package/dist/modes/interactive/theme/theme-json.js.map +0 -1
- package/dist/modes/interactive/theme/theme-schema.json +0 -361
- package/docs/bundled/extensions/web-search.md +0 -46
- package/examples/plugins/pi-example-plugin/README.md +0 -38
- package/examples/plugins/pi-example-plugin/package.json +0 -10
- package/examples/plugins/pi-example-plugin/src/contract.ts +0 -13
- package/examples/plugins/pi-example-plugin/src/session.ts +0 -24
- package/examples/plugins/pi-example-plugin/src/tui.ts +0 -31
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ProgramStatus, Terminal } from "@earendil-works/pi-tui";
|
|
2
|
+
import type { AgentSessionEvent } from "../../core/agent-session.ts";
|
|
3
|
+
export type BlockedStatus = {
|
|
4
|
+
kind: NonNullable<ProgramStatus["kind"]>;
|
|
5
|
+
message: string;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Reports interactive-mode state to the terminal (OSC 7501): `working` during agent runs and
|
|
9
|
+
* compaction, `blocked` while a dialog waits for the user, then `done`, `error`, or `idle` once the run
|
|
10
|
+
* settles. Messages are limited to the session name, dialog titles, and the first line of errors; prompts
|
|
11
|
+
* and assistant output are never reported.
|
|
12
|
+
*/
|
|
13
|
+
export declare class ProgramStatusReporter {
|
|
14
|
+
private readonly getTerminal;
|
|
15
|
+
private readonly getSessionName;
|
|
16
|
+
private runActive;
|
|
17
|
+
private compacting;
|
|
18
|
+
/** Outcome of the current run, reported once it settles. */
|
|
19
|
+
private runResult;
|
|
20
|
+
/** Status while no run is active. */
|
|
21
|
+
private restingStatus;
|
|
22
|
+
/** Open dialogs by source, in the order they opened. The most recent one is reported. */
|
|
23
|
+
private readonly blocked;
|
|
24
|
+
private lastReport;
|
|
25
|
+
constructor(getTerminal: () => Terminal, getSessionName: () => string | undefined);
|
|
26
|
+
handleEvent(event: AgentSessionEvent): void;
|
|
27
|
+
/** Report `blocked` for a dialog until it is cleared with `undefined`. Reopening a source replaces it. */
|
|
28
|
+
setBlocked(source: string, status: BlockedStatus | undefined): void;
|
|
29
|
+
/** Forget the previous session's run, for example after switching sessions. */
|
|
30
|
+
reset(): void;
|
|
31
|
+
report(): void;
|
|
32
|
+
private currentStatus;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=program-status-reporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"program-status-reporter.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/program-status-reporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEtE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,WAAW,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAM1F;;;;;GAKG;AACH,qBAAa,qBAAqB;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiB;IAC7C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA2B;IAC1D,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,4DAA4D;IAC5D,OAAO,CAAC,SAAS,CAAoC;IACrD,qCAAqC;IACrC,OAAO,CAAC,aAAa,CAAoC;IACzD,yFAAyF;IACzF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,OAAO,CAAC,UAAU,CAAqB;gBAE3B,WAAW,EAAE,MAAM,QAAQ,EAAE,cAAc,EAAE,MAAM,MAAM,GAAG,SAAS;IAKjF,WAAW,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IA4C3C,0GAA0G;IAC1G,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,SAAS,GAAG,IAAI;IAMnE,+EAA+E;IAC/E,KAAK,IAAI,IAAI;IAQb,MAAM,IAAI,IAAI;IAQd,OAAO,CAAC,aAAa;CAQrB"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { APP_NAME } from "../../config.js";
|
|
2
|
+
function firstLine(text) {
|
|
3
|
+
return text?.split(/\r?\n/, 1)[0]?.trim() || "Error";
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Reports interactive-mode state to the terminal (OSC 7501): `working` during agent runs and
|
|
7
|
+
* compaction, `blocked` while a dialog waits for the user, then `done`, `error`, or `idle` once the run
|
|
8
|
+
* settles. Messages are limited to the session name, dialog titles, and the first line of errors; prompts
|
|
9
|
+
* and assistant output are never reported.
|
|
10
|
+
*/
|
|
11
|
+
export class ProgramStatusReporter {
|
|
12
|
+
constructor(getTerminal, getSessionName) {
|
|
13
|
+
this.runActive = false;
|
|
14
|
+
this.compacting = false;
|
|
15
|
+
/** Outcome of the current run, reported once it settles. */
|
|
16
|
+
this.runResult = { state: "done" };
|
|
17
|
+
/** Status while no run is active. */
|
|
18
|
+
this.restingStatus = { state: "idle" };
|
|
19
|
+
/** Open dialogs by source, in the order they opened. The most recent one is reported. */
|
|
20
|
+
this.blocked = new Map();
|
|
21
|
+
this.getTerminal = getTerminal;
|
|
22
|
+
this.getSessionName = getSessionName;
|
|
23
|
+
}
|
|
24
|
+
handleEvent(event) {
|
|
25
|
+
switch (event.type) {
|
|
26
|
+
case "agent_start":
|
|
27
|
+
this.runActive = true;
|
|
28
|
+
this.runResult = { state: "done" };
|
|
29
|
+
break;
|
|
30
|
+
case "message_end":
|
|
31
|
+
// The latest response decides the outcome, so a retried error is replaced by its successful retry.
|
|
32
|
+
if (event.message.role !== "assistant")
|
|
33
|
+
return;
|
|
34
|
+
this.runResult =
|
|
35
|
+
event.message.stopReason === "error"
|
|
36
|
+
? { state: "error", message: firstLine(event.message.errorMessage) }
|
|
37
|
+
: { state: "done" };
|
|
38
|
+
break;
|
|
39
|
+
case "compaction_start":
|
|
40
|
+
this.compacting = true;
|
|
41
|
+
break;
|
|
42
|
+
case "compaction_end":
|
|
43
|
+
this.compacting = false;
|
|
44
|
+
if (this.runActive) {
|
|
45
|
+
// A failed recovery compaction ends the run unless a later response succeeds.
|
|
46
|
+
if (event.aborted)
|
|
47
|
+
this.runResult = { state: "idle" };
|
|
48
|
+
else if (event.errorMessage)
|
|
49
|
+
this.runResult = { state: "error", message: firstLine(event.errorMessage) };
|
|
50
|
+
}
|
|
51
|
+
else if (event.aborted) {
|
|
52
|
+
this.restingStatus = { state: "idle" };
|
|
53
|
+
}
|
|
54
|
+
else if (event.reason === "manual") {
|
|
55
|
+
this.restingStatus = event.errorMessage
|
|
56
|
+
? { state: "error", message: firstLine(event.errorMessage) }
|
|
57
|
+
: { state: "done" };
|
|
58
|
+
}
|
|
59
|
+
break;
|
|
60
|
+
case "agent_settled":
|
|
61
|
+
this.runActive = false;
|
|
62
|
+
this.restingStatus = event.aborted ? { state: "idle" } : this.runResult;
|
|
63
|
+
break;
|
|
64
|
+
case "session_info_changed":
|
|
65
|
+
// The session name is part of working and done reports.
|
|
66
|
+
break;
|
|
67
|
+
default:
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
this.report();
|
|
71
|
+
}
|
|
72
|
+
/** Report `blocked` for a dialog until it is cleared with `undefined`. Reopening a source replaces it. */
|
|
73
|
+
setBlocked(source, status) {
|
|
74
|
+
this.blocked.delete(source);
|
|
75
|
+
if (status)
|
|
76
|
+
this.blocked.set(source, status);
|
|
77
|
+
this.report();
|
|
78
|
+
}
|
|
79
|
+
/** Forget the previous session's run, for example after switching sessions. */
|
|
80
|
+
reset() {
|
|
81
|
+
this.runActive = false;
|
|
82
|
+
this.compacting = false;
|
|
83
|
+
this.runResult = { state: "done" };
|
|
84
|
+
this.restingStatus = { state: "idle" };
|
|
85
|
+
this.report();
|
|
86
|
+
}
|
|
87
|
+
report() {
|
|
88
|
+
const status = { ...this.currentStatus(), app: APP_NAME };
|
|
89
|
+
const key = JSON.stringify(status);
|
|
90
|
+
if (key === this.lastReport)
|
|
91
|
+
return;
|
|
92
|
+
this.lastReport = key;
|
|
93
|
+
this.getTerminal().setProgramStatus(status);
|
|
94
|
+
}
|
|
95
|
+
currentStatus() {
|
|
96
|
+
const blocked = [...this.blocked.values()].at(-1);
|
|
97
|
+
if (blocked)
|
|
98
|
+
return { state: "blocked", ...blocked };
|
|
99
|
+
if (this.compacting)
|
|
100
|
+
return { state: "working", message: "Compacting context" };
|
|
101
|
+
const status = this.runActive ? { state: "working" } : this.restingStatus;
|
|
102
|
+
if (status.state === "working" || status.state === "done")
|
|
103
|
+
return { ...status, message: this.getSessionName() };
|
|
104
|
+
return status;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=program-status-reporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"program-status-reporter.js","sourceRoot":"","sources":["../../../src/modes/interactive/program-status-reporter.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ProgramStatus, Terminal } from \"@earendil-works/pi-tui\";\nimport { APP_NAME } from \"../../config.ts\";\nimport type { AgentSessionEvent } from \"../../core/agent-session.ts\";\n\nexport type BlockedStatus = { kind: NonNullable<ProgramStatus[\"kind\"]>; message: string };\n\nfunction firstLine(text: string | undefined): string {\n\treturn text?.split(/\\r?\\n/, 1)[0]?.trim() || \"Error\";\n}\n\n/**\n * Reports interactive-mode state to the terminal (OSC 7501): `working` during agent runs and\n * compaction, `blocked` while a dialog waits for the user, then `done`, `error`, or `idle` once the run\n * settles. Messages are limited to the session name, dialog titles, and the first line of errors; prompts\n * and assistant output are never reported.\n */\nexport class ProgramStatusReporter {\n\tprivate readonly getTerminal: () => Terminal;\n\tprivate readonly getSessionName: () => string | undefined;\n\tprivate runActive = false;\n\tprivate compacting = false;\n\t/** Outcome of the current run, reported once it settles. */\n\tprivate runResult: ProgramStatus = { state: \"done\" };\n\t/** Status while no run is active. */\n\tprivate restingStatus: ProgramStatus = { state: \"idle\" };\n\t/** Open dialogs by source, in the order they opened. The most recent one is reported. */\n\tprivate readonly blocked = new Map<string, BlockedStatus>();\n\tprivate lastReport: string | undefined;\n\n\tconstructor(getTerminal: () => Terminal, getSessionName: () => string | undefined) {\n\t\tthis.getTerminal = getTerminal;\n\t\tthis.getSessionName = getSessionName;\n\t}\n\n\thandleEvent(event: AgentSessionEvent): void {\n\t\tswitch (event.type) {\n\t\t\tcase \"agent_start\":\n\t\t\t\tthis.runActive = true;\n\t\t\t\tthis.runResult = { state: \"done\" };\n\t\t\t\tbreak;\n\t\t\tcase \"message_end\":\n\t\t\t\t// The latest response decides the outcome, so a retried error is replaced by its successful retry.\n\t\t\t\tif (event.message.role !== \"assistant\") return;\n\t\t\t\tthis.runResult =\n\t\t\t\t\tevent.message.stopReason === \"error\"\n\t\t\t\t\t\t? { state: \"error\", message: firstLine(event.message.errorMessage) }\n\t\t\t\t\t\t: { state: \"done\" };\n\t\t\t\tbreak;\n\t\t\tcase \"compaction_start\":\n\t\t\t\tthis.compacting = true;\n\t\t\t\tbreak;\n\t\t\tcase \"compaction_end\":\n\t\t\t\tthis.compacting = false;\n\t\t\t\tif (this.runActive) {\n\t\t\t\t\t// A failed recovery compaction ends the run unless a later response succeeds.\n\t\t\t\t\tif (event.aborted) this.runResult = { state: \"idle\" };\n\t\t\t\t\telse if (event.errorMessage) this.runResult = { state: \"error\", message: firstLine(event.errorMessage) };\n\t\t\t\t} else if (event.aborted) {\n\t\t\t\t\tthis.restingStatus = { state: \"idle\" };\n\t\t\t\t} else if (event.reason === \"manual\") {\n\t\t\t\t\tthis.restingStatus = event.errorMessage\n\t\t\t\t\t\t? { state: \"error\", message: firstLine(event.errorMessage) }\n\t\t\t\t\t\t: { state: \"done\" };\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"agent_settled\":\n\t\t\t\tthis.runActive = false;\n\t\t\t\tthis.restingStatus = event.aborted ? { state: \"idle\" } : this.runResult;\n\t\t\t\tbreak;\n\t\t\tcase \"session_info_changed\":\n\t\t\t\t// The session name is part of working and done reports.\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\t\tthis.report();\n\t}\n\n\t/** Report `blocked` for a dialog until it is cleared with `undefined`. Reopening a source replaces it. */\n\tsetBlocked(source: string, status: BlockedStatus | undefined): void {\n\t\tthis.blocked.delete(source);\n\t\tif (status) this.blocked.set(source, status);\n\t\tthis.report();\n\t}\n\n\t/** Forget the previous session's run, for example after switching sessions. */\n\treset(): void {\n\t\tthis.runActive = false;\n\t\tthis.compacting = false;\n\t\tthis.runResult = { state: \"done\" };\n\t\tthis.restingStatus = { state: \"idle\" };\n\t\tthis.report();\n\t}\n\n\treport(): void {\n\t\tconst status: ProgramStatus = { ...this.currentStatus(), app: APP_NAME };\n\t\tconst key = JSON.stringify(status);\n\t\tif (key === this.lastReport) return;\n\t\tthis.lastReport = key;\n\t\tthis.getTerminal().setProgramStatus(status);\n\t}\n\n\tprivate currentStatus(): ProgramStatus {\n\t\tconst blocked = [...this.blocked.values()].at(-1);\n\t\tif (blocked) return { state: \"blocked\", ...blocked };\n\t\tif (this.compacting) return { state: \"working\", message: \"Compacting context\" };\n\t\tconst status = this.runActive ? { state: \"working\" as const } : this.restingStatus;\n\t\tif (status.state === \"working\" || status.state === \"done\") return { ...status, message: this.getSessionName() };\n\t\treturn status;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type AppKeybinding } from "../../../core/keybindings.ts";
|
|
2
|
+
import type { TaskSnapshot } from "../../../core/tasks/types.ts";
|
|
3
|
+
/**
|
|
4
|
+
* Task rows for `/hotkeys`. Task keybindings act outside the editor, so they never showed up in
|
|
5
|
+
* the editor-driven sections; labels come from KEYBINDINGS so the table cannot drift from the
|
|
6
|
+
* binding registry.
|
|
7
|
+
*/
|
|
8
|
+
export declare function hotkeysTaskSection(display: (action: AppKeybinding) => string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Ask before tree navigation cancels running tasks: results are saved on their launch branch,
|
|
11
|
+
* so leaving it stops them. Resolves true when navigation may continue.
|
|
12
|
+
*/
|
|
13
|
+
export declare function confirmStopBranchTasks(stopped: readonly TaskSnapshot[], confirm: (title: string, message: string) => Promise<boolean>): Promise<boolean>;
|
|
14
|
+
//# sourceMappingURL=host-hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-hooks.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/tasks/host-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,aAAa,EAAe,MAAM,8BAA8B,CAAC;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAGjE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,MAAM,GAAG,MAAM,CAUrF;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC3C,OAAO,EAAE,SAAS,YAAY,EAAE,EAChC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAC3D,OAAO,CAAC,OAAO,CAAC,CAQlB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { KEYBINDINGS } from "../../../core/keybindings.js";
|
|
2
|
+
import { cleanTaskText, firstCommandLine } from "./text.js";
|
|
3
|
+
/**
|
|
4
|
+
* Task rows for `/hotkeys`. Task keybindings act outside the editor, so they never showed up in
|
|
5
|
+
* the editor-driven sections; labels come from KEYBINDINGS so the table cannot drift from the
|
|
6
|
+
* binding registry.
|
|
7
|
+
*/
|
|
8
|
+
export function hotkeysTaskSection(display) {
|
|
9
|
+
const detach = KEYBINDINGS["app.tasks.detach"];
|
|
10
|
+
const detachSelected = KEYBINDINGS["app.tasks.detachSelected"];
|
|
11
|
+
return `
|
|
12
|
+
**Tasks**
|
|
13
|
+
| Key | Action |
|
|
14
|
+
|-----|--------|
|
|
15
|
+
| \`${display("app.tasks.detach")}\` | ${detach.description} |
|
|
16
|
+
| \`${display("app.tasks.detachSelected")}\` | ${detachSelected.description} (while /tasks is open) |
|
|
17
|
+
`;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Ask before tree navigation cancels running tasks: results are saved on their launch branch,
|
|
21
|
+
* so leaving it stops them. Resolves true when navigation may continue.
|
|
22
|
+
*/
|
|
23
|
+
export async function confirmStopBranchTasks(stopped, confirm) {
|
|
24
|
+
if (stopped.length === 0)
|
|
25
|
+
return true;
|
|
26
|
+
const shown = stopped.slice(0, 5).map((task) => ` ${cleanTaskText(firstCommandLine(task.command ?? task.title))}`);
|
|
27
|
+
if (stopped.length > shown.length)
|
|
28
|
+
shown.push(` …and ${stopped.length - shown.length} more`);
|
|
29
|
+
return confirm(`Stop ${stopped.length} running task${stopped.length === 1 ? "" : "s"}?`, `They were started on the branch you are leaving and will be cancelled:\n${shown.join("\n")}`);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=host-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-hooks.js","sourceRoot":"","sources":["../../../../src/modes/interactive/tasks/host-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE/E,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE5D;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAA0C;IAC5E,MAAM,MAAM,GAAG,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAC/C,MAAM,cAAc,GAAG,WAAW,CAAC,0BAA0B,CAAC,CAAC;IAC/D,OAAO;;;;MAIF,OAAO,CAAC,kBAAkB,CAAC,QAAQ,MAAM,CAAC,WAAW;MACrD,OAAO,CAAC,0BAA0B,CAAC,QAAQ,cAAc,CAAC,WAAW;CAC1E,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC3C,OAAgC,EAChC,OAA6D;IAE7D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,aAAa,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IACpH,IAAI,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,OAAO,CAAC,CAAC;IAC9F,OAAO,OAAO,CACb,QAAQ,OAAO,CAAC,MAAM,gBAAgB,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,EACxE,2EAA2E,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7F,CAAC;AACH,CAAC","sourcesContent":["import { type AppKeybinding, KEYBINDINGS } from \"../../../core/keybindings.ts\";\nimport type { TaskSnapshot } from \"../../../core/tasks/types.ts\";\nimport { cleanTaskText, firstCommandLine } from \"./text.ts\";\n\n/**\n * Task rows for `/hotkeys`. Task keybindings act outside the editor, so they never showed up in\n * the editor-driven sections; labels come from KEYBINDINGS so the table cannot drift from the\n * binding registry.\n */\nexport function hotkeysTaskSection(display: (action: AppKeybinding) => string): string {\n\tconst detach = KEYBINDINGS[\"app.tasks.detach\"];\n\tconst detachSelected = KEYBINDINGS[\"app.tasks.detachSelected\"];\n\treturn `\n**Tasks**\n| Key | Action |\n|-----|--------|\n| \\`${display(\"app.tasks.detach\")}\\` | ${detach.description} |\n| \\`${display(\"app.tasks.detachSelected\")}\\` | ${detachSelected.description} (while /tasks is open) |\n`;\n}\n\n/**\n * Ask before tree navigation cancels running tasks: results are saved on their launch branch,\n * so leaving it stops them. Resolves true when navigation may continue.\n */\nexport async function confirmStopBranchTasks(\n\tstopped: readonly TaskSnapshot[],\n\tconfirm: (title: string, message: string) => Promise<boolean>,\n): Promise<boolean> {\n\tif (stopped.length === 0) return true;\n\tconst shown = stopped.slice(0, 5).map((task) => ` ${cleanTaskText(firstCommandLine(task.command ?? task.title))}`);\n\tif (stopped.length > shown.length) shown.push(` …and ${stopped.length - shown.length} more`);\n\treturn confirm(\n\t\t`Stop ${stopped.length} running task${stopped.length === 1 ? \"\" : \"s\"}?`,\n\t\t`They were started on the branch you are leaving and will be cancelled:\\n${shown.join(\"\\n\")}`,\n\t);\n}\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme JSON validation, kept out of `theme.ts` on purpose.
|
|
3
|
+
*
|
|
4
|
+
* Validating user-authored theme files needs typebox, which costs ~17 MB of module graph to import.
|
|
5
|
+
* Palette lookup does not, so a presentation that only uses built-in themes should never pay for it.
|
|
6
|
+
* `main.ts` installs this validator before runtime resource loading; other consumers can opt in with
|
|
7
|
+
* `setThemeJsonValidator()`. Built-in themes do not need validation.
|
|
8
|
+
*/
|
|
9
|
+
import { type Static, Type } from "typebox";
|
|
10
|
+
import { type ThemeColorValues } from "./theme-tokens.ts";
|
|
11
|
+
export declare const ColorValueSchema: Type.TUnion<[Type.TString, Type.TInteger]>;
|
|
12
|
+
export type ThemeColorValue = Static<typeof ColorValueSchema>;
|
|
13
|
+
export declare const ThemeJsonSchema: Type.TObject<{
|
|
14
|
+
$schema: Type.TOptional<Type.TString>;
|
|
15
|
+
name: Type.TString;
|
|
16
|
+
appearance: Type.TOptional<Type.TUnion<[Type.TLiteral<"dark">, Type.TLiteral<"light">]>>;
|
|
17
|
+
vars: Type.TOptional<Type.TRecord<"^.*$", Type.TUnion<[Type.TString, Type.TInteger]>>>;
|
|
18
|
+
colors: Type.TUnsafe<ThemeColorValues<string | number>>;
|
|
19
|
+
export: Type.TOptional<Type.TObject<{
|
|
20
|
+
pageBg: Type.TOptional<Type.TUnion<[Type.TString, Type.TInteger]>>;
|
|
21
|
+
cardBg: Type.TOptional<Type.TUnion<[Type.TString, Type.TInteger]>>;
|
|
22
|
+
infoBg: Type.TOptional<Type.TUnion<[Type.TString, Type.TInteger]>>;
|
|
23
|
+
}>>;
|
|
24
|
+
}>;
|
|
25
|
+
export type ValidatedThemeJson = Static<typeof ThemeJsonSchema>;
|
|
26
|
+
/** Validate one theme document, throwing a message that names the offending tokens. */
|
|
27
|
+
export declare function validateThemeJson(label: string, json: unknown): ValidatedThemeJson;
|
|
28
|
+
//# sourceMappingURL=theme-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-schema.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/theme/theme-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,MAAM,EAAoB,IAAI,EAAE,MAAM,SAAS,CAAC;AAE9D,OAAO,EAAgB,KAAK,gBAAgB,EAA8B,MAAM,mBAAmB,CAAC;AAmBpG,eAAO,MAAM,gBAAgB,4CAAe,CAAC;AAE7C,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAmB9D,eAAO,MAAM,eAAe;;;;;;;;;;;EAsC3B,CAAC;AAIF,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AAEhE,uFAAuF;AACvF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,kBAAkB,CAiDlF"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Theme JSON validation, kept out of `theme.ts` on purpose.
|
|
3
|
+
*
|
|
4
|
+
* Validating user-authored theme files needs typebox, which costs ~17 MB of module graph to import.
|
|
5
|
+
* Palette lookup does not, so a presentation that only uses built-in themes should never pay for it.
|
|
6
|
+
* `main.ts` installs this validator before runtime resource loading; other consumers can opt in with
|
|
7
|
+
* `setThemeJsonValidator()`. Built-in themes do not need validation.
|
|
8
|
+
*/
|
|
9
|
+
import { Type } from "typebox";
|
|
10
|
+
import { Compile } from "typebox/compile";
|
|
11
|
+
import { THEME_TOKENS } from "./theme-tokens.js";
|
|
12
|
+
function colorValue(description) {
|
|
13
|
+
return Type.Union([
|
|
14
|
+
Type.String({
|
|
15
|
+
description: "Hex color (#RGB or #RRGGBB), OKLCH or OKHSL color, variable reference, or empty string for terminal default",
|
|
16
|
+
}),
|
|
17
|
+
Type.Integer({
|
|
18
|
+
minimum: 0,
|
|
19
|
+
maximum: 255,
|
|
20
|
+
description: "256-color palette index (0-255)",
|
|
21
|
+
}),
|
|
22
|
+
], description ? { description } : {});
|
|
23
|
+
}
|
|
24
|
+
export const ColorValueSchema = colorValue();
|
|
25
|
+
function themeTokenProperties(tokens) {
|
|
26
|
+
const properties = {};
|
|
27
|
+
for (const [name, descriptor] of Object.entries(tokens)) {
|
|
28
|
+
const schema = colorValue(descriptor.description);
|
|
29
|
+
properties[name] = descriptor.fallback === undefined ? schema : Type.Optional(schema);
|
|
30
|
+
}
|
|
31
|
+
return properties;
|
|
32
|
+
}
|
|
33
|
+
const ThemeColorsSchema = Type.Unsafe(Type.Object(themeTokenProperties(THEME_TOKENS), {
|
|
34
|
+
description: "Theme color definitions (scrollbar, thinkingMax, and search highlight colors are optional and use compatible fallbacks)",
|
|
35
|
+
additionalProperties: false,
|
|
36
|
+
}));
|
|
37
|
+
export const ThemeJsonSchema = Type.Object({
|
|
38
|
+
$schema: Type.Optional(Type.String({ description: "JSON schema reference" })),
|
|
39
|
+
name: Type.String({
|
|
40
|
+
pattern: "^[^/]+$",
|
|
41
|
+
description: "Theme name. Must not contain '/' because it is reserved for automatic light/dark theme settings.",
|
|
42
|
+
}),
|
|
43
|
+
appearance: Type.Optional(Type.Union([Type.Literal("dark"), Type.Literal("light")], {
|
|
44
|
+
description: "Background the theme is designed for. Detected from the theme colors when omitted.",
|
|
45
|
+
})),
|
|
46
|
+
vars: Type.Optional(Type.Record(Type.String(), ColorValueSchema, {
|
|
47
|
+
description: "Reusable color variables",
|
|
48
|
+
})),
|
|
49
|
+
colors: ThemeColorsSchema,
|
|
50
|
+
export: Type.Optional(Type.Object({
|
|
51
|
+
pageBg: Type.Optional(colorValue("Page background color")),
|
|
52
|
+
cardBg: Type.Optional(colorValue("Card/container background color")),
|
|
53
|
+
infoBg: Type.Optional(colorValue("Info sections background (system prompt, notices)")),
|
|
54
|
+
}, {
|
|
55
|
+
description: "Optional colors for HTML export (defaults derived from userMessageBg if not specified)",
|
|
56
|
+
additionalProperties: false,
|
|
57
|
+
})),
|
|
58
|
+
}, {
|
|
59
|
+
title: "Pi Coding Agent Theme",
|
|
60
|
+
description: "Theme schema for Pi coding agent",
|
|
61
|
+
additionalProperties: false,
|
|
62
|
+
});
|
|
63
|
+
const compiledThemeSchema = Compile(ThemeJsonSchema);
|
|
64
|
+
/** Validate one theme document, throwing a message that names the offending tokens. */
|
|
65
|
+
export function validateThemeJson(label, json) {
|
|
66
|
+
if (typeof json === "object" &&
|
|
67
|
+
json !== null &&
|
|
68
|
+
"name" in json &&
|
|
69
|
+
typeof json.name === "string" &&
|
|
70
|
+
json.name.includes("/")) {
|
|
71
|
+
throw new Error(`Invalid theme name "${json.name}": theme names cannot contain "/" because it is reserved for automatic light/dark theme settings.`);
|
|
72
|
+
}
|
|
73
|
+
if (!compiledThemeSchema.Check(json)) {
|
|
74
|
+
const errors = Array.from(compiledThemeSchema.Errors(json));
|
|
75
|
+
const missingColors = new Set();
|
|
76
|
+
const otherErrors = [];
|
|
77
|
+
for (const error of errors) {
|
|
78
|
+
if (error.keyword === "required" && error.instancePath === "/colors") {
|
|
79
|
+
const requiredProperties = error.params.requiredProperties;
|
|
80
|
+
for (const requiredProperty of requiredProperties ?? []) {
|
|
81
|
+
missingColors.add(requiredProperty);
|
|
82
|
+
}
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
const path = error.instancePath || "/";
|
|
86
|
+
otherErrors.push(` - ${path}: ${error.message}`);
|
|
87
|
+
}
|
|
88
|
+
let errorMessage = `Invalid theme "${label}":\n`;
|
|
89
|
+
if (missingColors.size > 0) {
|
|
90
|
+
errorMessage += "\nMissing required color tokens:\n";
|
|
91
|
+
errorMessage += Array.from(missingColors)
|
|
92
|
+
.sort()
|
|
93
|
+
.map((color) => ` - ${color}`)
|
|
94
|
+
.join("\n");
|
|
95
|
+
errorMessage += '\n\nPlease add these colors to your theme\'s "colors" object.';
|
|
96
|
+
errorMessage += "\nSee the built-in themes (dark.json, light.json) for reference values.";
|
|
97
|
+
}
|
|
98
|
+
if (otherErrors.length > 0) {
|
|
99
|
+
errorMessage += `\n\nOther errors:\n${otherErrors.join("\n")}`;
|
|
100
|
+
}
|
|
101
|
+
throw new Error(errorMessage);
|
|
102
|
+
}
|
|
103
|
+
return json;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=theme-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-schema.js","sourceRoot":"","sources":["../../../../src/modes/interactive/theme/theme-schema.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Theme JSON validation, kept out of `theme.ts` on purpose.\n *\n * Validating user-authored theme files needs typebox, which costs ~17 MB of module graph to import.\n * Palette lookup does not, so a presentation that only uses built-in themes should never pay for it.\n * `main.ts` installs this validator before runtime resource loading; other consumers can opt in with\n * `setThemeJsonValidator()`. Built-in themes do not need validation.\n */\n\nimport { type Static, type TProperties, Type } from \"typebox\";\nimport { Compile } from \"typebox/compile\";\nimport { THEME_TOKENS, type ThemeColorValues, type ThemeTokenDescriptors } from \"./theme-tokens.ts\";\n\nfunction colorValue(description?: string) {\n\treturn Type.Union(\n\t\t[\n\t\t\tType.String({\n\t\t\t\tdescription:\n\t\t\t\t\t\"Hex color (#RGB or #RRGGBB), OKLCH or OKHSL color, variable reference, or empty string for terminal default\",\n\t\t\t}),\n\t\t\tType.Integer({\n\t\t\t\tminimum: 0,\n\t\t\t\tmaximum: 255,\n\t\t\t\tdescription: \"256-color palette index (0-255)\",\n\t\t\t}),\n\t\t],\n\t\tdescription ? { description } : {},\n\t);\n}\n\nexport const ColorValueSchema = colorValue();\n\nexport type ThemeColorValue = Static<typeof ColorValueSchema>;\n\nfunction themeTokenProperties(tokens: ThemeTokenDescriptors): TProperties {\n\tconst properties: TProperties = {};\n\tfor (const [name, descriptor] of Object.entries(tokens)) {\n\t\tconst schema = colorValue(descriptor.description);\n\t\tproperties[name] = descriptor.fallback === undefined ? schema : Type.Optional(schema);\n\t}\n\treturn properties;\n}\n\nconst ThemeColorsSchema = Type.Unsafe<ThemeColorValues<ThemeColorValue>>(\n\tType.Object(themeTokenProperties(THEME_TOKENS), {\n\t\tdescription:\n\t\t\t\"Theme color definitions (scrollbar, thinkingMax, and search highlight colors are optional and use compatible fallbacks)\",\n\t\tadditionalProperties: false,\n\t}),\n);\n\nexport const ThemeJsonSchema = Type.Object(\n\t{\n\t\t$schema: Type.Optional(Type.String({ description: \"JSON schema reference\" })),\n\t\tname: Type.String({\n\t\t\tpattern: \"^[^/]+$\",\n\t\t\tdescription:\n\t\t\t\t\"Theme name. Must not contain '/' because it is reserved for automatic light/dark theme settings.\",\n\t\t}),\n\t\tappearance: Type.Optional(\n\t\t\tType.Union([Type.Literal(\"dark\"), Type.Literal(\"light\")], {\n\t\t\t\tdescription: \"Background the theme is designed for. Detected from the theme colors when omitted.\",\n\t\t\t}),\n\t\t),\n\t\tvars: Type.Optional(\n\t\t\tType.Record(Type.String(), ColorValueSchema, {\n\t\t\t\tdescription: \"Reusable color variables\",\n\t\t\t}),\n\t\t),\n\t\tcolors: ThemeColorsSchema,\n\t\texport: Type.Optional(\n\t\t\tType.Object(\n\t\t\t\t{\n\t\t\t\t\tpageBg: Type.Optional(colorValue(\"Page background color\")),\n\t\t\t\t\tcardBg: Type.Optional(colorValue(\"Card/container background color\")),\n\t\t\t\t\tinfoBg: Type.Optional(colorValue(\"Info sections background (system prompt, notices)\")),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdescription: \"Optional colors for HTML export (defaults derived from userMessageBg if not specified)\",\n\t\t\t\t\tadditionalProperties: false,\n\t\t\t\t},\n\t\t\t),\n\t\t),\n\t},\n\t{\n\t\ttitle: \"Pi Coding Agent Theme\",\n\t\tdescription: \"Theme schema for Pi coding agent\",\n\t\tadditionalProperties: false,\n\t},\n);\n\nconst compiledThemeSchema = Compile(ThemeJsonSchema);\n\nexport type ValidatedThemeJson = Static<typeof ThemeJsonSchema>;\n\n/** Validate one theme document, throwing a message that names the offending tokens. */\nexport function validateThemeJson(label: string, json: unknown): ValidatedThemeJson {\n\tif (\n\t\ttypeof json === \"object\" &&\n\t\tjson !== null &&\n\t\t\"name\" in json &&\n\t\ttypeof json.name === \"string\" &&\n\t\tjson.name.includes(\"/\")\n\t) {\n\t\tthrow new Error(\n\t\t\t`Invalid theme name \"${json.name}\": theme names cannot contain \"/\" because it is reserved for automatic light/dark theme settings.`,\n\t\t);\n\t}\n\n\tif (!compiledThemeSchema.Check(json)) {\n\t\tconst errors = Array.from(compiledThemeSchema.Errors(json));\n\t\tconst missingColors = new Set<string>();\n\t\tconst otherErrors: string[] = [];\n\n\t\tfor (const error of errors) {\n\t\t\tif (error.keyword === \"required\" && error.instancePath === \"/colors\") {\n\t\t\t\tconst requiredProperties = (error.params as { requiredProperties?: string[] }).requiredProperties;\n\t\t\t\tfor (const requiredProperty of requiredProperties ?? []) {\n\t\t\t\t\tmissingColors.add(requiredProperty);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst path = error.instancePath || \"/\";\n\t\t\totherErrors.push(` - ${path}: ${error.message}`);\n\t\t}\n\n\t\tlet errorMessage = `Invalid theme \"${label}\":\\n`;\n\t\tif (missingColors.size > 0) {\n\t\t\terrorMessage += \"\\nMissing required color tokens:\\n\";\n\t\t\terrorMessage += Array.from(missingColors)\n\t\t\t\t.sort()\n\t\t\t\t.map((color) => ` - ${color}`)\n\t\t\t\t.join(\"\\n\");\n\t\t\terrorMessage += '\\n\\nPlease add these colors to your theme\\'s \"colors\" object.';\n\t\t\terrorMessage += \"\\nSee the built-in themes (dark.json, light.json) for reference values.\";\n\t\t}\n\t\tif (otherErrors.length > 0) {\n\t\t\terrorMessage += `\\n\\nOther errors:\\n${otherErrors.join(\"\\n\")}`;\n\t\t}\n\n\t\tthrow new Error(errorMessage);\n\t}\n\n\treturn json as ValidatedThemeJson;\n}\n"]}
|