@hansjm10/volt-coding-agent 0.0.0-bootstrap.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BINARY-CAPABILITIES.md +28 -0
- package/CHANGELOG.md +4845 -0
- package/LICENSE +1 -1
- package/README.md +716 -3
- package/THIRD-PARTY-NOTICES.md +55 -0
- package/dist/LICENSES/clipboard-image-MIT.txt +9 -0
- package/dist/LICENSES/highlight.js-10.7.3-BSD-3-Clause.txt +29 -0
- package/dist/LICENSES/highlight.js-11.9.0-BSD-3-Clause.txt +29 -0
- package/dist/LICENSES/marked-18.0.5-LICENSE.txt +44 -0
- package/dist/LICENSES/run-jxa-MIT.txt +9 -0
- package/dist/cli/args.d.ts +60 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +414 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/config-selector.d.ts +14 -0
- package/dist/cli/config-selector.d.ts.map +1 -0
- package/dist/cli/config-selector.js +31 -0
- package/dist/cli/config-selector.js.map +1 -0
- package/dist/cli/file-processor.d.ts +15 -0
- package/dist/cli/file-processor.d.ts.map +1 -0
- package/dist/cli/file-processor.js +85 -0
- package/dist/cli/file-processor.js.map +1 -0
- package/dist/cli/initial-message.d.ts +18 -0
- package/dist/cli/initial-message.d.ts.map +1 -0
- package/dist/cli/initial-message.js +22 -0
- package/dist/cli/initial-message.js.map +1 -0
- package/dist/cli/list-models.d.ts +9 -0
- package/dist/cli/list-models.d.ts.map +1 -0
- package/dist/cli/list-models.js +98 -0
- package/dist/cli/list-models.js.map +1 -0
- package/dist/cli/project-trust.d.ts +10 -0
- package/dist/cli/project-trust.d.ts.map +1 -0
- package/dist/cli/project-trust.js +48 -0
- package/dist/cli/project-trust.js.map +1 -0
- package/dist/cli/session-picker.d.ts +9 -0
- package/dist/cli/session-picker.d.ts.map +1 -0
- package/dist/cli/session-picker.js +35 -0
- package/dist/cli/session-picker.js.map +1 -0
- package/dist/cli/startup-ui.d.ts +17 -0
- package/dist/cli/startup-ui.d.ts.map +1 -0
- package/dist/cli/startup-ui.js +133 -0
- package/dist/cli/startup-ui.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +18 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +85 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +487 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent-session-runtime.d.ts +160 -0
- package/dist/core/agent-session-runtime.d.ts.map +1 -0
- package/dist/core/agent-session-runtime.js +397 -0
- package/dist/core/agent-session-runtime.js.map +1 -0
- package/dist/core/agent-session-services.d.ts +98 -0
- package/dist/core/agent-session-services.d.ts.map +1 -0
- package/dist/core/agent-session-services.js +125 -0
- package/dist/core/agent-session-services.js.map +1 -0
- package/dist/core/agent-session.d.ts +739 -0
- package/dist/core/agent-session.d.ts.map +1 -0
- package/dist/core/agent-session.js +3158 -0
- package/dist/core/agent-session.js.map +1 -0
- package/dist/core/auth-guidance.d.ts +5 -0
- package/dist/core/auth-guidance.d.ts.map +1 -0
- package/dist/core/auth-guidance.js +21 -0
- package/dist/core/auth-guidance.js.map +1 -0
- package/dist/core/auth-storage.d.ts +159 -0
- package/dist/core/auth-storage.d.ts.map +1 -0
- package/dist/core/auth-storage.js +509 -0
- package/dist/core/auth-storage.js.map +1 -0
- package/dist/core/bash-executor.d.ts +32 -0
- package/dist/core/bash-executor.d.ts.map +1 -0
- package/dist/core/bash-executor.js +111 -0
- package/dist/core/bash-executor.js.map +1 -0
- package/dist/core/compaction/branch-summarization.d.ts +92 -0
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
- package/dist/core/compaction/branch-summarization.js +257 -0
- package/dist/core/compaction/branch-summarization.js.map +1 -0
- package/dist/core/compaction/compaction.d.ts +121 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -0
- package/dist/core/compaction/compaction.js +658 -0
- package/dist/core/compaction/compaction.js.map +1 -0
- package/dist/core/compaction/index.d.ts +7 -0
- package/dist/core/compaction/index.d.ts.map +1 -0
- package/dist/core/compaction/index.js +7 -0
- package/dist/core/compaction/index.js.map +1 -0
- package/dist/core/compaction/utils.d.ts +56 -0
- package/dist/core/compaction/utils.d.ts.map +1 -0
- package/dist/core/compaction/utils.js +271 -0
- package/dist/core/compaction/utils.js.map +1 -0
- package/dist/core/defaults.d.ts +3 -0
- package/dist/core/defaults.d.ts.map +1 -0
- package/dist/core/defaults.js +2 -0
- package/dist/core/defaults.js.map +1 -0
- package/dist/core/diagnostics.d.ts +15 -0
- package/dist/core/diagnostics.d.ts.map +1 -0
- package/dist/core/diagnostics.js +2 -0
- package/dist/core/diagnostics.js.map +1 -0
- package/dist/core/event-bus.d.ts +9 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +25 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/exec.d.ts +29 -0
- package/dist/core/exec.d.ts.map +1 -0
- package/dist/core/exec.js +75 -0
- package/dist/core/exec.js.map +1 -0
- package/dist/core/experimental.d.ts +2 -0
- package/dist/core/experimental.d.ts.map +1 -0
- package/dist/core/experimental.js +4 -0
- package/dist/core/experimental.js.map +1 -0
- package/dist/core/export-html/ansi-to-html.d.ts +22 -0
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
- package/dist/core/export-html/ansi-to-html.js +249 -0
- package/dist/core/export-html/ansi-to-html.js.map +1 -0
- package/dist/core/export-html/index.d.ts +37 -0
- package/dist/core/export-html/index.d.ts.map +1 -0
- package/dist/core/export-html/index.js +234 -0
- package/dist/core/export-html/index.js.map +1 -0
- package/dist/core/export-html/template.css +1066 -0
- package/dist/core/export-html/template.html +55 -0
- package/dist/core/export-html/template.js +1864 -0
- package/dist/core/export-html/tool-renderer.d.ts +34 -0
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
- package/dist/core/export-html/tool-renderer.js +108 -0
- package/dist/core/export-html/tool-renderer.js.map +1 -0
- package/dist/core/export-html/vendor/highlight.min.js +1213 -0
- package/dist/core/export-html/vendor/marked.min.js +78 -0
- package/dist/core/extensions/index.d.ts +12 -0
- package/dist/core/extensions/index.d.ts.map +1 -0
- package/dist/core/extensions/index.js +9 -0
- package/dist/core/extensions/index.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +25 -0
- package/dist/core/extensions/loader.d.ts.map +1 -0
- package/dist/core/extensions/loader.js +516 -0
- package/dist/core/extensions/loader.js.map +1 -0
- package/dist/core/extensions/runner.d.ts +180 -0
- package/dist/core/extensions/runner.d.ts.map +1 -0
- package/dist/core/extensions/runner.js +938 -0
- package/dist/core/extensions/runner.js.map +1 -0
- package/dist/core/extensions/types.d.ts +1215 -0
- package/dist/core/extensions/types.d.ts.map +1 -0
- package/dist/core/extensions/types.js +48 -0
- package/dist/core/extensions/types.js.map +1 -0
- package/dist/core/extensions/wrapper.d.ts +20 -0
- package/dist/core/extensions/wrapper.d.ts.map +1 -0
- package/dist/core/extensions/wrapper.js +22 -0
- package/dist/core/extensions/wrapper.js.map +1 -0
- package/dist/core/footer-data-provider.d.ts +54 -0
- package/dist/core/footer-data-provider.d.ts.map +1 -0
- package/dist/core/footer-data-provider.js +338 -0
- package/dist/core/footer-data-provider.js.map +1 -0
- package/dist/core/host-actions.d.ts +107 -0
- package/dist/core/host-actions.d.ts.map +1 -0
- package/dist/core/host-actions.js +632 -0
- package/dist/core/host-actions.js.map +1 -0
- package/dist/core/host-interaction.d.ts +35 -0
- package/dist/core/host-interaction.d.ts.map +1 -0
- package/dist/core/host-interaction.js +2 -0
- package/dist/core/host-interaction.js.map +1 -0
- package/dist/core/http-dispatcher.d.ts +22 -0
- package/dist/core/http-dispatcher.d.ts.map +1 -0
- package/dist/core/http-dispatcher.js +64 -0
- package/dist/core/http-dispatcher.js.map +1 -0
- package/dist/core/index.d.ts +18 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +17 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/keybindings.d.ts +373 -0
- package/dist/core/keybindings.d.ts.map +1 -0
- package/dist/core/keybindings.js +303 -0
- package/dist/core/keybindings.js.map +1 -0
- package/dist/core/lsp/client.d.ts +119 -0
- package/dist/core/lsp/client.d.ts.map +1 -0
- package/dist/core/lsp/client.js +711 -0
- package/dist/core/lsp/client.js.map +1 -0
- package/dist/core/lsp/config.d.ts +96 -0
- package/dist/core/lsp/config.d.ts.map +1 -0
- package/dist/core/lsp/config.js +206 -0
- package/dist/core/lsp/config.js.map +1 -0
- package/dist/core/lsp/index.d.ts +6 -0
- package/dist/core/lsp/index.d.ts.map +1 -0
- package/dist/core/lsp/index.js +6 -0
- package/dist/core/lsp/index.js.map +1 -0
- package/dist/core/lsp/manager.d.ts +122 -0
- package/dist/core/lsp/manager.d.ts.map +1 -0
- package/dist/core/lsp/manager.js +1136 -0
- package/dist/core/lsp/manager.js.map +1 -0
- package/dist/core/lsp/trace.d.ts +26 -0
- package/dist/core/lsp/trace.d.ts.map +1 -0
- package/dist/core/lsp/trace.js +98 -0
- package/dist/core/lsp/trace.js.map +1 -0
- package/dist/core/lsp/workspace-edit.d.ts +60 -0
- package/dist/core/lsp/workspace-edit.d.ts.map +1 -0
- package/dist/core/lsp/workspace-edit.js +71 -0
- package/dist/core/lsp/workspace-edit.js.map +1 -0
- package/dist/core/mcp/audit.d.ts +39 -0
- package/dist/core/mcp/audit.d.ts.map +1 -0
- package/dist/core/mcp/audit.js +35 -0
- package/dist/core/mcp/audit.js.map +1 -0
- package/dist/core/mcp/auth.d.ts +7 -0
- package/dist/core/mcp/auth.d.ts.map +1 -0
- package/dist/core/mcp/auth.js +56 -0
- package/dist/core/mcp/auth.js.map +1 -0
- package/dist/core/mcp/client-factory.d.ts +20 -0
- package/dist/core/mcp/client-factory.d.ts.map +1 -0
- package/dist/core/mcp/client-factory.js +200 -0
- package/dist/core/mcp/client-factory.js.map +1 -0
- package/dist/core/mcp/config-loader.d.ts +9 -0
- package/dist/core/mcp/config-loader.d.ts.map +1 -0
- package/dist/core/mcp/config-loader.js +104 -0
- package/dist/core/mcp/config-loader.js.map +1 -0
- package/dist/core/mcp/config-writer.d.ts +21 -0
- package/dist/core/mcp/config-writer.d.ts.map +1 -0
- package/dist/core/mcp/config-writer.js +124 -0
- package/dist/core/mcp/config-writer.js.map +1 -0
- package/dist/core/mcp/config.d.ts +32 -0
- package/dist/core/mcp/config.d.ts.map +1 -0
- package/dist/core/mcp/config.js +385 -0
- package/dist/core/mcp/config.js.map +1 -0
- package/dist/core/mcp/direct-tools.d.ts +11 -0
- package/dist/core/mcp/direct-tools.d.ts.map +1 -0
- package/dist/core/mcp/direct-tools.js +47 -0
- package/dist/core/mcp/direct-tools.js.map +1 -0
- package/dist/core/mcp/gateway-tool.d.ts +29 -0
- package/dist/core/mcp/gateway-tool.d.ts.map +1 -0
- package/dist/core/mcp/gateway-tool.js +108 -0
- package/dist/core/mcp/gateway-tool.js.map +1 -0
- package/dist/core/mcp/index.d.ts +19 -0
- package/dist/core/mcp/index.d.ts.map +1 -0
- package/dist/core/mcp/index.js +18 -0
- package/dist/core/mcp/index.js.map +1 -0
- package/dist/core/mcp/manager.d.ts +117 -0
- package/dist/core/mcp/manager.d.ts.map +1 -0
- package/dist/core/mcp/manager.js +819 -0
- package/dist/core/mcp/manager.js.map +1 -0
- package/dist/core/mcp/metadata-cache.d.ts +27 -0
- package/dist/core/mcp/metadata-cache.d.ts.map +1 -0
- package/dist/core/mcp/metadata-cache.js +152 -0
- package/dist/core/mcp/metadata-cache.js.map +1 -0
- package/dist/core/mcp/oauth-flow.d.ts +94 -0
- package/dist/core/mcp/oauth-flow.d.ts.map +1 -0
- package/dist/core/mcp/oauth-flow.js +473 -0
- package/dist/core/mcp/oauth-flow.js.map +1 -0
- package/dist/core/mcp/oauth-provider.d.ts +39 -0
- package/dist/core/mcp/oauth-provider.d.ts.map +1 -0
- package/dist/core/mcp/oauth-provider.js +149 -0
- package/dist/core/mcp/oauth-provider.js.map +1 -0
- package/dist/core/mcp/oauth-store.d.ts +27 -0
- package/dist/core/mcp/oauth-store.d.ts.map +1 -0
- package/dist/core/mcp/oauth-store.js +111 -0
- package/dist/core/mcp/oauth-store.js.map +1 -0
- package/dist/core/mcp/output-store.d.ts +55 -0
- package/dist/core/mcp/output-store.d.ts.map +1 -0
- package/dist/core/mcp/output-store.js +206 -0
- package/dist/core/mcp/output-store.js.map +1 -0
- package/dist/core/mcp/rpc.d.ts +13 -0
- package/dist/core/mcp/rpc.d.ts.map +1 -0
- package/dist/core/mcp/rpc.js +29 -0
- package/dist/core/mcp/rpc.js.map +1 -0
- package/dist/core/mcp/safety.d.ts +6 -0
- package/dist/core/mcp/safety.d.ts.map +1 -0
- package/dist/core/mcp/safety.js +65 -0
- package/dist/core/mcp/safety.js.map +1 -0
- package/dist/core/mcp/search.d.ts +8 -0
- package/dist/core/mcp/search.d.ts.map +1 -0
- package/dist/core/mcp/search.js +85 -0
- package/dist/core/mcp/search.js.map +1 -0
- package/dist/core/mcp/server-supervisor.d.ts +59 -0
- package/dist/core/mcp/server-supervisor.d.ts.map +1 -0
- package/dist/core/mcp/server-supervisor.js +331 -0
- package/dist/core/mcp/server-supervisor.js.map +1 -0
- package/dist/core/mcp/types.d.ts +321 -0
- package/dist/core/mcp/types.d.ts.map +1 -0
- package/dist/core/mcp/types.js +2 -0
- package/dist/core/mcp/types.js.map +1 -0
- package/dist/core/messages.d.ts +78 -0
- package/dist/core/messages.d.ts.map +1 -0
- package/dist/core/messages.js +138 -0
- package/dist/core/messages.js.map +1 -0
- package/dist/core/model-catalog-watcher.d.ts +36 -0
- package/dist/core/model-catalog-watcher.d.ts.map +1 -0
- package/dist/core/model-catalog-watcher.js +101 -0
- package/dist/core/model-catalog-watcher.js.map +1 -0
- package/dist/core/model-registry.d.ts +160 -0
- package/dist/core/model-registry.d.ts.map +1 -0
- package/dist/core/model-registry.js +754 -0
- package/dist/core/model-registry.js.map +1 -0
- package/dist/core/model-resolver.d.ts +111 -0
- package/dist/core/model-resolver.d.ts.map +1 -0
- package/dist/core/model-resolver.js +534 -0
- package/dist/core/model-resolver.js.map +1 -0
- package/dist/core/output-guard.d.ts +7 -0
- package/dist/core/output-guard.d.ts.map +1 -0
- package/dist/core/output-guard.js +89 -0
- package/dist/core/output-guard.js.map +1 -0
- package/dist/core/package-manager.d.ts +220 -0
- package/dist/core/package-manager.d.ts.map +1 -0
- package/dist/core/package-manager.js +2217 -0
- package/dist/core/package-manager.js.map +1 -0
- package/dist/core/project-trust.d.ts +15 -0
- package/dist/core/project-trust.d.ts.map +1 -0
- package/dist/core/project-trust.js +58 -0
- package/dist/core/project-trust.js.map +1 -0
- package/dist/core/prompt-templates.d.ts +53 -0
- package/dist/core/prompt-templates.d.ts.map +1 -0
- package/dist/core/prompt-templates.js +236 -0
- package/dist/core/prompt-templates.js.map +1 -0
- package/dist/core/provider-attribution.d.ts +4 -0
- package/dist/core/provider-attribution.d.ts.map +1 -0
- package/dist/core/provider-attribution.js +81 -0
- package/dist/core/provider-attribution.js.map +1 -0
- package/dist/core/provider-display-names.d.ts +2 -0
- package/dist/core/provider-display-names.d.ts.map +1 -0
- package/dist/core/provider-display-names.js +36 -0
- package/dist/core/provider-display-names.js.map +1 -0
- package/dist/core/remote/iroh/access-grant.d.ts +40 -0
- package/dist/core/remote/iroh/access-grant.d.ts.map +1 -0
- package/dist/core/remote/iroh/access-grant.js +199 -0
- package/dist/core/remote/iroh/access-grant.js.map +1 -0
- package/dist/core/remote/iroh/active-stream-registry.d.ts +39 -0
- package/dist/core/remote/iroh/active-stream-registry.d.ts.map +1 -0
- package/dist/core/remote/iroh/active-stream-registry.js +109 -0
- package/dist/core/remote/iroh/active-stream-registry.js.map +1 -0
- package/dist/core/remote/iroh/audit.d.ts +67 -0
- package/dist/core/remote/iroh/audit.d.ts.map +1 -0
- package/dist/core/remote/iroh/audit.js +274 -0
- package/dist/core/remote/iroh/audit.js.map +1 -0
- package/dist/core/remote/iroh/authorization.d.ts +46 -0
- package/dist/core/remote/iroh/authorization.d.ts.map +1 -0
- package/dist/core/remote/iroh/authorization.js +327 -0
- package/dist/core/remote/iroh/authorization.js.map +1 -0
- package/dist/core/remote/iroh/control.d.ts +64 -0
- package/dist/core/remote/iroh/control.d.ts.map +1 -0
- package/dist/core/remote/iroh/control.js +326 -0
- package/dist/core/remote/iroh/control.js.map +1 -0
- package/dist/core/remote/iroh/device-log-rpc.d.ts +22 -0
- package/dist/core/remote/iroh/device-log-rpc.d.ts.map +1 -0
- package/dist/core/remote/iroh/device-log-rpc.js +152 -0
- package/dist/core/remote/iroh/device-log-rpc.js.map +1 -0
- package/dist/core/remote/iroh/engine.d.ts +148 -0
- package/dist/core/remote/iroh/engine.d.ts.map +1 -0
- package/dist/core/remote/iroh/engine.js +499 -0
- package/dist/core/remote/iroh/engine.js.map +1 -0
- package/dist/core/remote/iroh/handshake-reader.d.ts +19 -0
- package/dist/core/remote/iroh/handshake-reader.d.ts.map +1 -0
- package/dist/core/remote/iroh/handshake-reader.js +91 -0
- package/dist/core/remote/iroh/handshake-reader.js.map +1 -0
- package/dist/core/remote/iroh/handshake.d.ts +119 -0
- package/dist/core/remote/iroh/handshake.d.ts.map +1 -0
- package/dist/core/remote/iroh/handshake.js +621 -0
- package/dist/core/remote/iroh/handshake.js.map +1 -0
- package/dist/core/remote/iroh/host-policy.d.ts +13 -0
- package/dist/core/remote/iroh/host-policy.d.ts.map +1 -0
- package/dist/core/remote/iroh/host-policy.js +15 -0
- package/dist/core/remote/iroh/host-policy.js.map +1 -0
- package/dist/core/remote/iroh/index.d.ts +25 -0
- package/dist/core/remote/iroh/index.d.ts.map +1 -0
- package/dist/core/remote/iroh/index.js +25 -0
- package/dist/core/remote/iroh/index.js.map +1 -0
- package/dist/core/remote/iroh/metadata.d.ts +28 -0
- package/dist/core/remote/iroh/metadata.d.ts.map +1 -0
- package/dist/core/remote/iroh/metadata.js +16 -0
- package/dist/core/remote/iroh/metadata.js.map +1 -0
- package/dist/core/remote/iroh/outbound-filter.d.ts +29 -0
- package/dist/core/remote/iroh/outbound-filter.d.ts.map +1 -0
- package/dist/core/remote/iroh/outbound-filter.js +692 -0
- package/dist/core/remote/iroh/outbound-filter.js.map +1 -0
- package/dist/core/remote/iroh/protocol.d.ts +60 -0
- package/dist/core/remote/iroh/protocol.d.ts.map +1 -0
- package/dist/core/remote/iroh/protocol.js +204 -0
- package/dist/core/remote/iroh/protocol.js.map +1 -0
- package/dist/core/remote/iroh/push.d.ts +179 -0
- package/dist/core/remote/iroh/push.d.ts.map +1 -0
- package/dist/core/remote/iroh/push.js +662 -0
- package/dist/core/remote/iroh/push.js.map +1 -0
- package/dist/core/remote/iroh/qr.d.ts +12 -0
- package/dist/core/remote/iroh/qr.d.ts.map +1 -0
- package/dist/core/remote/iroh/qr.js +27 -0
- package/dist/core/remote/iroh/qr.js.map +1 -0
- package/dist/core/remote/iroh/rpc-command-filter.d.ts +47 -0
- package/dist/core/remote/iroh/rpc-command-filter.d.ts.map +1 -0
- package/dist/core/remote/iroh/rpc-command-filter.js +188 -0
- package/dist/core/remote/iroh/rpc-command-filter.js.map +1 -0
- package/dist/core/remote/iroh/rpc-transport.d.ts +21 -0
- package/dist/core/remote/iroh/rpc-transport.d.ts.map +1 -0
- package/dist/core/remote/iroh/rpc-transport.js +106 -0
- package/dist/core/remote/iroh/rpc-transport.js.map +1 -0
- package/dist/core/remote/iroh/state-manager.d.ts +141 -0
- package/dist/core/remote/iroh/state-manager.d.ts.map +1 -0
- package/dist/core/remote/iroh/state-manager.js +744 -0
- package/dist/core/remote/iroh/state-manager.js.map +1 -0
- package/dist/core/remote/iroh/state.d.ts +141 -0
- package/dist/core/remote/iroh/state.d.ts.map +1 -0
- package/dist/core/remote/iroh/state.js +433 -0
- package/dist/core/remote/iroh/state.js.map +1 -0
- package/dist/core/remote/iroh/ticket.d.ts +46 -0
- package/dist/core/remote/iroh/ticket.d.ts.map +1 -0
- package/dist/core/remote/iroh/ticket.js +267 -0
- package/dist/core/remote/iroh/ticket.js.map +1 -0
- package/dist/core/remote/iroh/transcript-text.d.ts +8 -0
- package/dist/core/remote/iroh/transcript-text.d.ts.map +1 -0
- package/dist/core/remote/iroh/transcript-text.js +26 -0
- package/dist/core/remote/iroh/transcript-text.js.map +1 -0
- package/dist/core/remote/iroh/workspace-rpc.d.ts +31 -0
- package/dist/core/remote/iroh/workspace-rpc.d.ts.map +1 -0
- package/dist/core/remote/iroh/workspace-rpc.js +73 -0
- package/dist/core/remote/iroh/workspace-rpc.js.map +1 -0
- package/dist/core/remote/iroh/workspace.d.ts +16 -0
- package/dist/core/remote/iroh/workspace.d.ts.map +1 -0
- package/dist/core/remote/iroh/workspace.js +104 -0
- package/dist/core/remote/iroh/workspace.js.map +1 -0
- package/dist/core/remote/iroh/worktree-rpc.d.ts +83 -0
- package/dist/core/remote/iroh/worktree-rpc.d.ts.map +1 -0
- package/dist/core/remote/iroh/worktree-rpc.js +148 -0
- package/dist/core/remote/iroh/worktree-rpc.js.map +1 -0
- package/dist/core/resolve-config-value.d.ts +30 -0
- package/dist/core/resolve-config-value.d.ts.map +1 -0
- package/dist/core/resolve-config-value.js +245 -0
- package/dist/core/resolve-config-value.js.map +1 -0
- package/dist/core/resource-loader.d.ts +214 -0
- package/dist/core/resource-loader.d.ts.map +1 -0
- package/dist/core/resource-loader.js +824 -0
- package/dist/core/resource-loader.js.map +1 -0
- package/dist/core/review.d.ts +318 -0
- package/dist/core/review.d.ts.map +1 -0
- package/dist/core/review.js +1271 -0
- package/dist/core/review.js.map +1 -0
- package/dist/core/rpc/duplex-write-gate.d.ts +29 -0
- package/dist/core/rpc/duplex-write-gate.d.ts.map +1 -0
- package/dist/core/rpc/duplex-write-gate.js +124 -0
- package/dist/core/rpc/duplex-write-gate.js.map +1 -0
- package/dist/core/rpc/index.d.ts +6 -0
- package/dist/core/rpc/index.d.ts.map +1 -0
- package/dist/core/rpc/index.js +5 -0
- package/dist/core/rpc/index.js.map +1 -0
- package/dist/core/rpc/iroh-transport.d.ts +58 -0
- package/dist/core/rpc/iroh-transport.d.ts.map +1 -0
- package/dist/core/rpc/iroh-transport.js +278 -0
- package/dist/core/rpc/iroh-transport.js.map +1 -0
- package/dist/core/rpc/jsonl.d.ts +17 -0
- package/dist/core/rpc/jsonl.d.ts.map +1 -0
- package/dist/core/rpc/jsonl.js +49 -0
- package/dist/core/rpc/jsonl.js.map +1 -0
- package/dist/core/rpc/loopback-transport.d.ts +14 -0
- package/dist/core/rpc/loopback-transport.d.ts.map +1 -0
- package/dist/core/rpc/loopback-transport.js +120 -0
- package/dist/core/rpc/loopback-transport.js.map +1 -0
- package/dist/core/rpc/transcript.d.ts +37 -0
- package/dist/core/rpc/transcript.d.ts.map +1 -0
- package/dist/core/rpc/transcript.js +624 -0
- package/dist/core/rpc/transcript.js.map +1 -0
- package/dist/core/rpc/transport.d.ts +41 -0
- package/dist/core/rpc/transport.d.ts.map +1 -0
- package/dist/core/rpc/transport.js +155 -0
- package/dist/core/rpc/transport.js.map +1 -0
- package/dist/core/rpc/types.d.ts +1254 -0
- package/dist/core/rpc/types.d.ts.map +1 -0
- package/dist/core/rpc/types.js +8 -0
- package/dist/core/rpc/types.js.map +1 -0
- package/dist/core/rpc/ui-action-args.d.ts +3 -0
- package/dist/core/rpc/ui-action-args.d.ts.map +1 -0
- package/dist/core/rpc/ui-action-args.js +66 -0
- package/dist/core/rpc/ui-action-args.js.map +1 -0
- package/dist/core/rpc/ui-actions.d.ts +43 -0
- package/dist/core/rpc/ui-actions.d.ts.map +1 -0
- package/dist/core/rpc/ui-actions.js +362 -0
- package/dist/core/rpc/ui-actions.js.map +1 -0
- package/dist/core/sdk.d.ts +138 -0
- package/dist/core/sdk.d.ts.map +1 -0
- package/dist/core/sdk.js +324 -0
- package/dist/core/sdk.js.map +1 -0
- package/dist/core/session-cwd.d.ts +19 -0
- package/dist/core/session-cwd.d.ts.map +1 -0
- package/dist/core/session-cwd.js +38 -0
- package/dist/core/session-cwd.js.map +1 -0
- package/dist/core/session-manager.d.ts +346 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +1280 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/settings-manager.d.ts +359 -0
- package/dist/core/settings-manager.d.ts.map +1 -0
- package/dist/core/settings-manager.js +1277 -0
- package/dist/core/settings-manager.js.map +1 -0
- package/dist/core/skills.d.ts +60 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +387 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/slash-commands.d.ts +14 -0
- package/dist/core/slash-commands.d.ts.map +1 -0
- package/dist/core/slash-commands.js +51 -0
- package/dist/core/slash-commands.js.map +1 -0
- package/dist/core/source-info.d.ts +18 -0
- package/dist/core/source-info.d.ts.map +1 -0
- package/dist/core/source-info.js +19 -0
- package/dist/core/source-info.js.map +1 -0
- package/dist/core/subagents/delegation-scope.d.ts +47 -0
- package/dist/core/subagents/delegation-scope.d.ts.map +1 -0
- package/dist/core/subagents/delegation-scope.js +134 -0
- package/dist/core/subagents/delegation-scope.js.map +1 -0
- package/dist/core/subagents/index.d.ts +46 -0
- package/dist/core/subagents/index.d.ts.map +1 -0
- package/dist/core/subagents/index.js +369 -0
- package/dist/core/subagents/index.js.map +1 -0
- package/dist/core/subagents/manager.d.ts +183 -0
- package/dist/core/subagents/manager.d.ts.map +1 -0
- package/dist/core/subagents/manager.js +820 -0
- package/dist/core/subagents/manager.js.map +1 -0
- package/dist/core/system-prompt.d.ts +28 -0
- package/dist/core/system-prompt.d.ts.map +1 -0
- package/dist/core/system-prompt.js +180 -0
- package/dist/core/system-prompt.js.map +1 -0
- package/dist/core/telemetry.d.ts +3 -0
- package/dist/core/telemetry.d.ts.map +1 -0
- package/dist/core/telemetry.js +9 -0
- package/dist/core/telemetry.js.map +1 -0
- package/dist/core/theme/dark.json +86 -0
- package/dist/core/theme/discovery.d.ts +48 -0
- package/dist/core/theme/discovery.d.ts.map +1 -0
- package/dist/core/theme/discovery.js +239 -0
- package/dist/core/theme/discovery.js.map +1 -0
- package/dist/core/theme/index.d.ts +6 -0
- package/dist/core/theme/index.d.ts.map +1 -0
- package/dist/core/theme/index.js +5 -0
- package/dist/core/theme/index.js.map +1 -0
- package/dist/core/theme/light.json +85 -0
- package/dist/core/theme/runtime.d.ts +55 -0
- package/dist/core/theme/runtime.d.ts.map +1 -0
- package/dist/core/theme/runtime.js +555 -0
- package/dist/core/theme/runtime.js.map +1 -0
- package/dist/core/theme/theme-schema.json +335 -0
- package/dist/core/theme/theme-service.d.ts +37 -0
- package/dist/core/theme/theme-service.d.ts.map +1 -0
- package/dist/core/theme/theme-service.js +222 -0
- package/dist/core/theme/theme-service.js.map +1 -0
- package/dist/core/theme/theme.d.ts +100 -0
- package/dist/core/theme/theme.d.ts.map +1 -0
- package/dist/core/theme/theme.js +243 -0
- package/dist/core/theme/theme.js.map +1 -0
- package/dist/core/theme/tokens.d.ts +20 -0
- package/dist/core/theme/tokens.d.ts.map +1 -0
- package/dist/core/theme/tokens.js +178 -0
- package/dist/core/theme/tokens.js.map +1 -0
- package/dist/core/theme/types.d.ts +21 -0
- package/dist/core/theme/types.d.ts.map +1 -0
- package/dist/core/theme/types.js +2 -0
- package/dist/core/theme/types.js.map +1 -0
- package/dist/core/timings.d.ts +8 -0
- package/dist/core/timings.d.ts.map +1 -0
- package/dist/core/timings.js +31 -0
- package/dist/core/timings.js.map +1 -0
- package/dist/core/tools/bash.d.ts +68 -0
- package/dist/core/tools/bash.d.ts.map +1 -0
- package/dist/core/tools/bash.js +345 -0
- package/dist/core/tools/bash.js.map +1 -0
- package/dist/core/tools/diagnostics-provider.d.ts +12 -0
- package/dist/core/tools/diagnostics-provider.d.ts.map +1 -0
- package/dist/core/tools/diagnostics-provider.js +2 -0
- package/dist/core/tools/diagnostics-provider.js.map +1 -0
- package/dist/core/tools/edit-diff.d.ts +77 -0
- package/dist/core/tools/edit-diff.d.ts.map +1 -0
- package/dist/core/tools/edit-diff.js +506 -0
- package/dist/core/tools/edit-diff.js.map +1 -0
- package/dist/core/tools/edit.d.ts +56 -0
- package/dist/core/tools/edit.d.ts.map +1 -0
- package/dist/core/tools/edit.js +300 -0
- package/dist/core/tools/edit.js.map +1 -0
- package/dist/core/tools/file-mutation-queue.d.ts +6 -0
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
- package/dist/core/tools/file-mutation-queue.js +52 -0
- package/dist/core/tools/file-mutation-queue.js.map +1 -0
- package/dist/core/tools/find.d.ts +35 -0
- package/dist/core/tools/find.d.ts.map +1 -0
- package/dist/core/tools/find.js +337 -0
- package/dist/core/tools/find.js.map +1 -0
- package/dist/core/tools/grep.d.ts +37 -0
- package/dist/core/tools/grep.d.ts.map +1 -0
- package/dist/core/tools/grep.js +305 -0
- package/dist/core/tools/grep.js.map +1 -0
- package/dist/core/tools/index.d.ts +56 -0
- package/dist/core/tools/index.d.ts.map +1 -0
- package/dist/core/tools/index.js +174 -0
- package/dist/core/tools/index.js.map +1 -0
- package/dist/core/tools/ls.d.ts +37 -0
- package/dist/core/tools/ls.d.ts.map +1 -0
- package/dist/core/tools/ls.js +167 -0
- package/dist/core/tools/ls.js.map +1 -0
- package/dist/core/tools/lsp.d.ts +59 -0
- package/dist/core/tools/lsp.d.ts.map +1 -0
- package/dist/core/tools/lsp.js +157 -0
- package/dist/core/tools/lsp.js.map +1 -0
- package/dist/core/tools/output-accumulator.d.ts +52 -0
- package/dist/core/tools/output-accumulator.d.ts.map +1 -0
- package/dist/core/tools/output-accumulator.js +184 -0
- package/dist/core/tools/output-accumulator.js.map +1 -0
- package/dist/core/tools/path-utils.d.ts +10 -0
- package/dist/core/tools/path-utils.d.ts.map +1 -0
- package/dist/core/tools/path-utils.js +99 -0
- package/dist/core/tools/path-utils.js.map +1 -0
- package/dist/core/tools/read.d.ts +35 -0
- package/dist/core/tools/read.d.ts.map +1 -0
- package/dist/core/tools/read.js +292 -0
- package/dist/core/tools/read.js.map +1 -0
- package/dist/core/tools/render-utils.d.ts +26 -0
- package/dist/core/tools/render-utils.d.ts.map +1 -0
- package/dist/core/tools/render-utils.js +69 -0
- package/dist/core/tools/render-utils.js.map +1 -0
- package/dist/core/tools/subagent.d.ts +219 -0
- package/dist/core/tools/subagent.d.ts.map +1 -0
- package/dist/core/tools/subagent.js +1445 -0
- package/dist/core/tools/subagent.js.map +1 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
- package/dist/core/tools/tool-definition-wrapper.js +34 -0
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
- package/dist/core/tools/truncate.d.ts +70 -0
- package/dist/core/tools/truncate.d.ts.map +1 -0
- package/dist/core/tools/truncate.js +215 -0
- package/dist/core/tools/truncate.js.map +1 -0
- package/dist/core/tools/web-search.d.ts +69 -0
- package/dist/core/tools/web-search.d.ts.map +1 -0
- package/dist/core/tools/web-search.js +634 -0
- package/dist/core/tools/web-search.js.map +1 -0
- package/dist/core/tools/write.d.ts +33 -0
- package/dist/core/tools/write.d.ts.map +1 -0
- package/dist/core/tools/write.js +210 -0
- package/dist/core/tools/write.js.map +1 -0
- package/dist/core/trust-manager.d.ts +36 -0
- package/dist/core/trust-manager.d.ts.map +1 -0
- package/dist/core/trust-manager.js +220 -0
- package/dist/core/trust-manager.js.map +1 -0
- package/dist/daemon/cli.d.ts +8 -0
- package/dist/daemon/cli.d.ts.map +1 -0
- package/dist/daemon/cli.js +468 -0
- package/dist/daemon/cli.js.map +1 -0
- package/dist/daemon/control-client.d.ts +60 -0
- package/dist/daemon/control-client.d.ts.map +1 -0
- package/dist/daemon/control-client.js +411 -0
- package/dist/daemon/control-client.js.map +1 -0
- package/dist/daemon/control-protocol.d.ts +507 -0
- package/dist/daemon/control-protocol.d.ts.map +1 -0
- package/dist/daemon/control-protocol.js +395 -0
- package/dist/daemon/control-protocol.js.map +1 -0
- package/dist/daemon/control-server.d.ts +77 -0
- package/dist/daemon/control-server.d.ts.map +1 -0
- package/dist/daemon/control-server.js +327 -0
- package/dist/daemon/control-server.js.map +1 -0
- package/dist/daemon/conversation-commands.d.ts +176 -0
- package/dist/daemon/conversation-commands.d.ts.map +1 -0
- package/dist/daemon/conversation-commands.js +1268 -0
- package/dist/daemon/conversation-commands.js.map +1 -0
- package/dist/daemon/daemon-lock.d.ts +27 -0
- package/dist/daemon/daemon-lock.d.ts.map +1 -0
- package/dist/daemon/daemon-lock.js +238 -0
- package/dist/daemon/daemon-lock.js.map +1 -0
- package/dist/daemon/handshake-responses.d.ts +47 -0
- package/dist/daemon/handshake-responses.d.ts.map +1 -0
- package/dist/daemon/handshake-responses.js +113 -0
- package/dist/daemon/handshake-responses.js.map +1 -0
- package/dist/daemon/integrated-runtimes.d.ts +137 -0
- package/dist/daemon/integrated-runtimes.d.ts.map +1 -0
- package/dist/daemon/integrated-runtimes.js +763 -0
- package/dist/daemon/integrated-runtimes.js.map +1 -0
- package/dist/daemon/iroh-native.d.ts +76 -0
- package/dist/daemon/iroh-native.d.ts.map +1 -0
- package/dist/daemon/iroh-native.js +18 -0
- package/dist/daemon/iroh-native.js.map +1 -0
- package/dist/daemon/iroh-resource-guard.d.ts +57 -0
- package/dist/daemon/iroh-resource-guard.d.ts.map +1 -0
- package/dist/daemon/iroh-resource-guard.js +134 -0
- package/dist/daemon/iroh-resource-guard.js.map +1 -0
- package/dist/daemon/iroh-service.d.ts +51 -0
- package/dist/daemon/iroh-service.d.ts.map +1 -0
- package/dist/daemon/iroh-service.js +2604 -0
- package/dist/daemon/iroh-service.js.map +1 -0
- package/dist/daemon/keep-awake.d.ts +62 -0
- package/dist/daemon/keep-awake.d.ts.map +1 -0
- package/dist/daemon/keep-awake.js +190 -0
- package/dist/daemon/keep-awake.js.map +1 -0
- package/dist/daemon/lease-broker.d.ts +139 -0
- package/dist/daemon/lease-broker.d.ts.map +1 -0
- package/dist/daemon/lease-broker.js +504 -0
- package/dist/daemon/lease-broker.js.map +1 -0
- package/dist/daemon/log.d.ts +16 -0
- package/dist/daemon/log.d.ts.map +1 -0
- package/dist/daemon/log.js +40 -0
- package/dist/daemon/log.js.map +1 -0
- package/dist/daemon/main.d.ts +70 -0
- package/dist/daemon/main.d.ts.map +1 -0
- package/dist/daemon/main.js +781 -0
- package/dist/daemon/main.js.map +1 -0
- package/dist/daemon/paths.d.ts +32 -0
- package/dist/daemon/paths.d.ts.map +1 -0
- package/dist/daemon/paths.js +208 -0
- package/dist/daemon/paths.js.map +1 -0
- package/dist/daemon/process-identity.d.ts +58 -0
- package/dist/daemon/process-identity.d.ts.map +1 -0
- package/dist/daemon/process-identity.js +185 -0
- package/dist/daemon/process-identity.js.map +1 -0
- package/dist/daemon/relay-stream.d.ts +89 -0
- package/dist/daemon/relay-stream.d.ts.map +1 -0
- package/dist/daemon/relay-stream.js +202 -0
- package/dist/daemon/relay-stream.js.map +1 -0
- package/dist/daemon/remote-cli.d.ts +7 -0
- package/dist/daemon/remote-cli.d.ts.map +1 -0
- package/dist/daemon/remote-cli.js +774 -0
- package/dist/daemon/remote-cli.js.map +1 -0
- package/dist/daemon/service-install.d.ts +43 -0
- package/dist/daemon/service-install.d.ts.map +1 -0
- package/dist/daemon/service-install.js +198 -0
- package/dist/daemon/service-install.js.map +1 -0
- package/dist/daemon/session-target.d.ts +62 -0
- package/dist/daemon/session-target.d.ts.map +1 -0
- package/dist/daemon/session-target.js +66 -0
- package/dist/daemon/session-target.js.map +1 -0
- package/dist/daemon/spawn.d.ts +53 -0
- package/dist/daemon/spawn.d.ts.map +1 -0
- package/dist/daemon/spawn.js +205 -0
- package/dist/daemon/spawn.js.map +1 -0
- package/dist/daemon/state.d.ts +145 -0
- package/dist/daemon/state.d.ts.map +1 -0
- package/dist/daemon/state.js +454 -0
- package/dist/daemon/state.js.map +1 -0
- package/dist/daemon/theme-push.d.ts +23 -0
- package/dist/daemon/theme-push.d.ts.map +1 -0
- package/dist/daemon/theme-push.js +30 -0
- package/dist/daemon/theme-push.js.map +1 -0
- package/dist/daemon/viewer-feed.d.ts +42 -0
- package/dist/daemon/viewer-feed.d.ts.map +1 -0
- package/dist/daemon/viewer-feed.js +138 -0
- package/dist/daemon/viewer-feed.js.map +1 -0
- package/dist/daemon/workspace-directory.d.ts +35 -0
- package/dist/daemon/workspace-directory.d.ts.map +1 -0
- package/dist/daemon/workspace-directory.js +105 -0
- package/dist/daemon/workspace-directory.js.map +1 -0
- package/dist/daemon/workspace-streams.d.ts +70 -0
- package/dist/daemon/workspace-streams.d.ts.map +1 -0
- package/dist/daemon/workspace-streams.js +289 -0
- package/dist/daemon/workspace-streams.js.map +1 -0
- package/dist/daemon/worktree-manager.d.ts +219 -0
- package/dist/daemon/worktree-manager.d.ts.map +1 -0
- package/dist/daemon/worktree-manager.js +1204 -0
- package/dist/daemon/worktree-manager.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +12 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +773 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp-cli.d.ts +6 -0
- package/dist/mcp-cli.d.ts.map +1 -0
- package/dist/mcp-cli.js +347 -0
- package/dist/mcp-cli.js.map +1 -0
- package/dist/migrations.d.ts +33 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +281 -0
- package/dist/migrations.js.map +1 -0
- package/dist/modes/index.d.ts +13 -0
- package/dist/modes/index.d.ts.map +1 -0
- package/dist/modes/index.js +12 -0
- package/dist/modes/index.js.map +1 -0
- package/dist/modes/interactive/components/armin.d.ts +34 -0
- package/dist/modes/interactive/components/armin.d.ts.map +1 -0
- package/dist/modes/interactive/components/armin.js +333 -0
- package/dist/modes/interactive/components/armin.js.map +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts +22 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/assistant-message.js +129 -0
- package/dist/modes/interactive/components/assistant-message.js.map +1 -0
- package/dist/modes/interactive/components/bash-execution.d.ts +39 -0
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/bash-execution.js +212 -0
- package/dist/modes/interactive/components/bash-execution.js.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts +17 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.js +57 -0
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.js +44 -0
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/config-selector.d.ts +71 -0
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/config-selector.js +510 -0
- package/dist/modes/interactive/components/config-selector.js.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.js +33 -0
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
- package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-editor.js +70 -0
- package/dist/modes/interactive/components/custom-editor.js.map +1 -0
- package/dist/modes/interactive/components/custom-message.d.ts +20 -0
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-message.js +76 -0
- package/dist/modes/interactive/components/custom-message.js.map +1 -0
- package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
- package/dist/modes/interactive/components/daxnuts.js +140 -0
- package/dist/modes/interactive/components/daxnuts.js.map +1 -0
- package/dist/modes/interactive/components/diff.d.ts +12 -0
- package/dist/modes/interactive/components/diff.d.ts.map +1 -0
- package/dist/modes/interactive/components/diff.js +133 -0
- package/dist/modes/interactive/components/diff.js.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.js +21 -0
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
- package/dist/modes/interactive/components/extension-editor.d.ts +20 -0
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-editor.js +116 -0
- package/dist/modes/interactive/components/extension-editor.js.map +1 -0
- package/dist/modes/interactive/components/extension-input.d.ts +23 -0
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-input.js +61 -0
- package/dist/modes/interactive/components/extension-input.js.map +1 -0
- package/dist/modes/interactive/components/extension-selector.d.ts +27 -0
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-selector.js +98 -0
- package/dist/modes/interactive/components/extension-selector.js.map +1 -0
- package/dist/modes/interactive/components/first-time-setup.d.ts +25 -0
- package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -0
- package/dist/modes/interactive/components/first-time-setup.js +103 -0
- package/dist/modes/interactive/components/first-time-setup.js.map +1 -0
- package/dist/modes/interactive/components/footer.d.ts +27 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -0
- package/dist/modes/interactive/components/footer.js +180 -0
- package/dist/modes/interactive/components/footer.js.map +1 -0
- package/dist/modes/interactive/components/hotkeys.d.ts +24 -0
- package/dist/modes/interactive/components/hotkeys.d.ts.map +1 -0
- package/dist/modes/interactive/components/hotkeys.js +97 -0
- package/dist/modes/interactive/components/hotkeys.js.map +1 -0
- package/dist/modes/interactive/components/index.d.ts +35 -0
- package/dist/modes/interactive/components/index.d.ts.map +1 -0
- package/dist/modes/interactive/components/index.js +36 -0
- package/dist/modes/interactive/components/index.js.map +1 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts +19 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
- package/dist/modes/interactive/components/keybinding-hints.js +48 -0
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
- package/dist/modes/interactive/components/login-dialog.d.ts +52 -0
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
- package/dist/modes/interactive/components/login-dialog.js +179 -0
- package/dist/modes/interactive/components/login-dialog.js.map +1 -0
- package/dist/modes/interactive/components/logo.d.ts +25 -0
- package/dist/modes/interactive/components/logo.d.ts.map +1 -0
- package/dist/modes/interactive/components/logo.js +89 -0
- package/dist/modes/interactive/components/logo.js.map +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts +47 -0
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/model-selector.js +278 -0
- package/dist/modes/interactive/components/model-selector.js.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts +31 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.js +165 -0
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
- package/dist/modes/interactive/components/remote-control-center.d.ts +110 -0
- package/dist/modes/interactive/components/remote-control-center.d.ts.map +1 -0
- package/dist/modes/interactive/components/remote-control-center.js +1217 -0
- package/dist/modes/interactive/components/remote-control-center.js.map +1 -0
- package/dist/modes/interactive/components/review-tools-selector.d.ts +24 -0
- package/dist/modes/interactive/components/review-tools-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/review-tools-selector.js +93 -0
- package/dist/modes/interactive/components/review-tools-selector.js.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +42 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.js +290 -0
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.js +155 -0
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
- package/dist/modes/interactive/components/session-selector.d.ts +95 -0
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector.js +856 -0
- package/dist/modes/interactive/components/session-selector.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +77 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-selector.js +484 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.js +39 -0
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
- package/dist/modes/interactive/components/streaming-render-coalescer.d.ts +29 -0
- package/dist/modes/interactive/components/streaming-render-coalescer.d.ts.map +1 -0
- package/dist/modes/interactive/components/streaming-render-coalescer.js +98 -0
- package/dist/modes/interactive/components/streaming-render-coalescer.js.map +1 -0
- package/dist/modes/interactive/components/subagent-inspector.d.ts +32 -0
- package/dist/modes/interactive/components/subagent-inspector.d.ts.map +1 -0
- package/dist/modes/interactive/components/subagent-inspector.js +439 -0
- package/dist/modes/interactive/components/subagent-inspector.js.map +1 -0
- package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/theme-selector.js +50 -0
- package/dist/modes/interactive/components/theme-selector.js.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/thinking-selector.js +52 -0
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +83 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution.js +421 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector.d.ts +89 -0
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector.js +1208 -0
- package/dist/modes/interactive/components/tree-selector.js.map +1 -0
- package/dist/modes/interactive/components/trust-selector.d.ts +23 -0
- package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/trust-selector.js +91 -0
- package/dist/modes/interactive/components/trust-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message-selector.js +114 -0
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
- package/dist/modes/interactive/components/user-message.d.ts +9 -0
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message.js +42 -0
- package/dist/modes/interactive/components/user-message.js.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
- package/dist/modes/interactive/components/visual-truncate.js +33 -0
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
- package/dist/modes/interactive/components/volt-announcement.d.ts +5 -0
- package/dist/modes/interactive/components/volt-announcement.d.ts.map +1 -0
- package/dist/modes/interactive/components/volt-announcement.js +15 -0
- package/dist/modes/interactive/components/volt-announcement.js.map +1 -0
- package/dist/modes/interactive/daemon-attach.d.ts +154 -0
- package/dist/modes/interactive/daemon-attach.d.ts.map +1 -0
- package/dist/modes/interactive/daemon-attach.js +552 -0
- package/dist/modes/interactive/daemon-attach.js.map +1 -0
- package/dist/modes/interactive/drain-viewer.d.ts +31 -0
- package/dist/modes/interactive/drain-viewer.d.ts.map +1 -0
- package/dist/modes/interactive/drain-viewer.js +166 -0
- package/dist/modes/interactive/drain-viewer.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +502 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-mode.js +7007 -0
- package/dist/modes/interactive/interactive-mode.js.map +1 -0
- package/dist/modes/interactive/prompt-image-attachments.d.ts +34 -0
- package/dist/modes/interactive/prompt-image-attachments.d.ts.map +1 -0
- package/dist/modes/interactive/prompt-image-attachments.js +120 -0
- package/dist/modes/interactive/prompt-image-attachments.js.map +1 -0
- package/dist/modes/interactive/relay-stream-adapter.d.ts +19 -0
- package/dist/modes/interactive/relay-stream-adapter.d.ts.map +1 -0
- package/dist/modes/interactive/relay-stream-adapter.js +107 -0
- package/dist/modes/interactive/relay-stream-adapter.js.map +1 -0
- package/dist/modes/print-mode.d.ts +28 -0
- package/dist/modes/print-mode.d.ts.map +1 -0
- package/dist/modes/print-mode.js +132 -0
- package/dist/modes/print-mode.js.map +1 -0
- package/dist/modes/rpc/in-process-rpc-client.d.ts +31 -0
- package/dist/modes/rpc/in-process-rpc-client.d.ts.map +1 -0
- package/dist/modes/rpc/in-process-rpc-client.js +63 -0
- package/dist/modes/rpc/in-process-rpc-client.js.map +1 -0
- package/dist/modes/rpc/iroh-remote-agent-runtime.d.ts +61 -0
- package/dist/modes/rpc/iroh-remote-agent-runtime.d.ts.map +1 -0
- package/dist/modes/rpc/iroh-remote-agent-runtime.js +155 -0
- package/dist/modes/rpc/iroh-remote-agent-runtime.js.map +1 -0
- package/dist/modes/rpc/iroh-remote-rpc-mode.d.ts +69 -0
- package/dist/modes/rpc/iroh-remote-rpc-mode.d.ts.map +1 -0
- package/dist/modes/rpc/iroh-remote-rpc-mode.js +1223 -0
- package/dist/modes/rpc/iroh-remote-rpc-mode.js.map +1 -0
- package/dist/modes/rpc/jsonl.d.ts +2 -0
- package/dist/modes/rpc/jsonl.d.ts.map +1 -0
- package/dist/modes/rpc/jsonl.js +2 -0
- package/dist/modes/rpc/jsonl.js.map +1 -0
- package/dist/modes/rpc/rpc-client-base.d.ts +209 -0
- package/dist/modes/rpc/rpc-client-base.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-client-base.js +530 -0
- package/dist/modes/rpc/rpc-client-base.js.map +1 -0
- package/dist/modes/rpc/rpc-client.d.ts +50 -0
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-client.js +190 -0
- package/dist/modes/rpc/rpc-client.js.map +1 -0
- package/dist/modes/rpc/rpc-command-dispatcher.d.ts +43 -0
- package/dist/modes/rpc/rpc-command-dispatcher.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-command-dispatcher.js +613 -0
- package/dist/modes/rpc/rpc-command-dispatcher.js.map +1 -0
- package/dist/modes/rpc/rpc-command-validation.d.ts +2 -0
- package/dist/modes/rpc/rpc-command-validation.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-command-validation.js +207 -0
- package/dist/modes/rpc/rpc-command-validation.js.map +1 -0
- package/dist/modes/rpc/rpc-mode.d.ts +48 -0
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-mode.js +1089 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -0
- package/dist/modes/rpc/rpc-transport-client.d.ts +26 -0
- package/dist/modes/rpc/rpc-transport-client.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-transport-client.js +76 -0
- package/dist/modes/rpc/rpc-transport-client.js.map +1 -0
- package/dist/modes/rpc/rpc-types.d.ts +2 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-types.js +2 -0
- package/dist/modes/rpc/rpc-types.js.map +1 -0
- package/dist/package-manager-cli.d.ts +28 -0
- package/dist/package-manager-cli.d.ts.map +1 -0
- package/dist/package-manager-cli.js +667 -0
- package/dist/package-manager-cli.js.map +1 -0
- package/dist/remote/integrated-runtime-retention.d.ts +17 -0
- package/dist/remote/integrated-runtime-retention.d.ts.map +1 -0
- package/dist/remote/integrated-runtime-retention.js +62 -0
- package/dist/remote/integrated-runtime-retention.js.map +1 -0
- package/dist/remote/iroh-native-adapter.cjs +19 -0
- package/dist/sea/cli.d.ts +4 -0
- package/dist/sea/cli.d.ts.map +1 -0
- package/dist/sea/cli.js +4 -0
- package/dist/sea/cli.js.map +1 -0
- package/dist/sea/register-bedrock.d.ts +2 -0
- package/dist/sea/register-bedrock.d.ts.map +1 -0
- package/dist/sea/register-bedrock.js +4 -0
- package/dist/sea/register-bedrock.js.map +1 -0
- package/dist/store/catalog.d.ts +57 -0
- package/dist/store/catalog.d.ts.map +1 -0
- package/dist/store/catalog.js +331 -0
- package/dist/store/catalog.js.map +1 -0
- package/dist/store/inspector.d.ts +36 -0
- package/dist/store/inspector.d.ts.map +1 -0
- package/dist/store/inspector.js +578 -0
- package/dist/store/inspector.js.map +1 -0
- package/dist/store/install-plan.d.ts +26 -0
- package/dist/store/install-plan.d.ts.map +1 -0
- package/dist/store/install-plan.js +80 -0
- package/dist/store/install-plan.js.map +1 -0
- package/dist/store/render.d.ts +11 -0
- package/dist/store/render.d.ts.map +1 -0
- package/dist/store/render.js +153 -0
- package/dist/store/render.js.map +1 -0
- package/dist/store/resolver.d.ts +22 -0
- package/dist/store/resolver.d.ts.map +1 -0
- package/dist/store/resolver.js +207 -0
- package/dist/store/resolver.js.map +1 -0
- package/dist/store/store-cli.d.ts +7 -0
- package/dist/store/store-cli.d.ts.map +1 -0
- package/dist/store/store-cli.js +636 -0
- package/dist/store/store-cli.js.map +1 -0
- package/dist/store/targets.d.ts +21 -0
- package/dist/store/targets.d.ts.map +1 -0
- package/dist/store/targets.js +55 -0
- package/dist/store/targets.js.map +1 -0
- package/dist/utils/ansi.d.ts +2 -0
- package/dist/utils/ansi.d.ts.map +1 -0
- package/dist/utils/ansi.js +52 -0
- package/dist/utils/ansi.js.map +1 -0
- package/dist/utils/changelog.d.ts +22 -0
- package/dist/utils/changelog.d.ts.map +1 -0
- package/dist/utils/changelog.js +165 -0
- package/dist/utils/changelog.js.map +1 -0
- package/dist/utils/child-process.d.ts +18 -0
- package/dist/utils/child-process.d.ts.map +1 -0
- package/dist/utils/child-process.js +106 -0
- package/dist/utils/child-process.js.map +1 -0
- package/dist/utils/clipboard-image.d.ts +11 -0
- package/dist/utils/clipboard-image.d.ts.map +1 -0
- package/dist/utils/clipboard-image.js +245 -0
- package/dist/utils/clipboard-image.js.map +1 -0
- package/dist/utils/clipboard.d.ts +2 -0
- package/dist/utils/clipboard.d.ts.map +1 -0
- package/dist/utils/clipboard.js +94 -0
- package/dist/utils/clipboard.js.map +1 -0
- package/dist/utils/deprecation.d.ts +4 -0
- package/dist/utils/deprecation.d.ts.map +1 -0
- package/dist/utils/deprecation.js +13 -0
- package/dist/utils/deprecation.js.map +1 -0
- package/dist/utils/durable-atomic-write.d.ts +46 -0
- package/dist/utils/durable-atomic-write.d.ts.map +1 -0
- package/dist/utils/durable-atomic-write.js +104 -0
- package/dist/utils/durable-atomic-write.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +8 -0
- package/dist/utils/frontmatter.d.ts.map +1 -0
- package/dist/utils/frontmatter.js +26 -0
- package/dist/utils/frontmatter.js.map +1 -0
- package/dist/utils/fs-watch.d.ts +5 -0
- package/dist/utils/fs-watch.d.ts.map +1 -0
- package/dist/utils/fs-watch.js +25 -0
- package/dist/utils/fs-watch.js.map +1 -0
- package/dist/utils/git.d.ts +26 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +195 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/html.d.ts +7 -0
- package/dist/utils/html.d.ts.map +1 -0
- package/dist/utils/html.js +40 -0
- package/dist/utils/html.js.map +1 -0
- package/dist/utils/ignore-files.d.ts +5 -0
- package/dist/utils/ignore-files.d.ts.map +1 -0
- package/dist/utils/ignore-files.js +58 -0
- package/dist/utils/ignore-files.js.map +1 -0
- package/dist/utils/image-codec.d.ts +22 -0
- package/dist/utils/image-codec.d.ts.map +1 -0
- package/dist/utils/image-codec.js +35 -0
- package/dist/utils/image-codec.js.map +1 -0
- package/dist/utils/image-convert.d.ts +9 -0
- package/dist/utils/image-convert.d.ts.map +1 -0
- package/dist/utils/image-convert.js +26 -0
- package/dist/utils/image-convert.js.map +1 -0
- package/dist/utils/image-resize-core.d.ts +31 -0
- package/dist/utils/image-resize-core.d.ts.map +1 -0
- package/dist/utils/image-resize-core.js +181 -0
- package/dist/utils/image-resize-core.js.map +1 -0
- package/dist/utils/image-resize-worker.d.ts +2 -0
- package/dist/utils/image-resize-worker.d.ts.map +1 -0
- package/dist/utils/image-resize-worker.js +31 -0
- package/dist/utils/image-resize-worker.js.map +1 -0
- package/dist/utils/image-resize.d.ts +15 -0
- package/dist/utils/image-resize.d.ts.map +1 -0
- package/dist/utils/image-resize.js +92 -0
- package/dist/utils/image-resize.js.map +1 -0
- package/dist/utils/json.d.ts +3 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +7 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/mime.d.ts +3 -0
- package/dist/utils/mime.d.ts.map +1 -0
- package/dist/utils/mime.js +69 -0
- package/dist/utils/mime.js.map +1 -0
- package/dist/utils/npm-spec.d.ts +9 -0
- package/dist/utils/npm-spec.d.ts.map +1 -0
- package/dist/utils/npm-spec.js +15 -0
- package/dist/utils/npm-spec.js.map +1 -0
- package/dist/utils/open-browser.d.ts +9 -0
- package/dist/utils/open-browser.d.ts.map +1 -0
- package/dist/utils/open-browser.js +22 -0
- package/dist/utils/open-browser.js.map +1 -0
- package/dist/utils/paths.d.ts +31 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +92 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/private-files.d.ts +21 -0
- package/dist/utils/private-files.d.ts.map +1 -0
- package/dist/utils/private-files.js +103 -0
- package/dist/utils/private-files.js.map +1 -0
- package/dist/utils/process-env.d.ts +2 -0
- package/dist/utils/process-env.d.ts.map +1 -0
- package/dist/utils/process-env.js +31 -0
- package/dist/utils/process-env.js.map +1 -0
- package/dist/utils/shell.d.ts +30 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +195 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/sleep.d.ts +5 -0
- package/dist/utils/sleep.d.ts.map +1 -0
- package/dist/utils/sleep.js +17 -0
- package/dist/utils/sleep.js.map +1 -0
- package/dist/utils/syntax-highlight.d.ts +18 -0
- package/dist/utils/syntax-highlight.d.ts.map +1 -0
- package/dist/utils/syntax-highlight.js +139 -0
- package/dist/utils/syntax-highlight.js.map +1 -0
- package/dist/utils/tools-manager.d.ts +3 -0
- package/dist/utils/tools-manager.d.ts.map +1 -0
- package/dist/utils/tools-manager.js +328 -0
- package/dist/utils/tools-manager.js.map +1 -0
- package/dist/utils/version-check.d.ts +15 -0
- package/dist/utils/version-check.d.ts.map +1 -0
- package/dist/utils/version-check.js +61 -0
- package/dist/utils/version-check.js.map +1 -0
- package/dist/utils/volt-user-agent.d.ts +2 -0
- package/dist/utils/volt-user-agent.d.ts.map +1 -0
- package/dist/utils/volt-user-agent.js +5 -0
- package/dist/utils/volt-user-agent.js.map +1 -0
- package/dist/utils/windows-self-update.d.ts +3 -0
- package/dist/utils/windows-self-update.d.ts.map +1 -0
- package/dist/utils/windows-self-update.js +77 -0
- package/dist/utils/windows-self-update.js.map +1 -0
- package/docs/compaction.md +394 -0
- package/docs/containerization.md +111 -0
- package/docs/custom-provider.md +737 -0
- package/docs/daemon.md +190 -0
- package/docs/development.md +70 -0
- package/docs/docs.json +176 -0
- package/docs/extensions.md +2692 -0
- package/docs/images/exy.png +0 -0
- package/docs/images/interactive-mode.png +0 -0
- package/docs/images/tree-view.png +0 -0
- package/docs/index.md +82 -0
- package/docs/iroh-remote-access-design.md +340 -0
- package/docs/iroh-remote-protocol.md +431 -0
- package/docs/json.md +87 -0
- package/docs/keybindings.md +200 -0
- package/docs/live-shared-session-daemon-design.md +1090 -0
- package/docs/lsp.md +143 -0
- package/docs/mcp.md +1044 -0
- package/docs/models.md +495 -0
- package/docs/packages.md +230 -0
- package/docs/prompt-templates.md +108 -0
- package/docs/providers.md +274 -0
- package/docs/quickstart.md +165 -0
- package/docs/rpc.md +2050 -0
- package/docs/sdk.md +1267 -0
- package/docs/security.md +139 -0
- package/docs/session-format.md +412 -0
- package/docs/sessions.md +145 -0
- package/docs/settings.md +371 -0
- package/docs/shell-aliases.md +13 -0
- package/docs/skills.md +243 -0
- package/docs/subagents-design.md +419 -0
- package/docs/terminal-setup.md +148 -0
- package/docs/termux.md +127 -0
- package/docs/themes.md +295 -0
- package/docs/tla/ClientAuth.cfg +16 -0
- package/docs/tla/ClientAuth.tla +205 -0
- package/docs/tla/ClientConn.cfg +16 -0
- package/docs/tla/ClientConn.tla +265 -0
- package/docs/tla/LeaseBroker.cfg +43 -0
- package/docs/tla/LeaseBroker.tla +563 -0
- package/docs/tla/PLAN.md +240 -0
- package/docs/tla/PushOrdering.cfg +17 -0
- package/docs/tla/PushOrdering.tla +183 -0
- package/docs/tla/README.md +205 -0
- package/docs/tla/RelayViewer.cfg +26 -0
- package/docs/tla/RelayViewer.tla +299 -0
- package/docs/tla/SessionTarget.cfg +18 -0
- package/docs/tla/SessionTarget.tla +192 -0
- package/docs/tla/check.sh +34 -0
- package/docs/tmux.md +63 -0
- package/docs/tui.md +949 -0
- package/docs/usage.md +482 -0
- package/docs/windows.md +17 -0
- package/docs/worktrees-design.md +605 -0
- package/examples/README.md +28 -0
- package/examples/extensions/README.md +211 -0
- package/examples/extensions/auto-commit-on-exit.ts +49 -0
- package/examples/extensions/bash-spawn-hook.ts +30 -0
- package/examples/extensions/bookmark.ts +50 -0
- package/examples/extensions/border-status-editor.ts +150 -0
- package/examples/extensions/built-in-tool-renderer.ts +249 -0
- package/examples/extensions/claude-rules.ts +86 -0
- package/examples/extensions/commands.ts +72 -0
- package/examples/extensions/confirm-destructive.ts +59 -0
- package/examples/extensions/custom-compaction.ts +127 -0
- package/examples/extensions/custom-footer.ts +64 -0
- package/examples/extensions/custom-header.ts +72 -0
- package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
- package/examples/extensions/custom-provider-anthropic/package.json +19 -0
- package/examples/extensions/custom-provider-gitlab-duo/index.ts +400 -0
- package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
- package/examples/extensions/dirty-repo-guard.ts +56 -0
- package/examples/extensions/dynamic-resources/SKILL.md +8 -0
- package/examples/extensions/dynamic-resources/dynamic.json +79 -0
- package/examples/extensions/dynamic-resources/dynamic.md +5 -0
- package/examples/extensions/dynamic-resources/index.ts +15 -0
- package/examples/extensions/dynamic-tools.ts +74 -0
- package/examples/extensions/event-bus.ts +43 -0
- package/examples/extensions/file-trigger.ts +41 -0
- package/examples/extensions/git-checkpoint.ts +53 -0
- package/examples/extensions/git-merge-and-resolve.ts +115 -0
- package/examples/extensions/github-issue-autocomplete.ts +185 -0
- package/examples/extensions/gondolin/index.ts +531 -0
- package/examples/extensions/gondolin/package-lock.json +185 -0
- package/examples/extensions/gondolin/package.json +19 -0
- package/examples/extensions/handoff.ts +191 -0
- package/examples/extensions/hello.ts +26 -0
- package/examples/extensions/hidden-thinking-label.ts +53 -0
- package/examples/extensions/inline-bash.ts +94 -0
- package/examples/extensions/input-transform-streaming.ts +39 -0
- package/examples/extensions/input-transform.ts +43 -0
- package/examples/extensions/interactive-shell.ts +196 -0
- package/examples/extensions/mac-system-theme.ts +47 -0
- package/examples/extensions/message-renderer.ts +59 -0
- package/examples/extensions/minimal-mode.ts +426 -0
- package/examples/extensions/modal-editor.ts +85 -0
- package/examples/extensions/model-status.ts +31 -0
- package/examples/extensions/notify.ts +55 -0
- package/examples/extensions/overlay-qa-tests.ts +1450 -0
- package/examples/extensions/overlay-test.ts +153 -0
- package/examples/extensions/permission-gate.ts +34 -0
- package/examples/extensions/pirate.ts +47 -0
- package/examples/extensions/plan-mode/README.md +65 -0
- package/examples/extensions/plan-mode/index.ts +340 -0
- package/examples/extensions/plan-mode/utils.ts +168 -0
- package/examples/extensions/preset.ts +436 -0
- package/examples/extensions/project-trust.ts +64 -0
- package/examples/extensions/prompt-customizer.ts +97 -0
- package/examples/extensions/protected-paths.ts +30 -0
- package/examples/extensions/provider-payload.ts +18 -0
- package/examples/extensions/qna.ts +122 -0
- package/examples/extensions/question.ts +277 -0
- package/examples/extensions/questionnaire.ts +440 -0
- package/examples/extensions/rainbow-editor.ts +88 -0
- package/examples/extensions/reload-runtime.ts +37 -0
- package/examples/extensions/rpc-demo.ts +118 -0
- package/examples/extensions/sandbox/index.ts +321 -0
- package/examples/extensions/sandbox/package-lock.json +92 -0
- package/examples/extensions/sandbox/package.json +19 -0
- package/examples/extensions/send-user-message.ts +97 -0
- package/examples/extensions/session-name.ts +27 -0
- package/examples/extensions/shutdown-command.ts +63 -0
- package/examples/extensions/snake.ts +343 -0
- package/examples/extensions/space-invaders.ts +560 -0
- package/examples/extensions/ssh.ts +220 -0
- package/examples/extensions/status-line.ts +32 -0
- package/examples/extensions/structured-output.ts +65 -0
- package/examples/extensions/subagent/README.md +175 -0
- package/examples/extensions/subagent/agents/planner.md +37 -0
- package/examples/extensions/subagent/agents/reviewer.md +35 -0
- package/examples/extensions/subagent/agents/scout.md +50 -0
- package/examples/extensions/subagent/agents/worker.md +24 -0
- package/examples/extensions/subagent/agents.ts +126 -0
- package/examples/extensions/subagent/index.ts +1009 -0
- package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
- package/examples/extensions/subagent/prompts/implement.md +10 -0
- package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
- package/examples/extensions/summarize.ts +206 -0
- package/examples/extensions/system-prompt-header.ts +17 -0
- package/examples/extensions/tic-tac-toe.ts +1008 -0
- package/examples/extensions/timed-confirm.ts +70 -0
- package/examples/extensions/titlebar-spinner.ts +58 -0
- package/examples/extensions/todo.ts +297 -0
- package/examples/extensions/tool-override.ts +144 -0
- package/examples/extensions/tools.ts +146 -0
- package/examples/extensions/trigger-compact.ts +50 -0
- package/examples/extensions/truncated-tool.ts +195 -0
- package/examples/extensions/widget-placement.ts +9 -0
- package/examples/extensions/with-deps/index.ts +32 -0
- package/examples/extensions/with-deps/package-lock.json +31 -0
- package/examples/extensions/with-deps/package.json +22 -0
- package/examples/extensions/working-indicator.ts +123 -0
- package/examples/extensions/working-message-test.ts +25 -0
- package/examples/remote/firebase-push-relay/README.md +79 -0
- package/examples/remote/firebase-push-relay/firebase.json +12 -0
- package/examples/remote/firebase-push-relay/firestore.indexes.json +11 -0
- package/examples/remote/firebase-push-relay/firestore.rules +9 -0
- package/examples/remote/firebase-push-relay/functions/core.js +511 -0
- package/examples/remote/firebase-push-relay/functions/core.test.js +273 -0
- package/examples/remote/firebase-push-relay/functions/index.js +413 -0
- package/examples/remote/firebase-push-relay/functions/package-lock.json +2974 -0
- package/examples/remote/firebase-push-relay/functions/package.json +18 -0
- package/examples/remote/iroh-sidecar/README.md +211 -0
- package/examples/remote/iroh-sidecar/client.mjs +554 -0
- package/examples/remote/iroh-sidecar/common.mjs +195 -0
- package/examples/remote/iroh-sidecar/host.mjs +4 -0
- package/examples/remote/iroh-sidecar/package-lock.json +213 -0
- package/examples/remote/iroh-sidecar/package.json +13 -0
- package/examples/remote/iroh-sidecar/source-aware-run.mjs +41 -0
- package/examples/rpc-extension-ui.ts +632 -0
- package/examples/sdk/01-minimal.ts +26 -0
- package/examples/sdk/02-custom-model.ts +53 -0
- package/examples/sdk/03-custom-prompt.ts +70 -0
- package/examples/sdk/04-skills.ts +55 -0
- package/examples/sdk/05-tools.ts +48 -0
- package/examples/sdk/06-extensions.ts +94 -0
- package/examples/sdk/07-context-files.ts +42 -0
- package/examples/sdk/08-prompt-templates.ts +51 -0
- package/examples/sdk/09-api-keys-and-oauth.ts +52 -0
- package/examples/sdk/10-settings.ts +53 -0
- package/examples/sdk/11-sessions.ts +52 -0
- package/examples/sdk/12-full-control.ts +78 -0
- package/examples/sdk/13-session-runtime.ts +67 -0
- package/examples/sdk/README.md +147 -0
- package/npm-shrinkwrap.json +3442 -0
- package/package.json +125 -19
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc-command-dispatcher.js","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-command-dispatcher.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@hansjm10/volt-agent-core\";\nimport { getSupportedThinkingLevels } from \"@hansjm10/volt-ai\";\nimport type { AgentSession } from \"../../core/agent-session.ts\";\nimport type { AgentSessionRuntime } from \"../../core/agent-session-runtime.ts\";\nimport {\n\tBUILTIN_HOST_ACTION_REGISTRY,\n\ttype HostActionInvocationContext,\n\trunCancelHostAction,\n\trunContextCompactHostAction,\n\trunSessionNewHostAction,\n\trunSessionRenameHostAction,\n} from \"../../core/host-actions.ts\";\nimport { getMcpRpcCapabilities, listMcpRpcServers } from \"../../core/mcp/rpc.ts\";\nimport type { McpGatewayExecutionContext } from \"../../core/mcp/types.ts\";\nimport { projectMessageImages, projectSessionTranscript, projectSubagentDetails } from \"../../core/rpc/transcript.ts\";\nimport {\n\tcreateUiActionInvocationPlan,\n\tgetUiActionCompletions,\n\tgetUiActionDescriptors,\n} from \"../../core/rpc/ui-actions.ts\";\nimport type {\n\tRpcActiveToolExecution,\n\tRpcCatalogModel,\n\tRpcClientCapabilityFeature,\n\tRpcCommand,\n\tRpcHostActionRequest,\n\tRpcListSubagentsResponse,\n\tRpcModel,\n\tRpcPendingHostActionsResponse,\n\tRpcRegisterPushTargetResponse,\n\tRpcResponse,\n\tRpcSessionListItem,\n\tRpcSessionState,\n\tRpcSlashCommand,\n\tRpcSubagentStartResponse,\n\tRpcTranscriptResponse,\n\tUiActionCapabilities,\n} from \"./rpc-types.ts\";\n\nexport const HOST_ACTION_REQUESTS_CAPABILITY: RpcClientCapabilityFeature = \"host_action_requests.v1\";\n\nexport interface RpcCommandDispatcherOptions {\n\tallowUiActionInvocation: boolean;\n\trequireRemoteSafeUiActions: boolean;\n\tregisterPushTarget: ((args: unknown) => Promise<RpcRegisterPushTargetResponse>) | undefined;\n}\n\nexport interface RpcSubagentLifecycleController {\n\tlist(): RpcListSubagentsResponse;\n\tstart(agent: string, prompt: string): Promise<RpcSubagentStartResponse>;\n\tabort(subagentId: string): Promise<void>;\n\tgetState(subagentId: string): Promise<RpcSessionState>;\n\tgetTranscript(options: {\n\t\tsubagentId: string;\n\t\tlimit?: number;\n\t\tbeforeEntryId?: string;\n\t}): Promise<RpcTranscriptResponse>;\n\tdispose(subagentId: string): Promise<void>;\n\tdisposeAll(): Promise<void>;\n}\n\nexport interface RpcCommandDispatcherContext {\n\tsession: AgentSession;\n\truntimeHost: AgentSessionRuntime;\n\toptions: RpcCommandDispatcherOptions;\n\toutput(response: RpcResponse): void;\n\trebindSession(): Promise<void>;\n\tcreateHostActionContext(): HostActionInvocationContext;\n\tsetClientCapabilities(features: RpcClientCapabilityFeature[]): void;\n\tgetPendingHostActionRequests(): RpcHostActionRequest[];\n\tcancelPendingHostActionRequests(message?: string): void;\n\tsubagents: RpcSubagentLifecycleController;\n}\n\nfunction createRpcMcpExecutionContext(): McpGatewayExecutionContext {\n\treturn {\n\t\tmode: \"rpc\",\n\t\tcaller: \"user\",\n\t};\n}\n\nfunction getUiActionCapabilities(invocationEnabled: boolean): UiActionCapabilities {\n\treturn {\n\t\tprotocolVersion: 1,\n\t\tfeatures: invocationEnabled\n\t\t\t? [\"ui_actions.v1\", \"ui_action_invocation.v1\", \"ui_action_completions.v1\"]\n\t\t\t: [\"ui_actions.v1\", \"ui_action_completions.v1\"],\n\t\tmaxActions: 200,\n\t\tmaxDescriptorBytes: 65_536,\n\t};\n}\n\nfunction toCatalogModel(model: RpcModel): RpcCatalogModel {\n\treturn { ...model, availableThinkingLevels: getSupportedThinkingLevels(model) as ThinkingLevel[] };\n}\n\nfunction getPromptExtensionCommandName(message: string): string | undefined {\n\tif (!message.startsWith(\"/\")) {\n\t\treturn undefined;\n\t}\n\tconst spaceIndex = message.indexOf(\" \");\n\tconst name = spaceIndex === -1 ? message.slice(1) : message.slice(1, spaceIndex);\n\treturn name.length > 0 ? name : undefined;\n}\n\nexport function createRpcSuccessResponse<T extends RpcCommand[\"type\"]>(\n\tid: string | undefined,\n\tcommand: T,\n\tdata?: object | null,\n): RpcResponse {\n\tif (data === undefined) {\n\t\treturn { id, type: \"response\", command, success: true } as RpcResponse;\n\t}\n\treturn { id, type: \"response\", command, success: true, data } as RpcResponse;\n}\n\nexport function createRpcErrorResponse(id: string | undefined, command: string, message: string): RpcResponse {\n\treturn { id, type: \"response\", command, success: false, error: message };\n}\n\nexport function getRpcErrorResponseTarget(value: unknown): { id: string | undefined; command: string } {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n\t\treturn { id: undefined, command: \"unknown\" };\n\t}\n\tconst command = value as Record<string, unknown>;\n\treturn {\n\t\tid: typeof command.id === \"string\" ? command.id : undefined,\n\t\tcommand: typeof command.type === \"string\" ? command.type : \"unknown\",\n\t};\n}\n\nexport async function handleRpcCommand(\n\tcommand: RpcCommand,\n\tcontext: RpcCommandDispatcherContext,\n): Promise<RpcResponse | undefined> {\n\tconst { options, runtimeHost, session } = context;\n\tconst id = typeof command.id === \"string\" ? command.id : undefined;\n\n\tswitch (command.type) {\n\t\t// =================================================================\n\t\t// Prompting\n\t\t// =================================================================\n\n\t\tcase \"prompt\": {\n\t\t\tif (options.requireRemoteSafeUiActions) {\n\t\t\t\tconst commandName = getPromptExtensionCommandName(command.message);\n\t\t\t\tconst extensionCommand = commandName ? session.extensionRunner.getCommand(commandName) : undefined;\n\t\t\t\tif (extensionCommand && extensionCommand.remoteSafe !== true) {\n\t\t\t\t\treturn createRpcErrorResponse(\n\t\t\t\t\t\tid,\n\t\t\t\t\t\t\"prompt\",\n\t\t\t\t\t\t`Extension command is not available over remote host: /${commandName}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Start prompt handling immediately, but emit the authoritative response only after\n\t\t\t// prompt preflight succeeds. Queued and immediately handled prompts also count as success.\n\t\t\tlet preflightSucceeded = false;\n\t\t\tvoid session\n\t\t\t\t.prompt(command.message, {\n\t\t\t\t\timages: command.images,\n\t\t\t\t\tstreamingBehavior: command.streamingBehavior,\n\t\t\t\t\tsource: \"rpc\",\n\t\t\t\t\tpreflightResult: (didSucceed) => {\n\t\t\t\t\t\tif (didSucceed) {\n\t\t\t\t\t\t\tpreflightSucceeded = true;\n\t\t\t\t\t\t\tcontext.output(createRpcSuccessResponse(id, \"prompt\"));\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\t.catch((e) => {\n\t\t\t\t\tif (!preflightSucceeded) {\n\t\t\t\t\t\tcontext.output(createRpcErrorResponse(id, \"prompt\", e.message));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\treturn undefined;\n\t\t}\n\n\t\tcase \"steer\": {\n\t\t\tawait session.steer(command.message, command.images);\n\t\t\treturn createRpcSuccessResponse(id, \"steer\");\n\t\t}\n\n\t\tcase \"follow_up\": {\n\t\t\tawait session.followUp(command.message, command.images);\n\t\t\treturn createRpcSuccessResponse(id, \"follow_up\");\n\t\t}\n\n\t\tcase \"abort\": {\n\t\t\tawait runCancelHostAction(context.createHostActionContext());\n\t\t\treturn createRpcSuccessResponse(id, \"abort\");\n\t\t}\n\n\t\tcase \"new_session\": {\n\t\t\tconst newSessionOptions = command.parentSession ? { parentSession: command.parentSession } : undefined;\n\t\t\tconst result = await runSessionNewHostAction(context.createHostActionContext(), newSessionOptions);\n\t\t\treturn createRpcSuccessResponse(id, \"new_session\", result);\n\t\t}\n\n\t\t// =================================================================\n\t\t// Client capabilities and host-initiated actions\n\t\t// =================================================================\n\n\t\tcase \"set_client_capabilities\": {\n\t\t\tcontext.setClientCapabilities(command.features);\n\t\t\tif (!command.features.includes(HOST_ACTION_REQUESTS_CAPABILITY)) {\n\t\t\t\tcontext.cancelPendingHostActionRequests(\"Host action capability disabled\");\n\t\t\t}\n\t\t\treturn createRpcSuccessResponse(id, \"set_client_capabilities\");\n\t\t}\n\n\t\tcase \"get_pending_host_actions\": {\n\t\t\tconst data: RpcPendingHostActionsResponse = {\n\t\t\t\tactions: context.getPendingHostActionRequests(),\n\t\t\t};\n\t\t\treturn createRpcSuccessResponse(id, \"get_pending_host_actions\", data);\n\t\t}\n\n\t\t// =================================================================\n\t\t// Native UI Actions\n\t\t// =================================================================\n\n\t\tcase \"get_ui_capabilities\": {\n\t\t\treturn createRpcSuccessResponse(\n\t\t\t\tid,\n\t\t\t\t\"get_ui_capabilities\",\n\t\t\t\tgetUiActionCapabilities(options.allowUiActionInvocation),\n\t\t\t);\n\t\t}\n\n\t\tcase \"get_ui_actions\": {\n\t\t\treturn createRpcSuccessResponse(id, \"get_ui_actions\", {\n\t\t\t\tactions: getUiActionDescriptors(session, command.scope, {\n\t\t\t\t\tremoteSafeOnly: options.requireRemoteSafeUiActions,\n\t\t\t\t}),\n\t\t\t});\n\t\t}\n\n\t\tcase \"get_ui_action_completions\": {\n\t\t\treturn createRpcSuccessResponse(id, \"get_ui_action_completions\", {\n\t\t\t\tcompletions: await getUiActionCompletions(session, {\n\t\t\t\t\taction: command.action,\n\t\t\t\t\targument: command.argument,\n\t\t\t\t\tprefix: command.prefix,\n\t\t\t\t\trequireRemoteSafe: options.requireRemoteSafeUiActions,\n\t\t\t\t}),\n\t\t\t});\n\t\t}\n\n\t\tcase \"invoke_ui_action\": {\n\t\t\tif (!options.allowUiActionInvocation) {\n\t\t\t\treturn createRpcErrorResponse(\n\t\t\t\t\tid,\n\t\t\t\t\t\"invoke_ui_action\",\n\t\t\t\t\t\"UI action invocation is not available over this RPC transport\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (BUILTIN_HOST_ACTION_REGISTRY.get(command.action)) {\n\t\t\t\tconst response = await BUILTIN_HOST_ACTION_REGISTRY.invoke(\n\t\t\t\t\tcommand.action,\n\t\t\t\t\tcontext.createHostActionContext(),\n\t\t\t\t\tcommand.args,\n\t\t\t\t\t{ requireRemoteSafe: options.requireRemoteSafeUiActions },\n\t\t\t\t);\n\t\t\t\treturn createRpcSuccessResponse(id, \"invoke_ui_action\", response);\n\t\t\t}\n\t\t\tconst invocation = createUiActionInvocationPlan(session, {\n\t\t\t\taction: command.action,\n\t\t\t\targs: command.args,\n\t\t\t\trequireRemoteSafe: options.requireRemoteSafeUiActions,\n\t\t\t\tstreamingBehavior: command.streamingBehavior,\n\t\t\t});\n\t\t\tlet preflightSucceeded = false;\n\t\t\tvoid session\n\t\t\t\t.prompt(invocation.promptText, {\n\t\t\t\t\tstreamingBehavior: invocation.promptStreamingBehavior,\n\t\t\t\t\tsource: \"rpc\",\n\t\t\t\t\tpreflightResult: (didSucceed) => {\n\t\t\t\t\t\tif (didSucceed) {\n\t\t\t\t\t\t\tpreflightSucceeded = true;\n\t\t\t\t\t\t\tcontext.output(createRpcSuccessResponse(id, \"invoke_ui_action\", invocation.response));\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t\t.catch((e) => {\n\t\t\t\t\tif (!preflightSucceeded) {\n\t\t\t\t\t\tcontext.output(createRpcErrorResponse(id, \"invoke_ui_action\", e.message));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// =================================================================\n\t\t// Push notifications\n\t\t// =================================================================\n\n\t\tcase \"register_push_target\": {\n\t\t\tif (!options.registerPushTarget) {\n\t\t\t\treturn createRpcErrorResponse(\n\t\t\t\t\tid,\n\t\t\t\t\t\"register_push_target\",\n\t\t\t\t\t\"Push target registration is not available over this RPC transport\",\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn createRpcSuccessResponse(id, \"register_push_target\", await options.registerPushTarget(command.args));\n\t\t}\n\n\t\t// =================================================================\n\t\t// MCP management\n\t\t// =================================================================\n\n\t\tcase \"get_mcp_capabilities\": {\n\t\t\treturn createRpcSuccessResponse(id, \"get_mcp_capabilities\", getMcpRpcCapabilities());\n\t\t}\n\n\t\tcase \"list_mcp_servers\": {\n\t\t\treturn createRpcSuccessResponse(id, \"list_mcp_servers\", listMcpRpcServers(session.getMcpManager()));\n\t\t}\n\n\t\tcase \"get_mcp_server\": {\n\t\t\tconst manager = session.getMcpManager();\n\t\t\tif (!manager) {\n\t\t\t\treturn createRpcErrorResponse(id, \"get_mcp_server\", \"MCP is not configured\");\n\t\t\t}\n\t\t\treturn createRpcSuccessResponse(id, \"get_mcp_server\", { server: manager.getServer(command.server) });\n\t\t}\n\n\t\tcase \"connect_mcp_server\":\n\t\tcase \"refresh_mcp_server\": {\n\t\t\tconst manager = session.getMcpManager();\n\t\t\tif (!manager) {\n\t\t\t\treturn createRpcErrorResponse(id, command.type, \"MCP is not configured\");\n\t\t\t}\n\t\t\tconst result = await manager.connectServer(command.server);\n\t\t\treturn createRpcSuccessResponse(id, command.type, { server: result.server });\n\t\t}\n\n\t\tcase \"disconnect_mcp_server\": {\n\t\t\tconst manager = session.getMcpManager();\n\t\t\tif (!manager) {\n\t\t\t\treturn createRpcErrorResponse(id, \"disconnect_mcp_server\", \"MCP is not configured\");\n\t\t\t}\n\t\t\tconst result = await manager.disconnectServer(command.server);\n\t\t\treturn createRpcSuccessResponse(id, \"disconnect_mcp_server\", { server: result.server });\n\t\t}\n\n\t\tcase \"start_mcp_server_auth\": {\n\t\t\tconst manager = session.getMcpManager();\n\t\t\tif (!manager) {\n\t\t\t\treturn createRpcErrorResponse(id, \"start_mcp_server_auth\", \"MCP is not configured\");\n\t\t\t}\n\t\t\tconst result = await manager.startServerAuth(command.server, {\n\t\t\t\tflow: command.flow,\n\t\t\t\tredirectUrl: command.redirectUrl,\n\t\t\t});\n\t\t\treturn createRpcSuccessResponse(id, \"start_mcp_server_auth\", result as object);\n\t\t}\n\n\t\tcase \"complete_mcp_server_auth\": {\n\t\t\tconst manager = session.getMcpManager();\n\t\t\tif (!manager) {\n\t\t\t\treturn createRpcErrorResponse(id, \"complete_mcp_server_auth\", \"MCP is not configured\");\n\t\t\t}\n\t\t\tconst result = await manager.completeServerBrowserAuth(command.server, {\n\t\t\t\tredirectUrl: command.redirectUrl,\n\t\t\t\tcode: command.code,\n\t\t\t\tstate: command.state,\n\t\t\t});\n\t\t\treturn createRpcSuccessResponse(id, \"complete_mcp_server_auth\", result as object);\n\t\t}\n\n\t\tcase \"poll_mcp_server_auth\": {\n\t\t\tconst manager = session.getMcpManager();\n\t\t\tif (!manager) {\n\t\t\t\treturn createRpcErrorResponse(id, \"poll_mcp_server_auth\", \"MCP is not configured\");\n\t\t\t}\n\t\t\treturn createRpcSuccessResponse(\n\t\t\t\tid,\n\t\t\t\t\"poll_mcp_server_auth\",\n\t\t\t\t(await manager.pollServerAuth(command.server)) as object,\n\t\t\t);\n\t\t}\n\n\t\tcase \"cancel_mcp_server_auth\": {\n\t\t\tconst manager = session.getMcpManager();\n\t\t\tif (!manager) {\n\t\t\t\treturn createRpcErrorResponse(id, \"cancel_mcp_server_auth\", \"MCP is not configured\");\n\t\t\t}\n\t\t\treturn createRpcSuccessResponse(id, \"cancel_mcp_server_auth\", manager.cancelServerAuth(command.server));\n\t\t}\n\n\t\tcase \"logout_mcp_server\": {\n\t\t\tconst manager = session.getMcpManager();\n\t\t\tif (!manager) {\n\t\t\t\treturn createRpcErrorResponse(id, \"logout_mcp_server\", \"MCP is not configured\");\n\t\t\t}\n\t\t\treturn createRpcSuccessResponse(id, \"logout_mcp_server\", await manager.logoutServer(command.server));\n\t\t}\n\n\t\tcase \"set_mcp_server_enabled\": {\n\t\t\tconst manager = session.getMcpManager();\n\t\t\tif (!manager) {\n\t\t\t\treturn createRpcErrorResponse(id, \"set_mcp_server_enabled\", \"MCP is not configured\");\n\t\t\t}\n\t\t\tconst result = await manager.setServerEnabled(command.server, command.enabled);\n\t\t\treturn createRpcSuccessResponse(id, \"set_mcp_server_enabled\", {\n\t\t\t\tserver: result.server,\n\t\t\t\t...(result.persisted ? { persisted: result.persisted } : {}),\n\t\t\t});\n\t\t}\n\n\t\tcase \"list_mcp_tools\": {\n\t\t\tconst manager = session.getMcpManager();\n\t\t\tif (!manager) {\n\t\t\t\treturn createRpcErrorResponse(id, \"list_mcp_tools\", \"MCP is not configured\");\n\t\t\t}\n\t\t\treturn createRpcSuccessResponse(id, \"list_mcp_tools\", await manager.listTools(command.server));\n\t\t}\n\n\t\tcase \"get_mcp_tool\": {\n\t\t\tconst manager = session.getMcpManager();\n\t\t\tif (!manager) {\n\t\t\t\treturn createRpcErrorResponse(id, \"get_mcp_tool\", \"MCP is not configured\");\n\t\t\t}\n\t\t\tconst tools = await manager.listTools(command.server);\n\t\t\tconst tool = tools.tools.find((entry) => entry.name === command.tool);\n\t\t\tif (!tool) {\n\t\t\t\treturn createRpcErrorResponse(id, \"get_mcp_tool\", `MCP tool not found: ${command.server}.${command.tool}`);\n\t\t\t}\n\t\t\treturn createRpcSuccessResponse(id, \"get_mcp_tool\", { tool });\n\t\t}\n\n\t\tcase \"list_mcp_resources\": {\n\t\t\tconst manager = session.getMcpManager();\n\t\t\tif (!manager) {\n\t\t\t\treturn createRpcErrorResponse(id, \"list_mcp_resources\", \"MCP is not configured\");\n\t\t\t}\n\t\t\treturn createRpcSuccessResponse(\n\t\t\t\tid,\n\t\t\t\t\"list_mcp_resources\",\n\t\t\t\tawait manager.listResources(command.server, command.cursor),\n\t\t\t);\n\t\t}\n\n\t\tcase \"read_mcp_resource\": {\n\t\t\tconst manager = session.getMcpManager();\n\t\t\tif (!manager) {\n\t\t\t\treturn createRpcErrorResponse(id, \"read_mcp_resource\", \"MCP is not configured\");\n\t\t\t}\n\t\t\tconst result = await manager.readResource(command.server, command.resourceUri, createRpcMcpExecutionContext());\n\t\t\treturn createRpcSuccessResponse(id, \"read_mcp_resource\", { result });\n\t\t}\n\n\t\tcase \"list_mcp_prompts\": {\n\t\t\tconst manager = session.getMcpManager();\n\t\t\tif (!manager) {\n\t\t\t\treturn createRpcErrorResponse(id, \"list_mcp_prompts\", \"MCP is not configured\");\n\t\t\t}\n\t\t\treturn createRpcSuccessResponse(\n\t\t\t\tid,\n\t\t\t\t\"list_mcp_prompts\",\n\t\t\t\tawait manager.listPrompts(command.server, command.cursor),\n\t\t\t);\n\t\t}\n\n\t\tcase \"get_mcp_prompt\": {\n\t\t\tconst manager = session.getMcpManager();\n\t\t\tif (!manager) {\n\t\t\t\treturn createRpcErrorResponse(id, \"get_mcp_prompt\", \"MCP is not configured\");\n\t\t\t}\n\t\t\tconst result = await manager.getPrompt(\n\t\t\t\tcommand.server,\n\t\t\t\tcommand.prompt,\n\t\t\t\t{ action: \"get_prompt\", arguments: command.arguments, argumentsJson: command.argumentsJson },\n\t\t\t\tcreateRpcMcpExecutionContext(),\n\t\t\t);\n\t\t\treturn createRpcSuccessResponse(id, \"get_mcp_prompt\", { result });\n\t\t}\n\n\t\tcase \"list_mcp_recent_calls\": {\n\t\t\tconst manager = session.getMcpManager();\n\t\t\tif (!manager) {\n\t\t\t\treturn createRpcSuccessResponse(id, \"list_mcp_recent_calls\", { calls: [] });\n\t\t\t}\n\t\t\tconst calls = command.server\n\t\t\t\t? manager.getServer(command.server).recentCalls\n\t\t\t\t: manager.listServers().flatMap((server) => server.recentCalls);\n\t\t\treturn createRpcSuccessResponse(id, \"list_mcp_recent_calls\", { calls });\n\t\t}\n\n\t\t// =================================================================\n\t\t// State\n\t\t// =================================================================\n\n\t\tcase \"get_state\": {\n\t\t\tconst activeCompaction = session.activeCompaction;\n\t\t\tconst activeTools = [...session.agent.state.pendingToolExecutions.values()].map(\n\t\t\t\t(execution): RpcActiveToolExecution => {\n\t\t\t\t\t// Ship the newest subagent tree snapshot so a client attaching\n\t\t\t\t\t// mid-turn paints live delegation state without waiting for the\n\t\t\t\t\t// next tool_execution_update.\n\t\t\t\t\tconst details =\n\t\t\t\t\t\texecution.toolName === \"subagent\" && isRecord(execution.latestDetails)\n\t\t\t\t\t\t\t? projectSubagentDetails(execution.latestDetails)\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttoolCallId: execution.toolCallId,\n\t\t\t\t\t\ttoolName: execution.toolName,\n\t\t\t\t\t\tstatus: \"started\",\n\t\t\t\t\t\targs: { ...execution.args },\n\t\t\t\t\t\t...(details ? { details } : {}),\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t);\n\t\t\tconst state: RpcSessionState = {\n\t\t\t\tmodel: session.model,\n\t\t\t\tthinkingLevel: session.thinkingLevel,\n\t\t\t\tavailableThinkingLevels: session.getAvailableThinkingLevels(),\n\t\t\t\tisStreaming: session.isStreaming,\n\t\t\t\tisBusy: session.isBusy,\n\t\t\t\tisCompacting: session.isCompacting,\n\t\t\t\tsteeringMode: session.steeringMode,\n\t\t\t\tfollowUpMode: session.followUpMode,\n\t\t\t\tsessionFile: session.sessionFile,\n\t\t\t\tsessionId: session.sessionId,\n\t\t\t\tsessionName: session.sessionName,\n\t\t\t\tautoCompactionEnabled: session.autoCompactionEnabled,\n\t\t\t\tmessageCount: session.messages.length,\n\t\t\t\tpendingMessageCount: session.pendingMessageCount,\n\t\t\t\t...(activeTools.length === 0 ? {} : { activeTools }),\n\t\t\t\t...(activeCompaction ? { activeCompaction } : {}),\n\t\t\t};\n\t\t\treturn createRpcSuccessResponse(id, \"get_state\", state);\n\t\t}\n\n\t\tcase \"get_transcript\": {\n\t\t\tconst transcript = projectSessionTranscript(session.sessionManager, {\n\t\t\t\tbeforeEntryId: command.beforeEntryId,\n\t\t\t\tlimit: command.limit,\n\t\t\t});\n\t\t\treturn createRpcSuccessResponse(id, \"get_transcript\", transcript);\n\t\t}\n\n\t\tcase \"get_message_images\": {\n\t\t\tconst result = projectMessageImages(\n\t\t\t\tsession.sessionManager.getBranch(),\n\t\t\t\tcommand.entryId,\n\t\t\t\tcommand.startImageIndex,\n\t\t\t);\n\t\t\tif (!result.ok) {\n\t\t\t\treturn createRpcErrorResponse(id, \"get_message_images\", result.error);\n\t\t\t}\n\t\t\treturn createRpcSuccessResponse(id, \"get_message_images\", {\n\t\t\t\tsessionId: session.sessionManager.getSessionId(),\n\t\t\t\tentryId: result.entryId,\n\t\t\t\ttotalImages: result.totalImages,\n\t\t\t\timages: result.images,\n\t\t\t\tnextImageIndex: result.nextImageIndex,\n\t\t\t});\n\t\t}\n\n\t\t// =================================================================\n\t\t// Subagents (local RPC only)\n\t\t// =================================================================\n\n\t\tcase \"list_subagents\": {\n\t\t\treturn createRpcSuccessResponse(id, \"list_subagents\", context.subagents.list());\n\t\t}\n\n\t\tcase \"subagent_start\": {\n\t\t\treturn createRpcSuccessResponse(\n\t\t\t\tid,\n\t\t\t\t\"subagent_start\",\n\t\t\t\tawait context.subagents.start(command.agent, command.prompt),\n\t\t\t);\n\t\t}\n\n\t\tcase \"subagent_abort\": {\n\t\t\tawait context.subagents.abort(command.subagentId);\n\t\t\treturn createRpcSuccessResponse(id, \"subagent_abort\");\n\t\t}\n\n\t\tcase \"subagent_get_state\": {\n\t\t\treturn createRpcSuccessResponse(\n\t\t\t\tid,\n\t\t\t\t\"subagent_get_state\",\n\t\t\t\tawait context.subagents.getState(command.subagentId),\n\t\t\t);\n\t\t}\n\n\t\tcase \"subagent_get_transcript\": {\n\t\t\treturn createRpcSuccessResponse(\n\t\t\t\tid,\n\t\t\t\t\"subagent_get_transcript\",\n\t\t\t\tawait context.subagents.getTranscript({\n\t\t\t\t\tsubagentId: command.subagentId,\n\t\t\t\t\tlimit: command.limit,\n\t\t\t\t\tbeforeEntryId: command.beforeEntryId,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tcase \"subagent_dispose\": {\n\t\t\tawait context.subagents.dispose(command.subagentId);\n\t\t\treturn createRpcSuccessResponse(id, \"subagent_dispose\");\n\t\t}\n\n\t\t// =================================================================\n\t\t// Model\n\t\t// =================================================================\n\n\t\tcase \"set_model\": {\n\t\t\tconst models = await session.modelRegistry.getAvailable();\n\t\t\tconst model = models.find((m) => m.provider === command.provider && m.id === command.modelId);\n\t\t\tif (!model) {\n\t\t\t\treturn createRpcErrorResponse(id, \"set_model\", `Model not found: ${command.provider}/${command.modelId}`);\n\t\t\t}\n\t\t\tawait session.setModel(model, { persistDefault: command.persistDefault });\n\t\t\treturn createRpcSuccessResponse(id, \"set_model\", toCatalogModel(model));\n\t\t}\n\n\t\tcase \"cycle_model\": {\n\t\t\tconst result = await session.cycleModel();\n\t\t\tif (!result) {\n\t\t\t\treturn createRpcSuccessResponse(id, \"cycle_model\", null);\n\t\t\t}\n\t\t\treturn createRpcSuccessResponse(id, \"cycle_model\", result);\n\t\t}\n\n\t\tcase \"get_available_models\": {\n\t\t\t// Reload credentials and models from disk so logins, logouts, and API keys\n\t\t\t// saved by other volt processes become selectable without a host restart.\n\t\t\tsession.modelRegistry.refreshFromDisk();\n\t\t\tconst models = await session.modelRegistry.getAvailable();\n\t\t\treturn createRpcSuccessResponse(id, \"get_available_models\", { models: models.map(toCatalogModel) });\n\t\t}\n\n\t\t// =================================================================\n\t\t// Thinking\n\t\t// =================================================================\n\n\t\tcase \"set_thinking_level\": {\n\t\t\tsession.setThinkingLevel(command.level, { persistDefault: command.persistDefault });\n\t\t\treturn createRpcSuccessResponse(id, \"set_thinking_level\", { level: session.thinkingLevel });\n\t\t}\n\n\t\tcase \"cycle_thinking_level\": {\n\t\t\tconst level = session.cycleThinkingLevel();\n\t\t\tif (!level) {\n\t\t\t\treturn createRpcSuccessResponse(id, \"cycle_thinking_level\", null);\n\t\t\t}\n\t\t\treturn createRpcSuccessResponse(id, \"cycle_thinking_level\", { level });\n\t\t}\n\n\t\t// =================================================================\n\t\t// Queue Modes\n\t\t// =================================================================\n\n\t\tcase \"set_steering_mode\": {\n\t\t\tsession.setSteeringMode(command.mode);\n\t\t\treturn createRpcSuccessResponse(id, \"set_steering_mode\");\n\t\t}\n\n\t\tcase \"set_follow_up_mode\": {\n\t\t\tsession.setFollowUpMode(command.mode);\n\t\t\treturn createRpcSuccessResponse(id, \"set_follow_up_mode\");\n\t\t}\n\n\t\t// =================================================================\n\t\t// Compaction\n\t\t// =================================================================\n\n\t\tcase \"compact\": {\n\t\t\tconst result = await runContextCompactHostAction(\n\t\t\t\tcontext.createHostActionContext(),\n\t\t\t\tcommand.customInstructions,\n\t\t\t);\n\t\t\treturn createRpcSuccessResponse(id, \"compact\", result);\n\t\t}\n\n\t\tcase \"set_auto_compaction\": {\n\t\t\tsession.setAutoCompactionEnabled(command.enabled);\n\t\t\treturn createRpcSuccessResponse(id, \"set_auto_compaction\");\n\t\t}\n\n\t\t// =================================================================\n\t\t// Retry\n\t\t// =================================================================\n\n\t\tcase \"set_auto_retry\": {\n\t\t\tsession.setAutoRetryEnabled(command.enabled);\n\t\t\treturn createRpcSuccessResponse(id, \"set_auto_retry\");\n\t\t}\n\n\t\tcase \"abort_retry\": {\n\t\t\tsession.abortRetry();\n\t\t\treturn createRpcSuccessResponse(id, \"abort_retry\");\n\t\t}\n\n\t\t// =================================================================\n\t\t// Bash\n\t\t// =================================================================\n\n\t\tcase \"bash\": {\n\t\t\tconst result = await session.executeBash(command.command, undefined, {\n\t\t\t\texcludeFromContext: command.excludeFromContext,\n\t\t\t});\n\t\t\treturn createRpcSuccessResponse(id, \"bash\", result);\n\t\t}\n\n\t\tcase \"abort_bash\": {\n\t\t\tsession.abortBash();\n\t\t\treturn createRpcSuccessResponse(id, \"abort_bash\");\n\t\t}\n\n\t\t// =================================================================\n\t\t// Session\n\t\t// =================================================================\n\n\t\tcase \"get_session_stats\": {\n\t\t\tconst stats = session.getSessionStats();\n\t\t\treturn createRpcSuccessResponse(id, \"get_session_stats\", stats);\n\t\t}\n\n\t\tcase \"list_sessions\": {\n\t\t\tconst sessions: RpcSessionListItem[] = await runtimeHost.listSessions();\n\t\t\treturn createRpcSuccessResponse(id, \"list_sessions\", { sessions });\n\t\t}\n\n\t\tcase \"export_html\": {\n\t\t\tconst path = await session.exportToHtml(command.outputPath);\n\t\t\treturn createRpcSuccessResponse(id, \"export_html\", { path });\n\t\t}\n\n\t\tcase \"switch_session\": {\n\t\t\tconst result = await runtimeHost.switchSession(command.sessionPath);\n\t\t\tif (!result.cancelled) {\n\t\t\t\tawait context.rebindSession();\n\t\t\t}\n\t\t\treturn createRpcSuccessResponse(id, \"switch_session\", result);\n\t\t}\n\n\t\tcase \"switch_session_by_id\": {\n\t\t\tconst result = await runtimeHost.switchSessionById(command.sessionId);\n\t\t\tif (!result.cancelled) {\n\t\t\t\tawait context.rebindSession();\n\t\t\t}\n\t\t\treturn createRpcSuccessResponse(id, \"switch_session_by_id\", result);\n\t\t}\n\n\t\tcase \"fork\": {\n\t\t\tconst result = await runtimeHost.fork(command.entryId);\n\t\t\tif (!result.cancelled) {\n\t\t\t\tawait context.rebindSession();\n\t\t\t}\n\t\t\treturn createRpcSuccessResponse(id, \"fork\", { text: result.selectedText, cancelled: result.cancelled });\n\t\t}\n\n\t\tcase \"clone\": {\n\t\t\tconst leafId = session.sessionManager.getLeafId();\n\t\t\tif (!leafId) {\n\t\t\t\treturn createRpcErrorResponse(id, \"clone\", \"Cannot clone session: no current entry selected\");\n\t\t\t}\n\t\t\tconst result = await runtimeHost.fork(leafId, { position: \"at\" });\n\t\t\tif (!result.cancelled) {\n\t\t\t\tawait context.rebindSession();\n\t\t\t}\n\t\t\treturn createRpcSuccessResponse(id, \"clone\", { cancelled: result.cancelled });\n\t\t}\n\n\t\tcase \"get_fork_messages\": {\n\t\t\tconst messages = session.getUserMessagesForForking();\n\t\t\treturn createRpcSuccessResponse(id, \"get_fork_messages\", { messages });\n\t\t}\n\n\t\tcase \"get_last_assistant_text\": {\n\t\t\tconst text = session.getLastAssistantText();\n\t\t\treturn createRpcSuccessResponse(id, \"get_last_assistant_text\", { text });\n\t\t}\n\n\t\tcase \"set_session_name\": {\n\t\t\trunSessionRenameHostAction(context.createHostActionContext(), command.name);\n\t\t\treturn createRpcSuccessResponse(id, \"set_session_name\");\n\t\t}\n\n\t\t// =================================================================\n\t\t// Messages\n\t\t// =================================================================\n\n\t\tcase \"get_messages\": {\n\t\t\treturn createRpcSuccessResponse(id, \"get_messages\", { messages: session.messages });\n\t\t}\n\n\t\t// =================================================================\n\t\t// Commands (available for invocation via prompt)\n\t\t// =================================================================\n\n\t\tcase \"get_commands\": {\n\t\t\tconst commands: RpcSlashCommand[] = [];\n\n\t\t\tfor (const command of session.extensionRunner.getRegisteredCommands()) {\n\t\t\t\tcommands.push({\n\t\t\t\t\tname: command.invocationName,\n\t\t\t\t\tdescription: command.description,\n\t\t\t\t\tsource: \"extension\",\n\t\t\t\t\tsourceInfo: command.sourceInfo,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tfor (const template of session.promptTemplates) {\n\t\t\t\tcommands.push({\n\t\t\t\t\tname: template.name,\n\t\t\t\t\tdescription: template.description,\n\t\t\t\t\tsource: \"prompt\",\n\t\t\t\t\tsourceInfo: template.sourceInfo,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tfor (const skill of session.resourceLoader.getSkills().skills) {\n\t\t\t\tcommands.push({\n\t\t\t\t\tname: `skill:${skill.name}`,\n\t\t\t\t\tdescription: skill.description,\n\t\t\t\t\tsource: \"skill\",\n\t\t\t\t\tsourceInfo: skill.sourceInfo,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn createRpcSuccessResponse(id, \"get_commands\", { commands });\n\t\t}\n\n\t\tdefault: {\n\t\t\tconst target = getRpcErrorResponseTarget(command);\n\t\t\treturn createRpcErrorResponse(target.id, target.command, `Unknown command: ${target.command}`);\n\t\t}\n\t}\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc-command-validation.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-command-validation.ts"],"names":[],"mappings":"AA2HA,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAmK5E","sourcesContent":["import type { ThinkingLevel } from \"@hansjm10/volt-agent-core\";\nimport type { ImageContent } from \"@hansjm10/volt-ai\";\n\nconst RPC_QUEUE_MODES = [\"all\", \"one-at-a-time\"] as const;\nconst RPC_THINKING_LEVELS = [\n\t\"off\",\n\t\"minimal\",\n\t\"low\",\n\t\"medium\",\n\t\"high\",\n\t\"xhigh\",\n\t\"max\",\n] as const satisfies readonly ThinkingLevel[];\nconst RPC_STREAMING_BEHAVIORS = [\"steer\", \"followUp\"] as const;\nconst RPC_UI_ACTION_SCOPES = [\"primary\", \"palette\", \"all\"] as const;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isString(value: unknown): value is string {\n\treturn typeof value === \"string\";\n}\n\nfunction isBoolean(value: unknown): value is boolean {\n\treturn typeof value === \"boolean\";\n}\n\nfunction isMcpAuthFlow(value: unknown): value is \"browser\" | \"device\" {\n\treturn value === \"browser\" || value === \"device\";\n}\n\nfunction isNumber(value: unknown): value is number {\n\treturn typeof value === \"number\";\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n\treturn Array.isArray(value) && value.every(isString);\n}\n\nfunction isOneOf<T extends string>(value: unknown, allowed: readonly T[]): value is T {\n\treturn typeof value === \"string\" && allowed.some((allowedValue) => allowedValue === value);\n}\n\nfunction isRpcQueueMode(value: unknown): value is (typeof RPC_QUEUE_MODES)[number] {\n\treturn isOneOf(value, RPC_QUEUE_MODES);\n}\n\nfunction isRpcThinkingLevel(value: unknown): value is ThinkingLevel {\n\treturn isOneOf(value, RPC_THINKING_LEVELS);\n}\n\nfunction isRpcStreamingBehavior(value: unknown): value is (typeof RPC_STREAMING_BEHAVIORS)[number] {\n\treturn isOneOf(value, RPC_STREAMING_BEHAVIORS);\n}\n\nfunction isRpcUiActionScope(value: unknown): value is (typeof RPC_UI_ACTION_SCOPES)[number] {\n\treturn isOneOf(value, RPC_UI_ACTION_SCOPES);\n}\n\nfunction isRpcImageContent(value: unknown): value is ImageContent {\n\treturn (\n\t\tisRecord(value) && value.type === \"image\" && typeof value.data === \"string\" && typeof value.mimeType === \"string\"\n\t);\n}\n\nfunction isRpcImageContentArray(value: unknown): value is ImageContent[] {\n\treturn Array.isArray(value) && value.every(isRpcImageContent);\n}\n\nfunction isRpcLiveActivityRegistration(value: unknown): boolean {\n\treturn (\n\t\tisRecord(value) &&\n\t\ttypeof value.activityId === \"string\" &&\n\t\ttypeof value.pushToken === \"string\" &&\n\t\t(value.tokenHash === undefined || typeof value.tokenHash === \"string\") &&\n\t\t(value.tokenEnvironment === undefined ||\n\t\t\tvalue.tokenEnvironment === \"development\" ||\n\t\t\tvalue.tokenEnvironment === \"production\")\n\t);\n}\n\nfunction isRpcRegisterPushTargetArgs(value: unknown): boolean {\n\treturn (\n\t\tisRecord(value) &&\n\t\tvalue.provider === \"fcm\" &&\n\t\tvalue.platform === \"ios\" &&\n\t\ttypeof value.pushTargetId === \"string\" &&\n\t\ttypeof value.pushTargetAuthToken === \"string\" &&\n\t\ttypeof value.enabled === \"boolean\" &&\n\t\t(value.relayUrl === undefined || typeof value.relayUrl === \"string\") &&\n\t\t(value.tokenHash === undefined || typeof value.tokenHash === \"string\") &&\n\t\t(value.liveActivity === undefined || isRpcLiveActivityRegistration(value.liveActivity))\n\t);\n}\n\nfunction validateRequiredField(\n\tcommand: Record<string, unknown>,\n\tfield: string,\n\tisValid: (value: unknown) => boolean,\n\texpected: string,\n): string | undefined {\n\tif (command[field] === undefined) {\n\t\treturn `Invalid RPC command payload: \"${field}\" is required`;\n\t}\n\tif (!isValid(command[field])) {\n\t\treturn `Invalid RPC command payload: \"${field}\" must be ${expected}`;\n\t}\n\treturn undefined;\n}\n\nfunction validateOptionalField(\n\tcommand: Record<string, unknown>,\n\tfield: string,\n\tisValid: (value: unknown) => boolean,\n\texpected: string,\n): string | undefined {\n\tif (command[field] !== undefined && !isValid(command[field])) {\n\t\treturn `Invalid RPC command payload: \"${field}\" must be ${expected}`;\n\t}\n\treturn undefined;\n}\n\nexport function validateRpcCommandPayload(value: unknown): string | undefined {\n\tif (!isRecord(value)) {\n\t\treturn undefined;\n\t}\n\n\tswitch (value.type) {\n\t\tcase \"prompt\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"message\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"images\", isRpcImageContentArray, \"an array of image objects\") ??\n\t\t\t\tvalidateOptionalField(value, \"streamingBehavior\", isRpcStreamingBehavior, '\"steer\" or \"followUp\"')\n\t\t\t);\n\t\tcase \"steer\":\n\t\tcase \"follow_up\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"message\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"images\", isRpcImageContentArray, \"an array of image objects\")\n\t\t\t);\n\t\tcase \"new_session\":\n\t\t\treturn validateOptionalField(value, \"parentSession\", isString, \"a string\");\n\t\tcase \"set_client_capabilities\":\n\t\t\treturn validateRequiredField(value, \"features\", isStringArray, \"an array of strings\");\n\t\tcase \"get_ui_actions\":\n\t\t\treturn validateOptionalField(value, \"scope\", isRpcUiActionScope, '\"primary\", \"palette\", or \"all\"');\n\t\tcase \"get_ui_action_completions\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"action\", isString, \"a string\") ??\n\t\t\t\tvalidateRequiredField(value, \"argument\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"prefix\", isString, \"a string\")\n\t\t\t);\n\t\tcase \"invoke_ui_action\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"action\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"args\", isRecord, \"an object\") ??\n\t\t\t\tvalidateOptionalField(value, \"streamingBehavior\", isRpcStreamingBehavior, '\"steer\" or \"followUp\"')\n\t\t\t);\n\t\tcase \"register_push_target\":\n\t\t\treturn validateRequiredField(value, \"args\", isRpcRegisterPushTargetArgs, \"a push target registration object\");\n\t\tcase \"unregister_workspace\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(\n\t\t\t\t\tvalue,\n\t\t\t\t\t\"name\",\n\t\t\t\t\t(entry): entry is string => typeof entry === \"string\" && entry.trim().length > 0,\n\t\t\t\t\t\"a non-empty workspace name\",\n\t\t\t\t) ??\n\t\t\t\tvalidateOptionalField(value, \"path\", () => false, \"omitted\") ??\n\t\t\t\tvalidateOptionalField(value, \"workspacePath\", () => false, \"omitted\")\n\t\t\t);\n\t\tcase \"get_mcp_server\":\n\t\tcase \"connect_mcp_server\":\n\t\tcase \"disconnect_mcp_server\":\n\t\tcase \"refresh_mcp_server\":\n\t\tcase \"poll_mcp_server_auth\":\n\t\tcase \"cancel_mcp_server_auth\":\n\t\tcase \"logout_mcp_server\":\n\t\tcase \"list_mcp_tools\":\n\t\t\treturn validateRequiredField(value, \"server\", isString, \"a string\");\n\t\tcase \"list_mcp_resources\":\n\t\tcase \"list_mcp_prompts\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"server\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"cursor\", isString, \"a string\")\n\t\t\t);\n\t\tcase \"set_mcp_server_enabled\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"server\", isString, \"a string\") ??\n\t\t\t\tvalidateRequiredField(value, \"enabled\", isBoolean, \"a boolean\")\n\t\t\t);\n\t\tcase \"start_mcp_server_auth\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"server\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"flow\", isMcpAuthFlow, '\"browser\" or \"device\"') ??\n\t\t\t\tvalidateOptionalField(value, \"redirectUrl\", isString, \"a string\")\n\t\t\t);\n\t\tcase \"complete_mcp_server_auth\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"server\", isString, \"a string\") ??\n\t\t\t\tvalidateRequiredField(value, \"redirectUrl\", isString, \"a string\") ??\n\t\t\t\tvalidateRequiredField(value, \"code\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"state\", isString, \"a string\")\n\t\t\t);\n\t\tcase \"get_mcp_tool\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"server\", isString, \"a string\") ??\n\t\t\t\tvalidateRequiredField(value, \"tool\", isString, \"a string\")\n\t\t\t);\n\t\tcase \"read_mcp_resource\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"server\", isString, \"a string\") ??\n\t\t\t\tvalidateRequiredField(value, \"resourceUri\", isString, \"a string\")\n\t\t\t);\n\t\tcase \"get_mcp_prompt\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"server\", isString, \"a string\") ??\n\t\t\t\tvalidateRequiredField(value, \"prompt\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"arguments\", isRecord, \"an object\") ??\n\t\t\t\tvalidateOptionalField(value, \"argumentsJson\", isString, \"a string\")\n\t\t\t);\n\t\tcase \"list_mcp_recent_calls\":\n\t\t\treturn validateOptionalField(value, \"server\", isString, \"a string\");\n\t\tcase \"get_transcript\":\n\t\t\treturn (\n\t\t\t\tvalidateOptionalField(value, \"beforeEntryId\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"limit\", isNumber, \"a number\")\n\t\t\t);\n\t\tcase \"get_message_images\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"entryId\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"startImageIndex\", isNumber, \"a number\")\n\t\t\t);\n\t\tcase \"subagent_start\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"agent\", isString, \"a string\") ??\n\t\t\t\tvalidateRequiredField(value, \"prompt\", isString, \"a string\")\n\t\t\t);\n\t\tcase \"subagent_abort\":\n\t\tcase \"subagent_get_state\":\n\t\tcase \"subagent_dispose\":\n\t\t\treturn validateRequiredField(value, \"subagentId\", isString, \"a string\");\n\t\tcase \"subagent_get_transcript\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"subagentId\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"beforeEntryId\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"limit\", isNumber, \"a number\")\n\t\t\t);\n\t\tcase \"set_model\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"provider\", isString, \"a string\") ??\n\t\t\t\tvalidateRequiredField(value, \"modelId\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"persistDefault\", isBoolean, \"a boolean\")\n\t\t\t);\n\t\tcase \"set_thinking_level\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"level\", isRpcThinkingLevel, \"a supported thinking level\") ??\n\t\t\t\tvalidateOptionalField(value, \"persistDefault\", isBoolean, \"a boolean\")\n\t\t\t);\n\t\tcase \"set_steering_mode\":\n\t\tcase \"set_follow_up_mode\":\n\t\t\treturn validateRequiredField(value, \"mode\", isRpcQueueMode, '\"all\" or \"one-at-a-time\"');\n\t\tcase \"compact\":\n\t\t\treturn validateOptionalField(value, \"customInstructions\", isString, \"a string\");\n\t\tcase \"set_auto_compaction\":\n\t\tcase \"set_auto_retry\":\n\t\t\treturn validateRequiredField(value, \"enabled\", isBoolean, \"a boolean\");\n\t\tcase \"bash\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"command\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"excludeFromContext\", isBoolean, \"a boolean\")\n\t\t\t);\n\t\tcase \"export_html\":\n\t\t\treturn validateOptionalField(value, \"outputPath\", isString, \"a string\");\n\t\tcase \"switch_session\":\n\t\t\treturn validateRequiredField(value, \"sessionPath\", isString, \"a string\");\n\t\tcase \"switch_session_by_id\":\n\t\t\treturn validateRequiredField(value, \"sessionId\", isString, \"a string\");\n\t\tcase \"fork\":\n\t\t\treturn validateRequiredField(value, \"entryId\", isString, \"a string\");\n\t\tcase \"set_session_name\":\n\t\t\treturn validateRequiredField(value, \"name\", isString, \"a string\");\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
const RPC_QUEUE_MODES = ["all", "one-at-a-time"];
|
|
2
|
+
const RPC_THINKING_LEVELS = [
|
|
3
|
+
"off",
|
|
4
|
+
"minimal",
|
|
5
|
+
"low",
|
|
6
|
+
"medium",
|
|
7
|
+
"high",
|
|
8
|
+
"xhigh",
|
|
9
|
+
"max",
|
|
10
|
+
];
|
|
11
|
+
const RPC_STREAMING_BEHAVIORS = ["steer", "followUp"];
|
|
12
|
+
const RPC_UI_ACTION_SCOPES = ["primary", "palette", "all"];
|
|
13
|
+
function isRecord(value) {
|
|
14
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
15
|
+
}
|
|
16
|
+
function isString(value) {
|
|
17
|
+
return typeof value === "string";
|
|
18
|
+
}
|
|
19
|
+
function isBoolean(value) {
|
|
20
|
+
return typeof value === "boolean";
|
|
21
|
+
}
|
|
22
|
+
function isMcpAuthFlow(value) {
|
|
23
|
+
return value === "browser" || value === "device";
|
|
24
|
+
}
|
|
25
|
+
function isNumber(value) {
|
|
26
|
+
return typeof value === "number";
|
|
27
|
+
}
|
|
28
|
+
function isStringArray(value) {
|
|
29
|
+
return Array.isArray(value) && value.every(isString);
|
|
30
|
+
}
|
|
31
|
+
function isOneOf(value, allowed) {
|
|
32
|
+
return typeof value === "string" && allowed.some((allowedValue) => allowedValue === value);
|
|
33
|
+
}
|
|
34
|
+
function isRpcQueueMode(value) {
|
|
35
|
+
return isOneOf(value, RPC_QUEUE_MODES);
|
|
36
|
+
}
|
|
37
|
+
function isRpcThinkingLevel(value) {
|
|
38
|
+
return isOneOf(value, RPC_THINKING_LEVELS);
|
|
39
|
+
}
|
|
40
|
+
function isRpcStreamingBehavior(value) {
|
|
41
|
+
return isOneOf(value, RPC_STREAMING_BEHAVIORS);
|
|
42
|
+
}
|
|
43
|
+
function isRpcUiActionScope(value) {
|
|
44
|
+
return isOneOf(value, RPC_UI_ACTION_SCOPES);
|
|
45
|
+
}
|
|
46
|
+
function isRpcImageContent(value) {
|
|
47
|
+
return (isRecord(value) && value.type === "image" && typeof value.data === "string" && typeof value.mimeType === "string");
|
|
48
|
+
}
|
|
49
|
+
function isRpcImageContentArray(value) {
|
|
50
|
+
return Array.isArray(value) && value.every(isRpcImageContent);
|
|
51
|
+
}
|
|
52
|
+
function isRpcLiveActivityRegistration(value) {
|
|
53
|
+
return (isRecord(value) &&
|
|
54
|
+
typeof value.activityId === "string" &&
|
|
55
|
+
typeof value.pushToken === "string" &&
|
|
56
|
+
(value.tokenHash === undefined || typeof value.tokenHash === "string") &&
|
|
57
|
+
(value.tokenEnvironment === undefined ||
|
|
58
|
+
value.tokenEnvironment === "development" ||
|
|
59
|
+
value.tokenEnvironment === "production"));
|
|
60
|
+
}
|
|
61
|
+
function isRpcRegisterPushTargetArgs(value) {
|
|
62
|
+
return (isRecord(value) &&
|
|
63
|
+
value.provider === "fcm" &&
|
|
64
|
+
value.platform === "ios" &&
|
|
65
|
+
typeof value.pushTargetId === "string" &&
|
|
66
|
+
typeof value.pushTargetAuthToken === "string" &&
|
|
67
|
+
typeof value.enabled === "boolean" &&
|
|
68
|
+
(value.relayUrl === undefined || typeof value.relayUrl === "string") &&
|
|
69
|
+
(value.tokenHash === undefined || typeof value.tokenHash === "string") &&
|
|
70
|
+
(value.liveActivity === undefined || isRpcLiveActivityRegistration(value.liveActivity)));
|
|
71
|
+
}
|
|
72
|
+
function validateRequiredField(command, field, isValid, expected) {
|
|
73
|
+
if (command[field] === undefined) {
|
|
74
|
+
return `Invalid RPC command payload: "${field}" is required`;
|
|
75
|
+
}
|
|
76
|
+
if (!isValid(command[field])) {
|
|
77
|
+
return `Invalid RPC command payload: "${field}" must be ${expected}`;
|
|
78
|
+
}
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
function validateOptionalField(command, field, isValid, expected) {
|
|
82
|
+
if (command[field] !== undefined && !isValid(command[field])) {
|
|
83
|
+
return `Invalid RPC command payload: "${field}" must be ${expected}`;
|
|
84
|
+
}
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
export function validateRpcCommandPayload(value) {
|
|
88
|
+
if (!isRecord(value)) {
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
switch (value.type) {
|
|
92
|
+
case "prompt":
|
|
93
|
+
return (validateRequiredField(value, "message", isString, "a string") ??
|
|
94
|
+
validateOptionalField(value, "images", isRpcImageContentArray, "an array of image objects") ??
|
|
95
|
+
validateOptionalField(value, "streamingBehavior", isRpcStreamingBehavior, '"steer" or "followUp"'));
|
|
96
|
+
case "steer":
|
|
97
|
+
case "follow_up":
|
|
98
|
+
return (validateRequiredField(value, "message", isString, "a string") ??
|
|
99
|
+
validateOptionalField(value, "images", isRpcImageContentArray, "an array of image objects"));
|
|
100
|
+
case "new_session":
|
|
101
|
+
return validateOptionalField(value, "parentSession", isString, "a string");
|
|
102
|
+
case "set_client_capabilities":
|
|
103
|
+
return validateRequiredField(value, "features", isStringArray, "an array of strings");
|
|
104
|
+
case "get_ui_actions":
|
|
105
|
+
return validateOptionalField(value, "scope", isRpcUiActionScope, '"primary", "palette", or "all"');
|
|
106
|
+
case "get_ui_action_completions":
|
|
107
|
+
return (validateRequiredField(value, "action", isString, "a string") ??
|
|
108
|
+
validateRequiredField(value, "argument", isString, "a string") ??
|
|
109
|
+
validateOptionalField(value, "prefix", isString, "a string"));
|
|
110
|
+
case "invoke_ui_action":
|
|
111
|
+
return (validateRequiredField(value, "action", isString, "a string") ??
|
|
112
|
+
validateOptionalField(value, "args", isRecord, "an object") ??
|
|
113
|
+
validateOptionalField(value, "streamingBehavior", isRpcStreamingBehavior, '"steer" or "followUp"'));
|
|
114
|
+
case "register_push_target":
|
|
115
|
+
return validateRequiredField(value, "args", isRpcRegisterPushTargetArgs, "a push target registration object");
|
|
116
|
+
case "unregister_workspace":
|
|
117
|
+
return (validateRequiredField(value, "name", (entry) => typeof entry === "string" && entry.trim().length > 0, "a non-empty workspace name") ??
|
|
118
|
+
validateOptionalField(value, "path", () => false, "omitted") ??
|
|
119
|
+
validateOptionalField(value, "workspacePath", () => false, "omitted"));
|
|
120
|
+
case "get_mcp_server":
|
|
121
|
+
case "connect_mcp_server":
|
|
122
|
+
case "disconnect_mcp_server":
|
|
123
|
+
case "refresh_mcp_server":
|
|
124
|
+
case "poll_mcp_server_auth":
|
|
125
|
+
case "cancel_mcp_server_auth":
|
|
126
|
+
case "logout_mcp_server":
|
|
127
|
+
case "list_mcp_tools":
|
|
128
|
+
return validateRequiredField(value, "server", isString, "a string");
|
|
129
|
+
case "list_mcp_resources":
|
|
130
|
+
case "list_mcp_prompts":
|
|
131
|
+
return (validateRequiredField(value, "server", isString, "a string") ??
|
|
132
|
+
validateOptionalField(value, "cursor", isString, "a string"));
|
|
133
|
+
case "set_mcp_server_enabled":
|
|
134
|
+
return (validateRequiredField(value, "server", isString, "a string") ??
|
|
135
|
+
validateRequiredField(value, "enabled", isBoolean, "a boolean"));
|
|
136
|
+
case "start_mcp_server_auth":
|
|
137
|
+
return (validateRequiredField(value, "server", isString, "a string") ??
|
|
138
|
+
validateOptionalField(value, "flow", isMcpAuthFlow, '"browser" or "device"') ??
|
|
139
|
+
validateOptionalField(value, "redirectUrl", isString, "a string"));
|
|
140
|
+
case "complete_mcp_server_auth":
|
|
141
|
+
return (validateRequiredField(value, "server", isString, "a string") ??
|
|
142
|
+
validateRequiredField(value, "redirectUrl", isString, "a string") ??
|
|
143
|
+
validateRequiredField(value, "code", isString, "a string") ??
|
|
144
|
+
validateOptionalField(value, "state", isString, "a string"));
|
|
145
|
+
case "get_mcp_tool":
|
|
146
|
+
return (validateRequiredField(value, "server", isString, "a string") ??
|
|
147
|
+
validateRequiredField(value, "tool", isString, "a string"));
|
|
148
|
+
case "read_mcp_resource":
|
|
149
|
+
return (validateRequiredField(value, "server", isString, "a string") ??
|
|
150
|
+
validateRequiredField(value, "resourceUri", isString, "a string"));
|
|
151
|
+
case "get_mcp_prompt":
|
|
152
|
+
return (validateRequiredField(value, "server", isString, "a string") ??
|
|
153
|
+
validateRequiredField(value, "prompt", isString, "a string") ??
|
|
154
|
+
validateOptionalField(value, "arguments", isRecord, "an object") ??
|
|
155
|
+
validateOptionalField(value, "argumentsJson", isString, "a string"));
|
|
156
|
+
case "list_mcp_recent_calls":
|
|
157
|
+
return validateOptionalField(value, "server", isString, "a string");
|
|
158
|
+
case "get_transcript":
|
|
159
|
+
return (validateOptionalField(value, "beforeEntryId", isString, "a string") ??
|
|
160
|
+
validateOptionalField(value, "limit", isNumber, "a number"));
|
|
161
|
+
case "get_message_images":
|
|
162
|
+
return (validateRequiredField(value, "entryId", isString, "a string") ??
|
|
163
|
+
validateOptionalField(value, "startImageIndex", isNumber, "a number"));
|
|
164
|
+
case "subagent_start":
|
|
165
|
+
return (validateRequiredField(value, "agent", isString, "a string") ??
|
|
166
|
+
validateRequiredField(value, "prompt", isString, "a string"));
|
|
167
|
+
case "subagent_abort":
|
|
168
|
+
case "subagent_get_state":
|
|
169
|
+
case "subagent_dispose":
|
|
170
|
+
return validateRequiredField(value, "subagentId", isString, "a string");
|
|
171
|
+
case "subagent_get_transcript":
|
|
172
|
+
return (validateRequiredField(value, "subagentId", isString, "a string") ??
|
|
173
|
+
validateOptionalField(value, "beforeEntryId", isString, "a string") ??
|
|
174
|
+
validateOptionalField(value, "limit", isNumber, "a number"));
|
|
175
|
+
case "set_model":
|
|
176
|
+
return (validateRequiredField(value, "provider", isString, "a string") ??
|
|
177
|
+
validateRequiredField(value, "modelId", isString, "a string") ??
|
|
178
|
+
validateOptionalField(value, "persistDefault", isBoolean, "a boolean"));
|
|
179
|
+
case "set_thinking_level":
|
|
180
|
+
return (validateRequiredField(value, "level", isRpcThinkingLevel, "a supported thinking level") ??
|
|
181
|
+
validateOptionalField(value, "persistDefault", isBoolean, "a boolean"));
|
|
182
|
+
case "set_steering_mode":
|
|
183
|
+
case "set_follow_up_mode":
|
|
184
|
+
return validateRequiredField(value, "mode", isRpcQueueMode, '"all" or "one-at-a-time"');
|
|
185
|
+
case "compact":
|
|
186
|
+
return validateOptionalField(value, "customInstructions", isString, "a string");
|
|
187
|
+
case "set_auto_compaction":
|
|
188
|
+
case "set_auto_retry":
|
|
189
|
+
return validateRequiredField(value, "enabled", isBoolean, "a boolean");
|
|
190
|
+
case "bash":
|
|
191
|
+
return (validateRequiredField(value, "command", isString, "a string") ??
|
|
192
|
+
validateOptionalField(value, "excludeFromContext", isBoolean, "a boolean"));
|
|
193
|
+
case "export_html":
|
|
194
|
+
return validateOptionalField(value, "outputPath", isString, "a string");
|
|
195
|
+
case "switch_session":
|
|
196
|
+
return validateRequiredField(value, "sessionPath", isString, "a string");
|
|
197
|
+
case "switch_session_by_id":
|
|
198
|
+
return validateRequiredField(value, "sessionId", isString, "a string");
|
|
199
|
+
case "fork":
|
|
200
|
+
return validateRequiredField(value, "entryId", isString, "a string");
|
|
201
|
+
case "set_session_name":
|
|
202
|
+
return validateRequiredField(value, "name", isString, "a string");
|
|
203
|
+
default:
|
|
204
|
+
return undefined;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=rpc-command-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc-command-validation.js","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-command-validation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@hansjm10/volt-agent-core\";\nimport type { ImageContent } from \"@hansjm10/volt-ai\";\n\nconst RPC_QUEUE_MODES = [\"all\", \"one-at-a-time\"] as const;\nconst RPC_THINKING_LEVELS = [\n\t\"off\",\n\t\"minimal\",\n\t\"low\",\n\t\"medium\",\n\t\"high\",\n\t\"xhigh\",\n\t\"max\",\n] as const satisfies readonly ThinkingLevel[];\nconst RPC_STREAMING_BEHAVIORS = [\"steer\", \"followUp\"] as const;\nconst RPC_UI_ACTION_SCOPES = [\"primary\", \"palette\", \"all\"] as const;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isString(value: unknown): value is string {\n\treturn typeof value === \"string\";\n}\n\nfunction isBoolean(value: unknown): value is boolean {\n\treturn typeof value === \"boolean\";\n}\n\nfunction isMcpAuthFlow(value: unknown): value is \"browser\" | \"device\" {\n\treturn value === \"browser\" || value === \"device\";\n}\n\nfunction isNumber(value: unknown): value is number {\n\treturn typeof value === \"number\";\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n\treturn Array.isArray(value) && value.every(isString);\n}\n\nfunction isOneOf<T extends string>(value: unknown, allowed: readonly T[]): value is T {\n\treturn typeof value === \"string\" && allowed.some((allowedValue) => allowedValue === value);\n}\n\nfunction isRpcQueueMode(value: unknown): value is (typeof RPC_QUEUE_MODES)[number] {\n\treturn isOneOf(value, RPC_QUEUE_MODES);\n}\n\nfunction isRpcThinkingLevel(value: unknown): value is ThinkingLevel {\n\treturn isOneOf(value, RPC_THINKING_LEVELS);\n}\n\nfunction isRpcStreamingBehavior(value: unknown): value is (typeof RPC_STREAMING_BEHAVIORS)[number] {\n\treturn isOneOf(value, RPC_STREAMING_BEHAVIORS);\n}\n\nfunction isRpcUiActionScope(value: unknown): value is (typeof RPC_UI_ACTION_SCOPES)[number] {\n\treturn isOneOf(value, RPC_UI_ACTION_SCOPES);\n}\n\nfunction isRpcImageContent(value: unknown): value is ImageContent {\n\treturn (\n\t\tisRecord(value) && value.type === \"image\" && typeof value.data === \"string\" && typeof value.mimeType === \"string\"\n\t);\n}\n\nfunction isRpcImageContentArray(value: unknown): value is ImageContent[] {\n\treturn Array.isArray(value) && value.every(isRpcImageContent);\n}\n\nfunction isRpcLiveActivityRegistration(value: unknown): boolean {\n\treturn (\n\t\tisRecord(value) &&\n\t\ttypeof value.activityId === \"string\" &&\n\t\ttypeof value.pushToken === \"string\" &&\n\t\t(value.tokenHash === undefined || typeof value.tokenHash === \"string\") &&\n\t\t(value.tokenEnvironment === undefined ||\n\t\t\tvalue.tokenEnvironment === \"development\" ||\n\t\t\tvalue.tokenEnvironment === \"production\")\n\t);\n}\n\nfunction isRpcRegisterPushTargetArgs(value: unknown): boolean {\n\treturn (\n\t\tisRecord(value) &&\n\t\tvalue.provider === \"fcm\" &&\n\t\tvalue.platform === \"ios\" &&\n\t\ttypeof value.pushTargetId === \"string\" &&\n\t\ttypeof value.pushTargetAuthToken === \"string\" &&\n\t\ttypeof value.enabled === \"boolean\" &&\n\t\t(value.relayUrl === undefined || typeof value.relayUrl === \"string\") &&\n\t\t(value.tokenHash === undefined || typeof value.tokenHash === \"string\") &&\n\t\t(value.liveActivity === undefined || isRpcLiveActivityRegistration(value.liveActivity))\n\t);\n}\n\nfunction validateRequiredField(\n\tcommand: Record<string, unknown>,\n\tfield: string,\n\tisValid: (value: unknown) => boolean,\n\texpected: string,\n): string | undefined {\n\tif (command[field] === undefined) {\n\t\treturn `Invalid RPC command payload: \"${field}\" is required`;\n\t}\n\tif (!isValid(command[field])) {\n\t\treturn `Invalid RPC command payload: \"${field}\" must be ${expected}`;\n\t}\n\treturn undefined;\n}\n\nfunction validateOptionalField(\n\tcommand: Record<string, unknown>,\n\tfield: string,\n\tisValid: (value: unknown) => boolean,\n\texpected: string,\n): string | undefined {\n\tif (command[field] !== undefined && !isValid(command[field])) {\n\t\treturn `Invalid RPC command payload: \"${field}\" must be ${expected}`;\n\t}\n\treturn undefined;\n}\n\nexport function validateRpcCommandPayload(value: unknown): string | undefined {\n\tif (!isRecord(value)) {\n\t\treturn undefined;\n\t}\n\n\tswitch (value.type) {\n\t\tcase \"prompt\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"message\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"images\", isRpcImageContentArray, \"an array of image objects\") ??\n\t\t\t\tvalidateOptionalField(value, \"streamingBehavior\", isRpcStreamingBehavior, '\"steer\" or \"followUp\"')\n\t\t\t);\n\t\tcase \"steer\":\n\t\tcase \"follow_up\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"message\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"images\", isRpcImageContentArray, \"an array of image objects\")\n\t\t\t);\n\t\tcase \"new_session\":\n\t\t\treturn validateOptionalField(value, \"parentSession\", isString, \"a string\");\n\t\tcase \"set_client_capabilities\":\n\t\t\treturn validateRequiredField(value, \"features\", isStringArray, \"an array of strings\");\n\t\tcase \"get_ui_actions\":\n\t\t\treturn validateOptionalField(value, \"scope\", isRpcUiActionScope, '\"primary\", \"palette\", or \"all\"');\n\t\tcase \"get_ui_action_completions\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"action\", isString, \"a string\") ??\n\t\t\t\tvalidateRequiredField(value, \"argument\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"prefix\", isString, \"a string\")\n\t\t\t);\n\t\tcase \"invoke_ui_action\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"action\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"args\", isRecord, \"an object\") ??\n\t\t\t\tvalidateOptionalField(value, \"streamingBehavior\", isRpcStreamingBehavior, '\"steer\" or \"followUp\"')\n\t\t\t);\n\t\tcase \"register_push_target\":\n\t\t\treturn validateRequiredField(value, \"args\", isRpcRegisterPushTargetArgs, \"a push target registration object\");\n\t\tcase \"unregister_workspace\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(\n\t\t\t\t\tvalue,\n\t\t\t\t\t\"name\",\n\t\t\t\t\t(entry): entry is string => typeof entry === \"string\" && entry.trim().length > 0,\n\t\t\t\t\t\"a non-empty workspace name\",\n\t\t\t\t) ??\n\t\t\t\tvalidateOptionalField(value, \"path\", () => false, \"omitted\") ??\n\t\t\t\tvalidateOptionalField(value, \"workspacePath\", () => false, \"omitted\")\n\t\t\t);\n\t\tcase \"get_mcp_server\":\n\t\tcase \"connect_mcp_server\":\n\t\tcase \"disconnect_mcp_server\":\n\t\tcase \"refresh_mcp_server\":\n\t\tcase \"poll_mcp_server_auth\":\n\t\tcase \"cancel_mcp_server_auth\":\n\t\tcase \"logout_mcp_server\":\n\t\tcase \"list_mcp_tools\":\n\t\t\treturn validateRequiredField(value, \"server\", isString, \"a string\");\n\t\tcase \"list_mcp_resources\":\n\t\tcase \"list_mcp_prompts\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"server\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"cursor\", isString, \"a string\")\n\t\t\t);\n\t\tcase \"set_mcp_server_enabled\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"server\", isString, \"a string\") ??\n\t\t\t\tvalidateRequiredField(value, \"enabled\", isBoolean, \"a boolean\")\n\t\t\t);\n\t\tcase \"start_mcp_server_auth\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"server\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"flow\", isMcpAuthFlow, '\"browser\" or \"device\"') ??\n\t\t\t\tvalidateOptionalField(value, \"redirectUrl\", isString, \"a string\")\n\t\t\t);\n\t\tcase \"complete_mcp_server_auth\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"server\", isString, \"a string\") ??\n\t\t\t\tvalidateRequiredField(value, \"redirectUrl\", isString, \"a string\") ??\n\t\t\t\tvalidateRequiredField(value, \"code\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"state\", isString, \"a string\")\n\t\t\t);\n\t\tcase \"get_mcp_tool\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"server\", isString, \"a string\") ??\n\t\t\t\tvalidateRequiredField(value, \"tool\", isString, \"a string\")\n\t\t\t);\n\t\tcase \"read_mcp_resource\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"server\", isString, \"a string\") ??\n\t\t\t\tvalidateRequiredField(value, \"resourceUri\", isString, \"a string\")\n\t\t\t);\n\t\tcase \"get_mcp_prompt\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"server\", isString, \"a string\") ??\n\t\t\t\tvalidateRequiredField(value, \"prompt\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"arguments\", isRecord, \"an object\") ??\n\t\t\t\tvalidateOptionalField(value, \"argumentsJson\", isString, \"a string\")\n\t\t\t);\n\t\tcase \"list_mcp_recent_calls\":\n\t\t\treturn validateOptionalField(value, \"server\", isString, \"a string\");\n\t\tcase \"get_transcript\":\n\t\t\treturn (\n\t\t\t\tvalidateOptionalField(value, \"beforeEntryId\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"limit\", isNumber, \"a number\")\n\t\t\t);\n\t\tcase \"get_message_images\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"entryId\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"startImageIndex\", isNumber, \"a number\")\n\t\t\t);\n\t\tcase \"subagent_start\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"agent\", isString, \"a string\") ??\n\t\t\t\tvalidateRequiredField(value, \"prompt\", isString, \"a string\")\n\t\t\t);\n\t\tcase \"subagent_abort\":\n\t\tcase \"subagent_get_state\":\n\t\tcase \"subagent_dispose\":\n\t\t\treturn validateRequiredField(value, \"subagentId\", isString, \"a string\");\n\t\tcase \"subagent_get_transcript\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"subagentId\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"beforeEntryId\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"limit\", isNumber, \"a number\")\n\t\t\t);\n\t\tcase \"set_model\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"provider\", isString, \"a string\") ??\n\t\t\t\tvalidateRequiredField(value, \"modelId\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"persistDefault\", isBoolean, \"a boolean\")\n\t\t\t);\n\t\tcase \"set_thinking_level\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"level\", isRpcThinkingLevel, \"a supported thinking level\") ??\n\t\t\t\tvalidateOptionalField(value, \"persistDefault\", isBoolean, \"a boolean\")\n\t\t\t);\n\t\tcase \"set_steering_mode\":\n\t\tcase \"set_follow_up_mode\":\n\t\t\treturn validateRequiredField(value, \"mode\", isRpcQueueMode, '\"all\" or \"one-at-a-time\"');\n\t\tcase \"compact\":\n\t\t\treturn validateOptionalField(value, \"customInstructions\", isString, \"a string\");\n\t\tcase \"set_auto_compaction\":\n\t\tcase \"set_auto_retry\":\n\t\t\treturn validateRequiredField(value, \"enabled\", isBoolean, \"a boolean\");\n\t\tcase \"bash\":\n\t\t\treturn (\n\t\t\t\tvalidateRequiredField(value, \"command\", isString, \"a string\") ??\n\t\t\t\tvalidateOptionalField(value, \"excludeFromContext\", isBoolean, \"a boolean\")\n\t\t\t);\n\t\tcase \"export_html\":\n\t\t\treturn validateOptionalField(value, \"outputPath\", isString, \"a string\");\n\t\tcase \"switch_session\":\n\t\t\treturn validateRequiredField(value, \"sessionPath\", isString, \"a string\");\n\t\tcase \"switch_session_by_id\":\n\t\t\treturn validateRequiredField(value, \"sessionId\", isString, \"a string\");\n\t\tcase \"fork\":\n\t\t\treturn validateRequiredField(value, \"entryId\", isString, \"a string\");\n\t\tcase \"set_session_name\":\n\t\t\treturn validateRequiredField(value, \"name\", isString, \"a string\");\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RPC mode: Headless operation with JSON stdin/stdout protocol.
|
|
3
|
+
*
|
|
4
|
+
* Used for embedding the agent in other applications.
|
|
5
|
+
* Receives commands as JSON on stdin, outputs events and responses as JSON on stdout.
|
|
6
|
+
*
|
|
7
|
+
* Protocol:
|
|
8
|
+
* - Commands: JSON objects with `type` field, optional `id` for correlation
|
|
9
|
+
* - Responses: JSON objects with `type: "response"`, `command`, `success`, and optional `data`/`error`
|
|
10
|
+
* - Events: AgentSessionEvent objects streamed as they occur
|
|
11
|
+
* - Extension UI: Extension UI requests are emitted, client responds with extension_ui_response
|
|
12
|
+
*/
|
|
13
|
+
import type { AgentSessionRuntime } from "../../core/agent-session-runtime.ts";
|
|
14
|
+
import { type ReviewWorkflowEvent, type ReviewWorkflowToolEvent } from "../../core/review.ts";
|
|
15
|
+
import type { RpcTransport } from "../../core/rpc/transport.ts";
|
|
16
|
+
import type { RpcRegisterPushTargetResponse } from "./rpc-types.ts";
|
|
17
|
+
export type { RpcClientCapabilityFeature, RpcCommand, RpcExtensionUIRequest, RpcExtensionUIResponse, RpcHostActionRequest, RpcHostActionResponse, RpcHostActionUpdate, RpcListSubagentsResponse, RpcLiveActivityRegistration, RpcPendingHostActionsResponse, RpcPushPlatform, RpcPushProvider, RpcRegisterPushTargetArgs, RpcRegisterPushTargetResponse, RpcResponse, RpcSessionState, RpcSubagentDefinition, RpcSubagentDefinitionSource, RpcSubagentSourceInfo, RpcSubagentStartResponse, RpcWorkflowEvent, RpcWorkflowKind, RpcWorkflowStatus, RpcWorkflowToolEvent, UiActionArgumentDescriptor, UiActionArgumentType, UiActionCapabilities, UiActionCapabilityFeature, UiActionCategory, UiActionCompletionListResponse, UiActionDescriptor, UiActionInvocationQueueBehavior, UiActionInvocationResponse, UiActionInvocationStatus, UiActionListResponse, UiActionListScope, UiActionOptionDescriptor, UiActionPresentationHint, UiActionPresentationKind, UiActionScalar, UiActionSlashAlias, UiActionSource, UiActionStateDescriptor, UiActionStateType, UiActionStreamingBehavior, } from "./rpc-types.ts";
|
|
18
|
+
export interface RpcSessionChange {
|
|
19
|
+
sessionFile?: string;
|
|
20
|
+
sessionId: string;
|
|
21
|
+
}
|
|
22
|
+
export interface RpcModeOptions {
|
|
23
|
+
transport?: RpcTransport;
|
|
24
|
+
/** Defaults to true. Remote hosts can detach a transport without disposing the owned runtime. */
|
|
25
|
+
disposeRuntimeOnClose?: boolean;
|
|
26
|
+
/** Defaults to true for stdio RPC mode and false for caller-provided transports. */
|
|
27
|
+
exitProcess?: boolean;
|
|
28
|
+
/** Called after the active session is rebound, including initial startup. */
|
|
29
|
+
onSessionChanged?: (session: RpcSessionChange) => void | Promise<void>;
|
|
30
|
+
/** Called after initial startup has completed and the RPC transport is accepting commands. */
|
|
31
|
+
onReady?: () => void;
|
|
32
|
+
/** Called for review workflow events even if the client transport has already detached. */
|
|
33
|
+
onWorkflowEvent?: (event: ReviewWorkflowEvent | ReviewWorkflowToolEvent) => void | Promise<void>;
|
|
34
|
+
/** Defaults to true. Remote transports can disable this until their action allowlist is widened. */
|
|
35
|
+
allowUiActionInvocation?: boolean;
|
|
36
|
+
/** Defaults to false. Remote transports should only expose and invoke actions marked remote-safe. */
|
|
37
|
+
requireRemoteSafeUiActions?: boolean;
|
|
38
|
+
/** Remote host callback for registering platform push notification targets. */
|
|
39
|
+
registerPushTarget?: (args: unknown) => Promise<RpcRegisterPushTargetResponse>;
|
|
40
|
+
/** Observes set_client_capabilities feature lists (remote hosts gate optional pushes on these). */
|
|
41
|
+
onClientCapabilitiesChanged?: (features: string[]) => void;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Run in RPC mode.
|
|
45
|
+
* Listens for JSON commands from the transport, outputs events and responses to it.
|
|
46
|
+
*/
|
|
47
|
+
export declare function runRpcMode(runtimeHost: AgentSessionRuntime, options?: RpcModeOptions): Promise<void>;
|
|
48
|
+
//# sourceMappingURL=rpc-mode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc-mode.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/rpc-mode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAuB/E,OAAO,EAEN,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAE5B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAqBhE,OAAO,KAAK,EASX,6BAA6B,EAM7B,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EACX,0BAA0B,EAC1B,UAAU,EACV,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,mBAAmB,EACnB,wBAAwB,EACxB,2BAA2B,EAC3B,6BAA6B,EAC7B,eAAe,EACf,eAAe,EACf,yBAAyB,EACzB,6BAA6B,EAC7B,WAAW,EACX,eAAe,EACf,qBAAqB,EACrB,2BAA2B,EAC3B,qBAAqB,EACrB,wBAAwB,EACxB,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,EACpB,oBAAoB,EACpB,yBAAyB,EACzB,gBAAgB,EAChB,8BAA8B,EAC9B,kBAAkB,EAClB,+BAA+B,EAC/B,0BAA0B,EAC1B,wBAAwB,EACxB,oBAAoB,EACpB,iBAAiB,EACjB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,EACxB,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,uBAAuB,EACvB,iBAAiB,EACjB,yBAAyB,GACzB,MAAM,gBAAgB,CAAC;AAMxB,MAAM,WAAW,gBAAgB;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC9B,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,iGAAiG;IACjG,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,oFAAoF;IACpF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,8FAA8F;IAC9F,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,2FAA2F;IAC3F,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,GAAG,uBAAuB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjG,oGAAoG;IACpG,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,qGAAqG;IACrG,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,+EAA+E;IAC/E,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,6BAA6B,CAAC,CAAC;IAC/E,mGAAmG;IACnG,2BAA2B,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CAC3D;AAqUD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,WAAW,EAAE,mBAAmB,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAy2B9G","sourcesContent":["/**\n * RPC mode: Headless operation with JSON stdin/stdout protocol.\n *\n * Used for embedding the agent in other applications.\n * Receives commands as JSON on stdin, outputs events and responses as JSON on stdout.\n *\n * Protocol:\n * - Commands: JSON objects with `type` field, optional `id` for correlation\n * - Responses: JSON objects with `type: \"response\"`, `command`, `success`, and optional `data`/`error`\n * - Events: AgentSessionEvent objects streamed as they occur\n * - Extension UI: Extension UI requests are emitted, client responds with extension_ui_response\n */\n\nimport * as crypto from \"node:crypto\";\nimport type { AgentSession } from \"../../core/agent-session.ts\";\nimport type { AgentSessionRuntime } from \"../../core/agent-session-runtime.ts\";\nimport type {\n\tExtensionUIContext,\n\tExtensionUIDialogOptions,\n\tExtensionWidgetOptions,\n\tWorkingIndicatorOptions,\n} from \"../../core/extensions/index.ts\";\nimport type { HostActionInvocationContext } from \"../../core/host-actions.ts\";\nimport type {\n\tHostActionDecision,\n\tHostActionRequest,\n\tHostActionUpdate,\n\tHostInteraction,\n} from \"../../core/host-interaction.ts\";\nimport { extractVisibleTextContent } from \"../../core/messages.ts\";\nimport { startModelCatalogWatcher } from \"../../core/model-catalog-watcher.ts\";\nimport {\n\tflushRawStdout,\n\trestoreStdout,\n\ttakeOverStdout,\n\twaitForRawStdoutBackpressure,\n\twriteRawStdout,\n} from \"../../core/output-guard.ts\";\nimport {\n\tREMOTE_REVIEW_TOOL_NAMES,\n\ttype ReviewWorkflowEvent,\n\ttype ReviewWorkflowToolEvent,\n\trunReviewWorkflow,\n} from \"../../core/review.ts\";\nimport type { RpcTransport } from \"../../core/rpc/transport.ts\";\nimport type { SubagentDefinition, SubagentHandle } from \"../../core/subagents/index.ts\";\nimport {\n\tgetAvailableThemesWithPaths,\n\tgetThemeByName,\n\tsetRegisteredThemes,\n\tsetTheme,\n\tsetThemeInstance,\n\tTheme,\n\ttheme,\n} from \"../../core/theme/runtime.ts\";\nimport { killTrackedDetachedChildren } from \"../../utils/shell.ts\";\nimport { attachJsonlLineReader, serializeJsonLine } from \"./jsonl.ts\";\nimport {\n\tcreateRpcErrorResponse,\n\tgetRpcErrorResponseTarget,\n\tHOST_ACTION_REQUESTS_CAPABILITY,\n\thandleRpcCommand,\n\ttype RpcSubagentLifecycleController,\n} from \"./rpc-command-dispatcher.ts\";\nimport { validateRpcCommandPayload } from \"./rpc-command-validation.ts\";\nimport type {\n\tRpcClientCapabilityFeature,\n\tRpcCommand,\n\tRpcExtensionUIRequest,\n\tRpcExtensionUIResponse,\n\tRpcHostActionRequest,\n\tRpcHostActionResponse,\n\tRpcHostActionUpdate,\n\tRpcListSubagentsResponse,\n\tRpcRegisterPushTargetResponse,\n\tRpcResponse,\n\tRpcSessionState,\n\tRpcSubagentDefinition,\n\tRpcSubagentStartResponse,\n\tRpcTranscriptResponse,\n} from \"./rpc-types.ts\";\n\n// Re-export types for consumers\nexport type {\n\tRpcClientCapabilityFeature,\n\tRpcCommand,\n\tRpcExtensionUIRequest,\n\tRpcExtensionUIResponse,\n\tRpcHostActionRequest,\n\tRpcHostActionResponse,\n\tRpcHostActionUpdate,\n\tRpcListSubagentsResponse,\n\tRpcLiveActivityRegistration,\n\tRpcPendingHostActionsResponse,\n\tRpcPushPlatform,\n\tRpcPushProvider,\n\tRpcRegisterPushTargetArgs,\n\tRpcRegisterPushTargetResponse,\n\tRpcResponse,\n\tRpcSessionState,\n\tRpcSubagentDefinition,\n\tRpcSubagentDefinitionSource,\n\tRpcSubagentSourceInfo,\n\tRpcSubagentStartResponse,\n\tRpcWorkflowEvent,\n\tRpcWorkflowKind,\n\tRpcWorkflowStatus,\n\tRpcWorkflowToolEvent,\n\tUiActionArgumentDescriptor,\n\tUiActionArgumentType,\n\tUiActionCapabilities,\n\tUiActionCapabilityFeature,\n\tUiActionCategory,\n\tUiActionCompletionListResponse,\n\tUiActionDescriptor,\n\tUiActionInvocationQueueBehavior,\n\tUiActionInvocationResponse,\n\tUiActionInvocationStatus,\n\tUiActionListResponse,\n\tUiActionListScope,\n\tUiActionOptionDescriptor,\n\tUiActionPresentationHint,\n\tUiActionPresentationKind,\n\tUiActionScalar,\n\tUiActionSlashAlias,\n\tUiActionSource,\n\tUiActionStateDescriptor,\n\tUiActionStateType,\n\tUiActionStreamingBehavior,\n} from \"./rpc-types.ts\";\n\nfunction parseHostActionResponseDecision(value: unknown): RpcHostActionResponse[\"decision\"] | undefined {\n\treturn value === \"approved\" || value === \"denied\" || value === \"dismissed\" ? value : undefined;\n}\n\nexport interface RpcSessionChange {\n\tsessionFile?: string;\n\tsessionId: string;\n}\n\nexport interface RpcModeOptions {\n\ttransport?: RpcTransport;\n\t/** Defaults to true. Remote hosts can detach a transport without disposing the owned runtime. */\n\tdisposeRuntimeOnClose?: boolean;\n\t/** Defaults to true for stdio RPC mode and false for caller-provided transports. */\n\texitProcess?: boolean;\n\t/** Called after the active session is rebound, including initial startup. */\n\tonSessionChanged?: (session: RpcSessionChange) => void | Promise<void>;\n\t/** Called after initial startup has completed and the RPC transport is accepting commands. */\n\tonReady?: () => void;\n\t/** Called for review workflow events even if the client transport has already detached. */\n\tonWorkflowEvent?: (event: ReviewWorkflowEvent | ReviewWorkflowToolEvent) => void | Promise<void>;\n\t/** Defaults to true. Remote transports can disable this until their action allowlist is widened. */\n\tallowUiActionInvocation?: boolean;\n\t/** Defaults to false. Remote transports should only expose and invoke actions marked remote-safe. */\n\trequireRemoteSafeUiActions?: boolean;\n\t/** Remote host callback for registering platform push notification targets. */\n\tregisterPushTarget?: (args: unknown) => Promise<RpcRegisterPushTargetResponse>;\n\t/** Observes set_client_capabilities feature lists (remote hosts gate optional pushes on these). */\n\tonClientCapabilitiesChanged?: (features: string[]) => void;\n}\n\ntype RpcModeStartupAwareTransport = RpcTransport & {\n\tsetRpcModeStartupComplete?(startupComplete: boolean): void;\n};\n\nconst MAX_PENDING_RPC_INPUT_TASKS = 64;\n\nfunction createStdioRpcTransport(): RpcTransport {\n\treturn {\n\t\twrite(value) {\n\t\t\twriteRawStdout(serializeJsonLine(value));\n\t\t},\n\t\tonLine(handler) {\n\t\t\treturn attachJsonlLineReader(process.stdin, handler);\n\t\t},\n\t\tonClose(handler) {\n\t\t\tconst onEnd = () => {\n\t\t\t\thandler();\n\t\t\t};\n\t\t\tconst onError = (error: Error) => {\n\t\t\t\thandler(error);\n\t\t\t};\n\t\t\tprocess.stdin.on(\"end\", onEnd);\n\t\t\tprocess.stdin.on(\"error\", onError);\n\t\t\treturn () => {\n\t\t\t\tprocess.stdin.off(\"end\", onEnd);\n\t\t\t\tprocess.stdin.off(\"error\", onError);\n\t\t\t};\n\t\t},\n\t\twaitForBackpressure: waitForRawStdoutBackpressure,\n\t\tflush: flushRawStdout,\n\t\tclose() {\n\t\t\tprocess.stdin.pause();\n\t\t},\n\t};\n}\n\ninterface RpcHostActionBridgeAttachment {\n\tcanSend(): boolean;\n\tisShuttingDown(): boolean;\n\toutput(message: RpcHostActionRequest | RpcHostActionUpdate): void;\n}\n\ninterface PendingRpcHostActionRequest {\n\trequest: RpcHostActionRequest;\n\tresolve(decision: HostActionDecision): void;\n\tsettled: boolean;\n\tsignal?: AbortSignal;\n\ttimeoutId?: ReturnType<typeof setTimeout>;\n\tonAbort(): void;\n}\n\nclass RpcHostActionBridge {\n\treadonly interaction: HostInteraction = {\n\t\trequestAction: (request, options) => this.requestAction(request, options),\n\t\tupdateAction: (update) => this.updateAction(update),\n\t};\n\n\tprivate activeAttachment: (RpcHostActionBridgeAttachment & { id: number }) | undefined;\n\tprivate nextAttachmentId = 0;\n\tprivate readonly pendingRequests = new Map<string, PendingRpcHostActionRequest>();\n\n\tattach(attachment: RpcHostActionBridgeAttachment): () => void {\n\t\tconst activeAttachment = { ...attachment, id: ++this.nextAttachmentId };\n\t\tthis.activeAttachment = activeAttachment;\n\t\treturn () => {\n\t\t\tif (this.activeAttachment?.id === activeAttachment.id) {\n\t\t\t\tthis.activeAttachment = undefined;\n\t\t\t}\n\t\t};\n\t}\n\n\tgetPendingRequests(): RpcHostActionRequest[] {\n\t\treturn Array.from(this.pendingRequests.values()).map((entry) => entry.request);\n\t}\n\n\tcancelAll(message = \"RPC mode is shutting down\"): void {\n\t\tconst requests = Array.from(this.pendingRequests.values());\n\t\tfor (const request of requests) {\n\t\t\tthis.settle(request, { decision: \"dismissed\", message });\n\t\t}\n\t}\n\n\tresolveResponse(response: RpcHostActionResponse & { decision: HostActionDecision[\"decision\"] }): void {\n\t\tconst pending = this.pendingRequests.get(response.id);\n\t\tif (pending) {\n\t\t\tthis.settle(pending, { decision: response.decision, message: response.message });\n\t\t}\n\t}\n\n\tprivate requestAction(\n\t\trequest: HostActionRequest,\n\t\trequestOptions?: { signal?: AbortSignal },\n\t): Promise<HostActionDecision> {\n\t\tconst activeAttachment = this.activeAttachment;\n\t\tif (activeAttachment?.isShuttingDown()) {\n\t\t\treturn Promise.resolve({ decision: \"dismissed\" });\n\t\t}\n\t\tif (!activeAttachment?.canSend()) {\n\t\t\treturn Promise.resolve({ decision: \"unavailable\" });\n\t\t}\n\t\tif (requestOptions?.signal?.aborted) {\n\t\t\treturn Promise.resolve({ decision: \"dismissed\" });\n\t\t}\n\n\t\treturn new Promise((resolve) => {\n\t\t\tconst existing = this.pendingRequests.get(request.id);\n\t\t\tif (existing) {\n\t\t\t\tthis.settle(existing, { decision: \"dismissed\", message: \"Host action replaced\" });\n\t\t\t}\n\n\t\t\tconst rpcRequest: RpcHostActionRequest = { type: \"host_action_request\", ...request };\n\t\t\tlet entry: PendingRpcHostActionRequest;\n\t\t\tconst onAbort = (): void => {\n\t\t\t\tthis.settle(entry, { decision: \"dismissed\", message: \"Host action cancelled\" });\n\t\t\t};\n\t\t\tentry = {\n\t\t\t\trequest: rpcRequest,\n\t\t\t\tresolve,\n\t\t\t\tsettled: false,\n\t\t\t\tsignal: requestOptions?.signal,\n\t\t\t\tonAbort,\n\t\t\t};\n\t\t\trequestOptions?.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\t\tif (request.timeoutMs !== undefined) {\n\t\t\t\tentry.timeoutId = setTimeout(() => {\n\t\t\t\t\tthis.settle(entry, { decision: \"dismissed\", message: \"Host action timed out\" });\n\t\t\t\t}, request.timeoutMs);\n\t\t\t\tentry.timeoutId.unref?.();\n\t\t\t}\n\t\t\tthis.pendingRequests.set(request.id, entry);\n\t\t\tactiveAttachment.output(rpcRequest);\n\t\t});\n\t}\n\n\tprivate updateAction(update: HostActionUpdate): void {\n\t\tconst activeAttachment = this.activeAttachment;\n\t\tif (activeAttachment?.canSend()) {\n\t\t\tactiveAttachment.output({ type: \"host_action_update\", ...update });\n\t\t}\n\t}\n\n\tprivate settle(entry: PendingRpcHostActionRequest, decision: HostActionDecision): void {\n\t\tif (entry.settled) {\n\t\t\treturn;\n\t\t}\n\t\tentry.settled = true;\n\t\tif (entry.timeoutId) {\n\t\t\tclearTimeout(entry.timeoutId);\n\t\t}\n\t\tentry.signal?.removeEventListener(\"abort\", entry.onAbort);\n\t\tthis.pendingRequests.delete(entry.request.id);\n\t\tentry.resolve(decision);\n\t}\n}\n\nconst rpcHostActionBridges = new WeakMap<AgentSessionRuntime, RpcHostActionBridge>();\n\nfunction getRpcHostActionBridge(runtimeHost: AgentSessionRuntime): RpcHostActionBridge {\n\tlet bridge = rpcHostActionBridges.get(runtimeHost);\n\tif (!bridge) {\n\t\tbridge = new RpcHostActionBridge();\n\t\trpcHostActionBridges.set(runtimeHost, bridge);\n\t}\n\treturn bridge;\n}\n\ninterface RpcSubagentEntry {\n\thandle: SubagentHandle;\n\tunsubscribe: () => void;\n\tdisposed: boolean;\n}\n\nfunction createRpcSessionEventPayload(event: object): object {\n\tif (!isRecord(event) || event.type !== \"message_update\") {\n\t\treturn event;\n\t}\n\tconst assistantMessageEvent = event.assistantMessageEvent;\n\tconst message = event.message;\n\tif (!isRecord(assistantMessageEvent) || assistantMessageEvent.type !== \"text_end\" || !isRecord(message)) {\n\t\treturn event;\n\t}\n\tif (message.role !== \"assistant\") {\n\t\treturn event;\n\t}\n\treturn {\n\t\t...event,\n\t\tassistantMessageEvent: {\n\t\t\t...assistantMessageEvent,\n\t\t\tmessage: extractVisibleTextContent(message.content),\n\t\t},\n\t};\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction toRpcSubagentDefinition(definition: SubagentDefinition): RpcSubagentDefinition {\n\treturn {\n\t\tname: definition.name,\n\t\tdescription: definition.description,\n\t\tsource: definition.source,\n\t\tsourceInfo: {\n\t\t\tsource: definition.sourceInfo.source,\n\t\t\tscope: definition.sourceInfo.scope,\n\t\t\torigin: definition.sourceInfo.origin,\n\t\t},\n\t\t...(definition.tools ? { tools: definition.tools } : {}),\n\t\t...(definition.excludedTools ? { excludedTools: definition.excludedTools } : {}),\n\t\t...(definition.allowedSubagents ? { allowedSubagents: definition.allowedSubagents } : {}),\n\t\t...(definition.maxSubagentDepth !== undefined ? { maxSubagentDepth: definition.maxSubagentDepth } : {}),\n\t\t...(definition.maxChildAgents !== undefined ? { maxChildAgents: definition.maxChildAgents } : {}),\n\t\t...(definition.model ? { model: definition.model } : {}),\n\t\t...(definition.thinking ? { thinking: definition.thinking } : {}),\n\t};\n}\n\nclass RpcSubagentLifecycle implements RpcSubagentLifecycleController {\n\tprivate readonly getSession: () => AgentSession;\n\tprivate readonly output: (event: object) => void;\n\tprivate readonly active = new Map<string, RpcSubagentEntry>();\n\n\tconstructor(options: { getSession: () => AgentSession; output: (event: object) => void }) {\n\t\tthis.getSession = options.getSession;\n\t\tthis.output = options.output;\n\t}\n\n\tlist(): RpcListSubagentsResponse {\n\t\treturn {\n\t\t\tsubagents: this.getSession().resourceLoader.getSubagents().definitions.map(toRpcSubagentDefinition),\n\t\t};\n\t}\n\n\tasync start(agent: string, prompt: string): Promise<RpcSubagentStartResponse> {\n\t\tconst session = this.getSession();\n\t\tconst manager = session.getSubagentToolManager();\n\t\tif (!manager) {\n\t\t\tthrow new Error(\"Subagent manager is not available\");\n\t\t}\n\n\t\tconst handle = await manager.startByName(agent, { allowedTools: session.getActiveToolNames() });\n\t\tlet entry: RpcSubagentEntry | undefined;\n\t\tconst unsubscribe = handle.onEvent((event) => {\n\t\t\tif (entry?.disposed) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.output({ type: \"subagent_event\", subagentId: handle.id, event: createRpcSessionEventPayload(event) });\n\t\t});\n\t\tentry = { handle, unsubscribe, disposed: false };\n\t\tthis.active.set(handle.id, entry);\n\t\tvoid handle.waitForEnd().then(\n\t\t\t(result) => {\n\t\t\t\tif (!entry?.disposed) {\n\t\t\t\t\tthis.output({ type: \"subagent_end\", subagentId: handle.id, result });\n\t\t\t\t}\n\t\t\t},\n\t\t\t() => undefined,\n\t\t);\n\n\t\ttry {\n\t\t\tawait handle.prompt(prompt);\n\t\t} catch (error) {\n\t\t\tawait this.disposeEntry(handle.id, entry).catch(() => undefined);\n\t\t\tthrow error;\n\t\t}\n\n\t\treturn { subagentId: handle.id, sessionId: handle.sessionId };\n\t}\n\n\tasync abort(subagentId: string): Promise<void> {\n\t\tconst entry = this.getEntry(subagentId);\n\t\ttry {\n\t\t\tawait entry.handle.abort();\n\t\t} finally {\n\t\t\tawait this.disposeEntry(subagentId, entry);\n\t\t}\n\t}\n\n\tasync getState(subagentId: string): Promise<RpcSessionState> {\n\t\treturn this.getEntry(subagentId).handle.getState();\n\t}\n\n\tasync getTranscript(options: {\n\t\tsubagentId: string;\n\t\tlimit?: number;\n\t\tbeforeEntryId?: string;\n\t}): Promise<RpcTranscriptResponse> {\n\t\treturn this.getEntry(options.subagentId).handle.getTranscript({\n\t\t\tlimit: options.limit,\n\t\t\tbeforeEntryId: options.beforeEntryId,\n\t\t});\n\t}\n\n\tasync dispose(subagentId: string): Promise<void> {\n\t\tawait this.disposeEntry(subagentId, this.getEntry(subagentId));\n\t}\n\n\tasync disposeAll(): Promise<void> {\n\t\tconst entries = Array.from(this.active.entries());\n\t\tawait Promise.all(\n\t\t\tentries.map(([subagentId, entry]) => this.disposeEntry(subagentId, entry).catch(() => undefined)),\n\t\t);\n\t}\n\n\tprivate getEntry(subagentId: string): RpcSubagentEntry {\n\t\tconst entry = this.active.get(subagentId);\n\t\tif (!entry || entry.disposed) {\n\t\t\tthrow new Error(`Subagent ${subagentId} is not active`);\n\t\t}\n\t\treturn entry;\n\t}\n\n\tprivate async disposeEntry(subagentId: string, entry: RpcSubagentEntry): Promise<void> {\n\t\tif (entry.disposed) {\n\t\t\treturn;\n\t\t}\n\t\tentry.disposed = true;\n\t\tthis.active.delete(subagentId);\n\t\tentry.unsubscribe();\n\t\tawait entry.handle.dispose();\n\t}\n}\n\n/**\n * Run in RPC mode.\n * Listens for JSON commands from the transport, outputs events and responses to it.\n */\nexport async function runRpcMode(runtimeHost: AgentSessionRuntime, options: RpcModeOptions = {}): Promise<void> {\n\tif (!options.transport) {\n\t\ttakeOverStdout();\n\t}\n\tconst shouldExitProcess = options.exitProcess ?? !options.transport;\n\tconst shouldDisposeRuntimeOnClose = options.disposeRuntimeOnClose ?? true;\n\tconst allowUiActionInvocation = options.allowUiActionInvocation ?? true;\n\tconst requireRemoteSafeUiActions = options.requireRemoteSafeUiActions ?? false;\n\tconst shouldRestoreStdout = !options.transport && !shouldExitProcess;\n\tconst transport = options.transport ?? createStdioRpcTransport();\n\tconst startupAwareTransport = transport as RpcModeStartupAwareTransport;\n\tstartupAwareTransport.setRpcModeStartupComplete?.(false);\n\t// Shutdown request flag\n\tlet shutdownRequested = false;\n\tlet shuttingDown = false;\n\tconst signalCleanupHandlers: Array<() => void> = [];\n\tconst pendingWrites = new Set<Promise<void>>();\n\tlet hasPendingWriteError = false;\n\tlet pendingWriteError: unknown;\n\tlet transportFailureShutdownScheduled = false;\n\tconst toError = (value: unknown): Error => (value instanceof Error ? value : new Error(String(value)));\n\tconst recordPendingWriteError = (error: unknown): Error => {\n\t\tconst writeError = toError(error);\n\t\tif (!hasPendingWriteError) {\n\t\t\thasPendingWriteError = true;\n\t\t\tpendingWriteError = writeError;\n\t\t}\n\t\treturn writeError;\n\t};\n\tconst requestTransportFailureShutdown = (error: unknown): void => {\n\t\tconst writeError = recordPendingWriteError(error);\n\t\tif (shuttingDown || transportFailureShutdownScheduled) {\n\t\t\treturn;\n\t\t}\n\t\ttransportFailureShutdownScheduled = true;\n\t\t// Defer so in-flight backpressure waits can report the same failure first.\n\t\tsetImmediate(() => {\n\t\t\ttransportFailureShutdownScheduled = false;\n\t\t\tif (shuttingDown) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvoid shutdown(1, undefined, { error: writeError }).catch(() => {});\n\t\t});\n\t};\n\tconst trackTransportWrite = (result: void | Promise<void>): void => {\n\t\tif (!result) {\n\t\t\treturn;\n\t\t}\n\t\tconst tracked = Promise.resolve(result)\n\t\t\t.catch((error: unknown) => {\n\t\t\t\trequestTransportFailureShutdown(error);\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tpendingWrites.delete(tracked);\n\t\t\t});\n\t\tpendingWrites.add(tracked);\n\t};\n\tconst waitForTransportBackpressure = async (): Promise<void> => {\n\t\twhile (pendingWrites.size > 0) {\n\t\t\tawait Promise.all(pendingWrites);\n\t\t}\n\t\tif (hasPendingWriteError) {\n\t\t\tconst error = pendingWriteError;\n\t\t\thasPendingWriteError = false;\n\t\t\tpendingWriteError = undefined;\n\t\t\tthrow toError(error);\n\t\t}\n\t\tawait transport.waitForBackpressure?.();\n\t};\n\tlet session = runtimeHost.session;\n\tlet lastNotifiedSession: AgentSession | undefined;\n\tlet unsubscribe: (() => void) | undefined;\n\tlet unsubscribeBackpressure: (() => void) | undefined;\n\tlet stopModelCatalogWatcher: () => void = () => {};\n\n\tconst output = (obj: RpcResponse | RpcExtensionUIRequest | object) => {\n\t\tif (shuttingDown || hasPendingWriteError) {\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\ttrackTransportWrite(transport.write(obj));\n\t\t} catch (writeError: unknown) {\n\t\t\trequestTransportFailureShutdown(writeError);\n\t\t}\n\t};\n\tconst rpcSubagents = new RpcSubagentLifecycle({ getSession: () => session, output });\n\n\t// Pending extension UI requests waiting for response\n\tconst pendingExtensionRequests = new Map<\n\t\tstring,\n\t\t{ resolve: (response: RpcExtensionUIResponse) => void; cancel: () => void }\n\t>();\n\n\tconst cancelPendingExtensionRequests = (): void => {\n\t\tconst requests = Array.from(pendingExtensionRequests.values());\n\t\tpendingExtensionRequests.clear();\n\t\tfor (const request of requests) {\n\t\t\trequest.cancel();\n\t\t}\n\t};\n\n\tlet clientCapabilities = new Set<RpcClientCapabilityFeature>();\n\tconst hostActionBridge = getRpcHostActionBridge(runtimeHost);\n\tconst detachHostActionBridge = hostActionBridge.attach({\n\t\tcanSend: () => !shuttingDown && clientCapabilities.has(HOST_ACTION_REQUESTS_CAPABILITY),\n\t\tisShuttingDown: () => shuttingDown,\n\t\toutput: (message) => output(message),\n\t});\n\n\tconst cancelPendingHostActionRequests = (message = \"RPC mode is shutting down\"): void => {\n\t\thostActionBridge.cancelAll(message);\n\t};\n\n\tconst setSessionHostInteraction = (targetSession: AgentSession): void => {\n\t\tconst sessionWithHostInteraction = targetSession as {\n\t\t\tsetHostInteraction?: (hostInteraction: HostInteraction) => void;\n\t\t};\n\t\tsessionWithHostInteraction.setHostInteraction?.(hostActionBridge.interaction);\n\t};\n\n\t/** Helper for dialog methods with signal/timeout support */\n\tfunction createDialogPromise<T>(\n\t\topts: ExtensionUIDialogOptions | undefined,\n\t\tdefaultValue: T,\n\t\trequest: Record<string, unknown>,\n\t\tparseResponse: (response: RpcExtensionUIResponse) => T,\n\t): Promise<T> {\n\t\tif (opts?.signal?.aborted || shuttingDown) return Promise.resolve(defaultValue);\n\n\t\tconst id = crypto.randomUUID();\n\t\treturn new Promise((resolve) => {\n\t\t\tlet timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n\t\t\tconst cleanup = () => {\n\t\t\t\tif (timeoutId) clearTimeout(timeoutId);\n\t\t\t\topts?.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\t\tpendingExtensionRequests.delete(id);\n\t\t\t};\n\n\t\t\tconst onAbort = () => {\n\t\t\t\tcleanup();\n\t\t\t\tresolve(defaultValue);\n\t\t\t};\n\t\t\topts?.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\t\tif (opts?.timeout) {\n\t\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\t\tcleanup();\n\t\t\t\t\tresolve(defaultValue);\n\t\t\t\t}, opts.timeout);\n\t\t\t}\n\n\t\t\tpendingExtensionRequests.set(id, {\n\t\t\t\tresolve: (response: RpcExtensionUIResponse) => {\n\t\t\t\t\tcleanup();\n\t\t\t\t\tresolve(parseResponse(response));\n\t\t\t\t},\n\t\t\t\tcancel: () => {\n\t\t\t\t\tcleanup();\n\t\t\t\t\tresolve(defaultValue);\n\t\t\t\t},\n\t\t\t});\n\t\t\toutput({ type: \"extension_ui_request\", id, ...request } as RpcExtensionUIRequest);\n\t\t});\n\t}\n\n\t/**\n\t * Create an extension UI context that uses the RPC protocol.\n\t */\n\tconst createExtensionUIContext = (): ExtensionUIContext => ({\n\t\tselect: (title, options, opts) =>\n\t\t\tcreateDialogPromise(opts, undefined, { method: \"select\", title, options, timeout: opts?.timeout }, (r) =>\n\t\t\t\t\"cancelled\" in r && r.cancelled ? undefined : \"value\" in r ? r.value : undefined,\n\t\t\t),\n\n\t\tconfirm: (title, message, opts) =>\n\t\t\tcreateDialogPromise(opts, false, { method: \"confirm\", title, message, timeout: opts?.timeout }, (r) =>\n\t\t\t\t\"cancelled\" in r && r.cancelled ? false : \"confirmed\" in r ? r.confirmed : false,\n\t\t\t),\n\n\t\tinput: (title, placeholder, opts) =>\n\t\t\tcreateDialogPromise(opts, undefined, { method: \"input\", title, placeholder, timeout: opts?.timeout }, (r) =>\n\t\t\t\t\"cancelled\" in r && r.cancelled ? undefined : \"value\" in r ? r.value : undefined,\n\t\t\t),\n\n\t\tnotify(message: string, type?: \"info\" | \"warning\" | \"error\"): void {\n\t\t\t// Fire and forget - no response needed\n\t\t\toutput({\n\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\tmethod: \"notify\",\n\t\t\t\tmessage,\n\t\t\t\tnotifyType: type,\n\t\t\t} as RpcExtensionUIRequest);\n\t\t},\n\n\t\tonTerminalInput(): () => void {\n\t\t\t// Raw terminal input not supported in RPC mode\n\t\t\treturn () => {};\n\t\t},\n\n\t\tsetStatus(key: string, text: string | undefined): void {\n\t\t\t// Fire and forget - no response needed\n\t\t\toutput({\n\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\tmethod: \"setStatus\",\n\t\t\t\tstatusKey: key,\n\t\t\t\tstatusText: text,\n\t\t\t} as RpcExtensionUIRequest);\n\t\t},\n\n\t\tsetWorkingMessage(_message?: string): void {\n\t\t\t// Working message not supported in RPC mode - requires TUI loader access\n\t\t},\n\n\t\tsetWorkingVisible(_visible: boolean): void {\n\t\t\t// Working visibility not supported in RPC mode - requires TUI loader access\n\t\t},\n\n\t\tsetWorkingIndicator(_options?: WorkingIndicatorOptions): void {\n\t\t\t// Working indicator customization not supported in RPC mode - requires TUI loader access\n\t\t},\n\n\t\tsetHiddenThinkingLabel(_label?: string): void {\n\t\t\t// Hidden thinking label not supported in RPC mode - requires TUI message rendering access\n\t\t},\n\n\t\tsetWidget(key: string, content: unknown, options?: ExtensionWidgetOptions): void {\n\t\t\t// Only support string arrays in RPC mode - factory functions are ignored\n\t\t\tif (content === undefined || Array.isArray(content)) {\n\t\t\t\toutput({\n\t\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\t\tmethod: \"setWidget\",\n\t\t\t\t\twidgetKey: key,\n\t\t\t\t\twidgetLines: content as string[] | undefined,\n\t\t\t\t\twidgetPlacement: options?.placement,\n\t\t\t\t} as RpcExtensionUIRequest);\n\t\t\t}\n\t\t\t// Component factories are not supported in RPC mode - would need TUI access\n\t\t},\n\n\t\tsetFooter(_factory: unknown): void {\n\t\t\t// Custom footer not supported in RPC mode - requires TUI access\n\t\t},\n\n\t\tsetHeader(_factory: unknown): void {\n\t\t\t// Custom header not supported in RPC mode - requires TUI access\n\t\t},\n\n\t\tsetTitle(title: string): void {\n\t\t\t// Fire and forget - host can implement terminal title control\n\t\t\toutput({\n\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\tmethod: \"setTitle\",\n\t\t\t\ttitle,\n\t\t\t} as RpcExtensionUIRequest);\n\t\t},\n\n\t\tasync custom() {\n\t\t\t// Custom UI not supported in RPC mode\n\t\t\treturn undefined as never;\n\t\t},\n\n\t\tpasteToEditor(text: string): void {\n\t\t\t// Paste handling not supported in RPC mode - falls back to setEditorText\n\t\t\tthis.setEditorText(text);\n\t\t},\n\n\t\tsetEditorText(text: string): void {\n\t\t\t// Fire and forget - host can implement editor control\n\t\t\toutput({\n\t\t\t\ttype: \"extension_ui_request\",\n\t\t\t\tid: crypto.randomUUID(),\n\t\t\t\tmethod: \"set_editor_text\",\n\t\t\t\ttext,\n\t\t\t} as RpcExtensionUIRequest);\n\t\t},\n\n\t\tgetEditorText(): string {\n\t\t\t// Synchronous method can't wait for RPC response\n\t\t\t// Host should track editor state locally if needed\n\t\t\treturn \"\";\n\t\t},\n\n\t\tasync editor(title: string, prefill?: string): Promise<string | undefined> {\n\t\t\tif (shuttingDown) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst id = crypto.randomUUID();\n\t\t\treturn new Promise((resolve) => {\n\t\t\t\tconst cleanup = () => {\n\t\t\t\t\tpendingExtensionRequests.delete(id);\n\t\t\t\t};\n\t\t\t\tpendingExtensionRequests.set(id, {\n\t\t\t\t\tresolve: (response: RpcExtensionUIResponse) => {\n\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\tif (\"cancelled\" in response && response.cancelled) {\n\t\t\t\t\t\t\tresolve(undefined);\n\t\t\t\t\t\t} else if (\"value\" in response) {\n\t\t\t\t\t\t\tresolve(response.value);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresolve(undefined);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tcancel: () => {\n\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\tresolve(undefined);\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\toutput({ type: \"extension_ui_request\", id, method: \"editor\", title, prefill } as RpcExtensionUIRequest);\n\t\t\t});\n\t\t},\n\n\t\taddAutocompleteProvider(): void {\n\t\t\t// Autocomplete provider composition is not supported in RPC mode\n\t\t},\n\n\t\tsetEditorComponent(): void {\n\t\t\t// Custom editor components not supported in RPC mode\n\t\t},\n\n\t\tgetEditorComponent() {\n\t\t\t// Custom editor components not supported in RPC mode\n\t\t\treturn undefined;\n\t\t},\n\n\t\tget theme() {\n\t\t\treturn theme;\n\t\t},\n\n\t\tgetAllThemes() {\n\t\t\treturn getAvailableThemesWithPaths();\n\t\t},\n\n\t\tgetTheme(name: string) {\n\t\t\treturn getThemeByName(name);\n\t\t},\n\n\t\tsetTheme(themeOrName: string | Theme) {\n\t\t\t// Applies to this process's theme instance and persists the choice; a\n\t\t\t// daemon host observes the change and broadcasts a theme_snapshot. No\n\t\t\t// hot-reload watcher in rpc mode (that is the rendering TUI's job).\n\t\t\tif (themeOrName instanceof Theme) {\n\t\t\t\tsetThemeInstance(themeOrName);\n\t\t\t\treturn { success: true };\n\t\t\t}\n\t\t\tconst result = setTheme(themeOrName, false);\n\t\t\tif (result.success && session.settingsManager.getTheme() !== themeOrName) {\n\t\t\t\tsession.settingsManager.setTheme(themeOrName);\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\n\t\tgetToolsExpanded() {\n\t\t\t// Tool expansion not supported in RPC mode - no TUI\n\t\t\treturn false;\n\t\t},\n\n\t\tsetToolsExpanded(_expanded: boolean) {\n\t\t\t// Tool expansion not supported in RPC mode - no TUI\n\t\t},\n\t});\n\n\t// When a phone relays through a running TUI the SAME runtimeHost is shared and\n\t// survives this mode (shouldDisposeRuntimeOnClose === false). Capture the TUI's\n\t// own rebind handler so it can be restored on exit; otherwise the TUI's session\n\t// changes would keep running this RPC-mode handler after the phone disconnects.\n\tconst previousRebindSession = runtimeHost.getRebindSession?.();\n\truntimeHost.setRebindSession(async () => {\n\t\tawait rebindSession();\n\t});\n\tconst restoreRebindSession = (): void => {\n\t\tif (!shouldDisposeRuntimeOnClose) {\n\t\t\truntimeHost.setRebindSession(previousRebindSession);\n\t\t}\n\t};\n\n\tconst notifySessionChanged = async (): Promise<void> => {\n\t\t// Fire on a new session OBJECT, not just a new sessionId. A same-file\n\t\t// drain/reacquire reload produces a fresh AgentSession with the identical\n\t\t// sessionId; consumers (notably the iroh transcript-entry / live-activity\n\t\t// subscriptions) must rekey to the new object or they stay bound to the\n\t\t// disposed one and silently stop delivering. Same-id consumers no-op safely.\n\t\tif (options.onSessionChanged && session !== lastNotifiedSession) {\n\t\t\tlastNotifiedSession = session;\n\t\t\tawait options.onSessionChanged({ sessionFile: session.sessionFile, sessionId: session.sessionId });\n\t\t}\n\t};\n\n\tconst rebindSession = async (): Promise<void> => {\n\t\tawait rpcSubagents.disposeAll();\n\t\tsession = runtimeHost.session;\n\t\tif (shuttingDown) {\n\t\t\tawait notifySessionChanged();\n\t\t\treturn;\n\t\t}\n\t\tsetSessionHostInteraction(session);\n\t\t// Extension-provided themes resolve by name in rpc mode too (getAllThemes /\n\t\t// getTheme / setTheme), mirroring the TUI's registration at bind time.\n\t\tconst resourceThemes = session.resourceLoader?.getThemes?.().themes;\n\t\tif (resourceThemes) {\n\t\t\tsetRegisteredThemes(resourceThemes);\n\t\t}\n\t\tawait session.bindExtensions({\n\t\t\tuiContext: createExtensionUIContext(),\n\t\t\tmode: \"rpc\",\n\t\t\tcommandContextActions: {\n\t\t\t\twaitForIdle: () => session.waitForIdle(),\n\t\t\t\tnewSession: async (options) => runtimeHost.newSession(options),\n\t\t\t\tfork: async (entryId, forkOptions) => {\n\t\t\t\t\tconst result = await runtimeHost.fork(entryId, forkOptions);\n\t\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t\t},\n\t\t\t\tnavigateTree: async (targetId, options) => {\n\t\t\t\t\tconst result = await session.navigateTree(targetId, {\n\t\t\t\t\t\tsummarize: options?.summarize,\n\t\t\t\t\t\tcustomInstructions: options?.customInstructions,\n\t\t\t\t\t\treplaceInstructions: options?.replaceInstructions,\n\t\t\t\t\t\tlabel: options?.label,\n\t\t\t\t\t});\n\t\t\t\t\treturn { cancelled: result.cancelled };\n\t\t\t\t},\n\t\t\t\tswitchSession: async (sessionPath, options) => {\n\t\t\t\t\treturn runtimeHost.switchSession(sessionPath, options);\n\t\t\t\t},\n\t\t\t\treload: async () => {\n\t\t\t\t\tawait session.reload();\n\t\t\t\t},\n\t\t\t},\n\t\t\tshutdownHandler: () => {\n\t\t\t\tshutdownRequested = true;\n\t\t\t},\n\t\t\tonError: (err) => {\n\t\t\t\toutput({ type: \"extension_error\", extensionPath: err.extensionPath, event: err.event, error: err.error });\n\t\t\t},\n\t\t});\n\t\tif (shuttingDown) return;\n\t\tawait notifySessionChanged();\n\n\t\tunsubscribe?.();\n\t\tunsubscribeBackpressure?.();\n\t\tunsubscribe = session.subscribe((event) => {\n\t\t\toutput(createRpcSessionEventPayload(event));\n\t\t});\n\t\tunsubscribeBackpressure = session.agent.subscribe(async () => {\n\t\t\ttry {\n\t\t\t\tawait waitForTransportBackpressure();\n\t\t\t} catch (transportError: unknown) {\n\t\t\t\trequestTransportFailureShutdown(transportError);\n\t\t\t}\n\t\t});\n\t};\n\n\tconst handleReviewWorkflowEvent = (event: ReviewWorkflowEvent | ReviewWorkflowToolEvent): void => {\n\t\ttry {\n\t\t\tconst result = options.onWorkflowEvent?.(event);\n\t\t\tif (result) {\n\t\t\t\tvoid Promise.resolve(result).catch(() => {});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tvoid error;\n\t\t}\n\t\toutput(event);\n\t};\n\n\tconst createHostActionContext = (): HostActionInvocationContext => ({\n\t\tsession,\n\t\tabortRun: () => session.abort(),\n\t\tcompactContext: (customInstructions) => session.compact(customInstructions),\n\t\tnewSession: (newSessionOptions) => runtimeHost.newSession(newSessionOptions),\n\t\tafterSessionSwitch: rebindSession,\n\t\trenameSession: (name) => {\n\t\t\tsession.setSessionName(name);\n\t\t},\n\t\tsetThinkingLevel: (level, options) => {\n\t\t\tsession.setThinkingLevel(level, options);\n\t\t},\n\t\tsetFastModeRestoreThinkingLevel: (level) => {\n\t\t\tsession.setFastModeRestoreThinkingLevel(level);\n\t\t},\n\t\trunReviewAction: (target, reviewOptions) =>\n\t\t\trunReviewWorkflow({\n\t\t\t\ttarget,\n\t\t\t\tcwd: runtimeHost.cwd,\n\t\t\t\tagentDir: runtimeHost.services.agentDir,\n\t\t\t\tsession,\n\t\t\t\tnewSession: async (newSessionOptions) => {\n\t\t\t\t\tconst result = await runtimeHost.newSession(newSessionOptions);\n\t\t\t\t\tif (!result.cancelled) {\n\t\t\t\t\t\tawait rebindSession();\n\t\t\t\t\t}\n\t\t\t\t\treturn result;\n\t\t\t\t},\n\t\t\t\tauthStorage: session.modelRegistry.authStorage,\n\t\t\t\tsettingsManager: session.settingsManager,\n\t\t\t\ttools: REMOTE_REVIEW_TOOL_NAMES,\n\t\t\t\trequireProjectTrust: reviewOptions.remote,\n\t\t\t\trequireConfirmation: reviewOptions.requireConfirmation,\n\t\t\t\tconfirm: ({ title, message }) => createExtensionUIContext().confirm(title, message),\n\t\t\t\tonEvent: handleReviewWorkflowEvent,\n\t\t\t}),\n\t});\n\n\tconst createRpcCommandContext = () => ({\n\t\tsession,\n\t\truntimeHost,\n\t\toptions: {\n\t\t\tallowUiActionInvocation,\n\t\t\trequireRemoteSafeUiActions,\n\t\t\tregisterPushTarget: options.registerPushTarget,\n\t\t},\n\t\toutput,\n\t\trebindSession,\n\t\tcreateHostActionContext,\n\t\tsetClientCapabilities(features: RpcClientCapabilityFeature[]): void {\n\t\t\tclientCapabilities = new Set(\n\t\t\t\tfeatures.filter((feature): feature is RpcClientCapabilityFeature => typeof feature === \"string\"),\n\t\t\t);\n\t\t\toptions.onClientCapabilitiesChanged?.(Array.from(clientCapabilities));\n\t\t},\n\t\tgetPendingHostActionRequests: () => hostActionBridge.getPendingRequests(),\n\t\tcancelPendingHostActionRequests,\n\t\tsubagents: rpcSubagents,\n\t});\n\n\tlet detachInput = () => {};\n\tlet detachClose = () => {};\n\tlet resolveModeClosed: (() => void) | undefined;\n\tlet rejectModeClosed: ((error: unknown) => void) | undefined;\n\tconst modeClosed = new Promise<void>((resolve, reject) => {\n\t\tresolveModeClosed = resolve;\n\t\trejectModeClosed = reject;\n\t});\n\tlet shutdownPromise: Promise<void> | undefined;\n\n\tconst registerSignalHandlers = (): void => {\n\t\tconst signals: NodeJS.Signals[] = [\"SIGTERM\"];\n\t\tif (process.platform !== \"win32\") {\n\t\t\tsignals.push(\"SIGHUP\");\n\t\t}\n\n\t\tfor (const signal of signals) {\n\t\t\tconst handler = () => {\n\t\t\t\tkillTrackedDetachedChildren();\n\t\t\t\tvoid shutdown(signal === \"SIGHUP\" ? 129 : 143, signal);\n\t\t\t};\n\t\t\tprocess.on(signal, handler);\n\t\t\tsignalCleanupHandlers.push(() => process.off(signal, handler));\n\t\t}\n\t};\n\n\tconst cleanupStartupFailure = async (): Promise<void> => {\n\t\tshuttingDown = true;\n\t\ttry {\n\t\t\trestoreRebindSession();\n\t\t\tstopModelCatalogWatcher();\n\t\t\tcancelPendingExtensionRequests();\n\t\t\tdetachHostActionBridge();\n\t\t\tawait rpcSubagents.disposeAll();\n\t\t\tif (shouldDisposeRuntimeOnClose) {\n\t\t\t\tcancelPendingHostActionRequests();\n\t\t\t}\n\t\t\tfor (const cleanup of signalCleanupHandlers) {\n\t\t\t\tcleanup();\n\t\t\t}\n\t\t\tunsubscribe?.();\n\t\t\tunsubscribeBackpressure?.();\n\t\t\tif (shouldDisposeRuntimeOnClose) {\n\t\t\t\tawait runtimeHost.dispose();\n\t\t\t}\n\t\t\tdetachInput();\n\t\t\tdetachClose();\n\t\t} finally {\n\t\t\ttry {\n\t\t\t\tawait transport.close();\n\t\t\t} finally {\n\t\t\t\tif (shouldRestoreStdout) {\n\t\t\t\t\trestoreStdout();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\tlet startupComplete = false;\n\tlet startupAbortError: Error | undefined;\n\tconst queuedStartupCommandLines: string[] = [];\n\n\t/**\n\t * Check if shutdown was requested and perform shutdown if so.\n\t * Called after handling each command when waiting for the next command.\n\t */\n\tfunction shutdown(exitCode = 0, signal?: NodeJS.Signals, failure?: { error: unknown }): Promise<void> {\n\t\tif (!startupComplete) {\n\t\t\tvoid modeClosed.catch(() => {});\n\t\t\tif (!startupAbortError) {\n\t\t\t\tif (failure) {\n\t\t\t\t\tstartupAbortError = toError(failure.error);\n\t\t\t\t} else if (signal) {\n\t\t\t\t\tstartupAbortError = new Error(`RPC mode shut down during startup by ${signal}`);\n\t\t\t\t} else {\n\t\t\t\t\tstartupAbortError = new Error(\"RPC mode shut down during startup\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tstopModelCatalogWatcher();\n\t\tcancelPendingExtensionRequests();\n\t\tdetachHostActionBridge();\n\t\tif (shouldDisposeRuntimeOnClose) {\n\t\t\tcancelPendingHostActionRequests();\n\t\t}\n\t\tif (shuttingDown) {\n\t\t\tif (shouldExitProcess) {\n\t\t\t\tprocess.exit(exitCode);\n\t\t\t}\n\t\t\treturn shutdownPromise ?? modeClosed;\n\t\t}\n\t\tshuttingDown = true;\n\t\tshutdownPromise = (async () => {\n\t\t\ttry {\n\t\t\t\tlet hasShutdownError = failure !== undefined;\n\t\t\t\tlet shutdownError: unknown = failure?.error;\n\t\t\t\ttry {\n\t\t\t\t\trestoreRebindSession();\n\t\t\t\t\tfor (const cleanup of signalCleanupHandlers) {\n\t\t\t\t\t\tcleanup();\n\t\t\t\t\t}\n\t\t\t\t\tunsubscribe?.();\n\t\t\t\t\tunsubscribeBackpressure?.();\n\t\t\t\t\tawait rpcSubagents.disposeAll();\n\t\t\t\t\tif (shouldDisposeRuntimeOnClose) {\n\t\t\t\t\t\tawait runtimeHost.dispose();\n\t\t\t\t\t}\n\t\t\t\t\tdetachInput();\n\t\t\t\t\tdetachClose();\n\t\t\t\t\tif (signal !== \"SIGTERM\" && !hasShutdownError) {\n\t\t\t\t\t\tawait waitForTransportBackpressure();\n\t\t\t\t\t\tawait transport.flush?.();\n\t\t\t\t\t}\n\t\t\t\t} catch (error: unknown) {\n\t\t\t\t\tif (!hasShutdownError) {\n\t\t\t\t\t\thasShutdownError = true;\n\t\t\t\t\t\tshutdownError = error;\n\t\t\t\t\t}\n\t\t\t\t} finally {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait transport.close();\n\t\t\t\t\t} catch (closeError: unknown) {\n\t\t\t\t\t\tif (!hasShutdownError) {\n\t\t\t\t\t\t\thasShutdownError = true;\n\t\t\t\t\t\t\tshutdownError = closeError;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (shouldRestoreStdout) {\n\t\t\t\t\t\trestoreStdout();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (hasShutdownError) {\n\t\t\t\t\tthrow shutdownError;\n\t\t\t\t}\n\t\t\t\tif (shouldExitProcess) {\n\t\t\t\t\tprocess.exit(exitCode);\n\t\t\t\t}\n\t\t\t\tresolveModeClosed?.();\n\t\t\t} catch (shutdownError: unknown) {\n\t\t\t\trejectModeClosed?.(shutdownError);\n\t\t\t\tthrow shutdownError;\n\t\t\t}\n\t\t})();\n\t\treturn shutdownPromise;\n\t}\n\n\tasync function checkShutdownRequested(): Promise<void> {\n\t\tif (!shutdownRequested) return;\n\t\tawait shutdown();\n\t}\n\n\tlet commandQueue: Promise<void> = Promise.resolve();\n\tlet pendingInputTaskCount = 0;\n\n\tconst handleControlMessage = (parsed: unknown): boolean => {\n\t\t// Handle extension UI and host action responses during startup as well as normal operation.\n\t\tif (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed) || !(\"type\" in parsed)) {\n\t\t\treturn false;\n\t\t}\n\t\tif (parsed.type === \"extension_ui_response\") {\n\t\t\tconst response = parsed as RpcExtensionUIResponse;\n\t\t\tconst pending = pendingExtensionRequests.get(response.id);\n\t\t\tif (pending) {\n\t\t\t\tpendingExtensionRequests.delete(response.id);\n\t\t\t\tpending.resolve(response);\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\tif (parsed.type === \"host_action_response\") {\n\t\t\tconst response = parsed as RpcHostActionResponse;\n\t\t\tconst decision = parseHostActionResponseDecision(response.decision);\n\t\t\tif (decision) {\n\t\t\t\thostActionBridge.resolveResponse({ ...response, decision });\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t};\n\n\tconst handleQueuedParsedInput = async (parsed: unknown): Promise<void> => {\n\t\tif (shuttingDown) {\n\t\t\treturn;\n\t\t}\n\t\tif (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n\t\t\tconst target = getRpcErrorResponseTarget(parsed);\n\t\t\toutput(createRpcErrorResponse(target.id, target.command, `Unknown command: ${target.command}`));\n\t\t\tawait waitForTransportBackpressure();\n\t\t\treturn;\n\t\t}\n\n\t\tconst validationError = validateRpcCommandPayload(parsed);\n\t\tif (validationError) {\n\t\t\tconst target = getRpcErrorResponseTarget(parsed);\n\t\t\toutput(createRpcErrorResponse(target.id, target.command, validationError));\n\t\t\tawait waitForTransportBackpressure();\n\t\t\tawait checkShutdownRequested();\n\t\t\treturn;\n\t\t}\n\n\t\tconst command = parsed as RpcCommand;\n\t\tlet response: RpcResponse | undefined;\n\t\ttry {\n\t\t\tresponse = await handleRpcCommand(command, createRpcCommandContext());\n\t\t} catch (commandError: unknown) {\n\t\t\tconst target = getRpcErrorResponseTarget(command);\n\t\t\toutput(createRpcErrorResponse(target.id, target.command, toError(commandError).message));\n\t\t\tawait waitForTransportBackpressure();\n\t\t\tawait checkShutdownRequested();\n\t\t\treturn;\n\t\t}\n\t\tif (response && !shuttingDown) {\n\t\t\toutput(response);\n\t\t\tawait waitForTransportBackpressure();\n\t\t}\n\t\tawait checkShutdownRequested();\n\t};\n\n\tconst enqueueInputTask = (task: () => Promise<void>): boolean => {\n\t\tif (pendingInputTaskCount >= MAX_PENDING_RPC_INPUT_TASKS) {\n\t\t\treturn false;\n\t\t}\n\t\tpendingInputTaskCount++;\n\t\tconst runTask = async (): Promise<void> => {\n\t\t\ttry {\n\t\t\t\tawait task();\n\t\t\t} catch (inputError: unknown) {\n\t\t\t\tawait shutdown(1, undefined, { error: toError(inputError) }).catch(() => {});\n\t\t\t} finally {\n\t\t\t\tpendingInputTaskCount--;\n\t\t\t}\n\t\t};\n\t\tcommandQueue = commandQueue.then(runTask, runTask);\n\t\tvoid commandQueue.catch(() => {});\n\t\treturn true;\n\t};\n\n\tconst rejectInputTaskOverflow = (): Promise<void> => {\n\t\treturn shutdown(1, undefined, {\n\t\t\terror: new Error(`RPC input queue exceeds ${MAX_PENDING_RPC_INPUT_TASKS} tasks`),\n\t\t}).catch(() => {});\n\t};\n\n\tconst processInputLine = (line: string): Promise<void> => {\n\t\tif (shuttingDown) {\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(line);\n\t\t} catch (parseError: unknown) {\n\t\t\tconst enqueued = enqueueInputTask(async () => {\n\t\t\t\tif (shuttingDown) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\toutput(\n\t\t\t\t\tcreateRpcErrorResponse(\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\"parse\",\n\t\t\t\t\t\t`Failed to parse command: ${parseError instanceof Error ? parseError.message : String(parseError)}`,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tawait waitForTransportBackpressure();\n\t\t\t});\n\t\t\treturn enqueued ? Promise.resolve() : rejectInputTaskOverflow();\n\t\t}\n\n\t\tif (handleControlMessage(parsed)) {\n\t\t\treturn Promise.resolve();\n\t\t}\n\n\t\tif (!startupComplete) {\n\t\t\tif (queuedStartupCommandLines.length >= MAX_PENDING_RPC_INPUT_TASKS) {\n\t\t\t\treturn rejectInputTaskOverflow();\n\t\t\t}\n\t\t\tqueuedStartupCommandLines.push(line);\n\t\t\treturn Promise.resolve();\n\t\t}\n\n\t\treturn enqueueInputTask(() => handleQueuedParsedInput(parsed)) ? Promise.resolve() : rejectInputTaskOverflow();\n\t};\n\n\tdetachInput = transport.onLine(processInputLine);\n\tdetachClose =\n\t\ttransport.onClose?.((transportError) => {\n\t\t\tif (transportError) {\n\t\t\t\tvoid shutdown(1, undefined, { error: transportError }).catch(() => {});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!startupComplete) {\n\t\t\t\tvoid shutdown(0, undefined, { error: new Error(\"RPC transport closed during startup\") }).catch(() => {});\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvoid shutdown().catch(() => {});\n\t\t}) ?? (() => {});\n\n\ttry {\n\t\tawait rebindSession();\n\t} catch (startupError: unknown) {\n\t\tif (shuttingDown) {\n\t\t\ttry {\n\t\t\t\tawait shutdownPromise;\n\t\t\t} catch {}\n\t\t\tthrow startupAbortError ?? startupError;\n\t\t}\n\t\ttry {\n\t\t\tawait cleanupStartupFailure();\n\t\t} catch {}\n\t\tthrow startupError;\n\t}\n\tif (shuttingDown) {\n\t\ttry {\n\t\t\tawait shutdownPromise;\n\t\t} catch {}\n\t\tthrow startupAbortError ?? new Error(\"RPC mode shut down during startup\");\n\t}\n\tstartupComplete = true;\n\tstartupAwareTransport.setRpcModeStartupComplete?.(true);\n\t// Notify connected clients when logins or API keys saved by other volt\n\t// processes change the selectable model catalog on disk.\n\tstopModelCatalogWatcher = startModelCatalogWatcher({\n\t\tagentDir: runtimeHost.services?.agentDir,\n\t\tgetModelRegistry: () => session.modelRegistry,\n\t\tonCatalogChanged: () => output({ type: \"models_changed\" }),\n\t});\n\tfor (const line of queuedStartupCommandLines.splice(0)) {\n\t\t// These lines were admitted into the bounded pre-startup queue before an\n\t\t// async-aware transport could apply steady-state per-line backpressure.\n\t\t// Preserve detached review workflows by scheduling them onto commandQueue\n\t\t// without holding RPC-mode startup open until a long-running action ends.\n\t\tvoid processInputLine(line);\n\t}\n\tif (shouldExitProcess) {\n\t\tregisterSignalHandlers();\n\t}\n\ttry {\n\t\toptions.onReady?.();\n\t} catch (readyError: unknown) {\n\t\tvoid modeClosed.catch(() => {});\n\t\tawait shutdown(1, undefined, { error: readyError });\n\t\tthrow readyError;\n\t}\n\n\t// Keep RPC mode active until shutdown completes.\n\treturn modeClosed;\n}\n"]}
|