catui-agent 1.0.0-beta.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/LICENSE +674 -0
- package/README.md +267 -0
- package/dist/build-meta.json +6 -0
- package/dist/builtin-extensions.d.ts +47 -0
- package/dist/builtin-extensions.js +1 -0
- package/dist/catui-defaults.d.ts +555 -0
- package/dist/catui-defaults.js +22 -0
- package/dist/cli/args.d.ts +70 -0
- package/dist/cli/args.js +158 -0
- package/dist/cli/config-selector.d.ts +10 -0
- package/dist/cli/config-selector.js +1 -0
- package/dist/cli/file-processor.d.ts +11 -0
- package/dist/cli/file-processor.js +6 -0
- package/dist/cli/list-models.d.ts +12 -0
- package/dist/cli/list-models.js +2 -0
- package/dist/cli/session-picker.d.ts +5 -0
- package/dist/cli/session-picker.js +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +2 -0
- package/dist/config.d.ts +103 -0
- package/dist/config.js +1 -0
- package/dist/core/agent-dir/agent-dir-context.d.ts +60 -0
- package/dist/core/agent-dir/agent-dir-context.js +1 -0
- package/dist/core/agent-dir/agent-metadata.d.ts +48 -0
- package/dist/core/agent-dir/agent-metadata.js +1 -0
- package/dist/core/agent-dir/migration-tool.d.ts +40 -0
- package/dist/core/agent-dir/migration-tool.js +7 -0
- package/dist/core/export-html/AGENT.md +12 -0
- package/dist/core/export-html/ansi-to-html.d.ts +9 -0
- package/dist/core/export-html/ansi-to-html.js +2 -0
- package/dist/core/export-html/index.d.ts +39 -0
- package/dist/core/export-html/index.js +2 -0
- package/dist/core/export-html/template.css +971 -0
- package/dist/core/export-html/template.html +54 -0
- package/dist/core/export-html/template.js +66 -0
- package/dist/core/export-html/tool-renderer.d.ts +28 -0
- package/dist/core/export-html/tool-renderer.js +1 -0
- package/dist/core/export-html/vendor/highlight.min.js +4 -0
- package/dist/core/export-html/vendor/marked.min.js +56 -0
- package/dist/core/extensions-host/index.d.ts +13 -0
- package/dist/core/extensions-host/index.js +1 -0
- package/dist/core/extensions-host/loader.d.ts +21 -0
- package/dist/core/extensions-host/loader.js +1 -0
- package/dist/core/extensions-host/runner.d.ts +233 -0
- package/dist/core/extensions-host/runner.js +3 -0
- package/dist/core/extensions-host/types.d.ts +1079 -0
- package/dist/core/extensions-host/types.js +1 -0
- package/dist/core/extensions-host/wrapper.d.ts +29 -0
- package/dist/core/extensions-host/wrapper.js +2 -0
- package/dist/core/index.d.ts +17 -0
- package/dist/core/index.js +1 -0
- package/dist/core/lib/agent-core/src/agent-loop-continuations.d.ts +17 -0
- package/dist/core/lib/agent-core/src/agent-loop-continuations.js +1 -0
- package/dist/core/lib/agent-core/src/agent-loop-stream-events.d.ts +19 -0
- package/dist/core/lib/agent-core/src/agent-loop-stream-events.js +1 -0
- package/dist/core/lib/agent-core/src/agent-loop-tool-results.d.ts +10 -0
- package/dist/core/lib/agent-core/src/agent-loop-tool-results.js +3 -0
- package/dist/core/lib/agent-core/src/agent-loop-tool-summaries.d.ts +22 -0
- package/dist/core/lib/agent-core/src/agent-loop-tool-summaries.js +1 -0
- package/dist/core/lib/agent-core/src/agent-loop.d.ts +26 -0
- package/dist/core/lib/agent-core/src/agent-loop.js +4 -0
- package/dist/core/lib/agent-core/src/agent-run-result.d.ts +9 -0
- package/dist/core/lib/agent-core/src/agent-run-result.js +1 -0
- package/dist/core/lib/agent-core/src/agent.d.ts +215 -0
- package/dist/core/lib/agent-core/src/agent.js +1 -0
- package/dist/core/lib/agent-core/src/errors.d.ts +62 -0
- package/dist/core/lib/agent-core/src/errors.js +1 -0
- package/dist/core/lib/agent-core/src/index.d.ts +14 -0
- package/dist/core/lib/agent-core/src/index.js +1 -0
- package/dist/core/lib/agent-core/src/proxy.d.ts +91 -0
- package/dist/core/lib/agent-core/src/proxy.js +2 -0
- package/dist/core/lib/agent-core/src/structured-adaptive-agent-loop.d.ts +15 -0
- package/dist/core/lib/agent-core/src/structured-adaptive-agent-loop.js +2 -0
- package/dist/core/lib/agent-core/src/structured-adaptive-streaming-tool-executor.d.ts +33 -0
- package/dist/core/lib/agent-core/src/structured-adaptive-streaming-tool-executor.js +1 -0
- package/dist/core/lib/agent-core/src/structured-adaptive-tool-orchestration.d.ts +35 -0
- package/dist/core/lib/agent-core/src/structured-adaptive-tool-orchestration.js +3 -0
- package/dist/core/lib/agent-core/src/types.d.ts +417 -0
- package/dist/core/lib/agent-core/src/types.js +1 -0
- package/dist/core/lib/ai/src/api-registry.d.ts +27 -0
- package/dist/core/lib/ai/src/api-registry.js +1 -0
- package/dist/core/lib/ai/src/config-path.d.ts +1 -0
- package/dist/core/lib/ai/src/config-path.js +1 -0
- package/dist/core/lib/ai/src/debug-logger.d.ts +94 -0
- package/dist/core/lib/ai/src/debug-logger.js +4 -0
- package/dist/core/lib/ai/src/env-api-keys.d.ts +8 -0
- package/dist/core/lib/ai/src/env-api-keys.js +1 -0
- package/dist/core/lib/ai/src/env.d.ts +7 -0
- package/dist/core/lib/ai/src/env.js +1 -0
- package/dist/core/lib/ai/src/events.d.ts +8 -0
- package/dist/core/lib/ai/src/events.js +1 -0
- package/dist/core/lib/ai/src/index.d.ts +27 -0
- package/dist/core/lib/ai/src/index.js +1 -0
- package/dist/core/lib/ai/src/json.d.ts +7 -0
- package/dist/core/lib/ai/src/json.js +1 -0
- package/dist/core/lib/ai/src/models.d.ts +31 -0
- package/dist/core/lib/ai/src/models.generated.d.ts +15315 -0
- package/dist/core/lib/ai/src/models.generated.js +1 -0
- package/dist/core/lib/ai/src/models.js +1 -0
- package/dist/core/lib/ai/src/overflow.d.ts +7 -0
- package/dist/core/lib/ai/src/overflow.js +1 -0
- package/dist/core/lib/ai/src/providers/amazon-bedrock.d.ts +20 -0
- package/dist/core/lib/ai/src/providers/amazon-bedrock.js +1 -0
- package/dist/core/lib/ai/src/providers/anthropic.d.ts +38 -0
- package/dist/core/lib/ai/src/providers/anthropic.js +2 -0
- package/dist/core/lib/ai/src/providers/azure-openai-responses.d.ts +21 -0
- package/dist/core/lib/ai/src/providers/azure-openai-responses.js +1 -0
- package/dist/core/lib/ai/src/providers/github-copilot-headers.d.ts +13 -0
- package/dist/core/lib/ai/src/providers/github-copilot-headers.js +1 -0
- package/dist/core/lib/ai/src/providers/google-gemini-cli.d.ts +79 -0
- package/dist/core/lib/ai/src/providers/google-gemini-cli.js +2 -0
- package/dist/core/lib/ai/src/providers/google-shared.d.ts +70 -0
- package/dist/core/lib/ai/src/providers/google-shared.js +2 -0
- package/dist/core/lib/ai/src/providers/google-vertex.d.ts +20 -0
- package/dist/core/lib/ai/src/providers/google-vertex.js +1 -0
- package/dist/core/lib/ai/src/providers/google.d.ts +18 -0
- package/dist/core/lib/ai/src/providers/google.js +1 -0
- package/dist/core/lib/ai/src/providers/openai-codex-responses.d.ts +8 -0
- package/dist/core/lib/ai/src/providers/openai-codex-responses.js +7 -0
- package/dist/core/lib/ai/src/providers/openai-completions.d.ts +20 -0
- package/dist/core/lib/ai/src/providers/openai-completions.js +6 -0
- package/dist/core/lib/ai/src/providers/openai-responses-shared.d.ts +22 -0
- package/dist/core/lib/ai/src/providers/openai-responses-shared.js +10 -0
- package/dist/core/lib/ai/src/providers/openai-responses.d.ts +19 -0
- package/dist/core/lib/ai/src/providers/openai-responses.js +1 -0
- package/dist/core/lib/ai/src/providers/register-builtins.d.ts +8 -0
- package/dist/core/lib/ai/src/providers/register-builtins.js +1 -0
- package/dist/core/lib/ai/src/providers/simple-options.d.ts +13 -0
- package/dist/core/lib/ai/src/providers/simple-options.js +1 -0
- package/dist/core/lib/ai/src/providers/transform-messages.d.ts +13 -0
- package/dist/core/lib/ai/src/providers/transform-messages.js +1 -0
- package/dist/core/lib/ai/src/registry.d.ts +8 -0
- package/dist/core/lib/ai/src/registry.js +1 -0
- package/dist/core/lib/ai/src/schema.d.ts +10 -0
- package/dist/core/lib/ai/src/schema.js +1 -0
- package/dist/core/lib/ai/src/stream.d.ts +33 -0
- package/dist/core/lib/ai/src/stream.js +1 -0
- package/dist/core/lib/ai/src/types.d.ts +331 -0
- package/dist/core/lib/ai/src/types.js +0 -0
- package/dist/core/lib/ai/src/utils/event-stream-types.d.ts +12 -0
- package/dist/core/lib/ai/src/utils/event-stream-types.js +0 -0
- package/dist/core/lib/ai/src/utils/event-stream.d.ts +31 -0
- package/dist/core/lib/ai/src/utils/event-stream.js +1 -0
- package/dist/core/lib/ai/src/utils/http-proxy.d.ts +13 -0
- package/dist/core/lib/ai/src/utils/http-proxy.js +1 -0
- package/dist/core/lib/ai/src/utils/json-parse.d.ts +14 -0
- package/dist/core/lib/ai/src/utils/json-parse.js +1 -0
- package/dist/core/lib/ai/src/utils/oauth/anthropic.d.ts +22 -0
- package/dist/core/lib/ai/src/utils/oauth/anthropic.js +1 -0
- package/dist/core/lib/ai/src/utils/oauth/decode-credential.d.ts +12 -0
- package/dist/core/lib/ai/src/utils/oauth/decode-credential.js +1 -0
- package/dist/core/lib/ai/src/utils/oauth/github-copilot.d.ts +35 -0
- package/dist/core/lib/ai/src/utils/oauth/github-copilot.js +1 -0
- package/dist/core/lib/ai/src/utils/oauth/google-antigravity.d.ts +31 -0
- package/dist/core/lib/ai/src/utils/oauth/google-antigravity.js +1 -0
- package/dist/core/lib/ai/src/utils/oauth/google-gemini-cli.d.ts +31 -0
- package/dist/core/lib/ai/src/utils/oauth/google-gemini-cli.js +1 -0
- package/dist/core/lib/ai/src/utils/oauth/index.d.ts +60 -0
- package/dist/core/lib/ai/src/utils/oauth/index.js +1 -0
- package/dist/core/lib/ai/src/utils/oauth/openai-codex.d.ts +39 -0
- package/dist/core/lib/ai/src/utils/oauth/openai-codex.js +11 -0
- package/dist/core/lib/ai/src/utils/oauth/pkce.d.ts +18 -0
- package/dist/core/lib/ai/src/utils/oauth/pkce.js +1 -0
- package/dist/core/lib/ai/src/utils/oauth/types.d.ts +52 -0
- package/dist/core/lib/ai/src/utils/oauth/types.js +0 -0
- package/dist/core/lib/ai/src/utils/overflow.d.ts +57 -0
- package/dist/core/lib/ai/src/utils/overflow.js +1 -0
- package/dist/core/lib/ai/src/utils/sanitize-unicode.d.ts +16 -0
- package/dist/core/lib/ai/src/utils/sanitize-unicode.js +1 -0
- package/dist/core/lib/ai/src/utils/typebox-helpers.d.ts +22 -0
- package/dist/core/lib/ai/src/utils/typebox-helpers.js +1 -0
- package/dist/core/lib/ai/src/utils/validation.d.ts +23 -0
- package/dist/core/lib/ai/src/utils/validation.js +6 -0
- package/dist/core/lib/tui/src/autocomplete.d.ts +62 -0
- package/dist/core/lib/tui/src/autocomplete.js +2 -0
- package/dist/core/lib/tui/src/components/box.d.ts +27 -0
- package/dist/core/lib/tui/src/components/box.js +1 -0
- package/dist/core/lib/tui/src/components/cached-container.d.ts +42 -0
- package/dist/core/lib/tui/src/components/cached-container.js +1 -0
- package/dist/core/lib/tui/src/components/cancellable-loader.d.ts +27 -0
- package/dist/core/lib/tui/src/components/cancellable-loader.js +1 -0
- package/dist/core/lib/tui/src/components/editor.d.ts +222 -0
- package/dist/core/lib/tui/src/components/editor.js +21 -0
- package/dist/core/lib/tui/src/components/image.d.ts +33 -0
- package/dist/core/lib/tui/src/components/image.js +1 -0
- package/dist/core/lib/tui/src/components/input.d.ts +42 -0
- package/dist/core/lib/tui/src/components/input.js +2 -0
- package/dist/core/lib/tui/src/components/loader.d.ts +26 -0
- package/dist/core/lib/tui/src/components/loader.js +1 -0
- package/dist/core/lib/tui/src/components/markdown.d.ts +100 -0
- package/dist/core/lib/tui/src/components/markdown.js +7 -0
- package/dist/core/lib/tui/src/components/select-list.d.ts +37 -0
- package/dist/core/lib/tui/src/components/select-list.js +1 -0
- package/dist/core/lib/tui/src/components/settings-list.d.ts +55 -0
- package/dist/core/lib/tui/src/components/settings-list.js +1 -0
- package/dist/core/lib/tui/src/components/spacer.d.ts +17 -0
- package/dist/core/lib/tui/src/components/spacer.js +1 -0
- package/dist/core/lib/tui/src/components/text.d.ts +24 -0
- package/dist/core/lib/tui/src/components/text.js +1 -0
- package/dist/core/lib/tui/src/components/truncated-text.d.ts +18 -0
- package/dist/core/lib/tui/src/components/truncated-text.js +2 -0
- package/dist/core/lib/tui/src/editor-component.d.ts +51 -0
- package/dist/core/lib/tui/src/editor-component.js +0 -0
- package/dist/core/lib/tui/src/fuzzy.d.ts +32 -0
- package/dist/core/lib/tui/src/fuzzy.js +1 -0
- package/dist/core/lib/tui/src/index.d.ts +29 -0
- package/dist/core/lib/tui/src/index.js +1 -0
- package/dist/core/lib/tui/src/keybindings.d.ts +44 -0
- package/dist/core/lib/tui/src/keybindings.js +1 -0
- package/dist/core/lib/tui/src/keys.d.ts +149 -0
- package/dist/core/lib/tui/src/keys.js +5 -0
- package/dist/core/lib/tui/src/kill-ring.d.ts +33 -0
- package/dist/core/lib/tui/src/kill-ring.js +1 -0
- package/dist/core/lib/tui/src/stdin-buffer.d.ts +38 -0
- package/dist/core/lib/tui/src/stdin-buffer.js +1 -0
- package/dist/core/lib/tui/src/terminal-image.d.ts +73 -0
- package/dist/core/lib/tui/src/terminal-image.js +1 -0
- package/dist/core/lib/tui/src/terminal.d.ts +86 -0
- package/dist/core/lib/tui/src/terminal.js +1 -0
- package/dist/core/lib/tui/src/tui.d.ts +220 -0
- package/dist/core/lib/tui/src/tui.js +12 -0
- package/dist/core/lib/tui/src/undo-stack.d.ts +22 -0
- package/dist/core/lib/tui/src/undo-stack.js +1 -0
- package/dist/core/lib/tui/src/utils.d.ts +83 -0
- package/dist/core/lib/tui/src/utils.js +2 -0
- package/dist/core/mcp/figma-auth.d.ts +21 -0
- package/dist/core/mcp/figma-auth.js +22 -0
- package/dist/core/mcp/index.d.ts +11 -0
- package/dist/core/mcp/index.js +1 -0
- package/dist/core/mcp/mcp-adapter.d.ts +21 -0
- package/dist/core/mcp/mcp-adapter.js +3 -0
- package/dist/core/mcp/mcp-client.d.ts +91 -0
- package/dist/core/mcp/mcp-client.js +6 -0
- package/dist/core/mcp/mcp-config.d.ts +55 -0
- package/dist/core/mcp/mcp-config.js +1 -0
- package/dist/core/mcp/mcp-guidance.d.ts +52 -0
- package/dist/core/mcp/mcp-guidance.js +54 -0
- package/dist/core/mcp/mcp-manager.d.ts +51 -0
- package/dist/core/mcp/mcp-manager.js +1 -0
- package/dist/core/mcp/mcp-types.d.ts +62 -0
- package/dist/core/mcp/mcp-types.js +0 -0
- package/dist/core/messages.d.ts +77 -0
- package/dist/core/messages.js +17 -0
- package/dist/core/model/custom-providers.d.ts +34 -0
- package/dist/core/model/custom-providers.js +1 -0
- package/dist/core/model/discovery-cache.d.ts +65 -0
- package/dist/core/model/discovery-cache.js +1 -0
- package/dist/core/model/discovery-cache.test.d.ts +7 -0
- package/dist/core/model/discovery-cache.test.js +1 -0
- package/dist/core/model/discovery.d.ts +79 -0
- package/dist/core/model/discovery.js +1 -0
- package/dist/core/model/discovery.test.d.ts +7 -0
- package/dist/core/model/discovery.test.js +1 -0
- package/dist/core/model/index.d.ts +10 -0
- package/dist/core/model/index.js +1 -0
- package/dist/core/model/known-models.d.ts +65 -0
- package/dist/core/model/known-models.generated.d.ts +2 -0
- package/dist/core/model/known-models.generated.js +1 -0
- package/dist/core/model/known-models.js +1 -0
- package/dist/core/model/switcher.d.ts +80 -0
- package/dist/core/model/switcher.js +1 -0
- package/dist/core/model-registry.d.ts +186 -0
- package/dist/core/model-registry.js +9 -0
- package/dist/core/model-resolver.d.ts +106 -0
- package/dist/core/model-resolver.js +1 -0
- package/dist/core/package-manager.d.ts +156 -0
- package/dist/core/package-manager.js +3 -0
- package/dist/core/persona/persona-manager.d.ts +35 -0
- package/dist/core/persona/persona-manager.js +5 -0
- package/dist/core/platform/abort-slot.d.ts +26 -0
- package/dist/core/platform/abort-slot.js +1 -0
- package/dist/core/platform/config/auth-storage.d.ts +126 -0
- package/dist/core/platform/config/auth-storage.js +1 -0
- package/dist/core/platform/config/defaults.d.ts +8 -0
- package/dist/core/platform/config/defaults.js +1 -0
- package/dist/core/platform/config/diagnostics.d.ts +20 -0
- package/dist/core/platform/config/diagnostics.js +0 -0
- package/dist/core/platform/config/resolve-config-value.d.ts +12 -0
- package/dist/core/platform/config/resolve-config-value.js +1 -0
- package/dist/core/platform/config/resource-loader.d.ts +188 -0
- package/dist/core/platform/config/resource-loader.js +2 -0
- package/dist/core/platform/config/settings-manager.d.ts +314 -0
- package/dist/core/platform/config/settings-manager.js +1 -0
- package/dist/core/platform/exec/bash-executor.d.ts +41 -0
- package/dist/core/platform/exec/bash-executor.js +1 -0
- package/dist/core/platform/exec/exec.d.ts +25 -0
- package/dist/core/platform/exec/exec.js +1 -0
- package/dist/core/platform/i18n/index.d.ts +26 -0
- package/dist/core/platform/i18n/index.js +1 -0
- package/dist/core/platform/i18n/messages.d.ts +56 -0
- package/dist/core/platform/i18n/messages.js +1 -0
- package/dist/core/platform/i18n/messages.zh.d.ts +56 -0
- package/dist/core/platform/i18n/messages.zh.js +1 -0
- package/dist/core/platform/i18n/slash-commands.d.ts +53 -0
- package/dist/core/platform/i18n/slash-commands.js +1 -0
- package/dist/core/platform/i18n/slash-commands.zh.d.ts +53 -0
- package/dist/core/platform/i18n/slash-commands.zh.js +1 -0
- package/dist/core/platform/i18n/themes.d.ts +11 -0
- package/dist/core/platform/i18n/themes.js +1 -0
- package/dist/core/platform/i18n/themes.zh.d.ts +11 -0
- package/dist/core/platform/i18n/themes.zh.js +1 -0
- package/dist/core/platform/keybindings.d.ts +61 -0
- package/dist/core/platform/keybindings.js +1 -0
- package/dist/core/platform/listeners.d.ts +21 -0
- package/dist/core/platform/listeners.js +1 -0
- package/dist/core/platform/telemetry/batching-dispatcher.d.ts +41 -0
- package/dist/core/platform/telemetry/batching-dispatcher.js +1 -0
- package/dist/core/platform/telemetry/build-meta.d.ts +12 -0
- package/dist/core/platform/telemetry/build-meta.js +1 -0
- package/dist/core/platform/telemetry/caller-context.d.ts +32 -0
- package/dist/core/platform/telemetry/caller-context.js +1 -0
- package/dist/core/platform/telemetry/credentials.d.ts +27 -0
- package/dist/core/platform/telemetry/credentials.js +1 -0
- package/dist/core/platform/telemetry/ext-events.d.ts +89 -0
- package/dist/core/platform/telemetry/ext-events.js +1 -0
- package/dist/core/platform/telemetry/index.d.ts +13 -0
- package/dist/core/platform/telemetry/index.js +1 -0
- package/dist/core/platform/telemetry/insforge-base.d.ts +37 -0
- package/dist/core/platform/telemetry/insforge-base.js +1 -0
- package/dist/core/platform/telemetry/types.d.ts +33 -0
- package/dist/core/platform/telemetry/types.js +0 -0
- package/dist/core/platform/timings.d.ts +2 -0
- package/dist/core/platform/timings.js +3 -0
- package/dist/core/platform/utils/logger.d.ts +75 -0
- package/dist/core/platform/utils/logger.js +1 -0
- package/dist/core/platform/utils/shell.d.ts +25 -0
- package/dist/core/platform/utils/shell.js +9 -0
- package/dist/core/platform/utils/sleep.d.ts +7 -0
- package/dist/core/platform/utils/sleep.js +1 -0
- package/dist/core/platform/utils/tools-manager.d.ts +19 -0
- package/dist/core/platform/utils/tools-manager.js +1 -0
- package/dist/core/prompt/prompt-templates.d.ts +49 -0
- package/dist/core/prompt/prompt-templates.js +2 -0
- package/dist/core/prompt/system-prompt.d.ts +24 -0
- package/dist/core/prompt/system-prompt.js +139 -0
- package/dist/core/runtime/agent-session.d.ts +676 -0
- package/dist/core/runtime/agent-session.js +15 -0
- package/dist/core/runtime/bash-runner.d.ts +56 -0
- package/dist/core/runtime/bash-runner.js +2 -0
- package/dist/core/runtime/catui-agent.d.ts +182 -0
- package/dist/core/runtime/catui-agent.js +1 -0
- package/dist/core/runtime/compaction-controller.d.ts +43 -0
- package/dist/core/runtime/compaction-controller.js +1 -0
- package/dist/core/runtime/default-tools.d.ts +9 -0
- package/dist/core/runtime/default-tools.js +1 -0
- package/dist/core/runtime/event-bridge.d.ts +21 -0
- package/dist/core/runtime/event-bridge.js +1 -0
- package/dist/core/runtime/event-bus.d.ts +8 -0
- package/dist/core/runtime/event-bus.js +1 -0
- package/dist/core/runtime/export-bridge.d.ts +23 -0
- package/dist/core/runtime/export-bridge.js +1 -0
- package/dist/core/runtime/extension-core-bindings.d.ts +46 -0
- package/dist/core/runtime/extension-core-bindings.js +3 -0
- package/dist/core/runtime/model-controller.d.ts +84 -0
- package/dist/core/runtime/model-controller.js +1 -0
- package/dist/core/runtime/model-cycle.d.ts +20 -0
- package/dist/core/runtime/model-cycle.js +1 -0
- package/dist/core/runtime/prompt-assembly.d.ts +20 -0
- package/dist/core/runtime/prompt-assembly.js +3 -0
- package/dist/core/runtime/retry-coordinator.d.ts +84 -0
- package/dist/core/runtime/retry-coordinator.js +1 -0
- package/dist/core/runtime/sdk.d.ts +163 -0
- package/dist/core/runtime/sdk.js +1 -0
- package/dist/core/runtime/session-context.d.ts +155 -0
- package/dist/core/runtime/session-context.js +0 -0
- package/dist/core/runtime/session-lifecycle-controller.d.ts +42 -0
- package/dist/core/runtime/session-lifecycle-controller.js +1 -0
- package/dist/core/runtime/session-tree-controller.d.ts +40 -0
- package/dist/core/runtime/session-tree-controller.js +1 -0
- package/dist/core/runtime/slash-command-catalog.d.ts +27 -0
- package/dist/core/runtime/slash-command-catalog.js +1 -0
- package/dist/core/runtime/thinking-levels.d.ts +31 -0
- package/dist/core/runtime/thinking-levels.js +1 -0
- package/dist/core/runtime/tool-runtime-controller.d.ts +35 -0
- package/dist/core/runtime/tool-runtime-controller.js +1 -0
- package/dist/core/runtime/turn-context.d.ts +52 -0
- package/dist/core/runtime/turn-context.js +1 -0
- package/dist/core/session/compaction/branch-summarization.d.ts +85 -0
- package/dist/core/session/compaction/branch-summarization.js +38 -0
- package/dist/core/session/compaction/compaction.d.ts +120 -0
- package/dist/core/session/compaction/compaction.js +104 -0
- package/dist/core/session/compaction/index.d.ts +9 -0
- package/dist/core/session/compaction/index.js +1 -0
- package/dist/core/session/compaction/utils.d.ts +37 -0
- package/dist/core/session/compaction/utils.js +17 -0
- package/dist/core/session/session-manager.d.ts +359 -0
- package/dist/core/session/session-manager.js +14 -0
- package/dist/core/skills.d.ts +57 -0
- package/dist/core/skills.js +4 -0
- package/dist/core/slash-commands.d.ts +36 -0
- package/dist/core/slash-commands.js +1 -0
- package/dist/core/soul-integration.d.ts +77 -0
- package/dist/core/soul-integration.js +1 -0
- package/dist/core/soul-options-contract.d.ts +10 -0
- package/dist/core/soul-options-contract.js +0 -0
- package/dist/core/sub-agent/agent-definition-loader.d.ts +96 -0
- package/dist/core/sub-agent/agent-definition-loader.js +2 -0
- package/dist/core/sub-agent/agent-definition.d.ts +162 -0
- package/dist/core/sub-agent/agent-definition.js +6 -0
- package/dist/core/sub-agent/agent-handoff-safety.d.ts +39 -0
- package/dist/core/sub-agent/agent-handoff-safety.js +1 -0
- package/dist/core/sub-agent/agent-input-output.d.ts +143 -0
- package/dist/core/sub-agent/agent-input-output.js +1 -0
- package/dist/core/sub-agent/agent-output-persistence.d.ts +43 -0
- package/dist/core/sub-agent/agent-output-persistence.js +3 -0
- package/dist/core/sub-agent/agent-prompt-builder.d.ts +37 -0
- package/dist/core/sub-agent/agent-prompt-builder.js +2 -0
- package/dist/core/sub-agent/agent-registry.d.ts +145 -0
- package/dist/core/sub-agent/agent-registry.js +1 -0
- package/dist/core/sub-agent/agent-result-extractor.d.ts +28 -0
- package/dist/core/sub-agent/agent-result-extractor.js +3 -0
- package/dist/core/sub-agent/agent-telemetry.d.ts +71 -0
- package/dist/core/sub-agent/agent-telemetry.js +1 -0
- package/dist/core/sub-agent/agent-tool-filter.d.ts +89 -0
- package/dist/core/sub-agent/agent-tool-filter.js +2 -0
- package/dist/core/sub-agent/agent-tool.d.ts +69 -0
- package/dist/core/sub-agent/agent-tool.js +11 -0
- package/dist/core/sub-agent/index.d.ts +26 -0
- package/dist/core/sub-agent/index.js +1 -0
- package/dist/core/sub-agent/send-message-tool.d.ts +33 -0
- package/dist/core/sub-agent/send-message-tool.js +2 -0
- package/dist/core/sub-agent/sub-agent-backend.d.ts +26 -0
- package/dist/core/sub-agent/sub-agent-backend.js +7 -0
- package/dist/core/sub-agent/sub-agent-runtime.d.ts +34 -0
- package/dist/core/sub-agent/sub-agent-runtime.js +1 -0
- package/dist/core/sub-agent/sub-agent-types.d.ts +138 -0
- package/dist/core/sub-agent/sub-agent-types.js +0 -0
- package/dist/core/sub-agent/subprocess-backend.d.ts +35 -0
- package/dist/core/sub-agent/subprocess-backend.js +1 -0
- package/dist/core/sub-agent/subprocess-worker.d.ts +12 -0
- package/dist/core/sub-agent/subprocess-worker.js +1 -0
- package/dist/core/theme-contract.d.ts +32 -0
- package/dist/core/theme-contract.js +0 -0
- package/dist/core/tools/bash.d.ts +73 -0
- package/dist/core/tools/bash.js +21 -0
- package/dist/core/tools/edit-diff.d.ts +58 -0
- package/dist/core/tools/edit-diff.js +16 -0
- package/dist/core/tools/edit.d.ts +46 -0
- package/dist/core/tools/edit.js +1 -0
- package/dist/core/tools/file-state-cache.d.ts +30 -0
- package/dist/core/tools/file-state-cache.js +1 -0
- package/dist/core/tools/find.d.ts +46 -0
- package/dist/core/tools/find.js +8 -0
- package/dist/core/tools/grep.d.ts +58 -0
- package/dist/core/tools/grep.js +13 -0
- package/dist/core/tools/index.d.ts +116 -0
- package/dist/core/tools/index.js +1 -0
- package/dist/core/tools/input-validation.d.ts +13 -0
- package/dist/core/tools/input-validation.js +1 -0
- package/dist/core/tools/ls.d.ts +45 -0
- package/dist/core/tools/ls.js +4 -0
- package/dist/core/tools/orchestrator.d.ts +76 -0
- package/dist/core/tools/orchestrator.js +1 -0
- package/dist/core/tools/path-utils.d.ts +7 -0
- package/dist/core/tools/path-utils.js +1 -0
- package/dist/core/tools/pdf-extract.d.ts +11 -0
- package/dist/core/tools/pdf-extract.js +1 -0
- package/dist/core/tools/read.d.ts +46 -0
- package/dist/core/tools/read.js +11 -0
- package/dist/core/tools/source.d.ts +78 -0
- package/dist/core/tools/source.js +1 -0
- package/dist/core/tools/time.d.ts +19 -0
- package/dist/core/tools/time.js +2 -0
- package/dist/core/tools/truncate.d.ts +66 -0
- package/dist/core/tools/truncate.js +5 -0
- package/dist/core/tools/write-guard.d.ts +2 -0
- package/dist/core/tools/write-guard.js +1 -0
- package/dist/core/tools/write.d.ts +36 -0
- package/dist/core/tools/write.js +1 -0
- package/dist/core/workspace/index.d.ts +8 -0
- package/dist/core/workspace/index.js +1 -0
- package/dist/core/workspace/worktree-manager.d.ts +73 -0
- package/dist/core/workspace/worktree-manager.js +3 -0
- package/dist/extensions/builtin/AGENT.md +115 -0
- package/dist/extensions/builtin/ask-user-question/ask-user-question-tool.d.ts +9 -0
- package/dist/extensions/builtin/ask-user-question/ask-user-question-tool.js +4 -0
- package/dist/extensions/builtin/ask-user-question/index.d.ts +8 -0
- package/dist/extensions/builtin/ask-user-question/index.js +1 -0
- package/dist/extensions/builtin/ask-user-question/prompt.d.ts +14 -0
- package/dist/extensions/builtin/ask-user-question/prompt.js +30 -0
- package/dist/extensions/builtin/ask-user-question/types.d.ts +69 -0
- package/dist/extensions/builtin/ask-user-question/types.js +1 -0
- package/dist/extensions/builtin/browser/AGENT.md +17 -0
- package/dist/extensions/builtin/browser/agent-workspace/agent_helpers.py +12 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/amazon/product-search.md +198 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/archive-org/scraping.md +341 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv/scraping.md +311 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/arxiv-bulk/scraping.md +333 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/atlas/overview.md +70 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/booking-com/scraping.md +578 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/capterra/scraping.md +440 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/centilebrain/generate-estimates.md +110 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coingecko/scraping.md +325 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coinmarketcap/scraping.md +463 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/coursera/scraping.md +360 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/craigslist/scraping.md +390 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/crossref/scraping.md +568 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/dev-to/scraping.md +323 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/duckduckgo/scraping.md +349 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/ebay/scraping.md +435 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/etsy/scraping.md +506 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/eventbrite/scraping.md +363 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/expedia/automation.md +168 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/groups.md +236 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/facebook/pages.md +295 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/framer/editor.md +108 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/fred/scraping.md +493 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/g2/scraping.md +580 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/genius/scraping.md +511 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/repo-actions.md +65 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/github/scraping.md +184 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/glassdoor/scraping.md +543 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gmail/compose.md +122 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/goodreads/scraping.md +461 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/gutenberg/scraping.md +383 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/hackernews/scraping.md +243 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/howlongtobeat/scraping.md +473 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/imdb/scraping.md +271 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/itch-io/scraping.md +436 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/job-boards/indeed-glassdoor.md +1021 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/letterboxd/scraping.md +349 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/linkedin/invitation-manager.md +109 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/loom/folder-enumeration.md +170 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/macrotrends/scraping.md +537 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/article-hydration.md +120 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/medium/scraping.md +414 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/metacritic/scraping.md +477 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/musicbrainz/scraping.md +478 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/nasa/scraping.md +339 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/news-aggregation/multi-source.md +205 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/open-library/scraping.md +472 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openalex/scraping.md +470 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/openstreetmap/scraping.md +490 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/package-registries/npm-pypi.md +478 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/polymarket/scraping.md +234 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/producthunt/scraping.md +307 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/pubmed/scraping.md +421 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/quora/scraping.md +364 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rawg/scraping.md +352 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/reddit/scraping.md +124 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/rest-countries/scraping.md +233 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/sec-edgar/scraping.md +361 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/README.md +36 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/embedded-apps.md +72 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/knowledge-base.md +109 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/shopify-admin/polaris-inputs.md +137 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/soundcloud/scraping.md +362 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/spotify/scraping.md +339 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/stackoverflow/scraping.md +435 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/steam/scraping.md +575 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/substack/scraping.md +338 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/thetechgeeks/pricing.md +52 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tiktok/upload.md +107 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/tradingview/scraping.md +309 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trello/boards-and-lists.md +88 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/trustpilot/scraping.md +375 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/walmart/scraping.md +444 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wayback-machine/scraping.md +306 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/weather/scraping.md +398 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/wellfound/scraping.md +596 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/world-bank/scraping.md +356 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/xiaohongshu/scraping.md +84 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/youtube/scraping.md +418 -0
- package/dist/extensions/builtin/browser/agent-workspace/domain-skills/zillow/scraping.md +433 -0
- package/dist/extensions/builtin/browser/browser.md +73 -0
- package/dist/extensions/builtin/browser/index.d.ts +8 -0
- package/dist/extensions/builtin/browser/index.js +15 -0
- package/dist/extensions/builtin/browser/install.md +142 -0
- package/dist/extensions/builtin/browser/interaction-skills/connection.md +48 -0
- package/dist/extensions/builtin/browser/interaction-skills/cookies.md +3 -0
- package/dist/extensions/builtin/browser/interaction-skills/cross-origin-iframes.md +3 -0
- package/dist/extensions/builtin/browser/interaction-skills/dialogs.md +64 -0
- package/dist/extensions/builtin/browser/interaction-skills/downloads.md +3 -0
- package/dist/extensions/builtin/browser/interaction-skills/drag-and-drop.md +3 -0
- package/dist/extensions/builtin/browser/interaction-skills/dropdowns.md +3 -0
- package/dist/extensions/builtin/browser/interaction-skills/iframes.md +3 -0
- package/dist/extensions/builtin/browser/interaction-skills/network-requests.md +3 -0
- package/dist/extensions/builtin/browser/interaction-skills/print-as-pdf.md +3 -0
- package/dist/extensions/builtin/browser/interaction-skills/profile-sync.md +90 -0
- package/dist/extensions/builtin/browser/interaction-skills/screenshots.md +17 -0
- package/dist/extensions/builtin/browser/interaction-skills/scrolling.md +3 -0
- package/dist/extensions/builtin/browser/interaction-skills/shadow-dom.md +3 -0
- package/dist/extensions/builtin/browser/interaction-skills/tabs.md +69 -0
- package/dist/extensions/builtin/browser/interaction-skills/uploads.md +1 -0
- package/dist/extensions/builtin/browser/interaction-skills/viewport.md +3 -0
- package/dist/extensions/builtin/browser/src/browser_harness/AGENT.md +15 -0
- package/dist/extensions/builtin/browser/src/browser_harness/__init__.py +8 -0
- package/dist/extensions/builtin/browser/src/browser_harness/_ipc.py +90 -0
- package/dist/extensions/builtin/browser/src/browser_harness/admin.py +722 -0
- package/dist/extensions/builtin/browser/src/browser_harness/daemon.py +328 -0
- package/dist/extensions/builtin/browser/src/browser_harness/helpers.py +396 -0
- package/dist/extensions/builtin/browser/src/browser_harness/run.py +103 -0
- package/dist/extensions/builtin/btw/index.d.ts +8 -0
- package/dist/extensions/builtin/btw/index.js +15 -0
- package/dist/extensions/builtin/debug/collectors.d.ts +96 -0
- package/dist/extensions/builtin/debug/collectors.js +7 -0
- package/dist/extensions/builtin/debug/index.d.ts +8 -0
- package/dist/extensions/builtin/debug/index.js +49 -0
- package/dist/extensions/builtin/diagnostics/diagnostic-buffer.d.ts +19 -0
- package/dist/extensions/builtin/diagnostics/diagnostic-buffer.js +1 -0
- package/dist/extensions/builtin/diagnostics/index.d.ts +8 -0
- package/dist/extensions/builtin/diagnostics/index.js +1 -0
- package/dist/extensions/builtin/diagnostics/redaction.d.ts +8 -0
- package/dist/extensions/builtin/diagnostics/redaction.js +1 -0
- package/dist/extensions/builtin/diagnostics/reporter.d.ts +17 -0
- package/dist/extensions/builtin/diagnostics/reporter.js +1 -0
- package/dist/extensions/builtin/diagnostics/types.d.ts +62 -0
- package/dist/extensions/builtin/diagnostics/types.js +1 -0
- package/dist/extensions/builtin/discipline/index.d.ts +8 -0
- package/dist/extensions/builtin/discipline/index.js +7 -0
- package/dist/extensions/builtin/discipline/skills/brainstorming/SKILL.md +33 -0
- package/dist/extensions/builtin/discipline/skills/executing-plans/SKILL.md +25 -0
- package/dist/extensions/builtin/discipline/skills/finishing-development-branch/SKILL.md +25 -0
- package/dist/extensions/builtin/discipline/skills/receiving-code-review/SKILL.md +22 -0
- package/dist/extensions/builtin/discipline/skills/requesting-code-review/SKILL.md +31 -0
- package/dist/extensions/builtin/discipline/skills/systematic-debugging/SKILL.md +28 -0
- package/dist/extensions/builtin/discipline/skills/test-driven-development/SKILL.md +32 -0
- package/dist/extensions/builtin/discipline/skills/using-git-worktrees/SKILL.md +25 -0
- package/dist/extensions/builtin/discipline/skills/verification-before-completion/SKILL.md +27 -0
- package/dist/extensions/builtin/discipline/skills/writing-plans/SKILL.md +26 -0
- package/dist/extensions/builtin/goal/README.md +67 -0
- package/dist/extensions/builtin/goal/goal-command.d.ts +13 -0
- package/dist/extensions/builtin/goal/goal-command.js +9 -0
- package/dist/extensions/builtin/goal/goal-controller.d.ts +143 -0
- package/dist/extensions/builtin/goal/goal-controller.js +1 -0
- package/dist/extensions/builtin/goal/goal-format.d.ts +52 -0
- package/dist/extensions/builtin/goal/goal-format.js +1 -0
- package/dist/extensions/builtin/goal/goal-parser.d.ts +27 -0
- package/dist/extensions/builtin/goal/goal-parser.js +2 -0
- package/dist/extensions/builtin/goal/goal-prompts.d.ts +15 -0
- package/dist/extensions/builtin/goal/goal-prompts.js +5 -0
- package/dist/extensions/builtin/goal/goal-store.d.ts +28 -0
- package/dist/extensions/builtin/goal/goal-store.js +1 -0
- package/dist/extensions/builtin/goal/goal-tools.d.ts +26 -0
- package/dist/extensions/builtin/goal/goal-tools.js +3 -0
- package/dist/extensions/builtin/goal/goal-types.d.ts +87 -0
- package/dist/extensions/builtin/goal/goal-types.js +1 -0
- package/dist/extensions/builtin/goal/index.d.ts +8 -0
- package/dist/extensions/builtin/goal/index.js +10 -0
- package/dist/extensions/builtin/grub/README.md +112 -0
- package/dist/extensions/builtin/grub/grub-controller.d.ts +67 -0
- package/dist/extensions/builtin/grub/grub-controller.js +1 -0
- package/dist/extensions/builtin/grub/grub-decision.d.ts +8 -0
- package/dist/extensions/builtin/grub/grub-decision.js +1 -0
- package/dist/extensions/builtin/grub/grub-feature-list.d.ts +54 -0
- package/dist/extensions/builtin/grub/grub-feature-list.js +2 -0
- package/dist/extensions/builtin/grub/grub-format.d.ts +13 -0
- package/dist/extensions/builtin/grub/grub-format.js +4 -0
- package/dist/extensions/builtin/grub/grub-harness.d.ts +9 -0
- package/dist/extensions/builtin/grub/grub-harness.js +3 -0
- package/dist/extensions/builtin/grub/grub-i18n.d.ts +166 -0
- package/dist/extensions/builtin/grub/grub-i18n.js +1 -0
- package/dist/extensions/builtin/grub/grub-parser.d.ts +24 -0
- package/dist/extensions/builtin/grub/grub-parser.js +2 -0
- package/dist/extensions/builtin/grub/grub-persistence.d.ts +17 -0
- package/dist/extensions/builtin/grub/grub-persistence.js +2 -0
- package/dist/extensions/builtin/grub/grub-prompts.d.ts +12 -0
- package/dist/extensions/builtin/grub/grub-prompts.js +97 -0
- package/dist/extensions/builtin/grub/grub-turn.d.ts +16 -0
- package/dist/extensions/builtin/grub/grub-turn.js +1 -0
- package/dist/extensions/builtin/grub/grub-types.d.ts +110 -0
- package/dist/extensions/builtin/grub/grub-types.js +1 -0
- package/dist/extensions/builtin/grub/index.d.ts +8 -0
- package/dist/extensions/builtin/grub/index.js +6 -0
- package/dist/extensions/builtin/idle-think/curiosity.d.ts +46 -0
- package/dist/extensions/builtin/idle-think/curiosity.js +2 -0
- package/dist/extensions/builtin/idle-think/idle-think-runtime.d.ts +46 -0
- package/dist/extensions/builtin/idle-think/idle-think-runtime.js +1 -0
- package/dist/extensions/builtin/idle-think/index.d.ts +15 -0
- package/dist/extensions/builtin/idle-think/index.js +1 -0
- package/dist/extensions/builtin/idle-think/insights.d.ts +27 -0
- package/dist/extensions/builtin/idle-think/insights.js +5 -0
- package/dist/extensions/builtin/idle-think/thinker.d.ts +26 -0
- package/dist/extensions/builtin/idle-think/thinker.js +9 -0
- package/dist/extensions/builtin/insights/html-report.d.ts +21 -0
- package/dist/extensions/builtin/insights/html-report.js +463 -0
- package/dist/extensions/builtin/insights/index.d.ts +24 -0
- package/dist/extensions/builtin/insights/index.js +2 -0
- package/dist/extensions/builtin/insights/insights-engine.d.ts +18 -0
- package/dist/extensions/builtin/insights/insights-engine.js +39 -0
- package/dist/extensions/builtin/insights/prompts.d.ts +17 -0
- package/dist/extensions/builtin/insights/prompts.js +180 -0
- package/dist/extensions/builtin/insights/session-scanner.d.ts +27 -0
- package/dist/extensions/builtin/insights/session-scanner.js +19 -0
- package/dist/extensions/builtin/insights/stats.d.ts +13 -0
- package/dist/extensions/builtin/insights/stats.js +1 -0
- package/dist/extensions/builtin/insights/types.d.ts +199 -0
- package/dist/extensions/builtin/insights/types.js +0 -0
- package/dist/extensions/builtin/link-world/agent-workspace/README.md +16 -0
- package/dist/extensions/builtin/link-world/index.d.ts +8 -0
- package/dist/extensions/builtin/link-world/index.js +19 -0
- package/dist/extensions/builtin/link-world/internet-search/internet-search.md +65 -0
- package/dist/extensions/builtin/link-world/link-world-agent.md +82 -0
- package/dist/extensions/builtin/link-world/linkworld.md +313 -0
- package/dist/extensions/builtin/link-world/network-routing/network-routing.md +67 -0
- package/dist/extensions/builtin/loop/README.md +92 -0
- package/dist/extensions/builtin/loop/cron/cron-parser.d.ts +56 -0
- package/dist/extensions/builtin/loop/cron/cron-parser.js +1 -0
- package/dist/extensions/builtin/loop/cron/cron-scheduler.d.ts +85 -0
- package/dist/extensions/builtin/loop/cron/cron-scheduler.js +10 -0
- package/dist/extensions/builtin/loop/cron/cron-tasks-lock.d.ts +42 -0
- package/dist/extensions/builtin/loop/cron/cron-tasks-lock.js +1 -0
- package/dist/extensions/builtin/loop/cron/cron-tasks.d.ts +200 -0
- package/dist/extensions/builtin/loop/cron/cron-tasks.js +2 -0
- package/dist/extensions/builtin/loop/cron/index.d.ts +18 -0
- package/dist/extensions/builtin/loop/cron/index.js +1 -0
- package/dist/extensions/builtin/loop/cron-tools/cron-create-tool.d.ts +35 -0
- package/dist/extensions/builtin/loop/cron-tools/cron-create-tool.js +1 -0
- package/dist/extensions/builtin/loop/cron-tools/cron-delete-tool.d.ts +29 -0
- package/dist/extensions/builtin/loop/cron-tools/cron-delete-tool.js +1 -0
- package/dist/extensions/builtin/loop/cron-tools/cron-list-tool.d.ts +25 -0
- package/dist/extensions/builtin/loop/cron-tools/cron-list-tool.js +2 -0
- package/dist/extensions/builtin/loop/cron-tools/index.d.ts +16 -0
- package/dist/extensions/builtin/loop/cron-tools/index.js +1 -0
- package/dist/extensions/builtin/loop/cron-tools/prompt.d.ts +35 -0
- package/dist/extensions/builtin/loop/cron-tools/prompt.js +38 -0
- package/dist/extensions/builtin/loop/index.d.ts +19 -0
- package/dist/extensions/builtin/loop/index.js +2 -0
- package/dist/extensions/builtin/loop/loop-skill.d.ts +18 -0
- package/dist/extensions/builtin/loop/loop-skill.js +58 -0
- package/dist/extensions/builtin/lsp/index.d.ts +8 -0
- package/dist/extensions/builtin/lsp/index.js +1 -0
- package/dist/extensions/builtin/lsp/lsp-client.d.ts +22 -0
- package/dist/extensions/builtin/lsp/lsp-client.js +1 -0
- package/dist/extensions/builtin/lsp/lsp-config.d.ts +8 -0
- package/dist/extensions/builtin/lsp/lsp-config.js +1 -0
- package/dist/extensions/builtin/lsp/lsp-formatters.d.ts +15 -0
- package/dist/extensions/builtin/lsp/lsp-formatters.js +18 -0
- package/dist/extensions/builtin/lsp/lsp-server-instance.d.ts +24 -0
- package/dist/extensions/builtin/lsp/lsp-server-instance.js +1 -0
- package/dist/extensions/builtin/lsp/lsp-server-manager.d.ts +21 -0
- package/dist/extensions/builtin/lsp/lsp-server-manager.js +1 -0
- package/dist/extensions/builtin/lsp/lsp-tool.d.ts +33 -0
- package/dist/extensions/builtin/lsp/lsp-tool.js +2 -0
- package/dist/extensions/builtin/lsp/types.d.ts +31 -0
- package/dist/extensions/builtin/lsp/types.js +1 -0
- package/dist/extensions/builtin/mcp/figma-design.md +68 -0
- package/dist/extensions/builtin/mcp/index.d.ts +14 -0
- package/dist/extensions/builtin/mcp/index.js +25 -0
- package/dist/extensions/builtin/mcp/mcp-management.md +85 -0
- package/dist/extensions/builtin/plan/clear-context-state.d.ts +8 -0
- package/dist/extensions/builtin/plan/clear-context-state.js +1 -0
- package/dist/extensions/builtin/plan/enter-plan-mode-tool.d.ts +11 -0
- package/dist/extensions/builtin/plan/enter-plan-mode-tool.js +2 -0
- package/dist/extensions/builtin/plan/exit-plan-mode-tool.d.ts +18 -0
- package/dist/extensions/builtin/plan/exit-plan-mode-tool.js +13 -0
- package/dist/extensions/builtin/plan/index.d.ts +8 -0
- package/dist/extensions/builtin/plan/index.js +24 -0
- package/dist/extensions/builtin/plan/plan-agents.d.ts +23 -0
- package/dist/extensions/builtin/plan/plan-agents.js +43 -0
- package/dist/extensions/builtin/plan/plan-file-manager.d.ts +26 -0
- package/dist/extensions/builtin/plan/plan-file-manager.js +1 -0
- package/dist/extensions/builtin/plan/plan-permissions.d.ts +15 -0
- package/dist/extensions/builtin/plan/plan-permissions.js +12 -0
- package/dist/extensions/builtin/plan/plan-validation.d.ts +18 -0
- package/dist/extensions/builtin/plan/plan-validation.js +5 -0
- package/dist/extensions/builtin/plan/plan-workflow-prompt.d.ts +18 -0
- package/dist/extensions/builtin/plan/plan-workflow-prompt.js +102 -0
- package/dist/extensions/builtin/plan/teammate-approval.d.ts +49 -0
- package/dist/extensions/builtin/plan/teammate-approval.js +3 -0
- package/dist/extensions/builtin/plan/types.d.ts +133 -0
- package/dist/extensions/builtin/plan/types.js +1 -0
- package/dist/extensions/builtin/presence/index.d.ts +40 -0
- package/dist/extensions/builtin/presence/index.js +15 -0
- package/dist/extensions/builtin/presence/presence-memory.d.ts +47 -0
- package/dist/extensions/builtin/presence/presence-memory.js +1 -0
- package/dist/extensions/builtin/recap/AGENT.md +15 -0
- package/dist/extensions/builtin/recap/index.d.ts +8 -0
- package/dist/extensions/builtin/recap/index.js +1 -0
- package/dist/extensions/builtin/recap/recap-budget.d.ts +24 -0
- package/dist/extensions/builtin/recap/recap-budget.js +1 -0
- package/dist/extensions/builtin/recap/recap-extractor.d.ts +34 -0
- package/dist/extensions/builtin/recap/recap-extractor.js +3 -0
- package/dist/extensions/builtin/recap/recap-renderer.d.ts +19 -0
- package/dist/extensions/builtin/recap/recap-renderer.js +2 -0
- package/dist/extensions/builtin/recap/recap-synthesizer.d.ts +51 -0
- package/dist/extensions/builtin/recap/recap-synthesizer.js +19 -0
- package/dist/extensions/builtin/recap/recap-types.d.ts +40 -0
- package/dist/extensions/builtin/recap/recap-types.js +1 -0
- package/dist/extensions/builtin/sal/README.md +72 -0
- package/dist/extensions/builtin/sal/anchors.d.ts +46 -0
- package/dist/extensions/builtin/sal/anchors.js +1 -0
- package/dist/extensions/builtin/sal/eval/index.d.ts +18 -0
- package/dist/extensions/builtin/sal/eval/index.js +1 -0
- package/dist/extensions/builtin/sal/eval/insforge-sink.d.ts +30 -0
- package/dist/extensions/builtin/sal/eval/insforge-sink.js +1 -0
- package/dist/extensions/builtin/sal/eval/jsonl-sink.d.ts +27 -0
- package/dist/extensions/builtin/sal/eval/jsonl-sink.js +3 -0
- package/dist/extensions/builtin/sal/eval/noop-sink.d.ts +8 -0
- package/dist/extensions/builtin/sal/eval/noop-sink.js +1 -0
- package/dist/extensions/builtin/sal/eval/types.d.ts +60 -0
- package/dist/extensions/builtin/sal/eval/types.js +1 -0
- package/dist/extensions/builtin/sal/index.d.ts +12 -0
- package/dist/extensions/builtin/sal/index.js +7 -0
- package/dist/extensions/builtin/sal/sal-config.d.ts +46 -0
- package/dist/extensions/builtin/sal/sal-config.js +1 -0
- package/dist/extensions/builtin/sal/sal-context.d.ts +11 -0
- package/dist/extensions/builtin/sal/sal-context.js +2 -0
- package/dist/extensions/builtin/sal/sal-runtime.d.ts +72 -0
- package/dist/extensions/builtin/sal/sal-runtime.js +0 -0
- package/dist/extensions/builtin/sal/sal-trace.d.ts +11 -0
- package/dist/extensions/builtin/sal/sal-trace.js +1 -0
- package/dist/extensions/builtin/sal/terrain.d.ts +73 -0
- package/dist/extensions/builtin/sal/terrain.js +3 -0
- package/dist/extensions/builtin/sal/weights.d.ts +28 -0
- package/dist/extensions/builtin/sal/weights.js +1 -0
- package/dist/extensions/builtin/security-audit/README.md +289 -0
- package/dist/extensions/builtin/security-audit/engine/detector.d.ts +44 -0
- package/dist/extensions/builtin/security-audit/engine/detector.js +1 -0
- package/dist/extensions/builtin/security-audit/engine/interceptor.d.ts +61 -0
- package/dist/extensions/builtin/security-audit/engine/interceptor.js +27 -0
- package/dist/extensions/builtin/security-audit/engine/logger.d.ts +65 -0
- package/dist/extensions/builtin/security-audit/engine/logger.js +65 -0
- package/dist/extensions/builtin/security-audit/index.d.ts +13 -0
- package/dist/extensions/builtin/security-audit/index.js +49 -0
- package/dist/extensions/builtin/security-audit/interface.d.ts +167 -0
- package/dist/extensions/builtin/security-audit/interface.js +1 -0
- package/dist/extensions/builtin/soul/index.d.ts +13 -0
- package/dist/extensions/builtin/soul/index.js +1 -0
- package/dist/extensions/builtin/subagent/index.d.ts +8 -0
- package/dist/extensions/builtin/subagent/index.js +8 -0
- package/dist/extensions/builtin/subagent/subagent-parser.d.ts +30 -0
- package/dist/extensions/builtin/subagent/subagent-parser.js +15 -0
- package/dist/extensions/builtin/subagent/subagent-runner.d.ts +49 -0
- package/dist/extensions/builtin/subagent/subagent-runner.js +8 -0
- package/dist/extensions/builtin/subagent/subagent-types.d.ts +57 -0
- package/dist/extensions/builtin/subagent/subagent-types.js +0 -0
- package/dist/extensions/builtin/task/index.d.ts +8 -0
- package/dist/extensions/builtin/task/index.js +1 -0
- package/dist/extensions/builtin/task/task-store.d.ts +42 -0
- package/dist/extensions/builtin/task/task-store.js +1 -0
- package/dist/extensions/builtin/task/task-tools/task-create-tool.d.ts +37 -0
- package/dist/extensions/builtin/task/task-tools/task-create-tool.js +40 -0
- package/dist/extensions/builtin/task/task-tools/task-get-tool.d.ts +31 -0
- package/dist/extensions/builtin/task/task-tools/task-get-tool.js +23 -0
- package/dist/extensions/builtin/task/task-tools/task-list-tool.d.ts +27 -0
- package/dist/extensions/builtin/task/task-tools/task-list-tool.js +22 -0
- package/dist/extensions/builtin/task/task-tools/task-output-tool.d.ts +32 -0
- package/dist/extensions/builtin/task/task-tools/task-output-tool.js +10 -0
- package/dist/extensions/builtin/task/task-tools/task-stop-tool.d.ts +31 -0
- package/dist/extensions/builtin/task/task-tools/task-stop-tool.js +5 -0
- package/dist/extensions/builtin/task/task-tools/task-update-tool.d.ts +47 -0
- package/dist/extensions/builtin/task/task-tools/task-update-tool.js +77 -0
- package/dist/extensions/builtin/task/task-tools/tool-search-tool.d.ts +34 -0
- package/dist/extensions/builtin/task/task-tools/tool-search-tool.js +14 -0
- package/dist/extensions/builtin/task/task-types.d.ts +30 -0
- package/dist/extensions/builtin/task/task-types.js +1 -0
- package/dist/extensions/builtin/teach/README.md +197 -0
- package/dist/extensions/builtin/teach/index.d.ts +12 -0
- package/dist/extensions/builtin/teach/index.js +6 -0
- package/dist/extensions/builtin/teach/references/analogy-library.md +153 -0
- package/dist/extensions/builtin/teach/references/learning-paths.md +214 -0
- package/dist/extensions/builtin/teach/references/source-verification.md +268 -0
- package/dist/extensions/builtin/teach/references/teaching-template.md +237 -0
- package/dist/extensions/builtin/teach/teach-format.d.ts +35 -0
- package/dist/extensions/builtin/teach/teach-format.js +6 -0
- package/dist/extensions/builtin/teach/teach-i18n.d.ts +47 -0
- package/dist/extensions/builtin/teach/teach-i18n.js +1 -0
- package/dist/extensions/builtin/teach/teach-persistence.d.ts +36 -0
- package/dist/extensions/builtin/teach/teach-persistence.js +35 -0
- package/dist/extensions/builtin/teach/teach-prompts.d.ts +52 -0
- package/dist/extensions/builtin/teach/teach-prompts.js +35 -0
- package/dist/extensions/builtin/teach/teach-runtime.d.ts +93 -0
- package/dist/extensions/builtin/teach/teach-runtime.js +9 -0
- package/dist/extensions/builtin/teach/teach-types.d.ts +81 -0
- package/dist/extensions/builtin/teach/teach-types.js +0 -0
- package/dist/extensions/builtin/team/AGENT.md +112 -0
- package/dist/extensions/builtin/team/TESTING.md +299 -0
- package/dist/extensions/builtin/team/index.d.ts +26 -0
- package/dist/extensions/builtin/team/index.js +11 -0
- package/dist/extensions/builtin/team/team-dashboard.d.ts +13 -0
- package/dist/extensions/builtin/team/team-dashboard.js +1 -0
- package/dist/extensions/builtin/team/team-harness.d.ts +35 -0
- package/dist/extensions/builtin/team/team-harness.js +18 -0
- package/dist/extensions/builtin/team/team-mailbox.d.ts +50 -0
- package/dist/extensions/builtin/team/team-mailbox.js +4 -0
- package/dist/extensions/builtin/team/team-orchestrator.d.ts +39 -0
- package/dist/extensions/builtin/team/team-orchestrator.js +5 -0
- package/dist/extensions/builtin/team/team-parser.d.ts +84 -0
- package/dist/extensions/builtin/team/team-parser.js +38 -0
- package/dist/extensions/builtin/team/team-permissions.d.ts +63 -0
- package/dist/extensions/builtin/team/team-permissions.js +1 -0
- package/dist/extensions/builtin/team/team-presets.d.ts +45 -0
- package/dist/extensions/builtin/team/team-presets.js +2 -0
- package/dist/extensions/builtin/team/team-psyche.d.ts +14 -0
- package/dist/extensions/builtin/team/team-psyche.js +5 -0
- package/dist/extensions/builtin/team/team-runtime-helpers.d.ts +48 -0
- package/dist/extensions/builtin/team/team-runtime-helpers.js +2 -0
- package/dist/extensions/builtin/team/team-runtime.d.ts +91 -0
- package/dist/extensions/builtin/team/team-runtime.js +3 -0
- package/dist/extensions/builtin/team/team-state-store.d.ts +29 -0
- package/dist/extensions/builtin/team/team-state-store.js +2 -0
- package/dist/extensions/builtin/team/team-task-store.d.ts +35 -0
- package/dist/extensions/builtin/team/team-task-store.js +2 -0
- package/dist/extensions/builtin/team/team-transcript.d.ts +31 -0
- package/dist/extensions/builtin/team/team-transcript.js +2 -0
- package/dist/extensions/builtin/team/team-types.d.ts +250 -0
- package/dist/extensions/builtin/team/team-types.js +0 -0
- package/dist/extensions/builtin/team/team-ui.d.ts +50 -0
- package/dist/extensions/builtin/team/team-ui.js +2 -0
- package/dist/extensions/builtin/token-save/README.md +56 -0
- package/dist/extensions/builtin/token-save/config.d.ts +8 -0
- package/dist/extensions/builtin/token-save/config.js +1 -0
- package/dist/extensions/builtin/token-save/filters.d.ts +14 -0
- package/dist/extensions/builtin/token-save/filters.js +24 -0
- package/dist/extensions/builtin/token-save/index.d.ts +8 -0
- package/dist/extensions/builtin/token-save/index.js +4 -0
- package/dist/extensions/builtin/token-save/lexer.d.ts +11 -0
- package/dist/extensions/builtin/token-save/lexer.js +1 -0
- package/dist/extensions/builtin/token-save/recovery.d.ts +1 -0
- package/dist/extensions/builtin/token-save/recovery.js +1 -0
- package/dist/extensions/builtin/token-save/rewrite.d.ts +19 -0
- package/dist/extensions/builtin/token-save/rewrite.js +1 -0
- package/dist/extensions/builtin/token-save/runner.d.ts +14 -0
- package/dist/extensions/builtin/token-save/runner.js +3 -0
- package/dist/extensions/builtin/token-save/stream.d.ts +20 -0
- package/dist/extensions/builtin/token-save/stream.js +1 -0
- package/dist/extensions/builtin/token-save/toml-dsl.d.ts +25 -0
- package/dist/extensions/builtin/token-save/toml-dsl.js +3 -0
- package/dist/extensions/builtin/token-save/tracking.d.ts +24 -0
- package/dist/extensions/builtin/token-save/tracking.js +8 -0
- package/dist/extensions/optional/AGENT.md +11 -0
- package/dist/extensions/optional/export-html/index.d.ts +41 -0
- package/dist/extensions/optional/export-html/index.js +2 -0
- package/dist/extensions/optional/simplify/index.d.ts +35 -0
- package/dist/extensions/optional/simplify/index.js +77 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +1 -0
- package/dist/main.d.ts +7 -0
- package/dist/main.js +41 -0
- package/dist/migrations.d.ts +30 -0
- package/dist/migrations.js +4 -0
- package/dist/models.d.ts +7 -0
- package/dist/models.js +1 -0
- package/dist/modes/acp/acp-mode.d.ts +30 -0
- package/dist/modes/acp/acp-mode.js +25 -0
- package/dist/modes/index.d.ts +14 -0
- package/dist/modes/index.js +1 -0
- package/dist/modes/interactive/agent-loop-status.d.ts +8 -0
- package/dist/modes/interactive/agent-loop-status.js +1 -0
- package/dist/modes/interactive/components/apikey-input.d.ts +10 -0
- package/dist/modes/interactive/components/apikey-input.js +3 -0
- package/dist/modes/interactive/components/armin.d.ts +39 -0
- package/dist/modes/interactive/components/armin.js +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts +21 -0
- package/dist/modes/interactive/components/assistant-message.js +1 -0
- package/dist/modes/interactive/components/attachments-bar.d.ts +37 -0
- package/dist/modes/interactive/components/attachments-bar.js +1 -0
- package/dist/modes/interactive/components/bash-execution.d.ts +40 -0
- package/dist/modes/interactive/components/bash-execution.js +13 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts +21 -0
- package/dist/modes/interactive/components/bordered-loader.js +1 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts +21 -0
- package/dist/modes/interactive/components/branch-summary-message.js +3 -0
- package/dist/modes/interactive/components/buddy/pet-sprites.d.ts +31 -0
- package/dist/modes/interactive/components/buddy/pet-sprites.js +1 -0
- package/dist/modes/interactive/components/catui-loader.d.ts +55 -0
- package/dist/modes/interactive/components/catui-loader.js +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +21 -0
- package/dist/modes/interactive/components/compaction-summary-message.js +3 -0
- package/dist/modes/interactive/components/config-selector.d.ts +76 -0
- package/dist/modes/interactive/components/config-selector.js +1 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts +19 -0
- package/dist/modes/interactive/components/countdown-timer.js +1 -0
- package/dist/modes/interactive/components/custom-editor.d.ts +37 -0
- package/dist/modes/interactive/components/custom-editor.js +1 -0
- package/dist/modes/interactive/components/custom-message.d.ts +26 -0
- package/dist/modes/interactive/components/custom-message.js +2 -0
- package/dist/modes/interactive/components/daxnuts.d.ts +28 -0
- package/dist/modes/interactive/components/daxnuts.js +1 -0
- package/dist/modes/interactive/components/diff.d.ts +17 -0
- package/dist/modes/interactive/components/diff.js +3 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts +20 -0
- package/dist/modes/interactive/components/dynamic-border.js +1 -0
- package/dist/modes/interactive/components/editor-buddy-layout.d.ts +17 -0
- package/dist/modes/interactive/components/editor-buddy-layout.js +1 -0
- package/dist/modes/interactive/components/extension-editor.d.ts +25 -0
- package/dist/modes/interactive/components/extension-editor.js +1 -0
- package/dist/modes/interactive/components/extension-input.d.ts +29 -0
- package/dist/modes/interactive/components/extension-input.js +2 -0
- package/dist/modes/interactive/components/extension-selector.d.ts +32 -0
- package/dist/modes/interactive/components/extension-selector.js +2 -0
- package/dist/modes/interactive/components/footer.d.ts +34 -0
- package/dist/modes/interactive/components/footer.js +1 -0
- package/dist/modes/interactive/components/index.d.ts +44 -0
- package/dist/modes/interactive/components/index.js +1 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts +46 -0
- package/dist/modes/interactive/components/keybinding-hints.js +1 -0
- package/dist/modes/interactive/components/login-dialog.d.ts +47 -0
- package/dist/modes/interactive/components/login-dialog.js +1 -0
- package/dist/modes/interactive/components/memory-stats.d.ts +14 -0
- package/dist/modes/interactive/components/memory-stats.js +2 -0
- package/dist/modes/interactive/components/model-selector.d.ts +59 -0
- package/dist/modes/interactive/components/model-selector.js +2 -0
- package/dist/modes/interactive/components/notification-queue.d.ts +49 -0
- package/dist/modes/interactive/components/notification-queue.js +1 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts +30 -0
- package/dist/modes/interactive/components/oauth-selector.js +1 -0
- package/dist/modes/interactive/components/persona-selector.d.ts +24 -0
- package/dist/modes/interactive/components/persona-selector.js +1 -0
- package/dist/modes/interactive/components/plan-progress-panel.d.ts +24 -0
- package/dist/modes/interactive/components/plan-progress-panel.js +1 -0
- package/dist/modes/interactive/components/provider-selector.d.ts +25 -0
- package/dist/modes/interactive/components/provider-selector.js +1 -0
- package/dist/modes/interactive/components/raw-text.d.ts +19 -0
- package/dist/modes/interactive/components/raw-text.js +3 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +54 -0
- package/dist/modes/interactive/components/scoped-models-selector.js +1 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts +28 -0
- package/dist/modes/interactive/components/session-selector-search.js +1 -0
- package/dist/modes/interactive/components/session-selector.d.ts +100 -0
- package/dist/modes/interactive/components/session-selector.js +2 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +77 -0
- package/dist/modes/interactive/components/settings-selector.js +1 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts +15 -0
- package/dist/modes/interactive/components/show-images-selector.js +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +22 -0
- package/dist/modes/interactive/components/skill-invocation-message.js +3 -0
- package/dist/modes/interactive/components/soul-stats.d.ts +15 -0
- package/dist/modes/interactive/components/soul-stats.js +2 -0
- package/dist/modes/interactive/components/sub-agent-panel.d.ts +24 -0
- package/dist/modes/interactive/components/sub-agent-panel.js +1 -0
- package/dist/modes/interactive/components/task-status-panel.d.ts +36 -0
- package/dist/modes/interactive/components/task-status-panel.js +1 -0
- package/dist/modes/interactive/components/theme-selector.d.ts +16 -0
- package/dist/modes/interactive/components/theme-selector.js +1 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts +16 -0
- package/dist/modes/interactive/components/thinking-selector.js +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +80 -0
- package/dist/modes/interactive/components/tool-execution.js +58 -0
- package/dist/modes/interactive/components/tree-selector.d.ts +73 -0
- package/dist/modes/interactive/components/tree-selector.js +1 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts +35 -0
- package/dist/modes/interactive/components/user-message-selector.js +1 -0
- package/dist/modes/interactive/components/user-message.d.ts +13 -0
- package/dist/modes/interactive/components/user-message.js +1 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts +29 -0
- package/dist/modes/interactive/components/visual-truncate.js +1 -0
- package/dist/modes/interactive/controllers/auth-provider-config-controller.d.ts +64 -0
- package/dist/modes/interactive/controllers/auth-provider-config-controller.js +1 -0
- package/dist/modes/interactive/controllers/extension-ui/custom-overlay-host.d.ts +38 -0
- package/dist/modes/interactive/controllers/extension-ui/custom-overlay-host.js +1 -0
- package/dist/modes/interactive/controllers/extension-ui/editor-component-adapter.d.ts +37 -0
- package/dist/modes/interactive/controllers/extension-ui/editor-component-adapter.js +1 -0
- package/dist/modes/interactive/controllers/extension-ui/persistent-surface-registry.d.ts +53 -0
- package/dist/modes/interactive/controllers/extension-ui/persistent-surface-registry.js +1 -0
- package/dist/modes/interactive/controllers/extension-ui/prompt-host.d.ts +52 -0
- package/dist/modes/interactive/controllers/extension-ui/prompt-host.js +2 -0
- package/dist/modes/interactive/controllers/image-pipeline-controller.d.ts +106 -0
- package/dist/modes/interactive/controllers/image-pipeline-controller.js +1 -0
- package/dist/modes/interactive/controllers/input-submit-controller.d.ts +80 -0
- package/dist/modes/interactive/controllers/input-submit-controller.js +2 -0
- package/dist/modes/interactive/controllers/interrupt-controller.d.ts +75 -0
- package/dist/modes/interactive/controllers/interrupt-controller.js +1 -0
- package/dist/modes/interactive/controllers/model-overlay-controller.d.ts +127 -0
- package/dist/modes/interactive/controllers/model-overlay-controller.js +3 -0
- package/dist/modes/interactive/controllers/self-update-controller.d.ts +71 -0
- package/dist/modes/interactive/controllers/self-update-controller.js +24 -0
- package/dist/modes/interactive/controllers/settings-overlay-controller.d.ts +56 -0
- package/dist/modes/interactive/controllers/settings-overlay-controller.js +2 -0
- package/dist/modes/interactive/controllers/slash-dispatcher-controller.d.ts +74 -0
- package/dist/modes/interactive/controllers/slash-dispatcher-controller.js +1 -0
- package/dist/modes/interactive/controllers/stream-render-controller.d.ts +110 -0
- package/dist/modes/interactive/controllers/stream-render-controller.js +2 -0
- package/dist/modes/interactive/controllers/tree-overlay-controller.d.ts +55 -0
- package/dist/modes/interactive/controllers/tree-overlay-controller.js +1 -0
- package/dist/modes/interactive/footer-data-provider.d.ts +32 -0
- package/dist/modes/interactive/footer-data-provider.js +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +303 -0
- package/dist/modes/interactive/interactive-mode.js +119 -0
- package/dist/modes/interactive/services/tips.d.ts +20 -0
- package/dist/modes/interactive/services/tips.js +1 -0
- package/dist/modes/interactive/slash-command-arguments.d.ts +28 -0
- package/dist/modes/interactive/slash-command-arguments.js +1 -0
- package/dist/modes/interactive/state/interactive-state.d.ts +74 -0
- package/dist/modes/interactive/state/interactive-state.js +1 -0
- package/dist/modes/interactive/theme/dark.json +85 -0
- package/dist/modes/interactive/theme/light.json +84 -0
- package/dist/modes/interactive/theme/theme-schema.json +335 -0
- package/dist/modes/interactive/theme/theme.d.ts +81 -0
- package/dist/modes/interactive/theme/theme.js +16 -0
- package/dist/modes/interactive/theme/warm.json +81 -0
- package/dist/modes/print-mode.d.ts +38 -0
- package/dist/modes/print-mode.js +2 -0
- package/dist/modes/rpc/rpc-client.d.ts +221 -0
- package/dist/modes/rpc/rpc-client.js +2 -0
- package/dist/modes/rpc/rpc-mode.d.ts +14 -0
- package/dist/modes/rpc/rpc-mode.js +1 -0
- package/dist/modes/rpc/rpc-types.d.ts +449 -0
- package/dist/modes/rpc/rpc-types.js +0 -0
- package/dist/modes/utils/agent-loop-result-format.d.ts +10 -0
- package/dist/modes/utils/agent-loop-result-format.js +1 -0
- package/dist/modes/utils/clipboard-image.d.ts +10 -0
- package/dist/modes/utils/clipboard-image.js +1 -0
- package/dist/modes/utils/clipboard-native.d.ts +11 -0
- package/dist/modes/utils/clipboard-native.js +1 -0
- package/dist/modes/utils/clipboard.d.ts +1 -0
- package/dist/modes/utils/clipboard.js +1 -0
- package/dist/modes/utils/image-convert.d.ts +8 -0
- package/dist/modes/utils/image-convert.js +1 -0
- package/dist/modes/utils/image-resize.d.ts +41 -0
- package/dist/modes/utils/image-resize.js +1 -0
- package/dist/node_modules/@catui/agent-core/dist/agent-loop-continuations.js +1 -0
- package/dist/node_modules/@catui/agent-core/dist/agent-loop-stream-events.js +1 -0
- package/dist/node_modules/@catui/agent-core/dist/agent-loop-tool-results.js +3 -0
- package/dist/node_modules/@catui/agent-core/dist/agent-loop-tool-summaries.js +1 -0
- package/dist/node_modules/@catui/agent-core/dist/agent-loop.js +4 -0
- package/dist/node_modules/@catui/agent-core/dist/agent-run-result.js +1 -0
- package/dist/node_modules/@catui/agent-core/dist/agent.js +1 -0
- package/dist/node_modules/@catui/agent-core/dist/errors.js +1 -0
- package/dist/node_modules/@catui/agent-core/dist/index.js +1 -0
- package/dist/node_modules/@catui/agent-core/dist/proxy.js +2 -0
- package/dist/node_modules/@catui/agent-core/dist/structured-adaptive-agent-loop.js +2 -0
- package/dist/node_modules/@catui/agent-core/dist/structured-adaptive-streaming-tool-executor.js +1 -0
- package/dist/node_modules/@catui/agent-core/dist/structured-adaptive-tool-orchestration.js +3 -0
- package/dist/node_modules/@catui/agent-core/dist/types.js +1 -0
- package/dist/node_modules/@catui/agent-core/package.json +28 -0
- package/dist/node_modules/@catui/ai/dist/api-registry.js +1 -0
- package/dist/node_modules/@catui/ai/dist/cli.js +21 -0
- package/dist/node_modules/@catui/ai/dist/config-path.js +1 -0
- package/dist/node_modules/@catui/ai/dist/debug-logger.js +4 -0
- package/dist/node_modules/@catui/ai/dist/env-api-keys.js +1 -0
- package/dist/node_modules/@catui/ai/dist/env.js +1 -0
- package/dist/node_modules/@catui/ai/dist/events.js +1 -0
- package/dist/node_modules/@catui/ai/dist/index.js +1 -0
- package/dist/node_modules/@catui/ai/dist/json.js +1 -0
- package/dist/node_modules/@catui/ai/dist/models.generated.js +1 -0
- package/dist/node_modules/@catui/ai/dist/models.js +1 -0
- package/dist/node_modules/@catui/ai/dist/overflow.js +1 -0
- package/dist/node_modules/@catui/ai/dist/providers/amazon-bedrock.js +1 -0
- package/dist/node_modules/@catui/ai/dist/providers/anthropic.js +2 -0
- package/dist/node_modules/@catui/ai/dist/providers/azure-openai-responses.js +1 -0
- package/dist/node_modules/@catui/ai/dist/providers/github-copilot-headers.js +1 -0
- package/dist/node_modules/@catui/ai/dist/providers/google-gemini-cli.js +2 -0
- package/dist/node_modules/@catui/ai/dist/providers/google-shared.js +2 -0
- package/dist/node_modules/@catui/ai/dist/providers/google-vertex.js +1 -0
- package/dist/node_modules/@catui/ai/dist/providers/google.js +1 -0
- package/dist/node_modules/@catui/ai/dist/providers/openai-codex-responses.js +7 -0
- package/dist/node_modules/@catui/ai/dist/providers/openai-completions.js +6 -0
- package/dist/node_modules/@catui/ai/dist/providers/openai-responses-shared.js +10 -0
- package/dist/node_modules/@catui/ai/dist/providers/openai-responses.js +1 -0
- package/dist/node_modules/@catui/ai/dist/providers/register-builtins.js +1 -0
- package/dist/node_modules/@catui/ai/dist/providers/simple-options.js +1 -0
- package/dist/node_modules/@catui/ai/dist/providers/transform-messages.js +1 -0
- package/dist/node_modules/@catui/ai/dist/registry.js +1 -0
- package/dist/node_modules/@catui/ai/dist/schema.js +1 -0
- package/dist/node_modules/@catui/ai/dist/stream.js +1 -0
- package/dist/node_modules/@catui/ai/dist/types.js +0 -0
- package/dist/node_modules/@catui/ai/dist/utils/event-stream-types.js +0 -0
- package/dist/node_modules/@catui/ai/dist/utils/event-stream.js +1 -0
- package/dist/node_modules/@catui/ai/dist/utils/http-proxy.js +1 -0
- package/dist/node_modules/@catui/ai/dist/utils/json-parse.js +1 -0
- package/dist/node_modules/@catui/ai/dist/utils/oauth/anthropic.js +1 -0
- package/dist/node_modules/@catui/ai/dist/utils/oauth/decode-credential.js +1 -0
- package/dist/node_modules/@catui/ai/dist/utils/oauth/github-copilot.js +1 -0
- package/dist/node_modules/@catui/ai/dist/utils/oauth/google-antigravity.js +1 -0
- package/dist/node_modules/@catui/ai/dist/utils/oauth/google-gemini-cli.js +1 -0
- package/dist/node_modules/@catui/ai/dist/utils/oauth/index.js +1 -0
- package/dist/node_modules/@catui/ai/dist/utils/oauth/openai-codex.js +11 -0
- package/dist/node_modules/@catui/ai/dist/utils/oauth/pkce.js +1 -0
- package/dist/node_modules/@catui/ai/dist/utils/oauth/types.js +0 -0
- package/dist/node_modules/@catui/ai/dist/utils/overflow.js +1 -0
- package/dist/node_modules/@catui/ai/dist/utils/sanitize-unicode.js +1 -0
- package/dist/node_modules/@catui/ai/dist/utils/typebox-helpers.js +1 -0
- package/dist/node_modules/@catui/ai/dist/utils/validation.js +6 -0
- package/dist/node_modules/@catui/ai/package.json +106 -0
- package/dist/node_modules/@catui/tui/dist/autocomplete.js +2 -0
- package/dist/node_modules/@catui/tui/dist/components/box.js +1 -0
- package/dist/node_modules/@catui/tui/dist/components/cached-container.js +1 -0
- package/dist/node_modules/@catui/tui/dist/components/cancellable-loader.js +1 -0
- package/dist/node_modules/@catui/tui/dist/components/editor.js +21 -0
- package/dist/node_modules/@catui/tui/dist/components/image.js +1 -0
- package/dist/node_modules/@catui/tui/dist/components/input.js +2 -0
- package/dist/node_modules/@catui/tui/dist/components/loader.js +1 -0
- package/dist/node_modules/@catui/tui/dist/components/markdown.js +7 -0
- package/dist/node_modules/@catui/tui/dist/components/select-list.js +1 -0
- package/dist/node_modules/@catui/tui/dist/components/settings-list.js +1 -0
- package/dist/node_modules/@catui/tui/dist/components/spacer.js +1 -0
- package/dist/node_modules/@catui/tui/dist/components/text.js +1 -0
- package/dist/node_modules/@catui/tui/dist/components/truncated-text.js +2 -0
- package/dist/node_modules/@catui/tui/dist/editor-component.js +0 -0
- package/dist/node_modules/@catui/tui/dist/fuzzy.js +1 -0
- package/dist/node_modules/@catui/tui/dist/index.js +1 -0
- package/dist/node_modules/@catui/tui/dist/keybindings.js +1 -0
- package/dist/node_modules/@catui/tui/dist/keys.js +5 -0
- package/dist/node_modules/@catui/tui/dist/kill-ring.js +1 -0
- package/dist/node_modules/@catui/tui/dist/stdin-buffer.js +1 -0
- package/dist/node_modules/@catui/tui/dist/terminal-image.js +1 -0
- package/dist/node_modules/@catui/tui/dist/terminal.js +1 -0
- package/dist/node_modules/@catui/tui/dist/tui.js +12 -0
- package/dist/node_modules/@catui/tui/dist/undo-stack.js +1 -0
- package/dist/node_modules/@catui/tui/dist/utils.js +2 -0
- package/dist/node_modules/@catui/tui/package.json +37 -0
- package/dist/packages/mem-core/src/store.d.ts +21 -0
- package/dist/packages/mem-core/src/store.js +1 -0
- package/dist/packages/mem-core/src/types.d.ts +329 -0
- package/dist/packages/mem-core/src/types.js +0 -0
- package/dist/packages/protocol/src/commands.d.ts +33 -0
- package/dist/packages/protocol/src/commands.js +0 -0
- package/dist/packages/protocol/src/flags.d.ts +20 -0
- package/dist/packages/protocol/src/flags.js +0 -0
- package/dist/packages/protocol/src/hooks.d.ts +17 -0
- package/dist/packages/protocol/src/hooks.js +0 -0
- package/dist/packages/protocol/src/index.d.ts +15 -0
- package/dist/packages/protocol/src/index.js +1 -0
- package/dist/packages/protocol/src/lifecycle.d.ts +61 -0
- package/dist/packages/protocol/src/lifecycle.js +0 -0
- package/dist/packages/protocol/src/tools.d.ts +77 -0
- package/dist/packages/protocol/src/tools.js +0 -0
- package/dist/packages/soul-core/src/config.d.ts +20 -0
- package/dist/packages/soul-core/src/config.js +1 -0
- package/dist/packages/soul-core/src/diagnostics.d.ts +23 -0
- package/dist/packages/soul-core/src/diagnostics.js +1 -0
- package/dist/packages/soul-core/src/evolution.d.ts +75 -0
- package/dist/packages/soul-core/src/evolution.js +1 -0
- package/dist/packages/soul-core/src/index.d.ts +13 -0
- package/dist/packages/soul-core/src/index.js +1 -0
- package/dist/packages/soul-core/src/injection.d.ts +35 -0
- package/dist/packages/soul-core/src/injection.js +8 -0
- package/dist/packages/soul-core/src/manager.d.ts +101 -0
- package/dist/packages/soul-core/src/manager.js +1 -0
- package/dist/packages/soul-core/src/store.d.ts +62 -0
- package/dist/packages/soul-core/src/store.js +1 -0
- package/dist/packages/soul-core/src/types.d.ts +317 -0
- package/dist/packages/soul-core/src/types.js +0 -0
- package/dist/public-config.d.ts +12 -0
- package/dist/public-config.js +1 -0
- package/dist/runtime.d.ts +9 -0
- package/dist/runtime.js +1 -0
- package/dist/session-compaction.d.ts +7 -0
- package/dist/session-compaction.js +1 -0
- package/dist/session.d.ts +7 -0
- package/dist/session.js +1 -0
- package/dist/skills.d.ts +7 -0
- package/dist/skills.js +1 -0
- package/dist/tools.d.ts +7 -0
- package/dist/tools.js +1 -0
- package/dist/utils/changelog.d.ts +20 -0
- package/dist/utils/changelog.js +4 -0
- package/dist/utils/diagnostics.d.ts +37 -0
- package/dist/utils/diagnostics.js +1 -0
- package/dist/utils/frontmatter.d.ts +7 -0
- package/dist/utils/frontmatter.js +4 -0
- package/dist/utils/git.d.ts +25 -0
- package/dist/utils/git.js +1 -0
- package/dist/utils/mime.d.ts +1 -0
- package/dist/utils/mime.js +1 -0
- package/dist/utils/photon.d.ts +6 -0
- package/dist/utils/photon.js +1 -0
- package/dist/utils/startup-profiler.d.ts +87 -0
- package/dist/utils/startup-profiler.js +2 -0
- package/docs/codex-goal-command-impl.md +1055 -0
- package/docs/codex-goal-vs-grub.md +500 -0
- package/docs/custom-provider.md +27 -0
- package/docs/extensions.md +27 -0
- package/docs/keybindings.md +27 -0
- package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/200/273/347/273/223.md" +251 -0
- package/docs/loop /351/207/215/346/236/204/345/256/214/346/210/220/346/212/245/345/221/212.md" +123 -0
- package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210.md" +1222 -0
- package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210/345/256/236/347/216/260/346/212/245/345/221/212.md" +158 -0
- package/docs/loop /351/207/215/346/236/204/346/226/271/346/241/210/345/257/271/346/257/224/345/210/206/346/236/220.md" +128 -0
- package/docs/loop /351/207/215/346/236/204/350/256/241/345/210/222.md" +321 -0
- package/docs/loop-usage-examples.md +215 -0
- package/docs/models.md +27 -0
- package/docs/packages.md +27 -0
- package/docs/pi-design-philosophy.md +457 -0
- package/docs/planmode.md +1987 -0
- package/docs/prompt-templates.md +27 -0
- package/docs/providers.md +27 -0
- package/docs/sdk.md +27 -0
- package/docs/skills.md +27 -0
- package/docs/themes.md +27 -0
- package/docs/tui.md +27 -0
- package/package.json +191 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal TUI implementation with differential rendering
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* [WHO]: Component, Focusable, isFocusable, CURSOR_MARKER, visibleWidth
|
|
6
|
+
* [FROM]: Depends on node:fs, node:os, node:path, ./keys.js, ./terminal-image.js
|
|
7
|
+
* [TO]: Consumed by core/lib/tui/src/index.ts
|
|
8
|
+
* [HERE]: core/lib/tui/src/tui.ts -
|
|
9
|
+
*/
|
|
10
|
+
import type { Terminal } from "./terminal.js";
|
|
11
|
+
import { visibleWidth } from "./utils.js";
|
|
12
|
+
/**
|
|
13
|
+
* Component interface - all components must implement this
|
|
14
|
+
*/
|
|
15
|
+
export interface Component {
|
|
16
|
+
/**
|
|
17
|
+
* Render the component to lines for the given viewport width
|
|
18
|
+
* @param width - Current viewport width
|
|
19
|
+
* @returns Array of strings, each representing a line
|
|
20
|
+
*/
|
|
21
|
+
render(width: number): string[];
|
|
22
|
+
/**
|
|
23
|
+
* Optional handler for keyboard input when component has focus
|
|
24
|
+
*/
|
|
25
|
+
handleInput?(data: string): void;
|
|
26
|
+
/**
|
|
27
|
+
* If true, component receives key release events (Kitty protocol).
|
|
28
|
+
* Default is false - release events are filtered out.
|
|
29
|
+
*/
|
|
30
|
+
wantsKeyRelease?: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Invalidate any cached rendering state.
|
|
33
|
+
* Called when theme changes or when component needs to re-render from scratch.
|
|
34
|
+
*/
|
|
35
|
+
invalidate(): void;
|
|
36
|
+
}
|
|
37
|
+
type InputListenerResult = {
|
|
38
|
+
consume?: boolean;
|
|
39
|
+
data?: string;
|
|
40
|
+
} | undefined;
|
|
41
|
+
type InputListener = (data: string) => InputListenerResult;
|
|
42
|
+
/**
|
|
43
|
+
* Interface for components that can receive focus and display a hardware cursor.
|
|
44
|
+
* When focused, the component should emit CURSOR_MARKER at the cursor position
|
|
45
|
+
* in its render output. TUI will find this marker and position the hardware
|
|
46
|
+
* cursor there for proper IME candidate window positioning.
|
|
47
|
+
*/
|
|
48
|
+
export interface Focusable {
|
|
49
|
+
/** Set by TUI when focus changes. Component should emit CURSOR_MARKER when true. */
|
|
50
|
+
focused: boolean;
|
|
51
|
+
}
|
|
52
|
+
/** Type guard to check if a component implements Focusable */
|
|
53
|
+
export declare function isFocusable(component: Component | null): component is Component & Focusable;
|
|
54
|
+
/**
|
|
55
|
+
* Cursor position marker - APC (Application Program Command) sequence.
|
|
56
|
+
* This is a zero-width escape sequence that terminals ignore.
|
|
57
|
+
* Components emit this at the cursor position when focused.
|
|
58
|
+
* TUI finds and strips this marker, then positions the hardware cursor there.
|
|
59
|
+
*/
|
|
60
|
+
export declare const CURSOR_MARKER = "\u001B_pi:c\u0007";
|
|
61
|
+
export { visibleWidth };
|
|
62
|
+
/**
|
|
63
|
+
* Anchor position for overlays
|
|
64
|
+
*/
|
|
65
|
+
export type OverlayAnchor = "center" | "top-left" | "top-right" | "bottom-left" | "bottom-right" | "top-center" | "bottom-center" | "left-center" | "right-center";
|
|
66
|
+
/**
|
|
67
|
+
* Margin configuration for overlays
|
|
68
|
+
*/
|
|
69
|
+
export interface OverlayMargin {
|
|
70
|
+
top?: number;
|
|
71
|
+
right?: number;
|
|
72
|
+
bottom?: number;
|
|
73
|
+
left?: number;
|
|
74
|
+
}
|
|
75
|
+
/** Value that can be absolute (number) or percentage (string like "50%") */
|
|
76
|
+
export type SizeValue = number | `${number}%`;
|
|
77
|
+
/**
|
|
78
|
+
* Options for overlay positioning and sizing.
|
|
79
|
+
* Values can be absolute numbers or percentage strings (e.g., "50%").
|
|
80
|
+
*/
|
|
81
|
+
export interface OverlayOptions {
|
|
82
|
+
/** Width in columns, or percentage of terminal width (e.g., "50%") */
|
|
83
|
+
width?: SizeValue;
|
|
84
|
+
/** Minimum width in columns */
|
|
85
|
+
minWidth?: number;
|
|
86
|
+
/** Maximum height in rows, or percentage of terminal height (e.g., "50%") */
|
|
87
|
+
maxHeight?: SizeValue;
|
|
88
|
+
/** Anchor point for positioning (default: 'center') */
|
|
89
|
+
anchor?: OverlayAnchor;
|
|
90
|
+
/** Horizontal offset from anchor position (positive = right) */
|
|
91
|
+
offsetX?: number;
|
|
92
|
+
/** Vertical offset from anchor position (positive = down) */
|
|
93
|
+
offsetY?: number;
|
|
94
|
+
/** Row position: absolute number, or percentage (e.g., "25%" = 25% from top) */
|
|
95
|
+
row?: SizeValue;
|
|
96
|
+
/** Column position: absolute number, or percentage (e.g., "50%" = centered horizontally) */
|
|
97
|
+
col?: SizeValue;
|
|
98
|
+
/** Margin from terminal edges. Number applies to all sides. */
|
|
99
|
+
margin?: OverlayMargin | number;
|
|
100
|
+
/**
|
|
101
|
+
* Control overlay visibility based on terminal dimensions.
|
|
102
|
+
* If provided, overlay is only rendered when this returns true.
|
|
103
|
+
* Called each render cycle with current terminal dimensions.
|
|
104
|
+
*/
|
|
105
|
+
visible?: (termWidth: number, termHeight: number) => boolean;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Handle returned by showOverlay for controlling the overlay
|
|
109
|
+
*/
|
|
110
|
+
export interface OverlayHandle {
|
|
111
|
+
/** Permanently remove the overlay (cannot be shown again) */
|
|
112
|
+
hide(): void;
|
|
113
|
+
/** Temporarily hide or show the overlay */
|
|
114
|
+
setHidden(hidden: boolean): void;
|
|
115
|
+
/** Check if overlay is temporarily hidden */
|
|
116
|
+
isHidden(): boolean;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Container - a component that contains other components
|
|
120
|
+
*/
|
|
121
|
+
export declare class Container implements Component {
|
|
122
|
+
children: Component[];
|
|
123
|
+
addChild(component: Component): void;
|
|
124
|
+
removeChild(component: Component): void;
|
|
125
|
+
clear(): void;
|
|
126
|
+
invalidate(): void;
|
|
127
|
+
render(width: number): string[];
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* TUI - Main class for managing terminal UI with differential rendering
|
|
131
|
+
*/
|
|
132
|
+
export declare class TUI extends Container {
|
|
133
|
+
terminal: Terminal;
|
|
134
|
+
private previousLines;
|
|
135
|
+
private previousWidth;
|
|
136
|
+
private focusedComponent;
|
|
137
|
+
private inputListeners;
|
|
138
|
+
/** Global callback for debug key (Shift+Ctrl+D). Called before input is forwarded to focused component. */
|
|
139
|
+
onDebug?: () => void;
|
|
140
|
+
private renderRequested;
|
|
141
|
+
private renderWaiters;
|
|
142
|
+
private cursorRow;
|
|
143
|
+
private hardwareCursorRow;
|
|
144
|
+
private inputBuffer;
|
|
145
|
+
private cellSizeQueryPending;
|
|
146
|
+
private showHardwareCursor;
|
|
147
|
+
private clearOnShrink;
|
|
148
|
+
private maxLinesRendered;
|
|
149
|
+
private previousViewportTop;
|
|
150
|
+
private fullRedrawCount;
|
|
151
|
+
private stopped;
|
|
152
|
+
private synchronizedOutputEnabled;
|
|
153
|
+
private overlayStack;
|
|
154
|
+
private debugLog;
|
|
155
|
+
constructor(terminal: Terminal, showHardwareCursor?: boolean);
|
|
156
|
+
get fullRedraws(): number;
|
|
157
|
+
getShowHardwareCursor(): boolean;
|
|
158
|
+
setShowHardwareCursor(enabled: boolean): void;
|
|
159
|
+
getClearOnShrink(): boolean;
|
|
160
|
+
/**
|
|
161
|
+
* Set whether to trigger full re-render when content shrinks.
|
|
162
|
+
* When true (default), empty rows are cleared when content shrinks.
|
|
163
|
+
* When false, empty rows remain (reduces redraws on slower terminals).
|
|
164
|
+
*/
|
|
165
|
+
setClearOnShrink(enabled: boolean): void;
|
|
166
|
+
private wrapRenderBuffer;
|
|
167
|
+
setFocus(component: Component | null): void;
|
|
168
|
+
/**
|
|
169
|
+
* Show an overlay component with configurable positioning and sizing.
|
|
170
|
+
* Returns a handle to control the overlay's visibility.
|
|
171
|
+
*/
|
|
172
|
+
showOverlay(component: Component, options?: OverlayOptions): OverlayHandle;
|
|
173
|
+
/** Hide the topmost overlay and restore previous focus. */
|
|
174
|
+
hideOverlay(): void;
|
|
175
|
+
/** Check if there are any visible overlays */
|
|
176
|
+
hasOverlay(): boolean;
|
|
177
|
+
/** Check if an overlay entry is currently visible */
|
|
178
|
+
private isOverlayVisible;
|
|
179
|
+
/** Find the topmost visible overlay, if any */
|
|
180
|
+
private getTopmostVisibleOverlay;
|
|
181
|
+
invalidate(): void;
|
|
182
|
+
start(): void;
|
|
183
|
+
addInputListener(listener: InputListener): () => void;
|
|
184
|
+
removeInputListener(listener: InputListener): void;
|
|
185
|
+
private queryCellSize;
|
|
186
|
+
stop(): void;
|
|
187
|
+
requestRender(force?: boolean): void;
|
|
188
|
+
awaitRender(): Promise<void>;
|
|
189
|
+
private handleInput;
|
|
190
|
+
private parseCellSizeResponse;
|
|
191
|
+
/**
|
|
192
|
+
* Resolve overlay layout from options.
|
|
193
|
+
* Returns { width, row, col, maxHeight } for rendering.
|
|
194
|
+
*/
|
|
195
|
+
private resolveOverlayLayout;
|
|
196
|
+
private resolveAnchorRow;
|
|
197
|
+
private resolveAnchorCol;
|
|
198
|
+
/** Composite all overlays into content lines (in stack order, later = on top). */
|
|
199
|
+
private compositeOverlays;
|
|
200
|
+
private static readonly SEGMENT_RESET;
|
|
201
|
+
private applyLineResets;
|
|
202
|
+
/** Splice overlay content into a base line at a specific column. Single-pass optimized. */
|
|
203
|
+
private compositeLineAt;
|
|
204
|
+
/**
|
|
205
|
+
* Find and extract cursor position from rendered lines.
|
|
206
|
+
* Searches for CURSOR_MARKER, calculates its position, and strips it from the output.
|
|
207
|
+
* Only scans the bottom terminal height lines (visible viewport).
|
|
208
|
+
* @param lines - Rendered lines to search
|
|
209
|
+
* @param height - Terminal height (visible viewport size)
|
|
210
|
+
* @returns Cursor position { row, col } or null if no marker found
|
|
211
|
+
*/
|
|
212
|
+
private extractCursorPosition;
|
|
213
|
+
private doRender;
|
|
214
|
+
/**
|
|
215
|
+
* Position the hardware cursor for IME candidate window.
|
|
216
|
+
* @param cursorPos The cursor position extracted from rendered output, or null
|
|
217
|
+
* @param totalLines Total number of rendered lines
|
|
218
|
+
*/
|
|
219
|
+
private positionHardwareCursor;
|
|
220
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
var W=Object.defineProperty;var b=(R,e)=>W(R,"name",{value:e,configurable:!0});import*as $ from"node:fs";import*as V from"node:os";import*as k from"node:path";import{isKeyRelease as N,matchesKey as K}from"./keys.js";import{getCapabilities as G,isImageLine as I,setCellDimensions as j}from"./terminal-image.js";import{extractSegments as J,sliceByColumn as P,sliceWithWidth as Y,visibleWidth as L}from"./utils.js";function _(R){return R!==null&&"focused"in R}b(_,"isFocusable");function Q(){if(process.env.CATUI_SYNC_OUTPUT==="0")return!1;if(process.env.CATUI_SYNC_OUTPUT==="1")return!0;const R=process.env.TERM_PROGRAM?.toLowerCase()||"";return!new Set(["warpterminal","waveterm"]).has(R)}b(Q,"shouldUseSynchronizedOutput");const F="\x1B_pi:c\x07";function q(R,e){if(R===void 0)return;if(typeof R=="number")return R;const t=R.match(/^(\d+(?:\.\d+)?)%$/);if(t)return Math.floor(e*parseFloat(t[1])/100)}b(q,"parseSizeValue");class X{static{b(this,"Container")}children=[];addChild(e){this.children.push(e)}removeChild(e){const t=this.children.indexOf(e);t!==-1&&this.children.splice(t,1)}clear(){this.children=[]}invalidate(){for(const e of this.children)e.invalidate?.()}render(e){const t=[];for(const i of this.children)t.push(...i.render(e));return t}}class D extends X{static{b(this,"TUI")}terminal;previousLines=[];previousWidth=0;focusedComponent=null;inputListeners=new Set;onDebug;renderRequested=!1;renderWaiters=[];cursorRow=0;hardwareCursorRow=0;inputBuffer="";cellSizeQueryPending=!1;showHardwareCursor=process.env.CATUI_HARDWARE_CURSOR==="1";clearOnShrink=process.env.CATUI_CLEAR_ON_SHRINK==="1";maxLinesRendered=0;previousViewportTop=0;fullRedrawCount=0;stopped=!1;synchronizedOutputEnabled=Q();overlayStack=[];debugLog(e){if(process.env.CATUI_DEBUG_RENDER!=="1")return;const t=k.join(V.homedir(),".catui","agent","catui-debug.log");$.appendFileSync(t,`[${new Date().toISOString()}] [tui] ${e}
|
|
2
|
+
`)}constructor(e,t){super(),this.terminal=e,t!==void 0&&(this.showHardwareCursor=t)}get fullRedraws(){return this.fullRedrawCount}getShowHardwareCursor(){return this.showHardwareCursor}setShowHardwareCursor(e){this.showHardwareCursor!==e&&(this.showHardwareCursor=e,e||this.terminal.hideCursor(),this.requestRender())}getClearOnShrink(){return this.clearOnShrink}setClearOnShrink(e){this.clearOnShrink=e}wrapRenderBuffer(e){return this.synchronizedOutputEnabled?`\x1B[?2026h${e}\x1B[?2026l`:e}setFocus(e){_(this.focusedComponent)&&(this.focusedComponent.focused=!1),this.focusedComponent=e,_(e)&&(e.focused=!0)}showOverlay(e,t){const i={component:e,options:t,preFocus:this.focusedComponent,hidden:!1};return this.overlayStack.push(i),this.isOverlayVisible(i)&&this.setFocus(e),this.terminal.hideCursor(),this.requestRender(),{hide:b(()=>{const n=this.overlayStack.indexOf(i);if(n!==-1){if(this.overlayStack.splice(n,1),this.focusedComponent===e){const r=this.getTopmostVisibleOverlay();this.setFocus(r?.component??i.preFocus)}this.overlayStack.length===0&&this.terminal.hideCursor(),this.requestRender()}},"hide"),setHidden:b(n=>{if(i.hidden!==n){if(i.hidden=n,n){if(this.focusedComponent===e){const r=this.getTopmostVisibleOverlay();this.setFocus(r?.component??i.preFocus)}}else this.isOverlayVisible(i)&&this.setFocus(e);this.requestRender()}},"setHidden"),isHidden:b(()=>i.hidden,"isHidden")}}hideOverlay(){const e=this.overlayStack.pop();if(!e)return;const t=this.getTopmostVisibleOverlay();this.setFocus(t?.component??e.preFocus),this.overlayStack.length===0&&this.terminal.hideCursor(),this.requestRender()}hasOverlay(){return this.overlayStack.some(e=>this.isOverlayVisible(e))}isOverlayVisible(e){return e.hidden?!1:e.options?.visible?e.options.visible(this.terminal.columns,this.terminal.rows):!0}getTopmostVisibleOverlay(){for(let e=this.overlayStack.length-1;e>=0;e--)if(this.isOverlayVisible(this.overlayStack[e]))return this.overlayStack[e]}invalidate(){super.invalidate();for(const e of this.overlayStack)e.component.invalidate?.()}start(){this.stopped=!1,this.terminal.start(e=>this.handleInput(e),()=>this.requestRender()),this.terminal.hideCursor(),this.queryCellSize(),this.requestRender()}addInputListener(e){return this.inputListeners.add(e),()=>{this.inputListeners.delete(e)}}removeInputListener(e){this.inputListeners.delete(e)}queryCellSize(){G().images&&(this.cellSizeQueryPending=!0,this.terminal.write("\x1B[16t"))}stop(){if(this.stopped=!0,this.previousLines.length>0){const t=this.previousLines.length-this.hardwareCursorRow;t>0?this.terminal.write(`\x1B[${t}B`):t<0&&this.terminal.write(`\x1B[${-t}A`),this.terminal.write(`\r
|
|
3
|
+
`)}this.terminal.showCursor(),this.terminal.stop()}requestRender(e=!1){e&&(this.previousLines=[],this.previousWidth=-1,this.cursorRow=0,this.hardwareCursorRow=0,this.maxLinesRendered=0,this.previousViewportTop=0),!this.renderRequested&&(this.renderRequested=!0,this.debugLog(`requestRender (force=${e})`),process.nextTick(()=>{const t=this.renderWaiters.splice(0);this.renderRequested=!1;try{this.doRender()}finally{for(const i of t)i()}}))}async awaitRender(){this.renderRequested&&await new Promise(e=>{this.renderWaiters.push(e)})}handleInput(e){if(this.inputListeners.size>0){let i=e;for(const n of this.inputListeners){const r=n(i);if(r?.consume)return;r?.data!==void 0&&(i=r.data)}if(i.length===0)return;e=i}if(this.cellSizeQueryPending){this.inputBuffer+=e;const i=this.parseCellSizeResponse();if(i.length===0)return;e=i}if(K(e,"shift+ctrl+d")&&this.onDebug){this.onDebug();return}const t=this.overlayStack.find(i=>i.component===this.focusedComponent);if(t&&!this.isOverlayVisible(t)){const i=this.getTopmostVisibleOverlay();i?this.setFocus(i.component):this.setFocus(t.preFocus)}if(this.focusedComponent?.handleInput){if(N(e)&&!this.focusedComponent.wantsKeyRelease)return;this.focusedComponent.handleInput(e),this.requestRender()}}parseCellSizeResponse(){const e=/\x1b\[6;(\d+);(\d+)t/,t=this.inputBuffer.match(e);if(t){const r=parseInt(t[1],10),l=parseInt(t[2],10);r>0&&l>0&&(j({widthPx:l,heightPx:r}),this.invalidate(),this.requestRender()),this.inputBuffer=this.inputBuffer.replace(e,""),this.cellSizeQueryPending=!1}if(/\x1b(\[6?;?[\d;]*)?$/.test(this.inputBuffer)){const r=this.inputBuffer[this.inputBuffer.length-1];if(!/[a-zA-Z~]/.test(r))return""}const n=this.inputBuffer;return this.inputBuffer="",this.cellSizeQueryPending=!1,n}resolveOverlayLayout(e,t,i,n){const r=e??{},l=typeof r.margin=="number"?{top:r.margin,right:r.margin,bottom:r.margin,left:r.margin}:r.margin??{},s=Math.max(0,l.top??0),w=Math.max(0,l.right??0),y=Math.max(0,l.bottom??0),u=Math.max(0,l.left??0),v=Math.max(1,i-u-w),m=Math.max(1,n-s-y);let h=q(r.width,i)??Math.min(80,v);r.minWidth!==void 0&&(h=Math.max(h,r.minWidth)),h=Math.max(1,Math.min(h,v));let c=q(r.maxHeight,n);c!==void 0&&(c=Math.max(1,Math.min(c,m)));const d=c!==void 0?Math.min(t,c):t;let p,x;if(r.row!==void 0)if(typeof r.row=="string"){const C=r.row.match(/^(\d+(?:\.\d+)?)%$/);if(C){const g=Math.max(0,m-d),M=parseFloat(C[1])/100;p=s+Math.floor(g*M)}else p=this.resolveAnchorRow("center",d,m,s)}else p=r.row;else{const C=r.anchor??"center";p=this.resolveAnchorRow(C,d,m,s)}if(r.col!==void 0)if(typeof r.col=="string"){const C=r.col.match(/^(\d+(?:\.\d+)?)%$/);if(C){const g=Math.max(0,v-h),M=parseFloat(C[1])/100;x=u+Math.floor(g*M)}else x=this.resolveAnchorCol("center",h,v,u)}else x=r.col;else{const C=r.anchor??"center";x=this.resolveAnchorCol(C,h,v,u)}return r.offsetY!==void 0&&(p+=r.offsetY),r.offsetX!==void 0&&(x+=r.offsetX),p=Math.max(s,Math.min(p,n-y-d)),x=Math.max(u,Math.min(x,i-w-h)),{width:h,row:p,col:x,maxHeight:c}}resolveAnchorRow(e,t,i,n){switch(e){case"top-left":case"top-center":case"top-right":return n;case"bottom-left":case"bottom-center":case"bottom-right":return n+i-t;case"left-center":case"center":case"right-center":return n+Math.floor((i-t)/2)}}resolveAnchorCol(e,t,i,n){switch(e){case"top-left":case"left-center":case"bottom-left":return n;case"top-right":case"right-center":case"bottom-right":return n+i-t;case"top-center":case"center":case"bottom-center":return n+Math.floor((i-t)/2)}}compositeOverlays(e,t,i){if(this.overlayStack.length===0)return e;const n=[...e],r=[];let l=n.length;for(const u of this.overlayStack){if(!this.isOverlayVisible(u))continue;const{component:v,options:m}=u,{width:h,maxHeight:c}=this.resolveOverlayLayout(m,0,t,i);let d=v.render(h);c!==void 0&&d.length>c&&(d=d.slice(0,c));const{row:p,col:x}=this.resolveOverlayLayout(m,d.length,t,i);r.push({overlayLines:d,row:p,col:x,w:h}),l=Math.max(l,p+d.length)}const s=Math.max(this.maxLinesRendered,l);for(;n.length<s;)n.push("");const w=Math.max(0,s-i),y=new Set;for(const{overlayLines:u,row:v,col:m,w:h}of r)for(let c=0;c<u.length;c++){const d=w+v+c;if(d>=0&&d<n.length){const p=L(u[c])>h?P(u[c],0,h,!0):u[c];n[d]=this.compositeLineAt(n[d],p,m,h,t),y.add(d)}}for(const u of y)L(n[u])>t&&(n[u]=P(n[u],0,t,!0));return n}static SEGMENT_RESET="\x1B[0m\x1B]8;;\x07";applyLineResets(e){const t=D.SEGMENT_RESET;for(let i=0;i<e.length;i++){const n=e[i];I(n)||(e[i]=n+t)}return e}compositeLineAt(e,t,i,n,r){if(I(e))return e;const l=i+n,s=J(e,i,l,r-l,!0),w=Y(t,0,n,!0),y=Math.max(0,i-s.beforeWidth),u=Math.max(0,n-w.width),v=Math.max(i,s.beforeWidth),m=Math.max(n,w.width),h=Math.max(0,r-v-m),c=Math.max(0,h-s.afterWidth),d=D.SEGMENT_RESET,p=s.before+" ".repeat(y)+d+w.text+" ".repeat(u)+d+s.after+" ".repeat(c);return L(p)<=r?p:P(p,0,r,!0)}extractCursorPosition(e,t){const i=Math.max(0,e.length-t);for(let n=e.length-1;n>=i;n--){const r=e[n],l=r.indexOf(F);if(l!==-1){const s=r.slice(0,l),w=L(s);return e[n]=r.slice(0,l)+r.slice(l+F.length),{row:n,col:w}}}return null}doRender(){if(this.stopped)return;const e=this.terminal.columns,t=this.terminal.rows;this.debugLog(`doRender: width=${e} height=${t} stopped=${this.stopped} children=${this.children.length}`);let i=Math.max(0,this.maxLinesRendered-t),n=this.previousViewportTop,r=this.hardwareCursorRow;const l=b(o=>{const a=r-n;return o-i-a},"computeLineDiff");let s=this.render(e);this.overlayStack.length>0&&(s=this.compositeOverlays(s,e,t));const w=this.extractCursorPosition(s,t);s=this.applyLineResets(s);const y=this.previousWidth!==0&&this.previousWidth!==e,u=b(o=>{this.fullRedrawCount+=1;let a="";o&&(a+="\x1B[3J\x1B[2J\x1B[H");for(let f=0;f<s.length;f++)f>0&&(a+=`\r
|
|
4
|
+
`),a+=s[f];this.terminal.write(this.wrapRenderBuffer(a)),this.cursorRow=Math.max(0,s.length-1),this.hardwareCursorRow=this.cursorRow,o?this.maxLinesRendered=s.length:this.maxLinesRendered=Math.max(this.maxLinesRendered,s.length),this.previousViewportTop=Math.max(0,this.maxLinesRendered-t),this.positionHardwareCursor(w,s.length),this.previousLines=s,this.previousWidth=e},"fullRender"),v=process.env.CATUI_DEBUG_REDRAW==="1",m=b(o=>{if(!v)return;const a=k.join(V.homedir(),".catui","agent","catui-debug.log"),f=`[${new Date().toISOString()}] fullRender: ${o} (prev=${this.previousLines.length}, new=${s.length}, height=${t})
|
|
5
|
+
`;$.appendFileSync(a,f)},"logRedraw");if(this.previousLines.length===0&&!y){m("first render"),u(!1);return}if(y){m(`width changed (${this.previousWidth} -> ${e})`),u(!0);return}if(this.clearOnShrink&&s.length<this.maxLinesRendered&&this.overlayStack.length===0){m(`clearOnShrink (maxLinesRendered=${this.maxLinesRendered})`),u(!0);return}let h=-1,c=-1;const d=Math.max(s.length,this.previousLines.length);for(let o=0;o<d;o++){const a=o<this.previousLines.length?this.previousLines[o]:"",f=o<s.length?s[o]:"";a!==f&&(h===-1&&(h=o),c=o)}const p=s.length>this.previousLines.length;p&&(h===-1&&(h=this.previousLines.length),c=s.length-1);const x=p&&h===this.previousLines.length&&h>0;if(h===-1){this.positionHardwareCursor(w,s.length),this.previousViewportTop=Math.max(0,this.maxLinesRendered-t);return}if(h>=s.length){if(this.previousLines.length>s.length){let o="";const a=Math.max(0,s.length-1),f=l(a);f>0?o+=`\x1B[${f}B`:f<0&&(o+=`\x1B[${-f}A`),o+="\r";const S=this.previousLines.length-s.length;if(S>t){m(`extraLines > height (${S} > ${t})`),u(!0);return}S>0&&(o+="\x1B[1B");for(let B=0;B<S;B++)o+="\r\x1B[2K",B<S-1&&(o+="\x1B[1B");S>0&&(o+=`\x1B[${S}A`),this.terminal.write(this.wrapRenderBuffer(o)),this.cursorRow=a,this.hardwareCursorRow=a}this.positionHardwareCursor(w,s.length),this.previousLines=s,this.previousWidth=e,this.previousViewportTop=Math.max(0,this.maxLinesRendered-t);return}const C=Math.max(0,this.previousLines.length-t);if(h<C){m(`firstChanged < viewportTop (${h} < ${C})`),u(!0);return}let g="";const M=n+t-1,A=x?h-1:h;if(A>M){const o=Math.max(0,Math.min(t-1,r-n)),a=t-1-o;a>0&&(g+=`\x1B[${a}B`);const f=A-M;g+=`\r
|
|
6
|
+
`.repeat(f),n+=f,i+=f,r=A}const O=l(A);O>0?g+=`\x1B[${O}B`:O<0&&(g+=`\x1B[${-O}A`),g+=x?`\r
|
|
7
|
+
`:"\r";const T=Math.min(c,s.length-1);for(let o=h;o<=T;o++){o>h&&(g+=`\r
|
|
8
|
+
`),g+="\x1B[2K";const a=s[o];if(!I(a)&&L(a)>e){const S=k.join(V.homedir(),".catui","agent","catui-crash.log"),B=[`Crash at ${new Date().toISOString()}`,`Terminal width: ${e}`,`Line ${o} visible width: ${L(a)}`,"","=== All rendered lines ===",...s.map((U,H)=>`[${H}] (w=${L(U)}) ${U}`),""].join(`
|
|
9
|
+
`);$.mkdirSync(k.dirname(S),{recursive:!0}),$.writeFileSync(S,B),this.stop();const z=[`Rendered line ${o} exceeds terminal width (${L(a)} > ${e}).`,"","This is likely caused by a custom TUI component not truncating its output.","Use visibleWidth() to measure and truncateToWidth() to truncate lines.","",`Debug log written to: ${S}`].join(`
|
|
10
|
+
`);throw new Error(z)}g+=a}let E=T;if(this.previousLines.length>s.length){if(T<s.length-1){const a=s.length-1-T;g+=`\x1B[${a}B`,E=s.length-1}const o=this.previousLines.length-s.length;for(let a=s.length;a<this.previousLines.length;a++)g+=`\r
|
|
11
|
+
\x1B[2K`;g+=`\x1B[${o}A`}if(process.env.CATUI_TUI_DEBUG==="1"){const o="/tmp/tui";$.mkdirSync(o,{recursive:!0});const a=k.join(o,`render-${Date.now()}-${Math.random().toString(36).slice(2)}.log`),f=[`firstChanged: ${h}`,`viewportTop: ${i}`,`cursorRow: ${this.cursorRow}`,`height: ${t}`,`lineDiff: ${O}`,`hardwareCursorRow: ${r}`,`renderEnd: ${T}`,`finalCursorRow: ${E}`,`cursorPos: ${JSON.stringify(w)}`,`newLines.length: ${s.length}`,`previousLines.length: ${this.previousLines.length}`,"","=== newLines ===",JSON.stringify(s,null,2),"","=== previousLines ===",JSON.stringify(this.previousLines,null,2),"","=== buffer ===",JSON.stringify(g)].join(`
|
|
12
|
+
`);$.writeFileSync(a,f)}this.terminal.write(this.wrapRenderBuffer(g)),this.cursorRow=Math.max(0,s.length-1),this.hardwareCursorRow=E,this.maxLinesRendered=Math.max(this.maxLinesRendered,s.length),this.previousViewportTop=Math.max(0,this.maxLinesRendered-t),this.positionHardwareCursor(w,s.length),this.previousLines=s,this.previousWidth=e}positionHardwareCursor(e,t){if(!e||t<=0){this.terminal.hideCursor();return}const i=Math.max(0,Math.min(e.row,t-1)),n=Math.max(0,e.col),r=i-this.hardwareCursorRow;let l="";r>0?l+=`\x1B[${r}B`:r<0&&(l+=`\x1B[${-r}A`),l+=`\x1B[${n+1}G`,l&&this.terminal.write(l),this.hardwareCursorRow=i,this.showHardwareCursor?this.terminal.showCursor():this.terminal.hideCursor()}}export{F as CURSOR_MARKER,X as Container,D as TUI,_ as isFocusable,L as visibleWidth};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic undo stack with clone-on-push semantics.
|
|
3
|
+
*
|
|
4
|
+
* Stores deep clones of state snapshots. Popped snapshots are returned
|
|
5
|
+
* directly (no re-cloning) since they are already detached.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* [WHO]: UndoStack
|
|
9
|
+
* [FROM]: No external dependencies
|
|
10
|
+
* [TO]: Consumed by core/lib/tui/src/index.ts
|
|
11
|
+
* [HERE]: core/lib/tui/src/undo-stack.ts -
|
|
12
|
+
*/
|
|
13
|
+
export declare class UndoStack<S> {
|
|
14
|
+
private stack;
|
|
15
|
+
/** Push a deep clone of the given state onto the stack. */
|
|
16
|
+
push(state: S): void;
|
|
17
|
+
/** Pop and return the most recent snapshot, or undefined if empty. */
|
|
18
|
+
pop(): S | undefined;
|
|
19
|
+
/** Remove all snapshots. */
|
|
20
|
+
clear(): void;
|
|
21
|
+
get length(): number;
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var c=Object.defineProperty;var e=(s,t)=>c(s,"name",{value:t,configurable:!0});class a{static{e(this,"UndoStack")}stack=[];push(t){this.stack.push(structuredClone(t))}pop(){return this.stack.pop()}clear(){this.stack.length=0}get length(){return this.stack.length}}export{a as UndoStack};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* [WHO]: getSegmenter, visibleWidth, wrapTextWithAnsi, isWhitespaceChar, isPunctuationChar
|
|
3
|
+
* [FROM]: Depends on get-east-asian-width
|
|
4
|
+
* [TO]: Consumed by core/lib/tui/src/index.ts
|
|
5
|
+
* [HERE]: core/lib/tui/src/utils.ts -
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Get the shared grapheme segmenter instance.
|
|
9
|
+
*/
|
|
10
|
+
export declare function getSegmenter(): Intl.Segmenter;
|
|
11
|
+
/**
|
|
12
|
+
* Calculate the visible width of a string in terminal columns.
|
|
13
|
+
*/
|
|
14
|
+
export declare function visibleWidth(str: string): number;
|
|
15
|
+
/**
|
|
16
|
+
* Extract ANSI escape sequences from a string at the given position.
|
|
17
|
+
*/
|
|
18
|
+
export declare function extractAnsiCode(str: string, pos: number): {
|
|
19
|
+
code: string;
|
|
20
|
+
length: number;
|
|
21
|
+
} | null;
|
|
22
|
+
/**
|
|
23
|
+
* Wrap text with ANSI codes preserved.
|
|
24
|
+
*
|
|
25
|
+
* ONLY does word wrapping - NO padding, NO background colors.
|
|
26
|
+
* Returns lines where each line is <= width visible chars.
|
|
27
|
+
* Active ANSI codes are preserved across line breaks.
|
|
28
|
+
*
|
|
29
|
+
* @param text - Text to wrap (may contain ANSI codes and newlines)
|
|
30
|
+
* @param width - Maximum visible width per line
|
|
31
|
+
* @returns Array of wrapped lines (NOT padded to width)
|
|
32
|
+
*/
|
|
33
|
+
export declare function wrapTextWithAnsi(text: string, width: number): string[];
|
|
34
|
+
/**
|
|
35
|
+
* Check if a character is whitespace.
|
|
36
|
+
*/
|
|
37
|
+
export declare function isWhitespaceChar(char: string): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Check if a character is punctuation.
|
|
40
|
+
*/
|
|
41
|
+
export declare function isPunctuationChar(char: string): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Apply background color to a line, padding to full width.
|
|
44
|
+
*
|
|
45
|
+
* @param line - Line of text (may contain ANSI codes)
|
|
46
|
+
* @param width - Total width to pad to
|
|
47
|
+
* @param bgFn - Background color function
|
|
48
|
+
* @returns Line with background applied and padded to width
|
|
49
|
+
*/
|
|
50
|
+
export declare function applyBackgroundToLine(line: string, width: number, bgFn: (text: string) => string): string;
|
|
51
|
+
/**
|
|
52
|
+
* Truncate text to fit within a maximum visible width, adding ellipsis if needed.
|
|
53
|
+
* Optionally pad with spaces to reach exactly maxWidth.
|
|
54
|
+
* Properly handles ANSI escape codes (they don't count toward width).
|
|
55
|
+
*
|
|
56
|
+
* @param text - Text to truncate (may contain ANSI codes)
|
|
57
|
+
* @param maxWidth - Maximum visible width
|
|
58
|
+
* @param ellipsis - Ellipsis string to append when truncating (default: "...")
|
|
59
|
+
* @param pad - If true, pad result with spaces to exactly maxWidth (default: false)
|
|
60
|
+
* @returns Truncated text, optionally padded to exactly maxWidth
|
|
61
|
+
*/
|
|
62
|
+
export declare function truncateToWidth(text: string, maxWidth: number, ellipsis?: string, pad?: boolean): string;
|
|
63
|
+
/**
|
|
64
|
+
* Extract a range of visible columns from a line. Handles ANSI codes and wide chars.
|
|
65
|
+
* @param strict - If true, exclude wide chars at boundary that would extend past the range
|
|
66
|
+
*/
|
|
67
|
+
export declare function sliceByColumn(line: string, startCol: number, length: number, strict?: boolean): string;
|
|
68
|
+
/** Like sliceByColumn but also returns the actual visible width of the result. */
|
|
69
|
+
export declare function sliceWithWidth(line: string, startCol: number, length: number, strict?: boolean): {
|
|
70
|
+
text: string;
|
|
71
|
+
width: number;
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Extract "before" and "after" segments from a line in a single pass.
|
|
75
|
+
* Used for overlay compositing where we need content before and after the overlay region.
|
|
76
|
+
* Preserves styling from before the overlay that should affect content after it.
|
|
77
|
+
*/
|
|
78
|
+
export declare function extractSegments(line: string, beforeEnd: number, afterStart: number, afterLen: number, strictAfter?: boolean): {
|
|
79
|
+
before: string;
|
|
80
|
+
beforeWidth: number;
|
|
81
|
+
after: string;
|
|
82
|
+
afterWidth: number;
|
|
83
|
+
};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var $=Object.defineProperty;var g=(e,n)=>$(e,"name",{value:n,configurable:!0});import{eastAsianWidth as R}from"get-east-asian-width";const m=new Intl.Segmenter(void 0,{granularity:"grapheme"});function D(){return m}g(D,"getSegmenter");function y(e){const n=e.codePointAt(0);return n>=126976&&n<=130047||n>=8960&&n<=9215||n>=9728&&n<=10175||n>=11088&&n<=11093||e.includes("\uFE0F")||e.length>2}g(y,"couldBeEmoji");const P=new RegExp("^(?:\\p{Default_Ignorable_Code_Point}|\\p{Control}|\\p{Mark}|\\p{Surrogate})+$","v"),T=new RegExp("^[\\p{Default_Ignorable_Code_Point}\\p{Control}\\p{Format}\\p{Mark}\\p{Surrogate}]+","v"),_=new RegExp("^\\p{RGI_Emoji}$","v"),I=512,C=new Map;function w(e){if(P.test(e))return 0;if(y(e)&&_.test(e))return 2;const o=e.replace(T,"").codePointAt(0);if(o===void 0)return 0;if(o>=127462&&o<=127487)return 2;let t=R(o);if(e.length>1)for(const r of e.slice(1)){const i=r.codePointAt(0);i>=65280&&i<=65519&&(t+=R(i))}return t}g(w,"graphemeWidth");function x(e){if(e.length===0)return 0;let n=!0;for(let i=0;i<e.length;i++){const s=e.charCodeAt(i);if(s<32||s>126){n=!1;break}}if(n)return e.length;const o=C.get(e);if(o!==void 0)return o;let t=e;e.includes(" ")&&(t=t.replace(/\t/g," ")),t.includes("\x1B")&&(t=t.replace(/\x1b\[[0-9;]*[mGKHJ]/g,""),t=t.replace(/\x1b\]8;;[^\x07]*\x07/g,""),t=t.replace(/\x1b_[^\x07\x1b]*(?:\x07|\x1b\\)/g,""));let r=0;for(const{segment:i}of m.segment(t))r+=w(i);if(C.size>=I){const i=C.keys().next().value;i!==void 0&&C.delete(i)}return C.set(e,r),r}g(x,"visibleWidth");function k(e,n){if(n>=e.length||e[n]!=="\x1B")return null;const o=e[n+1];if(o==="["){let t=n+2;for(;t<e.length&&!/[mGKHJ]/.test(e[t]);)t++;return t<e.length?{code:e.substring(n,t+1),length:t+1-n}:null}if(o==="]"){let t=n+2;for(;t<e.length;){if(e[t]==="\x07")return{code:e.substring(n,t+1),length:t+1-n};if(e[t]==="\x1B"&&e[t+1]==="\\")return{code:e.substring(n,t+2),length:t+2-n};t++}return null}if(o==="_"){let t=n+2;for(;t<e.length;){if(e[t]==="\x07")return{code:e.substring(n,t+1),length:t+1-n};if(e[t]==="\x1B"&&e[t+1]==="\\")return{code:e.substring(n,t+2),length:t+2-n};t++}return null}return null}g(k,"extractAnsiCode");class W{static{g(this,"AnsiCodeTracker")}bold=!1;dim=!1;italic=!1;underline=!1;blink=!1;inverse=!1;hidden=!1;strikethrough=!1;fgColor=null;bgColor=null;process(n){if(!n.endsWith("m"))return;const o=n.match(/\x1b\[([\d;]*)m/);if(!o)return;const t=o[1];if(t===""||t==="0"){this.reset();return}const r=t.split(";");let i=0;for(;i<r.length;){const s=Number.parseInt(r[i],10);if(s===38||s===48){if(r[i+1]==="5"&&r[i+2]!==void 0){const l=`${r[i]};${r[i+1]};${r[i+2]}`;s===38?this.fgColor=l:this.bgColor=l,i+=3;continue}else if(r[i+1]==="2"&&r[i+4]!==void 0){const l=`${r[i]};${r[i+1]};${r[i+2]};${r[i+3]};${r[i+4]}`;s===38?this.fgColor=l:this.bgColor=l,i+=5;continue}}switch(s){case 0:this.reset();break;case 1:this.bold=!0;break;case 2:this.dim=!0;break;case 3:this.italic=!0;break;case 4:this.underline=!0;break;case 5:this.blink=!0;break;case 7:this.inverse=!0;break;case 8:this.hidden=!0;break;case 9:this.strikethrough=!0;break;case 21:this.bold=!1;break;case 22:this.bold=!1,this.dim=!1;break;case 23:this.italic=!1;break;case 24:this.underline=!1;break;case 25:this.blink=!1;break;case 27:this.inverse=!1;break;case 28:this.hidden=!1;break;case 29:this.strikethrough=!1;break;case 39:this.fgColor=null;break;case 49:this.bgColor=null;break;default:s>=30&&s<=37||s>=90&&s<=97?this.fgColor=String(s):(s>=40&&s<=47||s>=100&&s<=107)&&(this.bgColor=String(s));break}i++}}reset(){this.bold=!1,this.dim=!1,this.italic=!1,this.underline=!1,this.blink=!1,this.inverse=!1,this.hidden=!1,this.strikethrough=!1,this.fgColor=null,this.bgColor=null}clear(){this.reset()}getActiveCodes(){const n=[];return this.bold&&n.push("1"),this.dim&&n.push("2"),this.italic&&n.push("3"),this.underline&&n.push("4"),this.blink&&n.push("5"),this.inverse&&n.push("7"),this.hidden&&n.push("8"),this.strikethrough&&n.push("9"),this.fgColor&&n.push(this.fgColor),this.bgColor&&n.push(this.bgColor),n.length===0?"":`\x1B[${n.join(";")}m`}hasActiveCodes(){return this.bold||this.dim||this.italic||this.underline||this.blink||this.inverse||this.hidden||this.strikethrough||this.fgColor!==null||this.bgColor!==null}getLineEndReset(){return this.underline?"\x1B[24m":""}}function L(e,n){let o=0;for(;o<e.length;){const t=k(e,o);t?(n.process(t.code),o+=t.length):o++}}g(L,"updateTrackerFromText");function S(e){const n=[];let o="",t="",r=!1,i=0;for(;i<e.length;){const s=k(e,i);if(s){t+=s.code,i+=s.length;continue}const l=e[i],f=l===" ";f!==r&&o&&(n.push(o),o=""),t&&(o+=t,t=""),r=f,o+=l,i++}return t&&(o+=t),o&&n.push(o),n}g(S,"splitIntoTokensWithAnsi");function K(e,n){if(!e)return[""];const o=e.split(`
|
|
2
|
+
`),t=[],r=new W;for(const i of o){const s=t.length>0?r.getActiveCodes():"";t.push(...j(s+i,n)),L(i,r)}return t.length>0?t:[""]}g(K,"wrapTextWithAnsi");function j(e,n){if(!e)return[""];if(x(e)<=n)return[e];const t=[],r=new W,i=S(e);let s="",l=0;for(const f of i){const c=x(f),a=f.trim()==="";if(c>n&&!a){if(s){const h=r.getLineEndReset();h&&(s+=h),t.push(s),s="",l=0}const u=M(f,n,r);t.push(...u.slice(0,-1)),s=u[u.length-1],l=x(s);continue}if(l+c>n&&l>0){let u=s.trimEnd();const h=r.getLineEndReset();h&&(u+=h),t.push(u),a?(s=r.getActiveCodes(),l=0):(s=r.getActiveCodes()+f,l=c)}else s+=f,l+=c;L(f,r)}return s&&t.push(s),t.length>0?t.map(f=>f.trimEnd()):[""]}g(j,"wrapSingleLine");const N=/[(){}[\]<>.,;:'"!?+\-=*/\\|&%^$#@~`]/;function V(e){return/\s/.test(e)}g(V,"isWhitespaceChar");function z(e){return N.test(e)}g(z,"isPunctuationChar");function M(e,n,o){const t=[];let r=o.getActiveCodes(),i=0,s=0;const l=[];for(;s<e.length;){const f=k(e,s);if(f)l.push({type:"ansi",value:f.code}),s+=f.length;else{let c=s;for(;c<e.length&&!k(e,c);)c++;const a=e.slice(s,c);for(const d of m.segment(a))l.push({type:"grapheme",value:d.segment});s=c}}for(const f of l){if(f.type==="ansi"){r+=f.value,o.process(f.value);continue}const c=f.value;if(!c)continue;const a=x(c);if(i+a>n){const d=o.getLineEndReset();d&&(r+=d),t.push(r),r=o.getActiveCodes(),i=0}r+=c,i+=a}return r&&t.push(r),t.length>0?t:[""]}g(M,"breakLongWord");function J(e,n,o){const t=x(e),r=Math.max(0,n-t),i=" ".repeat(r),s=e+i;return o(s)}g(J,"applyBackgroundToLine");function U(e,n,o="...",t=!1){const r=x(e);if(r<=n)return t?e+" ".repeat(n-r):e;const i=x(o),s=n-i;if(s<=0)return o.substring(0,n);let l=0;const f=[];for(;l<e.length;){const u=k(e,l);if(u)f.push({type:"ansi",value:u.code}),l+=u.length;else{let h=l;for(;h<e.length&&!k(e,h);)h++;const b=e.slice(l,h);for(const p of m.segment(b))f.push({type:"grapheme",value:p.segment});l=h}}let c="",a=0;for(const u of f){if(u.type==="ansi"){c+=u.value;continue}const h=u.value;if(!h)continue;const b=x(h);if(a+b>s)break;c+=h,a+=b}const d=`${c}\x1B[0m${o}`;if(t){const u=x(d);return d+" ".repeat(Math.max(0,n-u))}return d}g(U,"truncateToWidth");function O(e,n,o,t=!1){return B(e,n,o,t).text}g(O,"sliceByColumn");function B(e,n,o,t=!1){if(o<=0)return{text:"",width:0};const r=n+o;let i="",s=0,l=0,f=0,c="";for(;f<e.length;){const a=k(e,f);if(a){l>=n&&l<r?i+=a.code:l<n&&(c+=a.code),f+=a.length;continue}let d=f;for(;d<e.length&&!k(e,d);)d++;for(const{segment:u}of m.segment(e.slice(f,d))){const h=w(u),b=l>=n&&l<r,p=!t||l+h<=r;if(b&&p&&(c&&(i+=c,c=""),i+=u,s+=h),l+=h,l>=r)break}if(f=d,l>=r)break}return{text:i,width:s}}g(B,"sliceWithWidth");const E=new W;function X(e,n,o,t,r=!1){let i="",s=0,l="",f=0,c=0,a=0,d="",u=!1;const h=o+t;for(E.clear();a<e.length;){const b=k(e,a);if(b){E.process(b.code),c<n?d+=b.code:c>=o&&c<h&&u&&(l+=b.code),a+=b.length;continue}let p=a;for(;p<e.length&&!k(e,p);)p++;for(const{segment:A}of m.segment(e.slice(a,p))){const v=w(A);if(c<n?(d&&(i+=d,d=""),i+=A,s+=v):c>=o&&c<h&&(!r||c+v<=h)&&(u||(l+=E.getActiveCodes(),u=!0),l+=A,f+=v),c+=v,t<=0?c>=n:c>=h)break}if(a=p,t<=0?c>=n:c>=h)break}return{before:i,beforeWidth:s,after:l,afterWidth:f}}g(X,"extractSegments");export{J as applyBackgroundToLine,k as extractAnsiCode,X as extractSegments,D as getSegmenter,z as isPunctuationChar,V as isWhitespaceChar,O as sliceByColumn,B as sliceWithWidth,U as truncateToWidth,x as visibleWidth,K as wrapTextWithAnsi};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* [WHO]: registerFigmaMcpOAuthProvider()
|
|
3
|
+
* [FROM]: Depends on ai, node:fs, node:http, node:os, node:path, node:child_process
|
|
4
|
+
* [TO]: Consumed by core/runtime/sdk.ts
|
|
5
|
+
* [HERE]: core/mcp/figma-auth.ts - Figma OAuth integration for MCP servers
|
|
6
|
+
*/
|
|
7
|
+
import { type OAuthCredentials } from "@catui/ai/oauth";
|
|
8
|
+
export type FigmaOAuthCredentials = OAuthCredentials & {
|
|
9
|
+
clientId: string;
|
|
10
|
+
clientSecret?: string;
|
|
11
|
+
tokenEndpointAuthMethod?: "client_secret_basic" | "client_secret_post" | "none";
|
|
12
|
+
scope?: string;
|
|
13
|
+
source?: string;
|
|
14
|
+
};
|
|
15
|
+
export type FigmaImportableSession = {
|
|
16
|
+
source: string;
|
|
17
|
+
expiresAt: number;
|
|
18
|
+
};
|
|
19
|
+
export declare function findImportableFigmaOAuthSession(): FigmaImportableSession | undefined;
|
|
20
|
+
export declare function refreshFigmaOAuthCredentials(credentials: FigmaOAuthCredentials): Promise<FigmaOAuthCredentials>;
|
|
21
|
+
export declare function registerFigmaMcpOAuthProvider(): void;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
var P=Object.defineProperty;var i=(e,n)=>P(e,"name",{value:n,configurable:!0});import{registerOAuthProvider as k}from"@catui/ai/oauth";import{existsSync as M,readFileSync as U}from"node:fs";import{createServer as L}from"node:http";import{homedir as v}from"node:os";import{join as x}from"node:path";import{exec as R}from"node:child_process";const g="https://mcp.figma.com/mcp",le="https://mcp.figma.com/.well-known/oauth-protected-resource",O="https://api.figma.com/.well-known/oauth-authorization-server",$="https://www.figma.com/oauth/mcp",C="https://api.figma.com/v1/oauth/token",he="https://api.figma.com/v1/oauth/mcp/register",m="mcp:connect",z="Catui",G="https://github.com/catui-agent/catui-agent",j="https://raw.githubusercontent.com/catui-agent/catui-agent/main/README.md",E=x(v(),".claude",".credentials.json"),A="127.0.0.1",S="/auth/callback",N=[14565,14566,14567,14568,14569],D=`<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>Figma authentication successful</title>
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<p>Figma authentication completed. Return to Catui.</p>
|
|
10
|
+
</body>
|
|
11
|
+
</html>`,B=`<!doctype html>
|
|
12
|
+
<html lang="en">
|
|
13
|
+
<head>
|
|
14
|
+
<meta charset="utf-8" />
|
|
15
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
16
|
+
<title>Figma authentication failed</title>
|
|
17
|
+
</head>
|
|
18
|
+
<body>
|
|
19
|
+
<p>Figma authentication failed. You can close this window and retry from Catui.</p>
|
|
20
|
+
</body>
|
|
21
|
+
</html>`;function I(e){let n="";for(const t of e)n+=String.fromCharCode(t);return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}i(I,"base64urlEncode");async function H(){const e=new Uint8Array(32);crypto.getRandomValues(e);const n=I(e),t=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(n)),r=I(new Uint8Array(t));return{verifier:n,challenge:r}}i(H,"generatePKCE");function K(e){const n=process.platform==="darwin"?`open "${e}"`:process.platform==="win32"?`start "" "${e}"`:`xdg-open "${e}"`;R(n,()=>{})}i(K,"openBrowser");function W(){const e=new Uint8Array(16);return crypto.getRandomValues(e),Buffer.from(e).toString("hex")}i(W,"createState");function J(e,n){if(!(!e.accessToken||!e.refreshToken||!e.clientId))return{access:e.accessToken,refresh:e.refreshToken,expires:typeof e.expiresAt=="number"?e.expiresAt:0,clientId:e.clientId,clientSecret:e.clientSecret,tokenEndpointAuthMethod:e.clientSecret?"client_secret_basic":"none",scope:e.stepUpScope||m,source:n}}i(J,"normalizeImportedCredentials");function F(){if(M(E))try{const e=JSON.parse(U(E,"utf-8"));return Object.values(e.mcpOAuth??{}).filter(t=>t.serverUrl===g).map(t=>J(t,"Claude Code")).filter(t=>!!t).sort((t,r)=>r.expires-t.expires)[0]}catch{return}}i(F,"loadClaudeFigmaCredentials");function fe(){const e=F();if(e)return{source:e.source||"Claude Code",expiresAt:e.expires}}i(fe,"findImportableFigmaOAuthSession");function V(){const e=process.env.CATUI_FIGMA_CLIENT_ID?.trim();if(!e)return;const n=process.env.CATUI_FIGMA_CLIENT_SECRET?.trim()||void 0;return{clientId:e,clientSecret:n,tokenEndpointAuthMethod:n?"client_secret_basic":"none",source:"environment"}}i(V,"loadConfiguredClientInformation");async function q(e,n){const t={"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json"},r=new URLSearchParams({grant_type:"refresh_token",refresh_token:e.refresh,resource:g});if(n==="client_secret_basic"){if(!e.clientSecret)return;const o=Buffer.from(`${e.clientId}:${e.clientSecret}`,"utf8").toString("base64");t.Authorization=`Basic ${o}`}else r.set("client_id",e.clientId),n==="client_secret_post"&&e.clientSecret&&r.set("client_secret",e.clientSecret);const a=await fetch(C,{method:"POST",headers:t,body:r});if(!a.ok)return;const c=await a.json();if(!(!c.access_token||typeof c.expires_in!="number"))return{...e,access:c.access_token,refresh:c.refresh_token||e.refresh,expires:Date.now()+c.expires_in*1e3}}i(q,"requestRefresh");async function y(e){const n=e.tokenEndpointAuthMethod??(e.clientSecret?"client_secret_basic":"none"),t=n==="client_secret_basic"?["client_secret_basic","client_secret_post","none"]:n==="client_secret_post"?["client_secret_post","client_secret_basic","none"]:["none","client_secret_basic","client_secret_post"];for(const r of t){const a=await q(e,r);if(a)return{...a,tokenEndpointAuthMethod:r}}throw new Error("Failed to refresh Figma MCP OAuth credentials")}i(y,"refreshFigmaOAuthCredentials");async function Y(){const e=await fetch(O,{headers:{Accept:"application/json"}});if(!e.ok)throw new Error(`Failed to fetch Figma authorization metadata (${e.status} ${e.statusText})`);return await e.json()}i(Y,"fetchAuthorizationServerMetadata");async function Q(e,n){if(!n.registration_endpoint)return;const t=await fetch(n.registration_endpoint,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({client_name:z,redirect_uris:[e],grant_types:["authorization_code","refresh_token"],response_types:["code"],token_endpoint_auth_method:"client_secret_basic",client_uri:G,client_metadata_url:j,scope:m})});if(!t.ok)return;const r=await t.json();if(r.client_id)return{clientId:r.client_id,clientSecret:r.client_secret,tokenEndpointAuthMethod:r.token_endpoint_auth_method||(r.client_secret?"client_secret_basic":"none"),source:"dynamic-registration"}}i(Q,"registerCatuiClient");function T(e){const n=e.trim();if(!n)return{};try{const t=new URL(n);return{code:t.searchParams.get("code")??void 0,state:t.searchParams.get("state")??void 0}}catch{}if(n.includes("code=")){const t=new URLSearchParams(n);return{code:t.get("code")??void 0,state:t.get("state")??void 0}}return{code:n}}i(T,"parseAuthorizationInput");async function X(e){let n=null,t=!1;for(const r of N)try{const a=await new Promise((c,o)=>{const s=L((f,u)=>{try{const l=new URL(f.url||"",`http://${A}:${r}`);if(l.pathname!==S){u.statusCode=404,u.end("Not found");return}const h=l.searchParams.get("code"),p=l.searchParams.get("state"),_=l.searchParams.get("error");if(h&&p){n={code:h,state:p},u.statusCode=200,u.setHeader("Content-Type","text/html; charset=utf-8"),u.end(D);return}u.statusCode=400,u.setHeader("Content-Type","text/html; charset=utf-8"),u.end(B+(_?`
|
|
22
|
+
<!-- ${_} -->`:""))}catch{u.statusCode=500,u.end("Internal error")}});s.once("error",o),s.listen(r,A,()=>{s.removeListener("error",o),c(s)})});return e?.addEventListener("abort",()=>{t=!0,a.close()},{once:!0}),{server:a,redirectUri:`http://${A}:${r}${S}`,cancelWait:i(()=>{t=!0},"cancelWait"),waitForCode:i(async()=>{const c=i(()=>new Promise(o=>setTimeout(o,100)),"sleep");for(let o=0;o<1800;o+=1){if(n)return n;if(t)return null;await c()}return null},"waitForCode")}}catch{}throw new Error("Failed to start a local OAuth callback server for Figma")}i(X,"startCallbackServer");function Z(e,n,t,r,a,c){const o=new URL(c.authorization_endpoint||$);return o.searchParams.set("response_type","code"),o.searchParams.set("client_id",e.clientId),o.searchParams.set("redirect_uri",n),o.searchParams.set("scope",a),o.searchParams.set("code_challenge",r),o.searchParams.set("code_challenge_method","S256"),o.searchParams.set("state",t),o.searchParams.set("resource",g),o.toString()}i(Z,"buildAuthorizationUrl");async function ee(e,n,t,r){const a=r.tokenEndpointAuthMethod??(r.clientSecret?"client_secret_basic":"none"),c={"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json"},o=new URLSearchParams({grant_type:"authorization_code",code:e,code_verifier:n,redirect_uri:t,resource:g});if(a==="client_secret_basic"){if(!r.clientSecret)throw new Error("Figma OAuth client is missing client_secret for client_secret_basic");c.Authorization=`Basic ${Buffer.from(`${r.clientId}:${r.clientSecret}`,"utf8").toString("base64")}`}else o.set("client_id",r.clientId),a==="client_secret_post"&&r.clientSecret&&o.set("client_secret",r.clientSecret);const s=await fetch(C,{method:"POST",headers:c,body:o});if(!s.ok){const u=await s.text().catch(()=>"");throw new Error(`Figma authorization code exchange failed (${s.status} ${s.statusText})${u?`: ${u}`:""}`)}const f=await s.json();if(!f.access_token||!f.refresh_token||typeof f.expires_in!="number")throw new Error("Figma OAuth token response did not include the expected fields");return{access:f.access_token,refresh:f.refresh_token,expires:Date.now()+f.expires_in*1e3,clientId:r.clientId,clientSecret:r.clientSecret,tokenEndpointAuthMethod:a,scope:m,source:r.source||"catui"}}i(ee,"exchangeAuthorizationCode");async function te(e){e.onProgress?.("Preparing a standalone Figma OAuth flow...");const n=await Y(),t=await X(e.signal);try{const a=V()||await Q(t.redirectUri,n);if(!a)throw new Error("Catui could not complete Figma dynamic client registration. Set CATUI_FIGMA_CLIENT_ID and CATUI_FIGMA_CLIENT_SECRET, or keep using the import fallback for now.");const{verifier:c,challenge:o}=await H(),s=W(),f=(n.scopes_supported?.includes(m),m),u=Z(a,t.redirectUri,s,o,f,n);e.onAuth({url:u,instructions:"A browser window should open. Approve Figma access to finish linking Catui."}),K(u);let l;if(e.onManualCodeInput){let h,p;const _=e.onManualCodeInput().then(d=>{h=d,t.cancelWait()}).catch(d=>{p=d instanceof Error?d:new Error(String(d)),t.cancelWait()}),w=await t.waitForCode();if(p)throw p;if(w?.code){if(w.state!==s)throw new Error("Figma OAuth state mismatch");l=w.code}else if(h){const d=T(h);if(d.state&&d.state!==s)throw new Error("Figma OAuth state mismatch");l=d.code}if(!l){if(await _,p)throw p;if(h){const d=T(h);if(d.state&&d.state!==s)throw new Error("Figma OAuth state mismatch");l=d.code}}}else{const h=await t.waitForCode();if(h?.state&&h.state!==s)throw new Error("Figma OAuth state mismatch");l=h?.code}if(!l)throw new Error("Figma OAuth did not complete");return e.onProgress?.("Finishing Figma authorization..."),await ee(l,c,t.redirectUri,a)}finally{t.server.close()}}i(te,"loginWithStandaloneOAuth");async function ne(e){try{return await te(e)}catch(n){e.onProgress?.("Standalone Figma OAuth was unavailable. Checking for an importable official session...");const t=F();if(!t)throw n;return e.onProgress?.(`Refreshing the imported Figma session from ${t.source}...`),await y(t)}}i(ne,"loginFigma");const re={id:"figma",name:"Figma MCP",usesCallbackServer:!0,async login(e){return await ne(e)},async refreshToken(e){return await y(e)},getApiKey(e){return String(e.access??"")}};let b=!1;function pe(){b||(k(re),b=!0)}i(pe,"registerFigmaMcpOAuthProvider");export{fe as findImportableFigmaOAuthSession,y as refreshFigmaOAuthCredentials,pe as registerFigmaMcpOAuthProvider};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* [WHO]: MCP module barrel exports
|
|
3
|
+
* [FROM]: Depends on mcp-client, mcp-adapter, mcp-config, mcp-guidance, figma-auth
|
|
4
|
+
* [TO]: Consumed by core/index.ts
|
|
5
|
+
* [HERE]: core/mcp/index.ts - MCP module public API
|
|
6
|
+
*/
|
|
7
|
+
export { MCPClient } from "./mcp-client.js";
|
|
8
|
+
export type { MCPServerConfig, MCPTool, MCPToolResult } from "./mcp-types.js";
|
|
9
|
+
export { createMCPTool, getMCPToolDisplayName, loadMCPTools, } from "./mcp-adapter.js";
|
|
10
|
+
export { API_KEY_GUIDANCE, formatGuidanceMessage, getAPIKeyGuidance, getMissingKeyServers, getOptionalAPIKeyServers, requiresAPIKey, } from "./mcp-guidance.js";
|
|
11
|
+
export type { APIKeyGuidance } from "./mcp-guidance.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{MCPClient as r}from"./mcp-client.js";import{createMCPTool as a,getMCPToolDisplayName as s,loadMCPTools as i}from"./mcp-adapter.js";import{API_KEY_GUIDANCE as l,formatGuidanceMessage as g,getAPIKeyGuidance as C,getMissingKeyServers as M,getOptionalAPIKeyServers as m,requiresAPIKey as n}from"./mcp-guidance.js";export{l as API_KEY_GUIDANCE,r as MCPClient,a as createMCPTool,g as formatGuidanceMessage,C as getAPIKeyGuidance,s as getMCPToolDisplayName,M as getMissingKeyServers,m as getOptionalAPIKeyServers,i as loadMCPTools,n as requiresAPIKey};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* [WHO]: createMCPTool(), loadMCPTools(), getMCPToolDisplayName()
|
|
3
|
+
* [FROM]: Depends on extensions, mcp-client, mcp-guidance
|
|
4
|
+
* [TO]: Consumed by core/mcp/index.ts, core/mcp/mcp-manager.ts
|
|
5
|
+
* [HERE]: core/mcp/mcp-adapter.ts - adapts MCP tools to Catui tool system
|
|
6
|
+
*/
|
|
7
|
+
import type { ToolDefinition } from "../extensions-host/index.js";
|
|
8
|
+
import type { MCPClient } from "./mcp-client.js";
|
|
9
|
+
import type { MCPTool } from "./mcp-types.js";
|
|
10
|
+
/**
|
|
11
|
+
* Create a Catui ToolDefinition from an MCP tool definition
|
|
12
|
+
*/
|
|
13
|
+
export declare function createMCPTool(mcpClient: MCPClient, mcpTool: MCPTool): ToolDefinition;
|
|
14
|
+
/**
|
|
15
|
+
* Load all MCP tools as Catui ToolDefinitions
|
|
16
|
+
*/
|
|
17
|
+
export declare function loadMCPTools(mcpClient: MCPClient): Promise<ToolDefinition[]>;
|
|
18
|
+
/**
|
|
19
|
+
* Get a human-readable display name for an MCP tool
|
|
20
|
+
*/
|
|
21
|
+
export declare function getMCPToolDisplayName(mcpTool: MCPTool): string;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
var f=Object.defineProperty;var s=(t,n)=>f(t,"name",{value:n,configurable:!0});import{formatGuidanceMessage as l,getAPIKeyGuidance as u}from"./mcp-guidance.js";function m(t){const n=`mcp_${t.replace(/[^a-zA-Z0-9_-]/g,"_")}`;if(n.length<=60)return n;let e=0;for(let a=0;a<t.length;a++)e=e*31+t.charCodeAt(a)|0;const i=Math.abs(e).toString(36);return`${n.slice(0,50)}_${i}`}s(m,"toSafeToolName");function x(t,n){const e=n.name,i=m(e),[a]=e.split("/");return{name:i,label:e,description:`${n.description} (MCP: ${e})`,parameters:n.inputSchema??{type:"object",properties:{},additionalProperties:!0},async execute(y,p,g,$,h){try{const r=await t.callTool(e,p);if(r.error){const o=u(a);return o&&r.error?.toLowerCase().includes("key")?{content:[{type:"text",text:l(o,!0)}],details:{error:r.error}}:{content:[{type:"text",text:r.content.map(d=>d.text||"").join(`
|
|
2
|
+
`)}],details:{error:r.error}}}return{content:[{type:"text",text:r.content.map(o=>o.type==="text"?o.text||"":o.type==="image"?`[Image: ${o.data?.uri||"unknown"}]`:o.type==="resource"?`[Resource: ${JSON.stringify(o.data)}]`:"").filter(Boolean).join(`
|
|
3
|
+
`)}],details:void 0}}catch(r){const c=u(a);return c&&String(r).toLowerCase().includes("key")?{content:[{type:"text",text:l(c,!0)}],details:{error:r instanceof Error?r.message:String(r)}}:{content:[{type:"text",text:`Failed to call MCP tool ${e}`}],details:{error:r instanceof Error?r.message:String(r)}}}}}}s(x,"createMCPTool");async function M(t){return(await t.listTools()).map(e=>x(t,e))}s(M,"loadMCPTools");function S(t){if(t.displayName)return t.displayName;const[n,...e]=t.name.split("/"),i=e.join("/");return`${n}/${i}`}s(S,"getMCPToolDisplayName");export{x as createMCPTool,S as getMCPToolDisplayName,M as loadMCPTools};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { MCPServerConfig, MCPTool, MCPToolResult } from "./mcp-types.js";
|
|
2
|
+
/**
|
|
3
|
+
* MCP Client class
|
|
4
|
+
* Manages connections to MCP servers and tool calls
|
|
5
|
+
*/
|
|
6
|
+
export declare class MCPClient {
|
|
7
|
+
private servers;
|
|
8
|
+
private serverRuntimes;
|
|
9
|
+
private serverTools;
|
|
10
|
+
private httpSessions;
|
|
11
|
+
private authStorage;
|
|
12
|
+
private agentDir?;
|
|
13
|
+
private mcpConfigPath?;
|
|
14
|
+
/**
|
|
15
|
+
* @param authStoragePath Optional path to auth.json. If omitted, uses getAgentDir()/auth.json.
|
|
16
|
+
* @param agentDir Optional agent directory for config path resolution. If omitted, uses getAgentDir().
|
|
17
|
+
* @param mcpConfigPath Optional explicit MCP config file path. Overrides default resolution.
|
|
18
|
+
*/
|
|
19
|
+
constructor(authStoragePath?: string, agentDir?: string, mcpConfigPath?: string);
|
|
20
|
+
/**
|
|
21
|
+
* Load MCP server configurations from config file
|
|
22
|
+
*/
|
|
23
|
+
private loadServersFromConfig;
|
|
24
|
+
/**
|
|
25
|
+
* Get all configured servers
|
|
26
|
+
*/
|
|
27
|
+
getServers(): MCPServerConfig[];
|
|
28
|
+
/**
|
|
29
|
+
* Get a specific server by ID
|
|
30
|
+
*/
|
|
31
|
+
getServer(id: string): MCPServerConfig | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* Add or update a server configuration
|
|
34
|
+
*/
|
|
35
|
+
addServer(server: MCPServerConfig): void;
|
|
36
|
+
/**
|
|
37
|
+
* Remove a server
|
|
38
|
+
*/
|
|
39
|
+
removeServer(id: string): void;
|
|
40
|
+
private getRuntime;
|
|
41
|
+
private convertNpxArgsToNpmExecArgs;
|
|
42
|
+
private getSpawnAttempts;
|
|
43
|
+
private spawnProcess;
|
|
44
|
+
private attachStdoutParser;
|
|
45
|
+
private processStdoutBuffer;
|
|
46
|
+
private handleJsonRpcMessage;
|
|
47
|
+
private writeFramedMessage;
|
|
48
|
+
private sendNotification;
|
|
49
|
+
private sendRequest;
|
|
50
|
+
private getHttpSession;
|
|
51
|
+
private buildHttpHeaders;
|
|
52
|
+
private ensureHttpInitialized;
|
|
53
|
+
private sendHttpRequest;
|
|
54
|
+
private parseEventStreamResponse;
|
|
55
|
+
private initializeServer;
|
|
56
|
+
private normalizeToolRecord;
|
|
57
|
+
private loadToolsForServer;
|
|
58
|
+
/**
|
|
59
|
+
* Start an MCP server (for stdio transport)
|
|
60
|
+
*/
|
|
61
|
+
startServer(serverId: string): Promise<boolean>;
|
|
62
|
+
/**
|
|
63
|
+
* Stop an MCP server
|
|
64
|
+
*/
|
|
65
|
+
stopServer(serverId: string): void;
|
|
66
|
+
/**
|
|
67
|
+
* Stop all running servers
|
|
68
|
+
*/
|
|
69
|
+
stopAllServers(): void;
|
|
70
|
+
/**
|
|
71
|
+
* List available tools from all servers
|
|
72
|
+
*/
|
|
73
|
+
listTools(serverId?: string): Promise<MCPTool[]>;
|
|
74
|
+
/**
|
|
75
|
+
* Call an MCP tool
|
|
76
|
+
*/
|
|
77
|
+
callTool(toolName: string, args: Record<string, unknown>, timeoutMs?: number): Promise<MCPToolResult>;
|
|
78
|
+
private callHttpTool;
|
|
79
|
+
/**
|
|
80
|
+
* Call tool via stdio (JSON-RPC)
|
|
81
|
+
*/
|
|
82
|
+
private callStdioTool;
|
|
83
|
+
/**
|
|
84
|
+
* Call tool via SSE (HTTP)
|
|
85
|
+
*/
|
|
86
|
+
private callSSETool;
|
|
87
|
+
/**
|
|
88
|
+
* Check if a tool exists
|
|
89
|
+
*/
|
|
90
|
+
hasTool(toolName: string): boolean;
|
|
91
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
var T=Object.defineProperty;var p=(c,t)=>T(c,"name",{value:t,configurable:!0});import{spawn as w}from"child_process";import{existsSync as v,readFileSync as $}from"fs";import{join as R}from"path";import{getAgentDir as E}from"../../config.js";import{AuthStorage as C}from"../platform/config/auth-storage.js";import{getMCPConfigPath as b}from"./mcp-config.js";const y=["1","true","yes","on"].includes((process.env.CATUI_DEBUG??"").toLowerCase());function g(...c){y&&console.error(...c)}p(g,"mcpLog");function F(...c){y&&console.warn(...c)}p(F,"mcpWarn");function x(...c){console.error(...c)}p(x,"mcpError");function M(c){if(c==null)return"Unknown error";if(c instanceof Error){const t=c.message?.trim();return t.length>0?t:c.name&&c.name!=="Error"?c.name:"Error (empty message)"}if(typeof c=="string")return c;try{return JSON.stringify(c)}catch{return String(c)}}p(M,"formatUnknownError");function P(c,t,e){const s=M(e);g(c==="http"?`[MCP] HTTP init failed ${t}: ${s}`:`[MCP] stdio start failed ${t}: ${s}`)}p(P,"logMcpStartupFailure");class O{static{p(this,"MCPClient")}servers=new Map;serverRuntimes=new Map;serverTools=new Map;httpSessions=new Map;authStorage;agentDir;mcpConfigPath;constructor(t,e,s){this.agentDir=e,this.mcpConfigPath=s;const n=t??R(e??E(),"auth.json");this.authStorage=C.create(n),this.loadServersFromConfig()}loadServersFromConfig(){const t=b(this.agentDir,this.mcpConfigPath);if(v(t))try{const s=JSON.parse($(t,"utf-8")).mcpServers||[];for(const n of s)n.enabled!==!1&&this.servers.set(n.id,n)}catch(e){x(`Failed to load MCP config: ${e}`)}}getServers(){return Array.from(this.servers.values())}getServer(t){return this.servers.get(t)}addServer(t){this.servers.set(t.id,t)}removeServer(t){this.servers.delete(t),this.serverTools.delete(t),this.stopServer(t)}getRuntime(t){return this.serverRuntimes.get(t)}convertNpxArgsToNpmExecArgs(t){if(t.length===0)return;const e=[...t];(e[0]==="-y"||e[0]==="--yes")&&e.shift();const s=e.shift();if(s)return["exec","--yes",s,...e.length>0?["--",...e]:[]]}getSpawnAttempts(t){if(!t.command)return[];const e=[],s=t.command.trim(),n=s.toLowerCase(),r=t.args??[];if(process.platform==="win32"&&n==="npx"){e.push({command:"npx.cmd",args:r});const o=this.convertNpxArgsToNpmExecArgs(r);return o&&e.push({command:"npm.cmd",args:o}),e.push({command:"npx",args:r}),e}if(e.push({command:s,args:r}),n==="npx"){const o=this.convertNpxArgsToNpmExecArgs(r);o&&e.push({command:process.platform==="win32"?"npm.cmd":"npm",args:o})}return e}async spawnProcess(t,e,s){return await new Promise((n,r)=>{const a=process.platform==="win32"?w([t.command,...t.args].map(u=>u.includes(" ")?`"${u}"`:u).join(" "),{env:e,cwd:s,stdio:["pipe","pipe","pipe"],windowsHide:!0,shell:!0}):w(t.command,t.args,{env:e,cwd:s,stdio:["pipe","pipe","pipe"],windowsHide:!0,shell:!1}),i=p(u=>{a.removeListener("spawn",l),r(u)},"onError"),l=p(()=>{a.removeListener("error",i),n(a)},"onSpawn");a.once("error",i),a.once("spawn",l)})}attachStdoutParser(t,e){const s=p(n=>{if(this.serverRuntimes.get(t)===e){for(const r of e.pendingRequests.values())clearTimeout(r.timer),r.reject(n);e.pendingRequests.clear(),this.serverRuntimes.delete(t)}},"rejectPending");e.process.stdin.on("error",n=>{const o=n.code==="EPIPE"?"process exited before MCP handshake (check command and npm package name)":n instanceof Error?n.message:String(n);g(`[MCP:${t}] stdin: ${o}`),s(new Error(`MCP server ${t} stdin closed: ${o}`))}),e.process.stdout.on("data",n=>{e.buffer=Buffer.concat([e.buffer,n]),this.processStdoutBuffer(t,e)}),e.process.stderr.on("data",n=>{const r=n.toString("utf8").trim();r.length>0&&y&&x(`[MCP:${t}] ${r}`)}),e.process.on("exit",(n,r)=>{if(this.serverRuntimes.get(t)!==e)return;const o=`[MCP:debug] Server exited: code=${n??"null"}, signal=${r??"null"}`;g(o),s(new Error(o))}),e.process.on("error",n=>{const r=`MCP server ${t} process error: ${n instanceof Error?n.message:String(n)}`;s(new Error(r))})}processStdoutBuffer(t,e){for(;e.buffer.length>0;){const s=e.buffer.indexOf(`
|
|
2
|
+
`);if(s===-1)return;const n=e.buffer.slice(0,s).toString("utf8").replace(/\r$/,"");e.buffer=e.buffer.slice(s+1),n.length>0&&(g(`[MCP:${t}] Received: ${n.slice(0,200)}`),this.handleJsonRpcMessage(t,n))}}handleJsonRpcMessage(t,e){let s;try{s=JSON.parse(e)}catch{return}if(s.id===void 0)return;const n=typeof s.id=="number"?s.id:Number(s.id);if(!Number.isFinite(n))return;const r=this.serverRuntimes.get(t);if(!r)return;const o=r.pendingRequests.get(n);if(o){if(clearTimeout(o.timer),r.pendingRequests.delete(n),s.error){o.reject(new Error(s.error.message||`JSON-RPC error ${s.error.code??"unknown"}`));return}o.resolve(s.result)}}writeFramedMessage(t,e){const n=JSON.stringify(e)+`
|
|
3
|
+
`;t.process.stdin.write(n)}sendNotification(t,e,s){const n=this.servers.get(t);if(n?.transport==="http"){this.sendHttpRequest(n,e,s,2e4,!0);return}const r=this.getRuntime(t);r&&this.writeFramedMessage(r,{jsonrpc:"2.0",method:e,params:s??{}})}async sendRequest(t,e,s,n=2e4){const r=this.servers.get(t);if(!r)throw new Error(`Server ${t} not found`);if(r.transport==="http")return await this.sendHttpRequest(r,e,s,n);const o=this.getRuntime(t);if(!o)throw new Error(`Server ${t} is not running`);const a=o.nextRequestId++,i={jsonrpc:"2.0",id:a,method:e,params:s??{}};return new Promise((l,u)=>{const h=setTimeout(()=>{o.pendingRequests.delete(a),u(new Error(`MCP request timed out: ${t} ${e} (${n}ms)`))},n);o.pendingRequests.set(a,{resolve:p(f=>l(f),"resolve"),reject:u,timer:h}),this.writeFramedMessage(o,i)})}getHttpSession(t){const e=this.httpSessions.get(t);if(e)return e;const s={initialized:!1};return this.httpSessions.set(t,s),s}async buildHttpHeaders(t,e){const s={"Content-Type":"application/json",Accept:"application/json, text/event-stream","MCP-Protocol-Version":"2025-03-26",...t.headers??{}};if(e&&(s["Mcp-Session-Id"]=e),t.authProvider){const n=await this.authStorage.getApiKey(t.authProvider);if(n){const r=t.authHeaderName?.trim()||"Authorization",o=t.authScheme??"bearer";s[r]=o==="raw"?n:`Bearer ${n}`}}return s}async ensureHttpInitialized(t){const e=this.getHttpSession(t.id);if(e.initialized)return;const s={protocolVersion:"2024-11-05",capabilities:{},clientInfo:{name:"catui-agent",version:"1.11.12"}};await this.sendHttpRequest(t,"initialize",s,t.initTimeout??2e4),e.initialized=!0,await this.sendHttpRequest(t,"notifications/initialized",{},t.initTimeout??2e4,!0)}async sendHttpRequest(t,e,s,n,r=!1,o=!0){if(!t.url)throw new Error(`HTTP MCP server ${t.id} is missing a url`);const a=this.getHttpSession(t.id);e!=="initialize"&&!a.initialized&&await this.ensureHttpInitialized(t);const i=r?void 0:Date.now()+Math.floor(Math.random()*1e3),l=r?{jsonrpc:"2.0",method:e,params:s??{}}:{jsonrpc:"2.0",id:i,method:e,params:s??{}},u=await fetch(t.url,{method:"POST",headers:await this.buildHttpHeaders(t,e==="initialize"?void 0:a.sessionId),body:JSON.stringify(l),signal:AbortSignal.timeout(n)});if(u.status===404&&a.sessionId&&o&&e!=="initialize")return this.httpSessions.set(t.id,{initialized:!1}),this.sendHttpRequest(t,e,s,n,r,!1);if(!u.ok){if(u.status===401&&t.authProvider)throw new Error(`HTTP MCP request failed (401 Unauthorized). The ${t.id} server requires valid credentials for "${t.authProvider}". Re-authenticate and try again.`);const S=await u.text().catch(()=>"");throw new Error(`HTTP MCP request failed (${u.status} ${u.statusText})${S?`: ${S}`:""}`)}const h=u.headers.get("Mcp-Session-Id");if(h&&(a.sessionId=h),r)return;const f=u.headers.get("content-type")??"",m=await u.text();if(!m.trim())return;let d;if(f.includes("text/event-stream"))d=this.parseEventStreamResponse(m);else{if(!f.includes("application/json")&&!m.trim().startsWith("{"))throw new Error(`Unsupported HTTP MCP response content type: ${f||"unknown"}`);d=JSON.parse(m)}if(d.error)throw new Error(d.error.message||`JSON-RPC error ${d.error.code??"unknown"}`);return d.result}parseEventStreamResponse(t){const e=[];let s={};for(const r of t.split(/\r?\n/)){if(!r.trim()){(s.data!==void 0||s.event!==void 0)&&(e.push(s),s={});continue}if(r.startsWith(":"))continue;const o=r.indexOf(":"),a=o===-1?r:r.slice(0,o),i=o===-1?"":r.slice(o+1).trimStart();a==="event"?s.event=i:a==="data"&&(s.data=s.data?`${s.data}
|
|
4
|
+
${i}`:i)}(s.data!==void 0||s.event!==void 0)&&e.push(s);const n=[...e].reverse().find(r=>typeof r.data=="string"&&r.data.trim().length>0)?.data;if(!n)throw new Error("HTTP MCP event-stream response did not include a JSON payload");return JSON.parse(n)}async initializeServer(t){const e=this.servers.get(t),s=e?.command?.toLowerCase().includes("npx")??!1,r=process.platform==="win32"&&s?1500:500;await new Promise(l=>setTimeout(l,r));const o=e?.initTimeout??2e4,a={protocolVersion:"2024-11-05",capabilities:{},clientInfo:{name:"catui-agent",version:"1.7.0"}},i={protocolVersion:"2024-10-07",capabilities:{},clientInfo:{name:"catui-agent",version:"1.7.0"}};try{await this.sendRequest(t,"initialize",a,o)}catch{await this.sendRequest(t,"initialize",i,o)}this.sendNotification(t,"notifications/initialized")}normalizeToolRecord(t,e){if(!e||typeof e!="object")return null;const s=e,n=s.name,r=s.description;if(typeof n!="string"||typeof r!="string")return null;const o=s.inputSchema&&typeof s.inputSchema=="object"?s.inputSchema:{type:"object",properties:{},additionalProperties:!0};return{name:`${t}/${n}`,displayName:typeof s.title=="string"?s.title:typeof s.displayName=="string"?s.displayName:void 0,description:r,inputSchema:o,serverId:t}}async loadToolsForServer(t){const e=[];let s;for(;;){const n=await this.sendRequest(t,"tools/list",s?{cursor:s}:{},2e4),r=Array.isArray(n.tools)?n.tools:[];for(const a of r){const i=this.normalizeToolRecord(t,a);i&&e.push(i)}const o=typeof n.nextCursor=="string"?n.nextCursor:typeof n.cursor=="string"?n.cursor:void 0;if(!o||o===s)break;s=o}return this.serverTools.set(t,e),e}async startServer(t){const e=this.servers.get(t);if(!e)throw new Error(`Server ${t} not found`);if(e.transport==="http")try{return await this.ensureHttpInitialized(e),await this.loadToolsForServer(t),!0}catch(r){return P("http",t,r),!1}if(e.transport==="sse"||this.serverRuntimes.has(t))return!0;const s=this.getSpawnAttempts(e);let n;for(const r of s)try{const o=e.cwd||process.cwd(),i={process:await this.spawnProcess(r,{...process.env,...e.env},o),buffer:Buffer.alloc(0),nextRequestId:1,pendingRequests:new Map};return this.serverRuntimes.set(t,i),this.attachStdoutParser(t,i),await this.initializeServer(t),await this.loadToolsForServer(t),!0}catch(o){n=o,this.stopServer(t)}return P("stdio",t,n),!1}stopServer(t){const e=this.servers.get(t),s=this.httpSessions.get(t);e?.transport==="http"&&s?.sessionId&&e.url&&this.buildHttpHeaders(e,s.sessionId).then(r=>fetch(e.url,{method:"DELETE",headers:r})).catch(()=>{}),this.httpSessions.delete(t);const n=this.serverRuntimes.get(t);if(n){for(const r of n.pendingRequests.values())clearTimeout(r.timer),r.reject(new Error(`MCP server ${t} stopped`));n.pendingRequests.clear(),n.process.kill(),this.serverRuntimes.delete(t)}}stopAllServers(){const t=new Set([...this.serverRuntimes.keys(),...this.httpSessions.keys()]);for(const e of t)this.stopServer(e)}async listTools(t){const e=[];if(t){if(!this.serverTools.has(t))try{await this.loadToolsForServer(t)}catch{}const s=this.serverTools.get(t)||[];e.push(...s)}else for(const[s]of this.servers.entries()){if(!this.serverTools.has(s))try{await this.loadToolsForServer(s)}catch{}e.push(...this.serverTools.get(s)||[])}return e}async callTool(t,e,s){const[n,...r]=t.split("/"),o=r.join("/"),a=this.servers.get(n);if(!a)return{content:[{type:"text",text:`Server ${n} not found`}],error:`Server ${n} not found`};const i=s??a.toolTimeout??2e4;return a.transport==="sse"?this.callSSETool(a,o,e):a.transport==="http"?this.callHttpTool(a,o,e,i):this.callStdioTool(a,o,e,i)}async callHttpTool(t,e,s,n=2e4){try{const r=await this.sendRequest(t.id,"tools/call",{name:e,arguments:s},n),o=r.isError===!0,a=Array.isArray(r.content)?r.content.map(i=>({type:i.type==="image"||i.type==="resource"?i.type:"text",text:typeof i.text=="string"?i.text:typeof i.message=="string"?i.message:void 0,data:i})):[{type:"text",text:JSON.stringify(r)}];return{content:a,error:o?a.map(i=>i.text).filter(i=>!!i).join(`
|
|
5
|
+
`)||`MCP tool ${e} failed`:void 0}}catch(r){return{content:[{type:"text",text:`Failed to call tool: ${r}`}],error:String(r)}}}async callStdioTool(t,e,s,n=2e4){if(!this.serverRuntimes.has(t.id))return{content:[{type:"text",text:`Server ${t.id} is not running`}],error:`Server ${t.id} is not running`};try{const r=await this.sendRequest(t.id,"tools/call",{name:e,arguments:s},n),o=r.isError===!0,a=Array.isArray(r.content)?r.content.map(i=>({type:i.type==="image"||i.type==="resource"?i.type:"text",text:typeof i.text=="string"?i.text:typeof i.message=="string"?i.message:void 0,data:i})):[{type:"text",text:JSON.stringify(r)}];return{content:a,error:o?a.map(i=>i.text).filter(i=>!!i).join(`
|
|
6
|
+
`)||`MCP tool ${e} failed`:void 0}}catch(r){return{content:[{type:"text",text:`Failed to call tool: ${r}`}],error:String(r)}}}async callSSETool(t,e,s){return{content:[{type:"text",text:`SSE transport is not implemented yet for ${t.id}/${e}`}],error:"SSE transport not yet supported"}}hasTool(t){const[e]=t.split("/");return this.servers.has(e)}}export{O as MCPClient};
|