@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":"conversation-commands.d.ts","sourceRoot":"","sources":["../../src/daemon/conversation-commands.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,sCAAsC,CAAC;AAGjG,OAAO,EAEN,KAAK,0BAA0B,EAC/B,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,sCAAsC,CAAC;AAUvF,OAAO,EAIN,KAAK,4BAA4B,EACjC,MAAM,qCAAqC,CAAC;AAE7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAA2C,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACrG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,eAAO,MAAM,6CAA6C,EAAE,WAAW,CAAC,MAAM,CAI5E,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,EAAE,WAAW,CAAC,MAAM,CAKxD,CAAC;AAEH,eAAO,MAAM,6BAA6B,OAAO,CAAC;AAElD,eAAO,MAAM,iCAAiC,KAAK,CAAC;AACpD,eAAO,MAAM,6BAA6B,MAAM,CAAC;AACjD,eAAO,MAAM,iCAAiC,QAAiB,CAAC;AAChE,eAAO,MAAM,oCAAoC,MAAM,CAAC;AACxD;;;;;;;GAOG;AACH,eAAO,MAAM,0CAA0C,KAAK,CAAC;AAQ7D,eAAO,MAAM,8BAA8B,OAAQ,CAAC;AAEpD,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1E,MAAM,MAAM,yBAAyB,GAAG,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AAEvE,MAAM,WAAW,sBAAsB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,wFAAwF;IACxF,YAAY,CAAC,EAAE,yBAAyB,CAAC;IACzC,qFAAqF;IACrF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,4BAA4B;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,sBAAsB,EAAE,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,yEAAyE;AACzE,MAAM,WAAW,0BAA0B;IAC1C,OAAO,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;KAClD,CAAC;IACF,YAAY,IAAI,OAAO,CACtB,KAAK,CAAC;QACL,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,UAAU,CAAC;KACpB,CAAC,CACF,CAAC;CACF;AAED,MAAM,WAAW,0BAA0B;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC,UAAU,CAAC,EAAE;QAAE,8BAA8B,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC7E,YAAY,EAAE,0BAA0B,CAAC;IACzC,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;IAC9D,sBAAsB,EAAE,MAAM,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,8FAA8F;IAC9F,iBAAiB,CAAC,EAAE,CACnB,aAAa,EAAE,MAAM,KACjB,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;IAC9G,mFAAkF;IAClF,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;IAC3B;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC;IAClC,yGAAyG;IACzG,uBAAuB,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,0FAA0F;IAC1F,SAAS,CAAC,EAAE;QACX,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,CAAC;QAC9C,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;KACjC,CAAC;IACF,gFAAgF;IAChF,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAChD,8FAA8F;IAC9F,YAAY,CAAC,EAAE;QACd,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;QACjC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;KAC7B,CAAC;IACF;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,CAAC,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,4BAA4B,CAAC;CACpG;AAED,wBAAgB,mCAAmC,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAatG;AAED,wBAAgB,6CAA6C,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAYhH;AAiBD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAErF;AAED,wBAAgB,wBAAwB,CACvC,EAAE,EAAE,MAAM,GAAG,SAAS,EACtB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQzB;AAyGD,MAAM,WAAW,oBAAoB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB;;8BAE0B;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC1B;AAgmBD,wBAAgB,oCAAoC,CACnD,OAAO,EAAE,gBAAgB,EACzB,aAAa,EAAE,oCAAoC,EACnD,OAAO,EAAE,0BAA0B,GACjC,MAAM,CAgBR;AAED,wBAAgB,uCAAuC,CACtD,OAAO,EAAE,gBAAgB,EACzB,aAAa,EAAE,oCAAoC,EACnD,OAAO,EAAE,0BAA0B,GACjC,MAAM,CA4BR;AA0CD,UAAU,oBAAoB;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,sBAAsB,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AA4BD,wBAAsB,mCAAmC,CACxD,aAAa,EAAE,oCAAoC,EACnD,OAAO,EAAE,0BAA0B,EACnC,OAAO,CAAC,EAAE,0BAA0B,GAClC,OAAO,CAAC,oBAAoB,EAAE,CAAC,CA+EjC;AAmHD,wBAAsB,mCAAmC,CACxD,OAAO,EAAE,gBAAgB,EACzB,aAAa,EAAE,oCAAoC,EACnD,OAAO,EAAE,0BAA0B,EACnC,OAAO,CAAC,EAAE,0BAA0B,GAClC,OAAO,CAAC,MAAM,CAAC,CA+BjB;AAqHD,wBAAsB,2CAA2C,CAChE,OAAO,EAAE,gBAAgB,EACzB,aAAa,EAAE,oCAAoC,EACnD,OAAO,EAAE,0BAA0B,EACnC,iBAAiB,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC,CAyDjB;AAED,wBAAsB,6CAA6C,CAClE,OAAO,EAAE,gBAAgB,EACzB,aAAa,EAAE,oCAAoC,EACnD,OAAO,EAAE,0BAA0B,EACnC,iBAAiB,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC,CAkBjB;AAMD,wBAAgB,sCAAsC,CACrD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,aAAa,EAAE,oCAAoC,EACnD,OAAO,EAAE,0BAA0B,GACjC,MAAM,GAAG,SAAS,CAiBpB;AA+BD,wBAAsB,0BAA0B,CAC/C,OAAO,EAAE,gBAAgB,EACzB,aAAa,EAAE,oCAAoC,EACnD,OAAO,EAAE,0BAA0B,GACjC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAwE7B;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACzC,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,0BAA0B,GACjC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,0BAA0B,CAetD;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC5C,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,0BAA0B,GACjC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,0BAA0B,CAmBtD;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG,kBAAkB,CAMhF;AAMD;;;;;GAKG;AACH,wBAAsB,sCAAsC,CAC3D,OAAO,EAAE,gBAAgB,EACzB,aAAa,EAAE,oCAAoC,EACnD,OAAO,EAAE,0BAA0B,EACnC,OAAO,EAAE,0BAA0B,GACjC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAmD7B","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport { randomUUID } from \"node:crypto\";\nimport { isAbsolute, relative, resolve, sep } from \"node:path\";\nimport type { IrohRemoteAuditLogger } from \"../core/remote/iroh/audit.ts\";\nimport type { IrohRemoteClientAuthorizationSuccess } from \"../core/remote/iroh/authorization.ts\";\nimport { handleIrohRemoteDeviceLogUploadRpcCommand } from \"../core/remote/iroh/device-log-rpc.ts\";\nimport { sanitizeIrohRemoteOutbound } from \"../core/remote/iroh/outbound-filter.ts\";\nimport {\n\tcreateIrohRemoteRpcErrorResponse,\n\ttype IrohRemoteRpcErrorResponse,\n} from \"../core/remote/iroh/rpc-command-filter.ts\";\nimport type { IrohRemoteHostStateManager } from \"../core/remote/iroh/state-manager.ts\";\nimport {\n\ttype IrohRemoteTranscriptTextLayout,\n\tsanitizeIrohRemoteTranscriptText,\n} from \"../core/remote/iroh/transcript-text.ts\";\nimport { getIrohRemoteWorkspaceAvailabilityStatus } from \"../core/remote/iroh/workspace.ts\";\nimport {\n\thandleIrohRemoteWorkspaceUnregisterRpcCommand,\n\tIROH_REMOTE_UNREGISTER_WORKSPACE_RPC_TYPE,\n} from \"../core/remote/iroh/workspace-rpc.ts\";\nimport {\n\thandleIrohRemoteWorktreeRpcCommand,\n\tIROH_REMOTE_CREATE_WORKTREE_RPC_TYPE,\n\tIROH_REMOTE_LIST_WORKTREES_RPC_TYPE,\n\ttype IrohRemoteWorktreeRpcBackend,\n} from \"../core/remote/iroh/worktree-rpc.ts\";\nimport { extractMessageImages, projectMessageImages } from \"../core/rpc/transcript.ts\";\nimport type { RpcKeepAwakeStatus } from \"../core/rpc/types.ts\";\nimport { getDefaultSessionDir, type SessionEntry, SessionManager } from \"../core/session-manager.ts\";\nimport type { KeepAwakeStatus } from \"./keep-awake.ts\";\nimport type { LeaseState } from \"./lease-broker.ts\";\nimport { getRegisteredWorkingDirectoryForWorktree } from \"./worktree-manager.ts\";\n\nexport const INTEGRATED_CONVERSATION_UNSUPPORTED_RPC_TYPES: ReadonlySet<string> = new Set([\n\t\"new_session\",\n\t\"switch_session_by_id\",\n\t\"get_messages\",\n]);\n\n/**\n * Commands that start or extend a turn. While a lease is draining to a TUI,\n * these are rejected with `lease_draining` so the drain converges; read-only\n * commands and abort pass through.\n */\nexport const TURN_INITIATING_RPC_TYPES: ReadonlySet<string> = new Set([\n\t\"prompt\",\n\t\"invoke_ui_action\",\n\t\"steer\",\n\t\"follow_up\",\n]);\n\nexport const LEASE_DRAINING_RETRY_AFTER_MS = 1000;\n\nexport const REMOTE_SESSION_LIST_DEFAULT_LIMIT = 50;\nexport const REMOTE_SESSION_LIST_MAX_LIMIT = 200;\nexport const REMOTE_SESSION_LIST_CURSOR_TTL_MS = 10 * 60 * 1000;\nexport const REMOTE_SESSION_LIST_CURSOR_MAX_BYTES = 512;\n/**\n * Per-client cap on retained pagination cursors. The cursor map is shared across\n * every stream on the daemon; without a bound a client that never echoes the\n * returned cursor (each no-cursor list_sessions mints a fresh snapshot of up to\n * REMOTE_SESSION_LIST_MAX_LIMIT summaries) would grow it without limit for the\n * whole TTL window. Bounding per client (rather than globally) prevents one client\n * from evicting another's cursors — mirrors the push deduper's per-client cap.\n */\nexport const REMOTE_SESSION_LIST_MAX_CURSORS_PER_CLIENT = 64;\nconst REMOTE_TRANSCRIPT_DEFAULT_LIMIT = 200;\nconst REMOTE_TRANSCRIPT_MAX_LIMIT = 200;\nconst REMOTE_TRANSCRIPT_CURSOR_MAX_BYTES = 2048;\nconst REMOTE_TRANSCRIPT_CURSOR_MAX_SCALARS = 512;\nconst REMOTE_TOOL_COMMAND_MAX_SCALARS = 500;\nconst REMOTE_TOOL_ARGUMENT_MAX_SCALARS = 500;\nconst REMOTE_TOOL_ARGUMENT_KEYS_MAX = 12;\nexport const REMOTE_TOOL_OUTPUT_MAX_SCALARS = 8_000;\n\nexport type RemoteRpcCommand = Record<string, unknown> & { type: string };\n\nexport type RemoteSessionRuntimeState = Exclude<LeaseState, \"unowned\">;\n\nexport interface RemoteSessionListEntry {\n\tsessionId: string;\n\ttitle: string;\n\tcreatedAt: string;\n\tupdatedAt: string;\n\tmessageCount: number;\n\t/** \"subagent\" when this session was created for a delegated subagent run. */\n\torigin?: \"subagent\";\n\t/** Live host ownership for this session. Omitted when no runtime is currently owned. */\n\truntimeState?: RemoteSessionRuntimeState;\n\t/** Present when the session is bound to a daemon-managed worktree (worktrees.v1). */\n\tworktreeId?: string;\n\t/** POSIX-style path relative to the registered workspace root. Omitted for root. */\n\tworkingDirectory?: string;\n}\n\nexport interface RemoteSessionListCursorEntry {\n\tclientNodeId: string;\n\tworkspaceName: string;\n\tsessions: RemoteSessionListEntry[];\n\tnextIndex: number;\n\texpiresAt: number;\n}\n\n/** Minimal runtime surface the conversation command handlers consume. */\nexport interface ConversationCommandRuntime {\n\tsession: {\n\t\tsessionId: string;\n\t\tsessionManager: Pick<SessionManager, \"getBranch\">;\n\t};\n\tlistSessions(): Promise<\n\t\tArray<{\n\t\t\tsessionId: string;\n\t\t\tsessionName?: string;\n\t\t\tcreatedAt: string;\n\t\t\tmodifiedAt: string;\n\t\t\tmessageCount: number;\n\t\t\tfirstMessage: string;\n\t\t\tcwd?: string;\n\t\t\torigin?: \"subagent\";\n\t\t}>\n\t>;\n}\n\nexport interface ConversationCommandContext {\n\tagentDir?: string;\n\tauditLogger?: IrohRemoteAuditLogger;\n\thostEngine?: { clearPairingSecretForWorkspace(workspaceName: string): void };\n\tstateManager: IrohRemoteHostStateManager;\n\tsessionListCursors: Map<string, RemoteSessionListCursorEntry>;\n\tsessionListCursorTtlMs: number;\n\tnow?: () => number;\n\t/** Batch live-runtime presence for list_sessions; absent on hosts without a daemon broker. */\n\tlistRuntimeStates?: (\n\t\tworkspaceName: string,\n\t) => Promise<ReadonlyMap<string, RemoteSessionRuntimeState>> | ReadonlyMap<string, RemoteSessionRuntimeState>;\n\t/** True while this conversation's lease is draining to a TUI (§4.5 rejection). */\n\tisDraining?: () => boolean;\n\t/**\n\t * True when this conversation runtime is a subagent child session. Subagent\n\t * sessions are observe-only for remote clients: the parent agent owns the\n\t * delegated turn, so turn-initiating commands are rejected.\n\t */\n\tisSubagentSession?: () => boolean;\n\t/** Host cleanup after a successful workspace unregister (streams, runtimes, live activities, relays). */\n\tonWorkspaceUnregistered?: (workspaceName: string) => Promise<void>;\n\t/** Host keep-awake control; absent when no daemon owns the host (e.g. plain rpc mode). */\n\tkeepAwake?: {\n\t\tsetEnabled(enabled: boolean): KeepAwakeStatus;\n\t\treadonly status: KeepAwakeStatus;\n\t};\n\t/** Persist the desired keep-awake setting after a successful set_keep_awake. */\n\tonKeepAwakeSetting?: (enabled: boolean) => void;\n\t/** Host web-search key control; absent when no daemon owns the host (e.g. plain rpc mode). */\n\twebSearchKey?: {\n\t\tset(apiKey: string | null): void;\n\t\treadonly configured: boolean;\n\t};\n\t/**\n\t * Worktree RPC backend for the stream-bound workspace (worktrees.v1);\n\t * absent when no daemon owns the host (create/list_worktrees then fail\n\t * with unsupported_remote_command).\n\t */\n\tcreateWorktreeBackend?: (workspace: { name: string; path: string }) => IrohRemoteWorktreeRpcBackend;\n}\n\nexport function createLeaseDrainingRpcErrorResponse(command: RemoteRpcCommand): Record<string, unknown> {\n\tconst id = getRpcResponseId(command);\n\treturn {\n\t\t...(id === undefined ? {} : { id }),\n\t\ttype: \"response\",\n\t\tcommand: command.type,\n\t\tsuccess: false,\n\t\terror: {\n\t\t\tcode: \"lease_draining\",\n\t\t\tmessage: \"Handing off to the desktop TUI; retry shortly.\",\n\t\t\tretryAfterMs: LEASE_DRAINING_RETRY_AFTER_MS,\n\t\t},\n\t};\n}\n\nexport function createSubagentSessionReadOnlyRpcErrorResponse(command: RemoteRpcCommand): Record<string, unknown> {\n\tconst id = getRpcResponseId(command);\n\treturn {\n\t\t...(id === undefined ? {} : { id }),\n\t\ttype: \"response\",\n\t\tcommand: command.type,\n\t\tsuccess: false,\n\t\terror: {\n\t\t\tcode: \"subagent_session_read_only\",\n\t\t\tmessage: \"Subagent sessions are observe-only; prompt the parent agent instead.\",\n\t\t},\n\t};\n}\n\nfunction contextNow(context: ConversationCommandContext): number {\n\treturn (context.now ?? Date.now)();\n}\n\nasync function logAudit(\n\tauditLogger: IrohRemoteAuditLogger | undefined,\n\tevent: Parameters<IrohRemoteAuditLogger[\"log\"]>[0],\n): Promise<void> {\n\ttry {\n\t\tawait auditLogger?.log(event);\n\t} catch {\n\t\t// Audit logging is best-effort and must not change remote runtime behavior.\n\t}\n}\n\nexport function getRpcResponseId(command: Record<string, unknown>): string | undefined {\n\treturn typeof command.id === \"string\" ? command.id : undefined;\n}\n\nexport function createRpcSuccessResponse(\n\tid: string | undefined,\n\tcommand: string,\n\tdata?: Record<string, unknown>,\n): Record<string, unknown> {\n\treturn {\n\t\t...(id === undefined ? {} : { id }),\n\t\ttype: \"response\",\n\t\tcommand,\n\t\tsuccess: true,\n\t\t...(data === undefined ? {} : { data }),\n\t};\n}\n\nfunction getRemoteSanitizerOptions(authorization: IrohRemoteClientAuthorizationSuccess) {\n\treturn {\n\t\tremoteWorkspacePath: \"/workspace\",\n\t\tworkspacePath: authorization.workspace.path,\n\t};\n}\n\nfunction truncateUnicodeScalars(value: string, maxLength: number): string {\n\tconst scalars = Array.from(value);\n\treturn scalars.length <= maxLength ? value : scalars.slice(0, maxLength).join(\"\");\n}\n\nfunction sanitizeRemoteTextField(\n\tvalue: string,\n\tmaxLength: number,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n): string {\n\tconst sanitized = (\n\t\tsanitizeIrohRemoteOutbound({ value }, getRemoteSanitizerOptions(authorization)) as { value?: unknown }\n\t).value;\n\treturn truncateUnicodeScalars(typeof sanitized === \"string\" ? sanitized : \"\", maxLength);\n}\n\nfunction sanitizeRemoteTranscriptText(\n\tvalue: unknown,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n\tlayout: IrohRemoteTranscriptTextLayout = \"preserve\",\n) {\n\treturn sanitizeIrohRemoteTranscriptText(\n\t\ttypeof value === \"string\" ? value : \"\",\n\t\tgetRemoteSanitizerOptions(authorization),\n\t\tlayout,\n\t);\n}\n\n// ============================================================================\n// Transcript projection\n// ============================================================================\n\ninterface RemoteTranscriptRequest {\n\tlimit: number;\n\tbeforeEntryId?: string;\n}\n\nfunction parseRemoteTranscriptLimit(\n\tcommand: Record<string, unknown>,\n): { ok: true; limit: number } | { ok: false; error: string } {\n\tif (command.limit === undefined) {\n\t\treturn { ok: true, limit: REMOTE_TRANSCRIPT_DEFAULT_LIMIT };\n\t}\n\tif (\n\t\ttypeof command.limit !== \"number\" ||\n\t\t!Number.isFinite(command.limit) ||\n\t\t!Number.isInteger(command.limit) ||\n\t\tcommand.limit <= 0\n\t) {\n\t\treturn { ok: false, error: \"invalid_limit\" };\n\t}\n\treturn { ok: true, limit: Math.min(command.limit, REMOTE_TRANSCRIPT_MAX_LIMIT) };\n}\n\nfunction isValidRemoteTranscriptCursor(value: unknown): value is string {\n\treturn (\n\t\ttypeof value === \"string\" &&\n\t\tvalue.length > 0 &&\n\t\tArray.from(value).length <= REMOTE_TRANSCRIPT_CURSOR_MAX_SCALARS &&\n\t\tBuffer.byteLength(value, \"utf8\") <= REMOTE_TRANSCRIPT_CURSOR_MAX_BYTES\n\t);\n}\n\nfunction parseRemoteTranscriptRequest(\n\tcommand: Record<string, unknown>,\n): ({ ok: true } & RemoteTranscriptRequest) | { ok: false; error: string } {\n\tconst limit = parseRemoteTranscriptLimit(command);\n\tif (!limit.ok) {\n\t\treturn limit;\n\t}\n\tif (command.beforeEntryId !== undefined && !isValidRemoteTranscriptCursor(command.beforeEntryId)) {\n\t\treturn { ok: false, error: \"invalid_cursor\" };\n\t}\n\treturn {\n\t\tok: true,\n\t\tlimit: limit.limit,\n\t\t...(command.beforeEntryId === undefined ? {} : { beforeEntryId: command.beforeEntryId as string }),\n\t};\n}\n\nfunction extractTranscriptContentText(content: unknown): string {\n\tif (typeof content === \"string\") {\n\t\treturn content;\n\t}\n\tif (!Array.isArray(content)) {\n\t\treturn \"\";\n\t}\n\treturn content\n\t\t.filter(\n\t\t\t(part): part is { type: \"text\"; text: string } =>\n\t\t\t\tisRemoteRecord(part) && part.type === \"text\" && typeof part.text === \"string\",\n\t\t)\n\t\t.map((part) => part.text)\n\t\t.join(\"\");\n}\n\nexport interface RemoteTranscriptItem {\n\tentryId: string;\n\tcreatedAt: string;\n\trole: \"user\" | \"assistant\" | \"system\" | \"tool\";\n\ttext: string;\n\ttruncated: boolean;\n\t/** Inline image blocks persisted on the message (user attachments or tool\n\t * results such as image reads); recoverable per entry via\n\t * get_message_images. */\n\timageCount?: number;\n\ttoolName?: string;\n\tstatus?: \"completed\" | \"failed\";\n\tsummary?: string;\n\tpath?: string;\n\targs?: Record<string, unknown>;\n\tdetails?: Record<string, unknown>;\n\toutput?: string;\n\toutputTruncated?: boolean;\n}\n\n/**\n * Sanitized, bounded tool result text for remote clients. Layout is preserved\n * (unlike tool summaries) so the phone can render real output; the scalar cap\n * keeps a single transcript item within remote stream size expectations.\n */\nfunction sanitizeRemoteToolOutput(\n\tvalue: unknown,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n\thostTruncated = false,\n): { text: string; truncated: boolean } | undefined {\n\tif (typeof value !== \"string\" || value.trim().length === 0) {\n\t\treturn undefined;\n\t}\n\tconst sanitized = sanitizeRemoteTranscriptText(value, authorization, \"preserve\");\n\tconst scalars = Array.from(sanitized.text);\n\tconst truncated = sanitized.truncated || hostTruncated || scalars.length > REMOTE_TOOL_OUTPUT_MAX_SCALARS;\n\treturn {\n\t\ttext:\n\t\t\tscalars.length > REMOTE_TOOL_OUTPUT_MAX_SCALARS\n\t\t\t\t? scalars.slice(0, REMOTE_TOOL_OUTPUT_MAX_SCALARS).join(\"\")\n\t\t\t\t: sanitized.text,\n\t\ttruncated,\n\t};\n}\n\nfunction createRemoteTranscriptItem(\n\tentry: SessionEntry,\n\trole: RemoteTranscriptItem[\"role\"],\n\ttext: unknown,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n\tlayout: IrohRemoteTranscriptTextLayout = role === \"tool\" ? \"summary\" : \"preserve\",\n): RemoteTranscriptItem {\n\tconst sanitized = sanitizeRemoteTranscriptText(text, authorization, layout);\n\treturn {\n\t\tentryId: entry.id,\n\t\tcreatedAt: toRemoteSessionTimestamp(entry.timestamp),\n\t\trole,\n\t\ttext: sanitized.text,\n\t\ttruncated: sanitized.truncated,\n\t};\n}\n\ninterface RemoteToolCallRecord {\n\tid: string;\n\tname: string;\n\targuments: Record<string, unknown>;\n}\n\nfunction projectRemoteTranscriptEntry(\n\tentry: SessionEntry,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n\ttoolCallsById: Map<string, RemoteToolCallRecord>,\n): RemoteTranscriptItem | undefined {\n\tif (!entry || typeof entry !== \"object\") {\n\t\treturn undefined;\n\t}\n\tif (entry.type === \"compaction\") {\n\t\treturn createRemoteTranscriptItem(entry, \"system\", entry.summary, authorization);\n\t}\n\tif (entry.type === \"custom_message\") {\n\t\tif (entry.customType !== \"review\" || entry.display !== true) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst text = extractTranscriptContentText(entry.content);\n\t\treturn text ? createRemoteTranscriptItem(entry, \"assistant\", text, authorization) : undefined;\n\t}\n\tif (entry.type !== \"message\" || !entry.message || typeof entry.message !== \"object\") {\n\t\treturn undefined;\n\t}\n\tconst message = entry.message as unknown as Record<string, unknown>;\n\tif (message.role === \"user\" || message.role === \"assistant\") {\n\t\tconst text = extractTranscriptContentText(message.content);\n\t\tconst imageCount = message.role === \"user\" ? extractMessageImages(message.content).length : 0;\n\t\tif (!text && imageCount === 0) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst item = createRemoteTranscriptItem(entry, message.role, text, authorization);\n\t\tif (imageCount > 0) {\n\t\t\titem.imageCount = imageCount;\n\t\t}\n\t\treturn item;\n\t}\n\tif (message.role === \"toolResult\") {\n\t\tconst status = message.isError ? \"failed\" : \"completed\";\n\t\tconst toolName =\n\t\t\ttypeof message.toolName === \"string\" && message.toolName.trim() ? message.toolName.trim() : \"tool\";\n\t\tconst toolCall = typeof message.toolCallId === \"string\" ? toolCallsById.get(message.toolCallId) : undefined;\n\t\tconst args = isRemoteRecord(toolCall?.arguments) ? toolCall.arguments : undefined;\n\t\tconst path = getRemoteToolPath(toolName, args, authorization);\n\t\tconst summary = summarizeRemoteToolResult(toolName, status, args, path, authorization);\n\t\tconst item = createRemoteTranscriptItem(entry, \"tool\", summary, authorization);\n\t\titem.toolName = toolName;\n\t\titem.status = status;\n\t\titem.summary = summary;\n\t\tif (path) {\n\t\t\titem.path = path;\n\t\t}\n\t\tconst projectedArgs = projectRemoteToolArgs(toolName, args, authorization);\n\t\tif (projectedArgs) {\n\t\t\titem.args = projectedArgs;\n\t\t}\n\t\tif (toolName === \"subagent\") {\n\t\t\tconst details = projectRemoteSubagentDetails(message.details, authorization);\n\t\t\tif (details) {\n\t\t\t\titem.details = details;\n\t\t\t}\n\t\t}\n\t\tconst output = sanitizeRemoteToolOutput(extractTranscriptContentText(message.content), authorization);\n\t\tif (output) {\n\t\t\titem.output = output.text;\n\t\t\titem.outputTruncated = output.truncated;\n\t\t}\n\t\tconst imageCount = extractMessageImages(message.content).length;\n\t\tif (imageCount > 0) {\n\t\t\titem.imageCount = imageCount;\n\t\t}\n\t\treturn item;\n\t}\n\tif (message.role === \"bashExecution\") {\n\t\tconst failed = message.cancelled === true || (message.exitCode !== undefined && message.exitCode !== 0);\n\t\tconst status = failed ? \"failed\" : \"completed\";\n\t\tconst exit = message.cancelled\n\t\t\t? \"cancelled\"\n\t\t\t: message.exitCode === undefined\n\t\t\t\t? status\n\t\t\t\t: `exit ${message.exitCode}`;\n\t\tconst command = remoteString(message.command, authorization, REMOTE_TOOL_COMMAND_MAX_SCALARS);\n\t\tconst summary = command ? `Ran command: ${command} (${exit})` : `bash ${exit}`;\n\t\tconst item = createRemoteTranscriptItem(entry, \"tool\", summary, authorization);\n\t\titem.toolName = \"bash\";\n\t\titem.status = status;\n\t\titem.summary = summary;\n\t\tif (command) {\n\t\t\titem.args = { command };\n\t\t}\n\t\tconst output = sanitizeRemoteToolOutput(message.output, authorization, message.truncated === true);\n\t\tif (output) {\n\t\t\titem.output = output.text;\n\t\t\titem.outputTruncated = output.truncated;\n\t\t}\n\t\treturn item;\n\t}\n\treturn undefined;\n}\n\nfunction projectRemoteTranscriptItems(\n\tsessionManager: Pick<SessionManager, \"getBranch\">,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n): RemoteTranscriptItem[] {\n\tconst branch = sessionManager.getBranch();\n\tconst toolCallsById = collectRemoteToolCalls(branch);\n\treturn branch\n\t\t.map((entry) => projectRemoteTranscriptEntry(entry, authorization, toolCallsById))\n\t\t.filter((item): item is RemoteTranscriptItem => item !== undefined);\n}\n\nfunction collectRemoteToolCalls(entries: SessionEntry[]): Map<string, RemoteToolCallRecord> {\n\tconst toolCallsById = new Map<string, RemoteToolCallRecord>();\n\tfor (const entry of entries) {\n\t\tif (entry.type !== \"message\") {\n\t\t\tcontinue;\n\t\t}\n\t\tconst message = entry.message as unknown as Record<string, unknown>;\n\t\tif (message?.role !== \"assistant\" || !Array.isArray(message.content)) {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const block of message.content) {\n\t\t\tif (\n\t\t\t\tisRemoteRecord(block) &&\n\t\t\t\tblock.type === \"toolCall\" &&\n\t\t\t\ttypeof block.id === \"string\" &&\n\t\t\t\ttypeof block.name === \"string\" &&\n\t\t\t\tisRemoteRecord(block.arguments)\n\t\t\t) {\n\t\t\t\ttoolCallsById.set(block.id, {\n\t\t\t\t\tid: block.id,\n\t\t\t\t\tname: block.name,\n\t\t\t\t\targuments: block.arguments,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\treturn toolCallsById;\n}\n\nfunction projectRemoteToolArgs(\n\ttoolName: string,\n\targs: Record<string, unknown> | undefined,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n): Record<string, unknown> | undefined {\n\tif (toolName === \"subagent\") {\n\t\treturn projectRemoteSubagentArgs(args, authorization);\n\t}\n\tif (!isRemoteRecord(args)) {\n\t\treturn undefined;\n\t}\n\n\tconst projected: Record<string, unknown> = {};\n\tswitch (toolName) {\n\t\tcase \"bash\":\n\t\t\tcopyRemoteString(args, projected, \"command\", authorization, REMOTE_TOOL_COMMAND_MAX_SCALARS);\n\t\t\tcopyRemoteNumber(args, projected, \"timeout\");\n\t\t\tbreak;\n\t\tcase \"read\":\n\t\t\tcopyRemoteString(args, projected, \"path\", authorization, REMOTE_TOOL_ARGUMENT_MAX_SCALARS);\n\t\t\tcopyRemoteString(args, projected, \"file_path\", authorization, REMOTE_TOOL_ARGUMENT_MAX_SCALARS);\n\t\t\tcopyRemoteNumber(args, projected, \"offset\");\n\t\t\tcopyRemoteNumber(args, projected, \"limit\");\n\t\t\tbreak;\n\t\tcase \"edit\":\n\t\tcase \"write\":\n\t\t\tcopyRemoteString(args, projected, \"path\", authorization, REMOTE_TOOL_ARGUMENT_MAX_SCALARS);\n\t\t\tcopyRemoteString(args, projected, \"file_path\", authorization, REMOTE_TOOL_ARGUMENT_MAX_SCALARS);\n\t\t\tbreak;\n\t\tcase \"grep\":\n\t\t\tcopyRemoteString(args, projected, \"pattern\", authorization, REMOTE_TOOL_ARGUMENT_MAX_SCALARS);\n\t\t\tcopyRemoteString(args, projected, \"path\", authorization, REMOTE_TOOL_ARGUMENT_MAX_SCALARS);\n\t\t\tcopyRemoteString(args, projected, \"glob\", authorization, REMOTE_TOOL_ARGUMENT_MAX_SCALARS);\n\t\t\tcopyRemoteString(args, projected, \"include\", authorization, REMOTE_TOOL_ARGUMENT_MAX_SCALARS);\n\t\t\tcopyRemoteString(args, projected, \"exclude\", authorization, REMOTE_TOOL_ARGUMENT_MAX_SCALARS);\n\t\t\tcopyRemoteBoolean(args, projected, \"ignoreCase\");\n\t\t\tcopyRemoteBoolean(args, projected, \"literal\");\n\t\t\tcopyRemoteNumber(args, projected, \"context\");\n\t\t\tbreak;\n\t\tcase \"find\":\n\t\t\tcopyRemoteString(args, projected, \"query\", authorization, REMOTE_TOOL_ARGUMENT_MAX_SCALARS);\n\t\t\tcopyRemoteString(args, projected, \"pattern\", authorization, REMOTE_TOOL_ARGUMENT_MAX_SCALARS);\n\t\t\tcopyRemoteString(args, projected, \"path\", authorization, REMOTE_TOOL_ARGUMENT_MAX_SCALARS);\n\t\t\tcopyRemoteString(args, projected, \"glob\", authorization, REMOTE_TOOL_ARGUMENT_MAX_SCALARS);\n\t\t\tcopyRemoteString(args, projected, \"name\", authorization, REMOTE_TOOL_ARGUMENT_MAX_SCALARS);\n\t\t\tcopyRemoteNumber(args, projected, \"limit\");\n\t\t\tbreak;\n\t\tcase \"ls\":\n\t\t\tcopyRemoteString(args, projected, \"path\", authorization, REMOTE_TOOL_ARGUMENT_MAX_SCALARS);\n\t\t\tcopyRemoteNumber(args, projected, \"limit\");\n\t\t\tbreak;\n\t\tcase \"lsp\":\n\t\t\tcopyRemoteString(args, projected, \"action\", authorization, REMOTE_TOOL_ARGUMENT_MAX_SCALARS);\n\t\t\tcopyRemoteString(args, projected, \"symbol\", authorization, REMOTE_TOOL_ARGUMENT_MAX_SCALARS);\n\t\t\tcopyRemoteString(args, projected, \"path\", authorization, REMOTE_TOOL_ARGUMENT_MAX_SCALARS);\n\t\t\tcopyRemoteString(args, projected, \"file_path\", authorization, REMOTE_TOOL_ARGUMENT_MAX_SCALARS);\n\t\t\tcopyRemoteNumber(args, projected, \"line\");\n\t\t\tbreak;\n\t\tcase \"web_search\":\n\t\t\tcopyRemoteString(args, projected, \"query\", authorization, REMOTE_TOOL_ARGUMENT_MAX_SCALARS);\n\t\t\tcopyRemoteStringArray(args, projected, \"domains\", authorization, REMOTE_TOOL_ARGUMENT_MAX_SCALARS);\n\t\t\tcopyRemoteNumber(args, projected, \"limit\");\n\t\t\tcopyRemoteNumber(args, projected, \"recencyDays\");\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\treturn Object.keys(projected).length > 0 ? projected : undefined;\n}\n\nfunction getRemoteToolPath(\n\ttoolName: string,\n\targs: Record<string, unknown> | undefined,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n): string | undefined {\n\tif (!isRemoteRecord(args)) {\n\t\treturn undefined;\n\t}\n\tswitch (toolName) {\n\t\tcase \"read\":\n\t\tcase \"edit\":\n\t\tcase \"write\":\n\t\tcase \"lsp\":\n\t\t\treturn (\n\t\t\t\tremoteString(args.path, authorization, REMOTE_TOOL_ARGUMENT_MAX_SCALARS) ??\n\t\t\t\tremoteString(args.file_path, authorization, REMOTE_TOOL_ARGUMENT_MAX_SCALARS)\n\t\t\t);\n\t\tcase \"grep\":\n\t\tcase \"find\":\n\t\tcase \"ls\":\n\t\t\treturn remoteString(args.path, authorization, REMOTE_TOOL_ARGUMENT_MAX_SCALARS);\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\nfunction summarizeRemoteToolResult(\n\ttoolName: string,\n\tstatus: \"completed\" | \"failed\",\n\targs: Record<string, unknown> | undefined,\n\tpath: string | undefined,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n): string {\n\tconst statusText = status === \"failed\" ? \"failed\" : \"completed\";\n\tif (toolName === \"bash\") {\n\t\tconst command = remoteString(args?.command, authorization, REMOTE_TOOL_COMMAND_MAX_SCALARS);\n\t\tif (command) {\n\t\t\treturn `Ran command: ${command} (${statusText})`;\n\t\t}\n\t}\n\tif (toolName === \"read\" && path) {\n\t\treturn `Read ${path} (${statusText})`;\n\t}\n\tif (path) {\n\t\treturn `${toolName} ${path} (${statusText})`;\n\t}\n\treturn `${toolName} ${statusText}`;\n}\n\nfunction projectRemoteSubagentArgs(\n\targs: unknown,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n): Record<string, unknown> | undefined {\n\tif (!isRemoteRecord(args)) {\n\t\treturn undefined;\n\t}\n\tconst projected: Record<string, unknown> = {};\n\tcopyRemoteString(args, projected, \"agent\", authorization, 200);\n\tcopyRemoteString(args, projected, \"task\", authorization, 1000);\n\tconst tasks = projectRemoteSubagentInputArray(args.tasks, authorization);\n\tif (tasks) {\n\t\tprojected.tasks = tasks;\n\t}\n\tconst chain = projectRemoteSubagentInputArray(args.chain, authorization);\n\tif (chain) {\n\t\tprojected.chain = chain;\n\t}\n\treturn Object.keys(projected).length > 0 ? projected : undefined;\n}\n\nfunction projectRemoteSubagentInputArray(\n\tvalue: unknown,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n): Array<{ agent: string; task: string }> | undefined {\n\tif (!Array.isArray(value)) {\n\t\treturn undefined;\n\t}\n\tconst projected = value\n\t\t.map((item) => {\n\t\t\tif (!isRemoteRecord(item)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst agent = remoteString(item.agent, authorization, 200);\n\t\t\tconst task = remoteString(item.task, authorization, 1000);\n\t\t\treturn agent && task ? { agent, task } : undefined;\n\t\t})\n\t\t.filter((item): item is { agent: string; task: string } => item !== undefined);\n\treturn projected.length > 0 ? projected : undefined;\n}\n\nfunction projectRemoteSubagentDetails(\n\tvalue: unknown,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n): Record<string, unknown> | undefined {\n\tif (!isRemoteRecord(value)) {\n\t\treturn undefined;\n\t}\n\tconst projected: Record<string, unknown> = {};\n\tcopyRemoteString(value, projected, \"mode\", authorization, 200);\n\tcopyRemoteString(value, projected, \"status\", authorization, 200);\n\tcopyRemoteString(value, projected, \"subagentId\", authorization, 200);\n\tcopyRemoteString(value, projected, \"sessionId\", authorization, 200);\n\tcopyRemoteSubagentNumericDetails(value, projected);\n\tcopyRemoteString(value, projected, \"currentActivity\", authorization, 300);\n\tconst summary = projectRemoteSubagentSummary(value.summary);\n\tif (summary) {\n\t\tprojected.summary = summary;\n\t}\n\tconst childSessions = projectRemoteSubagentDetailArray(value.childSessions, authorization);\n\tif (childSessions) {\n\t\tprojected.childSessions = childSessions;\n\t}\n\tconst agent = projectRemoteSubagentAgent(value.agent, authorization);\n\tif (agent) {\n\t\tprojected.agent = agent;\n\t}\n\tconst output = projectRemoteSubagentOutput(value.output, authorization);\n\tif (output) {\n\t\tprojected.output = output;\n\t}\n\tconst error = projectRemoteSubagentError(value.error, authorization);\n\tif (error) {\n\t\tprojected.error = error;\n\t}\n\tconst children = projectRemoteSubagentDetailArray(value.children, authorization);\n\tif (children) {\n\t\tprojected.children = children;\n\t}\n\tconst tasks = projectRemoteSubagentDetailArray(value.tasks, authorization);\n\tif (tasks) {\n\t\tprojected.tasks = tasks;\n\t}\n\tconst steps = projectRemoteSubagentDetailArray(value.steps, authorization);\n\tif (steps) {\n\t\tprojected.steps = steps;\n\t}\n\treturn Object.keys(projected).length > 0 ? projected : undefined;\n}\n\nconst REMOTE_SUBAGENT_NUMERIC_KEYS = [\"startedAt\", \"durationMs\", \"toolCalls\", \"tokens\"] as const;\nconst REMOTE_SUBAGENT_TREE_DEPTH_LIMIT = 5;\n\nfunction copyRemoteSubagentNumericDetails(from: Record<string, unknown>, to: Record<string, unknown>): void {\n\tfor (const key of REMOTE_SUBAGENT_NUMERIC_KEYS) {\n\t\tconst numberValue = remoteFiniteNumber(from[key]);\n\t\tif (numberValue !== undefined) {\n\t\t\tto[key] = numberValue;\n\t\t}\n\t}\n}\n\nfunction projectRemoteSubagentSummary(value: unknown): Record<string, number> | undefined {\n\tif (!isRemoteRecord(value)) {\n\t\treturn undefined;\n\t}\n\tconst projected: Record<string, number> = {};\n\tfor (const key of [\n\t\t\"total\",\n\t\t\"completed\",\n\t\t\"failed\",\n\t\t\"aborted\",\n\t\t\"running\",\n\t\t\"maxTasks\",\n\t\t\"maxConcurrency\",\n\t\t\"stoppedAt\",\n\t]) {\n\t\tconst numberValue = remoteFiniteNumber(value[key]);\n\t\tif (numberValue !== undefined) {\n\t\t\tprojected[key] = numberValue;\n\t\t}\n\t}\n\treturn Object.keys(projected).length > 0 ? projected : undefined;\n}\n\nfunction projectRemoteSubagentDetailArray(\n\tvalue: unknown,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n\tdepth = 0,\n): Array<Record<string, unknown>> | undefined {\n\tif (!Array.isArray(value) || depth >= REMOTE_SUBAGENT_TREE_DEPTH_LIMIT) {\n\t\treturn undefined;\n\t}\n\tconst projected = value\n\t\t.map((item) => projectRemoteSubagentTask(item, authorization, depth))\n\t\t.filter((item): item is Record<string, unknown> => item !== undefined);\n\treturn projected.length > 0 ? projected : undefined;\n}\n\nfunction projectRemoteSubagentTask(\n\tvalue: unknown,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n\tdepth = 0,\n): Record<string, unknown> | undefined {\n\tif (!isRemoteRecord(value)) {\n\t\treturn undefined;\n\t}\n\tconst projected: Record<string, unknown> = {};\n\tconst index = remoteFiniteNumber(value.index);\n\tif (index !== undefined) {\n\t\tprojected.index = index;\n\t}\n\tcopyRemoteString(value, projected, \"subagentId\", authorization, 200);\n\tcopyRemoteString(value, projected, \"sessionId\", authorization, 200);\n\tconst agent = projectRemoteSubagentAgent(value.agent, authorization);\n\tif (agent) {\n\t\tprojected.agent = agent;\n\t}\n\tcopyRemoteString(value, projected, \"status\", authorization, 200);\n\tcopyRemoteString(value, projected, \"task\", authorization, 1_000);\n\tcopyRemoteSubagentNumericDetails(value, projected);\n\tcopyRemoteString(value, projected, \"currentActivity\", authorization, 300);\n\tconst error = projectRemoteSubagentError(value.error, authorization);\n\tif (error) {\n\t\tprojected.error = error;\n\t}\n\tconst children = projectRemoteSubagentDetailArray(value.children, authorization, depth + 1);\n\tif (children) {\n\t\tprojected.children = children;\n\t}\n\treturn Object.keys(projected).length > 0 ? projected : undefined;\n}\n\nfunction projectRemoteSubagentAgent(\n\tvalue: unknown,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n): Record<string, unknown> | undefined {\n\tif (!isRemoteRecord(value)) {\n\t\treturn undefined;\n\t}\n\tconst projected: Record<string, unknown> = {};\n\tcopyRemoteString(value, projected, \"name\", authorization, 200);\n\tcopyRemoteString(value, projected, \"source\", authorization, 200);\n\treturn Object.keys(projected).length > 0 ? projected : undefined;\n}\n\nfunction projectRemoteSubagentOutput(\n\tvalue: unknown,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n): Record<string, unknown> | undefined {\n\tif (!isRemoteRecord(value)) {\n\t\treturn undefined;\n\t}\n\tconst projected: Record<string, unknown> = {};\n\tcopyRemoteString(value, projected, \"text\", authorization, 1000);\n\tfor (const key of [\"bytes\", \"omittedBytes\", \"maxBytes\"]) {\n\t\tconst numberValue = remoteFiniteNumber(value[key]);\n\t\tif (numberValue !== undefined) {\n\t\t\tprojected[key] = numberValue;\n\t\t}\n\t}\n\tif (typeof value.truncated === \"boolean\") {\n\t\tprojected.truncated = value.truncated;\n\t}\n\treturn Object.keys(projected).length > 0 ? projected : undefined;\n}\n\nfunction projectRemoteSubagentError(\n\tvalue: unknown,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n): { message: string } | undefined {\n\tif (!isRemoteRecord(value)) {\n\t\treturn undefined;\n\t}\n\tconst message = remoteString(value.message, authorization, 1000);\n\treturn message ? { message } : undefined;\n}\n\nfunction remoteString(\n\tvalue: unknown,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n\tmaxLength: number,\n): string | undefined {\n\treturn typeof value === \"string\" && value.trim()\n\t\t? sanitizeRemoteTextField(value, maxLength, authorization)\n\t\t: undefined;\n}\n\nfunction copyRemoteString(\n\tfrom: Record<string, unknown>,\n\tto: Record<string, unknown>,\n\tkey: string,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n\tmaxLength: number,\n): void {\n\tconst value = remoteString(from[key], authorization, maxLength);\n\tif (value) {\n\t\tto[key] = value;\n\t}\n}\n\nfunction copyRemoteNumber(from: Record<string, unknown>, to: Record<string, unknown>, key: string): void {\n\tconst value = remoteFiniteNumber(from[key]);\n\tif (value !== undefined) {\n\t\tto[key] = value;\n\t}\n}\n\nfunction copyRemoteBoolean(from: Record<string, unknown>, to: Record<string, unknown>, key: string): void {\n\tif (typeof from[key] === \"boolean\") {\n\t\tto[key] = from[key];\n\t}\n}\n\nfunction copyRemoteStringArray(\n\tfrom: Record<string, unknown>,\n\tto: Record<string, unknown>,\n\tkey: string,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n\tmaxLength: number,\n): void {\n\tconst value = from[key];\n\tif (!Array.isArray(value)) {\n\t\treturn;\n\t}\n\tconst projected = value\n\t\t.slice(0, REMOTE_TOOL_ARGUMENT_KEYS_MAX)\n\t\t.map((entry) => remoteString(entry, authorization, maxLength))\n\t\t.filter((entry): entry is string => entry !== undefined);\n\tif (projected.length > 0) {\n\t\tto[key] = projected;\n\t}\n}\n\nfunction remoteFiniteNumber(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction isRemoteRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction createRemoteTranscriptPage(items: RemoteTranscriptItem[], request: RemoteTranscriptRequest) {\n\tconst beforeIndex =\n\t\trequest.beforeEntryId === undefined\n\t\t\t? items.length\n\t\t\t: items.findIndex((item) => item.entryId === request.beforeEntryId);\n\tif (beforeIndex === -1) {\n\t\treturn undefined;\n\t}\n\tconst eligibleItems = items.slice(0, beforeIndex);\n\tconst pageStart = Math.max(0, eligibleItems.length - request.limit);\n\tconst pageItems = eligibleItems.slice(pageStart);\n\tconst hasMore = pageStart > 0;\n\treturn {\n\t\titems: pageItems,\n\t\thasMore,\n\t\tnextBeforeEntryId: hasMore ? (pageItems[0]?.entryId ?? null) : null,\n\t};\n}\n\nexport function createRemoteGetTranscriptRpcResponse(\n\tcommand: RemoteRpcCommand,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n\truntime: ConversationCommandRuntime,\n): object {\n\tconst id = getRpcResponseId(command);\n\tconst request = parseRemoteTranscriptRequest(command);\n\tif (!request.ok) {\n\t\treturn createIrohRemoteRpcErrorResponse(id, \"get_transcript\", request.error);\n\t}\n\tconst items = projectRemoteTranscriptItems(runtime.session.sessionManager, authorization);\n\tconst page = createRemoteTranscriptPage(items, request);\n\tif (!page) {\n\t\treturn createIrohRemoteRpcErrorResponse(id, \"get_transcript\", \"invalid_cursor\");\n\t}\n\treturn createRpcSuccessResponse(id, \"get_transcript\", {\n\t\tworkspaceName: authorization.workspace.name,\n\t\tsessionId: runtime.session.sessionId,\n\t\t...page,\n\t});\n}\n\nexport function createRemoteGetMessageImagesRpcResponse(\n\tcommand: RemoteRpcCommand,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n\truntime: ConversationCommandRuntime,\n): object {\n\tconst id = getRpcResponseId(command);\n\tif (!isValidRemoteTranscriptCursor(command.entryId)) {\n\t\treturn createIrohRemoteRpcErrorResponse(id, \"get_message_images\", \"invalid_cursor\");\n\t}\n\tlet startImageIndex = 0;\n\tif (command.startImageIndex !== undefined) {\n\t\tif (\n\t\t\ttypeof command.startImageIndex !== \"number\" ||\n\t\t\t!Number.isInteger(command.startImageIndex) ||\n\t\t\tcommand.startImageIndex < 0\n\t\t) {\n\t\t\treturn createIrohRemoteRpcErrorResponse(id, \"get_message_images\", \"invalid_request\");\n\t\t}\n\t\tstartImageIndex = command.startImageIndex;\n\t}\n\tconst result = projectMessageImages(runtime.session.sessionManager.getBranch(), command.entryId, startImageIndex);\n\tif (!result.ok) {\n\t\treturn createIrohRemoteRpcErrorResponse(id, \"get_message_images\", result.error);\n\t}\n\treturn createRpcSuccessResponse(id, \"get_message_images\", {\n\t\tworkspaceName: authorization.workspace.name,\n\t\tsessionId: runtime.session.sessionId,\n\t\tentryId: result.entryId,\n\t\ttotalImages: result.totalImages,\n\t\timages: result.images,\n\t\tnextImageIndex: result.nextImageIndex,\n\t});\n}\n\n// ============================================================================\n// Session listing\n// ============================================================================\n\nfunction toRemoteSessionTimestamp(value: string | number | Date): string {\n\tconst date = value instanceof Date ? value : new Date(value);\n\treturn Number.isNaN(date.getTime()) ? new Date(0).toISOString() : date.toISOString();\n}\n\nfunction getRemoteSessionTimestampMs(value: string): number {\n\tconst date = new Date(value);\n\treturn Number.isNaN(date.getTime()) ? 0 : date.getTime();\n}\n\ninterface RemoteSessionSummaryInput {\n\tsessionId: string;\n\ttitle: unknown;\n\tcreatedAt: string | Date;\n\tupdatedAt: string | Date;\n\tmessageCount: number;\n\tcwd?: string;\n\torigin?: \"subagent\";\n}\n\nfunction getRelativeWorkingDirectory(rootPath: string, cwd: string | undefined): string | null | undefined {\n\tif (!cwd) {\n\t\treturn undefined;\n\t}\n\tconst root = resolve(rootPath);\n\tconst child = resolve(cwd);\n\tconst relativePath = relative(root, child);\n\tif (relativePath === \"\" || relativePath === \".\") {\n\t\treturn undefined;\n\t}\n\tif (relativePath === \"..\" || relativePath.startsWith(`..${sep}`) || isAbsolute(relativePath)) {\n\t\treturn null;\n\t}\n\treturn relativePath.split(sep).join(\"/\");\n}\n\ninterface RemoteSessionSummary {\n\tsortUpdatedAtMs: number;\n\tsession: RemoteSessionListEntry;\n\tcwd?: string;\n}\n\nfunction createRemoteSessionSummary(\n\tinput: RemoteSessionSummaryInput,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n): RemoteSessionSummary {\n\tconst createdAt = toRemoteSessionTimestamp(input.createdAt);\n\tconst updatedAt = toRemoteSessionTimestamp(input.updatedAt);\n\tconst workingDirectory = getRelativeWorkingDirectory(authorization.workspace.path, input.cwd);\n\treturn {\n\t\tsortUpdatedAtMs: getRemoteSessionTimestampMs(updatedAt),\n\t\tsession: {\n\t\t\tsessionId: input.sessionId,\n\t\t\ttitle: sanitizeRemoteTextField(typeof input.title === \"string\" ? input.title : \"\", 160, authorization),\n\t\t\tcreatedAt,\n\t\t\tupdatedAt,\n\t\t\tmessageCount: input.messageCount,\n\t\t\t...(input.origin === undefined ? {} : { origin: input.origin }),\n\t\t\t...(workingDirectory === undefined || workingDirectory === null ? {} : { workingDirectory }),\n\t\t},\n\t\t...(input.cwd === undefined ? {} : { cwd: input.cwd }),\n\t};\n}\n\nfunction sortRemoteSessionSummaries(left: RemoteSessionSummary, right: RemoteSessionSummary): number {\n\treturn right.sortUpdatedAtMs - left.sortUpdatedAtMs || left.session.sessionId.localeCompare(right.session.sessionId);\n}\n\nexport async function listRemoteWorkspaceSessionSummaries(\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n\tcontext: ConversationCommandContext,\n\truntime?: ConversationCommandRuntime,\n): Promise<RemoteSessionSummary[]> {\n\tconst bySessionId = new Map<string, RemoteSessionSummary>();\n\tif (runtime === undefined || context.agentDir !== undefined) {\n\t\tfor (const info of await SessionManager.list(\n\t\t\tauthorization.workspace.path,\n\t\t\tgetDefaultSessionDir(authorization.workspace.path, context.agentDir),\n\t\t)) {\n\t\t\tconst summary = createRemoteSessionSummary(\n\t\t\t\t{\n\t\t\t\t\tsessionId: info.id,\n\t\t\t\t\ttitle: info.name ?? info.firstMessage,\n\t\t\t\t\tcreatedAt: info.created,\n\t\t\t\t\tupdatedAt: info.modified,\n\t\t\t\t\tmessageCount: info.messageCount,\n\t\t\t\t\tcwd: info.cwd,\n\t\t\t\t\t...(info.origin === undefined ? {} : { origin: info.origin }),\n\t\t\t\t},\n\t\t\t\tauthorization,\n\t\t\t);\n\t\t\tbySessionId.set(summary.session.sessionId, summary);\n\t\t}\n\t}\n\tif (runtime !== undefined) {\n\t\tfor (const liveSummary of await runtime.listSessions()) {\n\t\t\tconst summary = createRemoteSessionSummary(\n\t\t\t\t{\n\t\t\t\t\tsessionId: liveSummary.sessionId,\n\t\t\t\t\ttitle: liveSummary.sessionName ?? liveSummary.firstMessage,\n\t\t\t\t\tcreatedAt: liveSummary.createdAt,\n\t\t\t\t\tupdatedAt: liveSummary.modifiedAt,\n\t\t\t\t\tmessageCount: liveSummary.messageCount,\n\t\t\t\t\tcwd: liveSummary.cwd,\n\t\t\t\t\t...(liveSummary.origin === undefined ? {} : { origin: liveSummary.origin }),\n\t\t\t\t},\n\t\t\t\tauthorization,\n\t\t\t);\n\t\t\tbySessionId.set(summary.session.sessionId, summary);\n\t\t}\n\t}\n\t// Worktree attribution (worktrees.v1): join the persisted session bindings so\n\t// clients can badge worktree-bound sessions without a separate list_worktrees\n\t// round trip. Ids only — checkout paths never reach the wire.\n\ttry {\n\t\tfor (const worktree of await context.stateManager.listWorktrees(authorization.workspace.name)) {\n\t\t\tfor (const sessionId of worktree.sessionIds) {\n\t\t\t\tconst summary = bySessionId.get(sessionId);\n\t\t\t\tif (summary) {\n\t\t\t\t\tsummary.session.worktreeId = worktree.id;\n\t\t\t\t\tconst worktreeRelativeDirectory = getRelativeWorkingDirectory(worktree.path, summary.cwd);\n\t\t\t\t\tif (worktreeRelativeDirectory === null) {\n\t\t\t\t\t\tdelete summary.session.workingDirectory;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tconst workingDirectory = getRegisteredWorkingDirectoryForWorktree(worktree, worktreeRelativeDirectory);\n\t\t\t\t\tif (workingDirectory === undefined) {\n\t\t\t\t\t\tdelete summary.session.workingDirectory;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsummary.session.workingDirectory = workingDirectory;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Attribution is best-effort; the session list itself stays authoritative.\n\t}\n\ttry {\n\t\tconst runtimeStates = await context.listRuntimeStates?.(authorization.workspace.name);\n\t\tif (runtimeStates) {\n\t\t\tfor (const [sessionId, runtimeState] of runtimeStates) {\n\t\t\t\tconst summary = bySessionId.get(sessionId);\n\t\t\t\tif (summary) {\n\t\t\t\t\tsummary.session.runtimeState = runtimeState;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Presence is best-effort; persisted session discovery remains authoritative.\n\t}\n\treturn Array.from(bySessionId.values()).sort(sortRemoteSessionSummaries);\n}\n\nfunction cleanupExpiredSessionListCursors(context: ConversationCommandContext, now = contextNow(context)): void {\n\tfor (const [cursor, entry] of context.sessionListCursors) {\n\t\tif (entry.expiresAt <= now) {\n\t\t\tcontext.sessionListCursors.delete(cursor);\n\t\t}\n\t}\n}\n\nfunction evictExcessSessionListCursors(\n\tcontext: ConversationCommandContext,\n\tclientNodeId: string,\n\tmaxForClient: number,\n): void {\n\t// Map iteration is insertion order, so this client's oldest cursors come first.\n\tconst clientCursors: string[] = [];\n\tfor (const [cursor, entry] of context.sessionListCursors) {\n\t\tif (entry.clientNodeId === clientNodeId) {\n\t\t\tclientCursors.push(cursor);\n\t\t}\n\t}\n\t// Drop oldest until inserting one more keeps this client within the cap.\n\tfor (let index = 0; index <= clientCursors.length - maxForClient; index++) {\n\t\tcontext.sessionListCursors.delete(clientCursors[index]);\n\t}\n}\n\nfunction createSessionListCursor(\n\tcontext: ConversationCommandContext,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n\tsessions: RemoteSessionListEntry[],\n\tnextIndex: number,\n): string {\n\t// Sweep expired entries on every insert (not only on the cursored read path) and\n\t// bound this client's retained cursors so a client that never echoes the returned\n\t// cursor cannot grow the shared, daemon-wide map without limit.\n\tcleanupExpiredSessionListCursors(context);\n\tevictExcessSessionListCursors(context, authorization.client.nodeId, REMOTE_SESSION_LIST_MAX_CURSORS_PER_CLIENT);\n\tconst cursor = randomUUID();\n\tcontext.sessionListCursors.set(cursor, {\n\t\tclientNodeId: authorization.client.nodeId,\n\t\tworkspaceName: authorization.workspace.name,\n\t\tsessions,\n\t\tnextIndex,\n\t\texpiresAt: contextNow(context) + context.sessionListCursorTtlMs,\n\t});\n\treturn cursor;\n}\n\nfunction getSessionListCursorEntry(\n\tcontext: ConversationCommandContext,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n\tcursor: string,\n): RemoteSessionListCursorEntry | undefined {\n\tcleanupExpiredSessionListCursors(context);\n\tconst entry = context.sessionListCursors.get(cursor);\n\tif (\n\t\t!entry ||\n\t\tentry.clientNodeId !== authorization.client.nodeId ||\n\t\tentry.workspaceName !== authorization.workspace.name\n\t) {\n\t\treturn undefined;\n\t}\n\treturn entry;\n}\n\nfunction parseRemoteSessionListLimit(\n\tcommand: Record<string, unknown>,\n): { ok: true; limit: number } | { ok: false; error: string } {\n\tif (command.limit === undefined) {\n\t\treturn { ok: true, limit: REMOTE_SESSION_LIST_DEFAULT_LIMIT };\n\t}\n\tif (typeof command.limit !== \"number\" || !Number.isInteger(command.limit) || command.limit <= 0) {\n\t\treturn { ok: false, error: \"invalid_limit\" };\n\t}\n\treturn { ok: true, limit: Math.min(command.limit, REMOTE_SESSION_LIST_MAX_LIMIT) };\n}\n\nfunction parseRemoteSessionListRequest(\n\tcommand: Record<string, unknown>,\n): { ok: true; limit: number; cursor?: string } | { ok: false; error: string } {\n\tif (Object.hasOwn(command, \"sessionId\")) {\n\t\treturn { ok: false, error: \"unexpected_session_id\" };\n\t}\n\tfor (const field of [\"workspace\", \"workspaceName\", \"clientNodeId\", \"hostNodeId\"]) {\n\t\tif (Object.hasOwn(command, field)) {\n\t\t\treturn { ok: false, error: \"session_mismatch\" };\n\t\t}\n\t}\n\tfor (const field of Object.keys(command)) {\n\t\tif (field !== \"id\" && field !== \"type\" && field !== \"limit\" && field !== \"cursor\") {\n\t\t\treturn { ok: false, error: \"invalid_request\" };\n\t\t}\n\t}\n\tconst limit = parseRemoteSessionListLimit(command);\n\tif (!limit.ok) {\n\t\treturn limit;\n\t}\n\tif (command.cursor !== undefined) {\n\t\tif (\n\t\t\ttypeof command.cursor !== \"string\" ||\n\t\t\tcommand.cursor.length === 0 ||\n\t\t\tBuffer.byteLength(command.cursor, \"utf8\") > REMOTE_SESSION_LIST_CURSOR_MAX_BYTES\n\t\t) {\n\t\t\treturn { ok: false, error: \"invalid_cursor\" };\n\t\t}\n\t}\n\treturn {\n\t\tok: true,\n\t\tlimit: limit.limit,\n\t\t...(command.cursor === undefined ? {} : { cursor: command.cursor as string }),\n\t};\n}\n\nexport async function createRemoteListSessionsRpcResponse(\n\tcommand: RemoteRpcCommand,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n\tcontext: ConversationCommandContext,\n\truntime?: ConversationCommandRuntime,\n): Promise<object> {\n\tconst id = getRpcResponseId(command);\n\tconst request = parseRemoteSessionListRequest(command);\n\tif (!request.ok) {\n\t\treturn createIrohRemoteRpcErrorResponse(id, \"list_sessions\", request.error);\n\t}\n\n\tlet sessions: RemoteSessionListEntry[];\n\tlet startIndex: number;\n\tif (request.cursor) {\n\t\tconst cursorEntry = getSessionListCursorEntry(context, authorization, request.cursor);\n\t\tif (!cursorEntry) {\n\t\t\treturn createIrohRemoteRpcErrorResponse(id, \"list_sessions\", \"invalid_cursor\");\n\t\t}\n\t\tsessions = cursorEntry.sessions;\n\t\tstartIndex = cursorEntry.nextIndex;\n\t} else {\n\t\tsessions = (await listRemoteWorkspaceSessionSummaries(authorization, context, runtime)).map(\n\t\t\t(summary) => summary.session,\n\t\t);\n\t\tstartIndex = 0;\n\t}\n\n\tconst nextIndex = startIndex + request.limit;\n\tconst page = sessions.slice(startIndex, nextIndex);\n\tconst hasMore = nextIndex < sessions.length;\n\treturn createRpcSuccessResponse(id, \"list_sessions\", {\n\t\tsessions: page,\n\t\thasMore,\n\t\tnextCursor: hasMore ? createSessionListCursor(context, authorization, sessions, nextIndex) : null,\n\t});\n}\n\n// ============================================================================\n// Live Activities\n// ============================================================================\n\ninterface RemoteLiveActivityCommandScope {\n\tworkspaceName: string;\n\tsessionId: string;\n\tactivityId: string;\n}\n\ninterface RemoteLiveActivityRegistrationRequest extends RemoteLiveActivityCommandScope {\n\ttokenHash: string;\n\ttokenEnvironment: \"development\" | \"production\";\n\tplatform: \"ios\";\n}\n\nfunction parseRemoteLiveActivityRegistrationCommand(\n\tcommand: Record<string, unknown>,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n\texpectedSessionId: string,\n): ({ ok: true } & RemoteLiveActivityRegistrationRequest) | { ok: false; error: string } {\n\tconst common = parseRemoteLiveActivityCommandScope(command, authorization, expectedSessionId);\n\tif (!common.ok) {\n\t\treturn common;\n\t}\n\tif (typeof command.tokenHash !== \"string\") {\n\t\treturn { ok: false, error: \"invalid_live_activity_token\" };\n\t}\n\tif (!/^[0-9a-f]{64}$/.test(command.tokenHash)) {\n\t\treturn { ok: false, error: \"invalid_live_activity_token\" };\n\t}\n\tif (command.tokenEnvironment !== \"development\" && command.tokenEnvironment !== \"production\") {\n\t\treturn { ok: false, error: \"invalid_live_activity_registration\" };\n\t}\n\tif (command.platform !== \"ios\") {\n\t\treturn { ok: false, error: \"invalid_live_activity_registration\" };\n\t}\n\treturn {\n\t\t...common,\n\t\ttokenHash: command.tokenHash,\n\t\ttokenEnvironment: command.tokenEnvironment,\n\t\tplatform: command.platform,\n\t};\n}\n\nfunction parseRemoteLiveActivityUnregistrationCommand(\n\tcommand: Record<string, unknown>,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n\texpectedSessionId: string,\n): ({ ok: true } & RemoteLiveActivityCommandScope) | { ok: false; error: string } {\n\treturn parseRemoteLiveActivityCommandScope(command, authorization, expectedSessionId);\n}\n\nfunction parseRemoteLiveActivityCommandScope(\n\tcommand: Record<string, unknown>,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n\texpectedSessionId: string,\n): ({ ok: true } & RemoteLiveActivityCommandScope) | { ok: false; error: string } {\n\tif (\n\t\ttypeof command.workspaceName !== \"string\" ||\n\t\ttypeof command.sessionId !== \"string\" ||\n\t\ttypeof command.activityId !== \"string\"\n\t) {\n\t\treturn { ok: false, error: \"invalid_live_activity_registration\" };\n\t}\n\tif (command.workspaceName !== authorization.workspace.name || command.sessionId !== expectedSessionId) {\n\t\treturn { ok: false, error: \"session_mismatch\" };\n\t}\n\tif (!isValidLiveActivityId(command.activityId)) {\n\t\treturn { ok: false, error: \"invalid_live_activity_registration\" };\n\t}\n\treturn {\n\t\tok: true,\n\t\tworkspaceName: command.workspaceName,\n\t\tsessionId: command.sessionId,\n\t\tactivityId: command.activityId,\n\t};\n}\n\nfunction isValidLiveActivityId(activityId: string): boolean {\n\treturn activityId.length > 0 && Array.from(activityId).length <= 128 && Buffer.byteLength(activityId, \"utf8\") <= 512;\n}\n\nasync function logLiveActivityRegistrationAudit(\n\tcontext: ConversationCommandContext,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n\tcommand: RemoteRpcCommand,\n\tsuccess: boolean,\n\terror?: string,\n\trequest?: Partial<RemoteLiveActivityRegistrationRequest>,\n\textraDetails: Record<string, unknown> = {},\n): Promise<void> {\n\tconst details: Record<string, unknown> = {\n\t\tcommand: command.type,\n\t\t...(request\n\t\t\t? {\n\t\t\t\t\tsessionId: request.sessionId,\n\t\t\t\t\tactivityId: request.activityId,\n\t\t\t\t\ttokenHash: request.tokenHash,\n\t\t\t\t\ttokenEnvironment: request.tokenEnvironment,\n\t\t\t\t\tplatform: request.platform,\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...extraDetails,\n\t};\n\tawait logAudit(context.auditLogger, {\n\t\ttype: command.type === \"unregister_live_activity\" ? \"live_activity_unregistered\" : \"live_activity_registered\",\n\t\tclientNodeId: authorization.client.nodeId,\n\t\tworkspace: request?.workspaceName ?? authorization.workspace.name,\n\t\tsuccess,\n\t\terror,\n\t\tdetails,\n\t});\n}\n\nexport async function createRemoteRegisterLiveActivityRpcResponse(\n\tcommand: RemoteRpcCommand,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n\tcontext: ConversationCommandContext,\n\texpectedSessionId: string,\n): Promise<object> {\n\tconst id = getRpcResponseId(command);\n\tconst request = parseRemoteLiveActivityRegistrationCommand(command, authorization, expectedSessionId);\n\tif (!request.ok) {\n\t\tawait logLiveActivityRegistrationAudit(context, authorization, command, false, request.error);\n\t\treturn createIrohRemoteRpcErrorResponse(id, \"register_live_activity\", request.error);\n\t}\n\tconst deliveryChannel = await context.stateManager.findClientLiveActivityDeliveryChannel(\n\t\tauthorization.client.nodeId,\n\t\t{\n\t\t\ttokenHash: request.tokenHash,\n\t\t\ttokenEnvironment: request.tokenEnvironment,\n\t\t\tplatform: request.platform,\n\t\t},\n\t);\n\tif (!deliveryChannel?.liveActivity) {\n\t\tawait logLiveActivityRegistrationAudit(\n\t\t\tcontext,\n\t\t\tauthorization,\n\t\t\tcommand,\n\t\t\tfalse,\n\t\t\t\"unknown_live_activity_token\",\n\t\t\trequest,\n\t\t);\n\t\treturn createIrohRemoteRpcErrorResponse(id, \"register_live_activity\", \"unknown_live_activity_token\");\n\t}\n\tconst now = contextNow(context);\n\tconst result = await context.stateManager.registerClientLiveActivity(authorization.client.nodeId, {\n\t\tworkspaceName: request.workspaceName,\n\t\tsessionId: request.sessionId,\n\t\tactivityId: request.activityId,\n\t\ttokenHash: request.tokenHash,\n\t\ttokenEnvironment: request.tokenEnvironment,\n\t\tplatform: request.platform,\n\t\tpushTargetId: deliveryChannel.id,\n\t\tcreatedAt: now,\n\t\tupdatedAt: now,\n\t});\n\tif (!result.registration) {\n\t\tawait logLiveActivityRegistrationAudit(\n\t\t\tcontext,\n\t\t\tauthorization,\n\t\t\tcommand,\n\t\t\tfalse,\n\t\t\t\"unknown_live_activity_token\",\n\t\t\trequest,\n\t\t);\n\t\treturn createIrohRemoteRpcErrorResponse(id, \"register_live_activity\", \"unknown_live_activity_token\");\n\t}\n\tawait logLiveActivityRegistrationAudit(context, authorization, command, true, undefined, request, {\n\t\tpushTargetId: deliveryChannel.id,\n\t\treplaced: result.replacedRegistration !== undefined,\n\t});\n\treturn createRpcSuccessResponse(id, \"register_live_activity\", {\n\t\tstatus: \"registered\",\n\t\tactivityId: request.activityId,\n\t});\n}\n\nexport async function createRemoteUnregisterLiveActivityRpcResponse(\n\tcommand: RemoteRpcCommand,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n\tcontext: ConversationCommandContext,\n\texpectedSessionId: string,\n): Promise<object> {\n\tconst id = getRpcResponseId(command);\n\tconst request = parseRemoteLiveActivityUnregistrationCommand(command, authorization, expectedSessionId);\n\tif (!request.ok) {\n\t\tawait logLiveActivityRegistrationAudit(context, authorization, command, false, request.error);\n\t\treturn createIrohRemoteRpcErrorResponse(id, \"unregister_live_activity\", request.error);\n\t}\n\tconst removed = await context.stateManager.unregisterClientLiveActivity(\n\t\tauthorization.client.nodeId,\n\t\trequest.workspaceName,\n\t\trequest.sessionId,\n\t\trequest.activityId,\n\t);\n\tawait logLiveActivityRegistrationAudit(context, authorization, command, true, undefined, request, { removed });\n\treturn createRpcSuccessResponse(id, \"unregister_live_activity\", {\n\t\tstatus: \"unregistered\",\n\t\tactivityId: request.activityId,\n\t});\n}\n\n// ============================================================================\n// Identity checks, device logs, host commands\n// ============================================================================\n\nexport function getIntegratedConversationIdentityError(\n\tcommand: Record<string, unknown>,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n\truntime: ConversationCommandRuntime,\n): string | undefined {\n\tconst expectedWorkspaceName = authorization.workspace.name;\n\tfor (const field of [\"workspace\", \"workspaceName\"]) {\n\t\tif (\n\t\t\tObject.hasOwn(command, field) &&\n\t\t\t(typeof command[field] !== \"string\" || command[field] !== expectedWorkspaceName)\n\t\t) {\n\t\t\treturn \"session_mismatch\";\n\t\t}\n\t}\n\tif (\n\t\tObject.hasOwn(command, \"sessionId\") &&\n\t\t(typeof command.sessionId !== \"string\" || command.sessionId !== runtime.session.sessionId)\n\t) {\n\t\treturn \"session_mismatch\";\n\t}\n\treturn undefined;\n}\n\nasync function createRemoteUploadDeviceLogsRpcResponse(\n\tcommand: RemoteRpcCommand,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n\tcontext: ConversationCommandContext,\n): Promise<object> {\n\tconst response = await handleIrohRemoteDeviceLogUploadRpcCommand(command, {\n\t\tworkspacePath: authorization.workspace.path,\n\t});\n\tawait logAudit(context.auditLogger, {\n\t\ttype: \"device_log_uploaded\",\n\t\tclientNodeId: authorization.client.nodeId,\n\t\tworkspace: authorization.workspace.name,\n\t\tsuccess: response.success === true,\n\t\terror: response.success === true ? undefined : response.error,\n\t\tdetails: response.success === true ? { path: response.data.path, byteCount: response.data.byteCount } : undefined,\n\t});\n\treturn response;\n}\n\nfunction updateAuthorizationWorkspaceMetadata(\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n\tmetadata: { workspaceNames: string[]; workspaces: Array<{ name: string; status: string }> },\n): void {\n\tauthorization.workspaceNames = [...metadata.workspaceNames];\n\tauthorization.workspaces = metadata.workspaces.map((workspace) => ({\n\t\t...workspace,\n\t})) as typeof authorization.workspaces;\n}\n\nexport async function handleRemoteHostRpcCommand(\n\tcommand: RemoteRpcCommand,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n\tcontext: ConversationCommandContext,\n): Promise<object | undefined> {\n\t// create_worktree / list_worktrees are accepted on conversation streams so a\n\t// phone can spin up a parallel isolated session without opening a separate\n\t// manage_worktrees stream. remove_worktree stays management-stream-only (a\n\t// destructive op keeps the narrower surface); the passthrough filter and the\n\t// relay command set never admit it here.\n\tif (command.type === IROH_REMOTE_CREATE_WORKTREE_RPC_TYPE || command.type === IROH_REMOTE_LIST_WORKTREES_RPC_TYPE) {\n\t\tconst backend = context.createWorktreeBackend?.(authorization.workspace);\n\t\tif (!backend) {\n\t\t\treturn createIrohRemoteRpcErrorResponse(getRpcResponseId(command), command.type, \"unsupported_remote_command\");\n\t\t}\n\t\tconst worktreeResult = await handleIrohRemoteWorktreeRpcCommand(command, {\n\t\t\tauthorizedWorkspaceName: authorization.workspace.name,\n\t\t\tbackend,\n\t\t});\n\t\tif (!worktreeResult.handled) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (worktreeResult.audit) {\n\t\t\tawait logAudit(context.auditLogger, {\n\t\t\t\ttype: worktreeResult.audit.type,\n\t\t\t\tclientNodeId: authorization.client.nodeId,\n\t\t\t\tworkspace: authorization.workspace.name,\n\t\t\t\tsuccess: true,\n\t\t\t\tdetails: { ...worktreeResult.audit.details, source: \"remote_rpc\" },\n\t\t\t});\n\t\t}\n\t\treturn worktreeResult.response;\n\t}\n\tif (command.type === IROH_REMOTE_UNREGISTER_WORKSPACE_RPC_TYPE) {\n\t\t// Conversation and relay unregister is scoped to the stream-bound workspace:\n\t\t// the documented `workspaceName` must be present and equal the authorized\n\t\t// workspace, so a client cannot unregister an unrelated registered workspace\n\t\t// by name. The relay path bypasses getIntegratedConversationIdentityError, so\n\t\t// this is the authoritative scope check for it; the dedicated\n\t\t// workspaceManagement stream enforces the same rule (workspace-streams.ts).\n\t\tif (typeof command.workspaceName !== \"string\" || command.workspaceName !== authorization.workspace.name) {\n\t\t\treturn createIrohRemoteRpcErrorResponse(getRpcResponseId(command), command.type, \"session_mismatch\");\n\t\t}\n\t}\n\tlet result: Awaited<ReturnType<typeof handleIrohRemoteWorkspaceUnregisterRpcCommand>>;\n\ttry {\n\t\tresult = await handleIrohRemoteWorkspaceUnregisterRpcCommand(command, {\n\t\t\tclassifyWorkspaceAvailability: getIrohRemoteWorkspaceAvailabilityStatus,\n\t\t\tstateManager: context.stateManager,\n\t\t});\n\t} catch (error) {\n\t\treturn createIrohRemoteRpcErrorResponse(\n\t\t\tgetRpcResponseId(command),\n\t\t\tcommand.type,\n\t\t\terror instanceof Error ? error.message : String(error),\n\t\t);\n\t}\n\tif (!result.handled) {\n\t\treturn undefined;\n\t}\n\tif (result.metadata) {\n\t\tupdateAuthorizationWorkspaceMetadata(authorization, result.metadata);\n\t}\n\tif (result.response.success === true) {\n\t\tcontext.hostEngine?.clearPairingSecretForWorkspace(authorization.workspace.name);\n\t\tawait context.onWorkspaceUnregistered?.(authorization.workspace.name);\n\t}\n\tawait logAudit(context.auditLogger, {\n\t\ttype: \"workspace_unregistered\",\n\t\tclientNodeId: authorization.client.nodeId,\n\t\tworkspace: authorization.workspace.name,\n\t\tsuccess: result.response.success === true,\n\t\terror: result.response.success === true ? undefined : result.response.error,\n\t\tdetails: { source: \"remote_rpc\" },\n\t});\n\treturn result.response;\n}\n\n/**\n * `set_keep_awake` / `get_keep_awake` from a phone. Host-level (not\n * conversation-level): any paired client with stream access may toggle it. The\n * wire status strips the host-local mechanism name.\n */\nexport function createKeepAwakeRpcResponse(\n\tcommand: RemoteRpcCommand,\n\tcontext: ConversationCommandContext,\n): Record<string, unknown> | IrohRemoteRpcErrorResponse {\n\tconst id = getRpcResponseId(command);\n\tconst keepAwake = context.keepAwake;\n\tif (!keepAwake) {\n\t\treturn createIrohRemoteRpcErrorResponse(id, command.type, \"unsupported_remote_command\");\n\t}\n\tif (command.type === \"set_keep_awake\") {\n\t\tif (typeof command.enabled !== \"boolean\") {\n\t\t\treturn createIrohRemoteRpcErrorResponse(id, command.type, \"set_keep_awake requires a boolean enabled\");\n\t\t}\n\t\tconst status = keepAwake.setEnabled(command.enabled);\n\t\tcontext.onKeepAwakeSetting?.(command.enabled);\n\t\treturn createRpcSuccessResponse(id, command.type, { keepAwake: toRpcKeepAwakeStatus(status) });\n\t}\n\treturn createRpcSuccessResponse(id, command.type, { keepAwake: toRpcKeepAwakeStatus(keepAwake.status) });\n}\n\n/**\n * `set_web_search_key` / `get_web_search_status` from a phone. Host-level (not\n * conversation-level): any paired client with stream access may set it. The\n * wire status never includes the key itself, only whether one is stored.\n */\nexport function createWebSearchKeyRpcResponse(\n\tcommand: RemoteRpcCommand,\n\tcontext: ConversationCommandContext,\n): Record<string, unknown> | IrohRemoteRpcErrorResponse {\n\tconst id = getRpcResponseId(command);\n\tconst webSearchKey = context.webSearchKey;\n\tif (!webSearchKey) {\n\t\treturn createIrohRemoteRpcErrorResponse(id, command.type, \"unsupported_remote_command\");\n\t}\n\tif (command.type === \"set_web_search_key\") {\n\t\tconst apiKey = command.apiKey;\n\t\tif (apiKey !== undefined && apiKey !== null && typeof apiKey !== \"string\") {\n\t\t\treturn createIrohRemoteRpcErrorResponse(\n\t\t\t\tid,\n\t\t\t\tcommand.type,\n\t\t\t\t\"set_web_search_key requires apiKey to be a string or null\",\n\t\t\t);\n\t\t}\n\t\tconst normalized = typeof apiKey === \"string\" ? apiKey.trim() : \"\";\n\t\twebSearchKey.set(normalized.length > 0 ? normalized : null);\n\t}\n\treturn createRpcSuccessResponse(id, command.type, { webSearch: { configured: webSearchKey.configured } });\n}\n\nexport function toRpcKeepAwakeStatus(status: KeepAwakeStatus): RpcKeepAwakeStatus {\n\treturn {\n\t\tenabled: status.enabled,\n\t\tstate: status.state,\n\t\t...(status.reason === undefined ? {} : { reason: status.reason }),\n\t};\n}\n\n// ============================================================================\n// Dispatch\n// ============================================================================\n\n/**\n * Host-side handler for conversation-stream RPC commands that are not served\n * directly by the runtime's rpc mode. Returns undefined for commands the rpc\n * mode should handle itself — including abort, which stops the turn while the\n * stream stays open and the runtime stays live.\n */\nexport async function handleIntegratedConversationRpcCommand(\n\tcommand: RemoteRpcCommand,\n\tauthorization: IrohRemoteClientAuthorizationSuccess,\n\tcontext: ConversationCommandContext,\n\truntime: ConversationCommandRuntime,\n): Promise<object | undefined> {\n\tif (context.isDraining?.() && TURN_INITIATING_RPC_TYPES.has(command.type)) {\n\t\treturn createLeaseDrainingRpcErrorResponse(command);\n\t}\n\t// Defense in depth: the phone hides the composer for subagent tabs, but a\n\t// stray client must not be able to inject turns into a delegated child run.\n\tif (context.isSubagentSession?.() && TURN_INITIATING_RPC_TYPES.has(command.type)) {\n\t\treturn createSubagentSessionReadOnlyRpcErrorResponse(command);\n\t}\n\tif (command.type === \"list_sessions\") {\n\t\treturn await createRemoteListSessionsRpcResponse(command, authorization, context, runtime);\n\t}\n\tif (command.type === \"set_keep_awake\" || command.type === \"get_keep_awake\") {\n\t\treturn createKeepAwakeRpcResponse(command, context);\n\t}\n\tif (command.type === \"set_web_search_key\" || command.type === \"get_web_search_status\") {\n\t\treturn createWebSearchKeyRpcResponse(command, context);\n\t}\n\tif (INTEGRATED_CONVERSATION_UNSUPPORTED_RPC_TYPES.has(command.type)) {\n\t\treturn createIrohRemoteRpcErrorResponse(getRpcResponseId(command), command.type, \"unsupported_remote_command\");\n\t}\n\tif (command.type === \"register_live_activity\") {\n\t\treturn await createRemoteRegisterLiveActivityRpcResponse(\n\t\t\tcommand,\n\t\t\tauthorization,\n\t\t\tcontext,\n\t\t\truntime.session.sessionId,\n\t\t);\n\t}\n\tif (command.type === \"unregister_live_activity\") {\n\t\treturn await createRemoteUnregisterLiveActivityRpcResponse(\n\t\t\tcommand,\n\t\t\tauthorization,\n\t\t\tcontext,\n\t\t\truntime.session.sessionId,\n\t\t);\n\t}\n\tconst identityError = getIntegratedConversationIdentityError(command, authorization, runtime);\n\tif (identityError) {\n\t\treturn createIrohRemoteRpcErrorResponse(getRpcResponseId(command), command.type, identityError);\n\t}\n\tif (command.type === \"upload_device_logs\") {\n\t\treturn await createRemoteUploadDeviceLogsRpcResponse(command, authorization, context);\n\t}\n\tif (command.type === \"get_transcript\") {\n\t\treturn createRemoteGetTranscriptRpcResponse(command, authorization, runtime);\n\t}\n\tif (command.type === \"get_message_images\") {\n\t\treturn createRemoteGetMessageImagesRpcResponse(command, authorization, runtime);\n\t}\n\treturn await handleRemoteHostRpcCommand(command, authorization, context);\n}\n"]}
|