@greppleai/grip 0.0.0-stage → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +115 -0
- package/README.md +731 -2
- package/dist/bun/cli.d.ts +3 -0
- package/dist/bun/cli.d.ts.map +1 -0
- package/dist/bun/cli.js +13 -0
- package/dist/bun/cli.js.map +1 -0
- package/dist/bun/embedded-assets.d.ts +3 -0
- package/dist/bun/embedded-assets.d.ts.map +1 -0
- package/dist/bun/embedded-assets.js +52 -0
- package/dist/bun/embedded-assets.js.map +1 -0
- package/dist/bun/register-bedrock.d.ts +2 -0
- package/dist/bun/register-bedrock.d.ts.map +1 -0
- package/dist/bun/register-bedrock.js +4 -0
- package/dist/bun/register-bedrock.js.map +1 -0
- package/dist/bun/restore-sandbox-env.d.ts +13 -0
- package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
- package/dist/bun/restore-sandbox-env.js +32 -0
- package/dist/bun/restore-sandbox-env.js.map +1 -0
- package/dist/cli/args.d.ts +70 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +442 -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 +60 -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/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.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +14 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +82 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +406 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent-session.d.ts +970 -0
- package/dist/core/agent-session.d.ts.map +1 -0
- package/dist/core/agent-session.js +5191 -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 +150 -0
- package/dist/core/auth-storage.d.ts.map +1 -0
- package/dist/core/auth-storage.js +557 -0
- package/dist/core/auth-storage.js.map +1 -0
- package/dist/core/bash-executor.d.ts +26 -0
- package/dist/core/bash-executor.d.ts.map +1 -0
- package/dist/core/bash-executor.js +99 -0
- package/dist/core/bash-executor.js.map +1 -0
- package/dist/core/compaction/branch-summarization.d.ts +83 -0
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
- package/dist/core/compaction/branch-summarization.js +220 -0
- package/dist/core/compaction/branch-summarization.js.map +1 -0
- package/dist/core/compaction/compaction.d.ts +65 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -0
- package/dist/core/compaction/compaction.js +550 -0
- package/dist/core/compaction/compaction.js.map +1 -0
- package/dist/core/compaction/compression-detection-ledger.d.ts +34 -0
- package/dist/core/compaction/compression-detection-ledger.d.ts.map +1 -0
- package/dist/core/compaction/compression-detection-ledger.js +52 -0
- package/dist/core/compaction/compression-detection-ledger.js.map +1 -0
- package/dist/core/compaction/compression-detector.d.ts +71 -0
- package/dist/core/compaction/compression-detector.d.ts.map +1 -0
- package/dist/core/compaction/compression-detector.js +407 -0
- package/dist/core/compaction/compression-detector.js.map +1 -0
- package/dist/core/compaction/compression-economics.d.ts +55 -0
- package/dist/core/compaction/compression-economics.d.ts.map +1 -0
- package/dist/core/compaction/compression-economics.js +151 -0
- package/dist/core/compaction/compression-economics.js.map +1 -0
- package/dist/core/compaction/utils.d.ts +28 -0
- package/dist/core/compaction/utils.d.ts.map +1 -0
- package/dist/core/compaction/utils.js +165 -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 +18 -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/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 +245 -0
- package/dist/core/export-html/ansi-to-html.js.map +1 -0
- package/dist/core/export-html/index.d.ts +21 -0
- package/dist/core/export-html/index.d.ts.map +1 -0
- package/dist/core/export-html/index.js +230 -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 +32 -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/loader.d.ts +24 -0
- package/dist/core/extensions/loader.d.ts.map +1 -0
- package/dist/core/extensions/loader.js +613 -0
- package/dist/core/extensions/loader.js.map +1 -0
- package/dist/core/extensions/runner.d.ts +160 -0
- package/dist/core/extensions/runner.d.ts.map +1 -0
- package/dist/core/extensions/runner.js +962 -0
- package/dist/core/extensions/runner.js.map +1 -0
- package/dist/core/extensions/types.d.ts +1311 -0
- package/dist/core/extensions/types.d.ts.map +1 -0
- package/dist/core/extensions/types.js +51 -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 +52 -0
- package/dist/core/footer-data-provider.d.ts.map +1 -0
- package/dist/core/footer-data-provider.js +318 -0
- package/dist/core/footer-data-provider.js.map +1 -0
- package/dist/core/grip-agent.d.ts +240 -0
- package/dist/core/grip-agent.d.ts.map +1 -0
- package/dist/core/grip-agent.js +1243 -0
- package/dist/core/grip-agent.js.map +1 -0
- package/dist/core/grip-manifest.d.ts +9 -0
- package/dist/core/grip-manifest.d.ts.map +1 -0
- package/dist/core/grip-manifest.js +25 -0
- package/dist/core/grip-manifest.js.map +1 -0
- package/dist/core/hooks/aggregate.d.ts +5 -0
- package/dist/core/hooks/aggregate.d.ts.map +1 -0
- package/dist/core/hooks/aggregate.js +226 -0
- package/dist/core/hooks/aggregate.js.map +1 -0
- package/dist/core/hooks/config.d.ts +14 -0
- package/dist/core/hooks/config.d.ts.map +1 -0
- package/dist/core/hooks/config.js +372 -0
- package/dist/core/hooks/config.js.map +1 -0
- package/dist/core/hooks/executor.d.ts +12 -0
- package/dist/core/hooks/executor.d.ts.map +1 -0
- package/dist/core/hooks/executor.js +708 -0
- package/dist/core/hooks/executor.js.map +1 -0
- package/dist/core/hooks/index.d.ts +9 -0
- package/dist/core/hooks/index.d.ts.map +1 -0
- package/dist/core/hooks/index.js +14 -0
- package/dist/core/hooks/index.js.map +1 -0
- package/dist/core/hooks/matcher.d.ts +10 -0
- package/dist/core/hooks/matcher.d.ts.map +1 -0
- package/dist/core/hooks/matcher.js +70 -0
- package/dist/core/hooks/matcher.js.map +1 -0
- package/dist/core/hooks/trust-store.d.ts +38 -0
- package/dist/core/hooks/trust-store.d.ts.map +1 -0
- package/dist/core/hooks/trust-store.js +167 -0
- package/dist/core/hooks/trust-store.js.map +1 -0
- package/dist/core/hooks/types.d.ts +234 -0
- package/dist/core/hooks/types.d.ts.map +1 -0
- package/dist/core/hooks/types.js +52 -0
- package/dist/core/hooks/types.js.map +1 -0
- package/dist/core/http-dispatcher.d.ts +21 -0
- package/dist/core/http-dispatcher.d.ts.map +1 -0
- package/dist/core/http-dispatcher.js +82 -0
- package/dist/core/http-dispatcher.js.map +1 -0
- package/dist/core/instruction-resource-loader.d.ts +81 -0
- package/dist/core/instruction-resource-loader.d.ts.map +1 -0
- package/dist/core/instruction-resource-loader.js +574 -0
- package/dist/core/instruction-resource-loader.js.map +1 -0
- package/dist/core/keybindings.d.ts +399 -0
- package/dist/core/keybindings.d.ts.map +1 -0
- package/dist/core/keybindings.js +299 -0
- package/dist/core/keybindings.js.map +1 -0
- package/dist/core/lsp/abort.d.ts +3 -0
- package/dist/core/lsp/abort.d.ts.map +1 -0
- package/dist/core/lsp/abort.js +28 -0
- package/dist/core/lsp/abort.js.map +1 -0
- package/dist/core/lsp/client.d.ts +108 -0
- package/dist/core/lsp/client.d.ts.map +1 -0
- package/dist/core/lsp/client.js +586 -0
- package/dist/core/lsp/client.js.map +1 -0
- package/dist/core/lsp/config-loader.d.ts +44 -0
- package/dist/core/lsp/config-loader.d.ts.map +1 -0
- package/dist/core/lsp/config-loader.js +223 -0
- package/dist/core/lsp/config-loader.js.map +1 -0
- package/dist/core/lsp/config.d.ts +134 -0
- package/dist/core/lsp/config.d.ts.map +1 -0
- package/dist/core/lsp/config.js +682 -0
- package/dist/core/lsp/config.js.map +1 -0
- package/dist/core/lsp/diagnostics.d.ts +18 -0
- package/dist/core/lsp/diagnostics.d.ts.map +1 -0
- package/dist/core/lsp/diagnostics.js +311 -0
- package/dist/core/lsp/diagnostics.js.map +1 -0
- package/dist/core/lsp/file-sync.d.ts +58 -0
- package/dist/core/lsp/file-sync.d.ts.map +1 -0
- package/dist/core/lsp/file-sync.js +432 -0
- package/dist/core/lsp/file-sync.js.map +1 -0
- package/dist/core/lsp/integration.d.ts +62 -0
- package/dist/core/lsp/integration.d.ts.map +1 -0
- package/dist/core/lsp/integration.js +145 -0
- package/dist/core/lsp/integration.js.map +1 -0
- package/dist/core/lsp/language-map.d.ts +54 -0
- package/dist/core/lsp/language-map.d.ts.map +1 -0
- package/dist/core/lsp/language-map.js +300 -0
- package/dist/core/lsp/language-map.js.map +1 -0
- package/dist/core/lsp/manager.d.ts +120 -0
- package/dist/core/lsp/manager.d.ts.map +1 -0
- package/dist/core/lsp/manager.js +636 -0
- package/dist/core/lsp/manager.js.map +1 -0
- package/dist/core/lsp/navigation.d.ts +32 -0
- package/dist/core/lsp/navigation.d.ts.map +1 -0
- package/dist/core/lsp/navigation.js +327 -0
- package/dist/core/lsp/navigation.js.map +1 -0
- package/dist/core/lsp/portable-path.d.ts +18 -0
- package/dist/core/lsp/portable-path.d.ts.map +1 -0
- package/dist/core/lsp/portable-path.js +83 -0
- package/dist/core/lsp/portable-path.js.map +1 -0
- package/dist/core/lsp/refactor.d.ts +32 -0
- package/dist/core/lsp/refactor.d.ts.map +1 -0
- package/dist/core/lsp/refactor.js +519 -0
- package/dist/core/lsp/refactor.js.map +1 -0
- package/dist/core/lsp/transport.d.ts +39 -0
- package/dist/core/lsp/transport.d.ts.map +1 -0
- package/dist/core/lsp/transport.js +261 -0
- package/dist/core/lsp/transport.js.map +1 -0
- package/dist/core/messages.d.ts +34 -0
- package/dist/core/messages.d.ts.map +1 -0
- package/dist/core/messages.js +140 -0
- package/dist/core/messages.js.map +1 -0
- package/dist/core/model-registry.d.ts +148 -0
- package/dist/core/model-registry.d.ts.map +1 -0
- package/dist/core/model-registry.js +812 -0
- package/dist/core/model-registry.js.map +1 -0
- package/dist/core/model-resolver.d.ts +115 -0
- package/dist/core/model-resolver.d.ts.map +1 -0
- package/dist/core/model-resolver.js +498 -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 +209 -0
- package/dist/core/package-manager.d.ts.map +1 -0
- package/dist/core/package-manager.js +2341 -0
- package/dist/core/package-manager.js.map +1 -0
- package/dist/core/prompt-templates.d.ts +57 -0
- package/dist/core/prompt-templates.d.ts.map +1 -0
- package/dist/core/prompt-templates.js +353 -0
- package/dist/core/prompt-templates.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 +33 -0
- package/dist/core/provider-display-names.js.map +1 -0
- package/dist/core/remote-workspace-protocol/contract.d.ts +465 -0
- package/dist/core/remote-workspace-protocol/contract.d.ts.map +1 -0
- package/dist/core/remote-workspace-protocol/contract.js +825 -0
- package/dist/core/remote-workspace-protocol/contract.js.map +1 -0
- package/dist/core/remote-workspace-protocol/guest-shared-client.d.ts +16 -0
- package/dist/core/remote-workspace-protocol/guest-shared-client.d.ts.map +1 -0
- package/dist/core/remote-workspace-protocol/guest-shared-client.js +54 -0
- package/dist/core/remote-workspace-protocol/guest-shared-client.js.map +1 -0
- package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.d.ts +23 -0
- package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.d.ts.map +1 -0
- package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.js +112 -0
- package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.js.map +1 -0
- package/dist/core/remote-workspace-protocol/guest-shared-uplink.d.ts +30 -0
- package/dist/core/remote-workspace-protocol/guest-shared-uplink.d.ts.map +1 -0
- package/dist/core/remote-workspace-protocol/guest-shared-uplink.js +243 -0
- package/dist/core/remote-workspace-protocol/guest-shared-uplink.js.map +1 -0
- package/dist/core/remote-workspace-protocol/lima-owner-directory.d.ts +3 -0
- package/dist/core/remote-workspace-protocol/lima-owner-directory.d.ts.map +1 -0
- package/dist/core/remote-workspace-protocol/lima-owner-directory.js +31 -0
- package/dist/core/remote-workspace-protocol/lima-owner-directory.js.map +1 -0
- package/dist/core/remote-workspace-protocol/lima-owner-lock.d.ts +9 -0
- package/dist/core/remote-workspace-protocol/lima-owner-lock.d.ts.map +1 -0
- package/dist/core/remote-workspace-protocol/lima-owner-lock.js +89 -0
- package/dist/core/remote-workspace-protocol/lima-owner-lock.js.map +1 -0
- package/dist/core/remote-workspace-protocol/session.d.ts +249 -0
- package/dist/core/remote-workspace-protocol/session.d.ts.map +1 -0
- package/dist/core/remote-workspace-protocol/session.js +1842 -0
- package/dist/core/remote-workspace-protocol/session.js.map +1 -0
- package/dist/core/remote-workspace-protocol/shared-transport.d.ts +71 -0
- package/dist/core/remote-workspace-protocol/shared-transport.d.ts.map +1 -0
- package/dist/core/remote-workspace-protocol/shared-transport.js +68 -0
- package/dist/core/remote-workspace-protocol/shared-transport.js.map +1 -0
- package/dist/core/resolve-config-value.d.ts +32 -0
- package/dist/core/resolve-config-value.d.ts.map +1 -0
- package/dist/core/resolve-config-value.js +257 -0
- package/dist/core/resolve-config-value.js.map +1 -0
- package/dist/core/resource-loader.d.ts +200 -0
- package/dist/core/resource-loader.d.ts.map +1 -0
- package/dist/core/resource-loader.js +1209 -0
- package/dist/core/resource-loader.js.map +1 -0
- package/dist/core/rules.d.ts +40 -0
- package/dist/core/rules.d.ts.map +1 -0
- package/dist/core/rules.js +57 -0
- package/dist/core/rules.js.map +1 -0
- package/dist/core/sandbox/command.d.ts +25 -0
- package/dist/core/sandbox/command.d.ts.map +1 -0
- package/dist/core/sandbox/command.js +102 -0
- package/dist/core/sandbox/command.js.map +1 -0
- package/dist/core/sandbox/config.d.ts +91 -0
- package/dist/core/sandbox/config.d.ts.map +1 -0
- package/dist/core/sandbox/config.js +88 -0
- package/dist/core/sandbox/config.js.map +1 -0
- package/dist/core/sandbox/lima-guest-binary.d.ts +11 -0
- package/dist/core/sandbox/lima-guest-binary.d.ts.map +1 -0
- package/dist/core/sandbox/lima-guest-binary.js +140 -0
- package/dist/core/sandbox/lima-guest-binary.js.map +1 -0
- package/dist/core/sandbox/lima.d.ts +57 -0
- package/dist/core/sandbox/lima.d.ts.map +1 -0
- package/dist/core/sandbox/lima.js +716 -0
- package/dist/core/sandbox/lima.js.map +1 -0
- package/dist/core/sandbox/shared-lima-roots.d.ts +11 -0
- package/dist/core/sandbox/shared-lima-roots.d.ts.map +1 -0
- package/dist/core/sandbox/shared-lima-roots.js +25 -0
- package/dist/core/sandbox/shared-lima-roots.js.map +1 -0
- package/dist/core/sandbox/update-shared-guest-binary.d.ts +8 -0
- package/dist/core/sandbox/update-shared-guest-binary.d.ts.map +1 -0
- package/dist/core/sandbox/update-shared-guest-binary.js +100 -0
- package/dist/core/sandbox/update-shared-guest-binary.js.map +1 -0
- package/dist/core/session/constants.d.ts +2 -0
- package/dist/core/session/constants.d.ts.map +1 -0
- package/dist/core/session/constants.js +2 -0
- package/dist/core/session/constants.js.map +1 -0
- package/dist/core/session/context-metadata.d.ts +5 -0
- package/dist/core/session/context-metadata.d.ts.map +1 -0
- package/dist/core/session/context-metadata.js +55 -0
- package/dist/core/session/context-metadata.js.map +1 -0
- package/dist/core/session/context.d.ts +14 -0
- package/dist/core/session/context.d.ts.map +1 -0
- package/dist/core/session/context.js +117 -0
- package/dist/core/session/context.js.map +1 -0
- package/dist/core/session/ids.d.ts +9 -0
- package/dist/core/session/ids.d.ts.map +1 -0
- package/dist/core/session/ids.js +21 -0
- package/dist/core/session/ids.js.map +1 -0
- package/dist/core/session/in-memory-session-manager.d.ts +17 -0
- package/dist/core/session/in-memory-session-manager.d.ts.map +1 -0
- package/dist/core/session/in-memory-session-manager.js +40 -0
- package/dist/core/session/in-memory-session-manager.js.map +1 -0
- package/dist/core/session/in-memory-session.d.ts +7 -0
- package/dist/core/session/in-memory-session.d.ts.map +1 -0
- package/dist/core/session/in-memory-session.js +11 -0
- package/dist/core/session/in-memory-session.js.map +1 -0
- package/dist/core/session/jsonl-errors.d.ts +36 -0
- package/dist/core/session/jsonl-errors.d.ts.map +1 -0
- package/dist/core/session/jsonl-errors.js +49 -0
- package/dist/core/session/jsonl-errors.js.map +1 -0
- package/dist/core/session/jsonl-helpers.d.ts +20 -0
- package/dist/core/session/jsonl-helpers.d.ts.map +1 -0
- package/dist/core/session/jsonl-helpers.js +21 -0
- package/dist/core/session/jsonl-helpers.js.map +1 -0
- package/dist/core/session/local-session-manager.d.ts +30 -0
- package/dist/core/session/local-session-manager.d.ts.map +1 -0
- package/dist/core/session/local-session-manager.js +205 -0
- package/dist/core/session/local-session-manager.js.map +1 -0
- package/dist/core/session/local-session.d.ts +9 -0
- package/dist/core/session/local-session.d.ts.map +1 -0
- package/dist/core/session/local-session.js +15 -0
- package/dist/core/session/local-session.js.map +1 -0
- package/dist/core/session/migrations.d.ts +11 -0
- package/dist/core/session/migrations.d.ts.map +1 -0
- package/dist/core/session/migrations.js +78 -0
- package/dist/core/session/migrations.js.map +1 -0
- package/dist/core/session/remote-session-client.d.ts +83 -0
- package/dist/core/session/remote-session-client.d.ts.map +1 -0
- package/dist/core/session/remote-session-client.js +224 -0
- package/dist/core/session/remote-session-client.js.map +1 -0
- package/dist/core/session/remote-session-manager.d.ts +32 -0
- package/dist/core/session/remote-session-manager.d.ts.map +1 -0
- package/dist/core/session/remote-session-manager.js +124 -0
- package/dist/core/session/remote-session-manager.js.map +1 -0
- package/dist/core/session/remote-session.d.ts +20 -0
- package/dist/core/session/remote-session.d.ts.map +1 -0
- package/dist/core/session/remote-session.js +33 -0
- package/dist/core/session/remote-session.js.map +1 -0
- package/dist/core/session/session-manager.d.ts +18 -0
- package/dist/core/session/session-manager.d.ts.map +1 -0
- package/dist/core/session/session-manager.js +2 -0
- package/dist/core/session/session-manager.js.map +1 -0
- package/dist/core/session/session.d.ts +140 -0
- package/dist/core/session/session.d.ts.map +1 -0
- package/dist/core/session/session.js +461 -0
- package/dist/core/session/session.js.map +1 -0
- package/dist/core/session/stores/in-memory-session-store.d.ts +39 -0
- package/dist/core/session/stores/in-memory-session-store.d.ts.map +1 -0
- package/dist/core/session/stores/in-memory-session-store.js +168 -0
- package/dist/core/session/stores/in-memory-session-store.js.map +1 -0
- package/dist/core/session/stores/jsonl-session-store.d.ts +97 -0
- package/dist/core/session/stores/jsonl-session-store.d.ts.map +1 -0
- package/dist/core/session/stores/jsonl-session-store.js +1140 -0
- package/dist/core/session/stores/jsonl-session-store.js.map +1 -0
- package/dist/core/session/stores/remote-session-store.d.ts +44 -0
- package/dist/core/session/stores/remote-session-store.d.ts.map +1 -0
- package/dist/core/session/stores/remote-session-store.js +159 -0
- package/dist/core/session/stores/remote-session-store.js.map +1 -0
- package/dist/core/session/stores/session-store.d.ts +42 -0
- package/dist/core/session/stores/session-store.d.ts.map +1 -0
- package/dist/core/session/stores/session-store.js +2 -0
- package/dist/core/session/stores/session-store.js.map +1 -0
- package/dist/core/session/types.d.ts +141 -0
- package/dist/core/session/types.d.ts.map +1 -0
- package/dist/core/session/types.js +2 -0
- package/dist/core/session/types.js.map +1 -0
- package/dist/core/session/usage-ledger.d.ts +18 -0
- package/dist/core/session/usage-ledger.d.ts.map +1 -0
- package/dist/core/session/usage-ledger.js +68 -0
- package/dist/core/session/usage-ledger.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/settings-manager.d.ts +314 -0
- package/dist/core/settings-manager.d.ts.map +1 -0
- package/dist/core/settings-manager.js +991 -0
- package/dist/core/settings-manager.js.map +1 -0
- package/dist/core/skills.d.ts +40 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +57 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/slash-commands.d.ts +15 -0
- package/dist/core/slash-commands.d.ts.map +1 -0
- package/dist/core/slash-commands.js +36 -0
- package/dist/core/slash-commands.js.map +1 -0
- package/dist/core/source-info.d.ts +26 -0
- package/dist/core/source-info.d.ts.map +1 -0
- package/dist/core/source-info.js +27 -0
- package/dist/core/source-info.js.map +1 -0
- package/dist/core/system-prompt.d.ts +32 -0
- package/dist/core/system-prompt.d.ts.map +1 -0
- package/dist/core/system-prompt.js +131 -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/timings.d.ts +10 -0
- package/dist/core/timings.d.ts.map +1 -0
- package/dist/core/timings.js +41 -0
- package/dist/core/timings.js.map +1 -0
- package/dist/core/tools/bash.d.ts +51 -0
- package/dist/core/tools/bash.d.ts.map +1 -0
- package/dist/core/tools/bash.js +321 -0
- package/dist/core/tools/bash.js.map +1 -0
- package/dist/core/tools/compress-context.d.ts +27 -0
- package/dist/core/tools/compress-context.d.ts.map +1 -0
- package/dist/core/tools/compress-context.js +142 -0
- package/dist/core/tools/compress-context.js.map +1 -0
- package/dist/core/tools/edit-diff.d.ts +82 -0
- package/dist/core/tools/edit-diff.d.ts.map +1 -0
- package/dist/core/tools/edit-diff.js +327 -0
- package/dist/core/tools/edit-diff.js.map +1 -0
- package/dist/core/tools/edit.d.ts +50 -0
- package/dist/core/tools/edit.d.ts.map +1 -0
- package/dist/core/tools/edit.js +324 -0
- package/dist/core/tools/edit.js.map +1 -0
- package/dist/core/tools/file-mutation-queue.d.ts +8 -0
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
- package/dist/core/tools/file-mutation-queue.js +69 -0
- package/dist/core/tools/file-mutation-queue.js.map +1 -0
- package/dist/core/tools/find.d.ts +22 -0
- package/dist/core/tools/find.d.ts.map +1 -0
- package/dist/core/tools/find.js +268 -0
- package/dist/core/tools/find.js.map +1 -0
- package/dist/core/tools/grep.d.ts +27 -0
- package/dist/core/tools/grep.d.ts.map +1 -0
- package/dist/core/tools/grep.js +332 -0
- package/dist/core/tools/grep.js.map +1 -0
- package/dist/core/tools/hash-store.d.ts +12 -0
- package/dist/core/tools/hash-store.d.ts.map +1 -0
- package/dist/core/tools/hash-store.js +48 -0
- package/dist/core/tools/hash-store.js.map +1 -0
- package/dist/core/tools/hashline/apply.d.ts +40 -0
- package/dist/core/tools/hashline/apply.d.ts.map +1 -0
- package/dist/core/tools/hashline/apply.js +261 -0
- package/dist/core/tools/hashline/apply.js.map +1 -0
- package/dist/core/tools/hashline/hash.d.ts +56 -0
- package/dist/core/tools/hashline/hash.d.ts.map +1 -0
- package/dist/core/tools/hashline/hash.js +196 -0
- package/dist/core/tools/hashline/hash.js.map +1 -0
- package/dist/core/tools/hashline/parse.d.ts +8 -0
- package/dist/core/tools/hashline/parse.d.ts.map +1 -0
- package/dist/core/tools/hashline/parse.js +41 -0
- package/dist/core/tools/hashline/parse.js.map +1 -0
- package/dist/core/tools/hashline/resolve.d.ts +51 -0
- package/dist/core/tools/hashline/resolve.d.ts.map +1 -0
- package/dist/core/tools/hashline/resolve.js +187 -0
- package/dist/core/tools/hashline/resolve.js.map +1 -0
- package/dist/core/tools/hashline-utils.d.ts +6 -0
- package/dist/core/tools/hashline-utils.d.ts.map +1 -0
- package/dist/core/tools/hashline-utils.js +23 -0
- package/dist/core/tools/hashline-utils.js.map +1 -0
- package/dist/core/tools/index.d.ts +36 -0
- package/dist/core/tools/index.d.ts.map +1 -0
- package/dist/core/tools/index.js +141 -0
- package/dist/core/tools/index.js.map +1 -0
- package/dist/core/tools/ls.d.ts +21 -0
- package/dist/core/tools/ls.d.ts.map +1 -0
- package/dist/core/tools/ls.js +156 -0
- package/dist/core/tools/ls.js.map +1 -0
- package/dist/core/tools/operations.d.ts +212 -0
- package/dist/core/tools/operations.d.ts.map +1 -0
- package/dist/core/tools/operations.js +793 -0
- package/dist/core/tools/operations.js.map +1 -0
- package/dist/core/tools/output-accumulator.d.ts +54 -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 +9 -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 +32 -0
- package/dist/core/tools/read.d.ts.map +1 -0
- package/dist/core/tools/read.js +318 -0
- package/dist/core/tools/read.js.map +1 -0
- package/dist/core/tools/render-utils.d.ts +33 -0
- package/dist/core/tools/render-utils.d.ts.map +1 -0
- package/dist/core/tools/render-utils.js +61 -0
- package/dist/core/tools/render-utils.js.map +1 -0
- package/dist/core/tools/replace-diff.d.ts +16 -0
- package/dist/core/tools/replace-diff.d.ts.map +1 -0
- package/dist/core/tools/replace-diff.js +117 -0
- package/dist/core/tools/replace-diff.js.map +1 -0
- package/dist/core/tools/replace-normalize.d.ts +2 -0
- package/dist/core/tools/replace-normalize.d.ts.map +1 -0
- package/dist/core/tools/replace-normalize.js +73 -0
- package/dist/core/tools/replace-normalize.js.map +1 -0
- package/dist/core/tools/replace-render.d.ts +51 -0
- package/dist/core/tools/replace-render.d.ts.map +1 -0
- package/dist/core/tools/replace-render.js +162 -0
- package/dist/core/tools/replace-render.js.map +1 -0
- package/dist/core/tools/runtime.d.ts +2 -0
- package/dist/core/tools/runtime.d.ts.map +1 -0
- package/dist/core/tools/runtime.js +6 -0
- package/dist/core/tools/runtime.js.map +1 -0
- package/dist/core/tools/session-history.d.ts +55 -0
- package/dist/core/tools/session-history.d.ts.map +1 -0
- package/dist/core/tools/session-history.js +649 -0
- package/dist/core/tools/session-history.js.map +1 -0
- package/dist/core/tools/subagent-agents.d.ts +29 -0
- package/dist/core/tools/subagent-agents.d.ts.map +1 -0
- package/dist/core/tools/subagent-agents.js +223 -0
- package/dist/core/tools/subagent-agents.js.map +1 -0
- package/dist/core/tools/subagent.d.ts +185 -0
- package/dist/core/tools/subagent.d.ts.map +1 -0
- package/dist/core/tools/subagent.js +1309 -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 +39 -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/websearch.d.ts +33 -0
- package/dist/core/tools/websearch.d.ts.map +1 -0
- package/dist/core/tools/websearch.js +341 -0
- package/dist/core/tools/websearch.js.map +1 -0
- package/dist/core/tools/workspace-tool-host.d.ts +102 -0
- package/dist/core/tools/workspace-tool-host.d.ts.map +1 -0
- package/dist/core/tools/workspace-tool-host.js +348 -0
- package/dist/core/tools/workspace-tool-host.js.map +1 -0
- package/dist/core/tools/write.d.ts +16 -0
- package/dist/core/tools/write.d.ts.map +1 -0
- package/dist/core/tools/write.js +204 -0
- package/dist/core/tools/write.js.map +1 -0
- package/dist/core/workspace-identity.d.ts +7 -0
- package/dist/core/workspace-identity.d.ts.map +1 -0
- package/dist/core/workspace-identity.js +2 -0
- package/dist/core/workspace-identity.js.map +1 -0
- package/dist/daemon/activity-budget.d.ts +10 -0
- package/dist/daemon/activity-budget.d.ts.map +1 -0
- package/dist/daemon/activity-budget.js +34 -0
- package/dist/daemon/activity-budget.js.map +1 -0
- package/dist/daemon/command.d.ts +6 -0
- package/dist/daemon/command.d.ts.map +1 -0
- package/dist/daemon/command.js +58 -0
- package/dist/daemon/command.js.map +1 -0
- package/dist/daemon/config.d.ts +45 -0
- package/dist/daemon/config.d.ts.map +1 -0
- package/dist/daemon/config.js +319 -0
- package/dist/daemon/config.js.map +1 -0
- package/dist/daemon/help.d.ts +2 -0
- package/dist/daemon/help.d.ts.map +1 -0
- package/dist/daemon/help.js +42 -0
- package/dist/daemon/help.js.map +1 -0
- package/dist/daemon/lsp-config.d.ts +4 -0
- package/dist/daemon/lsp-config.d.ts.map +1 -0
- package/dist/daemon/lsp-config.js +155 -0
- package/dist/daemon/lsp-config.js.map +1 -0
- package/dist/daemon/outbound-budget.d.ts +10 -0
- package/dist/daemon/outbound-budget.d.ts.map +1 -0
- package/dist/daemon/outbound-budget.js +30 -0
- package/dist/daemon/outbound-budget.js.map +1 -0
- package/dist/daemon/security.d.ts +19 -0
- package/dist/daemon/security.d.ts.map +1 -0
- package/dist/daemon/security.js +177 -0
- package/dist/daemon/security.js.map +1 -0
- package/dist/daemon/server.d.ts +20 -0
- package/dist/daemon/server.d.ts.map +1 -0
- package/dist/daemon/server.js +480 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/daemon/shared-connection.d.ts +33 -0
- package/dist/daemon/shared-connection.d.ts.map +1 -0
- package/dist/daemon/shared-connection.js +271 -0
- package/dist/daemon/shared-connection.js.map +1 -0
- package/dist/daemon/shared-revision.d.ts +5 -0
- package/dist/daemon/shared-revision.d.ts.map +1 -0
- package/dist/daemon/shared-revision.js +61 -0
- package/dist/daemon/shared-revision.js.map +1 -0
- package/dist/daemon/shared-roots.d.ts +9 -0
- package/dist/daemon/shared-roots.d.ts.map +1 -0
- package/dist/daemon/shared-roots.js +33 -0
- package/dist/daemon/shared-roots.js.map +1 -0
- package/dist/daemon/workspace-runtime.d.ts +46 -0
- package/dist/daemon/workspace-runtime.d.ts.map +1 -0
- package/dist/daemon/workspace-runtime.js +705 -0
- package/dist/daemon/workspace-runtime.js.map +1 -0
- package/dist/index.d.ts +109 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +107 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +39 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +765 -0
- package/dist/main.js.map +1 -0
- package/dist/migrations.d.ts +35 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +412 -0
- package/dist/migrations.js.map +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts +30 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/assistant-message.js +159 -0
- package/dist/modes/interactive/components/assistant-message.js.map +1 -0
- package/dist/modes/interactive/components/bash-execution.d.ts +36 -0
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/bash-execution.js +173 -0
- package/dist/modes/interactive/components/bash-execution.js.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts +18 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.js +54 -0
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts +17 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.js +45 -0
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +17 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.js +46 -0
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/config-selector.d.ts +74 -0
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/config-selector.js +514 -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 +25 -0
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-editor.js +85 -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 +81 -0
- package/dist/modes/interactive/components/custom-message.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 +118 -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 +22 -0
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-editor.js +128 -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 +26 -0
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-selector.js +83 -0
- package/dist/modes/interactive/components/extension-selector.js.map +1 -0
- package/dist/modes/interactive/components/footer.d.ts +36 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -0
- package/dist/modes/interactive/components/footer.js +227 -0
- package/dist/modes/interactive/components/footer.js.map +1 -0
- package/dist/modes/interactive/components/hook-execution.d.ts +19 -0
- package/dist/modes/interactive/components/hook-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/hook-execution.js +185 -0
- package/dist/modes/interactive/components/hook-execution.js.map +1 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
- package/dist/modes/interactive/components/keybinding-hints.js +36 -0
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
- package/dist/modes/interactive/components/login-dialog.d.ts +55 -0
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
- package/dist/modes/interactive/components/login-dialog.js +176 -0
- package/dist/modes/interactive/components/login-dialog.js.map +1 -0
- package/dist/modes/interactive/components/markdown-transform.d.ts +4 -0
- package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -0
- package/dist/modes/interactive/components/markdown-transform.js +19 -0
- package/dist/modes/interactive/components/markdown-transform.js.map +1 -0
- package/dist/modes/interactive/components/mermaid.d.ts +14 -0
- package/dist/modes/interactive/components/mermaid.d.ts.map +1 -0
- package/dist/modes/interactive/components/mermaid.js +228 -0
- package/dist/modes/interactive/components/mermaid.js.map +1 -0
- package/dist/modes/interactive/components/message-card.d.ts +9 -0
- package/dist/modes/interactive/components/message-card.d.ts.map +1 -0
- package/dist/modes/interactive/components/message-card.js +24 -0
- package/dist/modes/interactive/components/message-card.js.map +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts +52 -0
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/model-selector.js +296 -0
- package/dist/modes/interactive/components/model-selector.js.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts +33 -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/scoped-models-selector.d.ts +50 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.js +300 -0
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts +22 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.js +144 -0
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
- package/dist/modes/interactive/components/session-selector.d.ts +108 -0
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector.js +835 -0
- package/dist/modes/interactive/components/session-selector.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +81 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-selector.js +455 -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 +18 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.js +48 -0
- package/dist/modes/interactive/components/skill-invocation-message.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 +51 -0
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +67 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution.js +312 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector.d.ts +127 -0
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector.js +1098 -0
- package/dist/modes/interactive/components/tree-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 +16 -0
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message.js +50 -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/interactive-mode.d.ts +554 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-mode.js +5870 -0
- package/dist/modes/interactive/interactive-mode.js.map +1 -0
- package/dist/modes/interactive/theme/dark.json +86 -0
- package/dist/modes/interactive/theme/light.json +85 -0
- package/dist/modes/interactive/theme/theme-schema.json +335 -0
- package/dist/modes/interactive/theme/theme.d.ts +109 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme.js +1040 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -0
- package/dist/modes/json-event.d.ts +28 -0
- package/dist/modes/json-event.d.ts.map +1 -0
- package/dist/modes/json-event.js +12 -0
- package/dist/modes/json-event.js.map +1 -0
- package/dist/modes/print-mode.d.ts +29 -0
- package/dist/modes/print-mode.d.ts.map +1 -0
- package/dist/modes/print-mode.js +142 -0
- package/dist/modes/print-mode.js.map +1 -0
- package/dist/modes/rpc/jsonl.d.ts +17 -0
- package/dist/modes/rpc/jsonl.d.ts.map +1 -0
- package/dist/modes/rpc/jsonl.js +49 -0
- package/dist/modes/rpc/jsonl.js.map +1 -0
- package/dist/modes/rpc/rpc-client.d.ts +321 -0
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-client.js +755 -0
- package/dist/modes/rpc/rpc-client.js.map +1 -0
- package/dist/modes/rpc/rpc-mode.d.ts +20 -0
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-mode.js +963 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -0
- package/dist/modes/rpc/rpc-types.d.ts +652 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-types.js +8 -0
- package/dist/modes/rpc/rpc-types.js.map +1 -0
- package/dist/package-manager-cli.d.ts +4 -0
- package/dist/package-manager-cli.d.ts.map +1 -0
- package/dist/package-manager-cli.js +488 -0
- package/dist/package-manager-cli.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 +25 -0
- package/dist/utils/ansi.js.map +1 -0
- package/dist/utils/changelog.d.ts +23 -0
- package/dist/utils/changelog.d.ts.map +1 -0
- package/dist/utils/changelog.js +74 -0
- package/dist/utils/changelog.js.map +1 -0
- package/dist/utils/child-process.d.ts +15 -0
- package/dist/utils/child-process.d.ts.map +1 -0
- package/dist/utils/child-process.js +88 -0
- package/dist/utils/child-process.js.map +1 -0
- package/dist/utils/clipboard-image.d.ts +13 -0
- package/dist/utils/clipboard-image.d.ts.map +1 -0
- package/dist/utils/clipboard-image.js +248 -0
- package/dist/utils/clipboard-image.js.map +1 -0
- package/dist/utils/clipboard-native.d.ts +11 -0
- package/dist/utils/clipboard-native.d.ts.map +1 -0
- package/dist/utils/clipboard-native.js +20 -0
- package/dist/utils/clipboard-native.js.map +1 -0
- package/dist/utils/clipboard.d.ts +4 -0
- package/dist/utils/clipboard.d.ts.map +1 -0
- package/dist/utils/clipboard.js +171 -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/directory-completions.d.ts +5 -0
- package/dist/utils/directory-completions.d.ts.map +1 -0
- package/dist/utils/directory-completions.js +64 -0
- package/dist/utils/directory-completions.js.map +1 -0
- package/dist/utils/exif-orientation.d.ts +6 -0
- package/dist/utils/exif-orientation.d.ts.map +1 -0
- package/dist/utils/exif-orientation.js +166 -0
- package/dist/utils/exif-orientation.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 +27 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +237 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/grip-user-agent.d.ts +2 -0
- package/dist/utils/grip-user-agent.d.ts.map +1 -0
- package/dist/utils/grip-user-agent.js +5 -0
- package/dist/utils/grip-user-agent.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/image-convert.d.ts +12 -0
- package/dist/utils/image-convert.d.ts.map +1 -0
- package/dist/utils/image-convert.js +43 -0
- package/dist/utils/image-convert.js.map +1 -0
- package/dist/utils/image-process.d.ts +18 -0
- package/dist/utils/image-process.d.ts.map +1 -0
- package/dist/utils/image-process.js +83 -0
- package/dist/utils/image-process.js.map +1 -0
- package/dist/utils/image-resize-core.d.ts +30 -0
- package/dist/utils/image-resize-core.d.ts.map +1 -0
- package/dist/utils/image-resize-core.js +133 -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 +19 -0
- package/dist/utils/image-resize.d.ts.map +1 -0
- package/dist/utils/image-resize.js +86 -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 +110 -0
- package/dist/utils/mime.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 +87 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/photon.d.ts +22 -0
- package/dist/utils/photon.d.ts.map +1 -0
- package/dist/utils/photon.js +126 -0
- package/dist/utils/photon.js.map +1 -0
- package/dist/utils/shell.d.ts +28 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +188 -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 +12 -0
- package/dist/utils/syntax-highlight.d.ts.map +1 -0
- package/dist/utils/syntax-highlight.js +125 -0
- package/dist/utils/syntax-highlight.js.map +1 -0
- package/dist/utils/tools-manager.d.ts +5 -0
- package/dist/utils/tools-manager.d.ts.map +1 -0
- package/dist/utils/tools-manager.js +329 -0
- package/dist/utils/tools-manager.js.map +1 -0
- package/dist/utils/version-check.d.ts +14 -0
- package/dist/utils/version-check.d.ts.map +1 -0
- package/dist/utils/version-check.js +91 -0
- package/dist/utils/version-check.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 +408 -0
- package/docs/custom-provider.md +714 -0
- package/docs/daemon-architecture.md +399 -0
- package/docs/daemon.md +112 -0
- package/docs/development.md +72 -0
- package/docs/docs.json +164 -0
- package/docs/extensions.md +2745 -0
- package/docs/hooks.md +85 -0
- package/docs/images/doom-extension.png +0 -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 +77 -0
- package/docs/json.md +89 -0
- package/docs/keybindings.md +230 -0
- package/docs/lsp.md +499 -0
- package/docs/migrating-to-grip.md +18 -0
- package/docs/models.md +496 -0
- package/docs/packages.md +228 -0
- package/docs/prompt-templates.md +88 -0
- package/docs/providers.md +251 -0
- package/docs/quickstart.md +159 -0
- package/docs/rpc.md +1492 -0
- package/docs/rules.md +117 -0
- package/docs/sandbox.md +104 -0
- package/docs/sdk.md +360 -0
- package/docs/session-format.md +414 -0
- package/docs/sessions.md +137 -0
- package/docs/settings.md +372 -0
- package/docs/shell-aliases.md +13 -0
- package/docs/skills.md +246 -0
- package/docs/terminal-setup.md +112 -0
- package/docs/termux.md +112 -0
- package/docs/themes.md +295 -0
- package/docs/tmux.md +61 -0
- package/docs/tui.md +918 -0
- package/docs/usage.md +304 -0
- package/docs/windows.md +17 -0
- package/examples/README.md +29 -0
- package/examples/daemon-docker/Dockerfile +43 -0
- package/examples/daemon-docker/README.md +45 -0
- package/examples/extensions/README.md +208 -0
- package/examples/extensions/auto-commit-on-exit.ts +46 -0
- package/examples/extensions/bash-spawn-hook.ts +30 -0
- package/examples/extensions/bookmark.ts +50 -0
- package/examples/extensions/border-status-editor.ts +145 -0
- package/examples/extensions/built-in-tool-renderer.ts +259 -0
- package/examples/extensions/claude-rules.ts +86 -0
- package/examples/extensions/commands.ts +82 -0
- package/examples/extensions/confirm-destructive.ts +59 -0
- package/examples/extensions/custom-compaction.ts +131 -0
- package/examples/extensions/custom-footer.ts +79 -0
- package/examples/extensions/custom-header.ts +73 -0
- package/examples/extensions/custom-provider-anthropic/index.ts +707 -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 +402 -0
- package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +104 -0
- package/examples/extensions/dirty-repo-guard.ts +59 -0
- package/examples/extensions/doom-overlay/README.md +46 -0
- package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
- package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
- package/examples/extensions/doom-overlay/doom/build.sh +152 -0
- package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
- package/examples/extensions/doom-overlay/doom-component.ts +133 -0
- package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
- package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
- package/examples/extensions/doom-overlay/index.ts +74 -0
- package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
- package/examples/extensions/dynamic-resources/RULES.md +8 -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 +16 -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 +125 -0
- package/examples/extensions/github-issue-autocomplete.ts +191 -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 +104 -0
- package/examples/extensions/input-transform.ts +43 -0
- package/examples/extensions/interactive-shell.ts +194 -0
- package/examples/extensions/mac-system-theme.ts +47 -0
- package/examples/extensions/message-renderer.ts +59 -0
- package/examples/extensions/minimal-mode.ts +428 -0
- package/examples/extensions/modal-editor.ts +86 -0
- package/examples/extensions/model-status.ts +31 -0
- package/examples/extensions/notify.ts +55 -0
- package/examples/extensions/overlay-qa-tests.ts +1374 -0
- package/examples/extensions/overlay-test.ts +171 -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 +346 -0
- package/examples/extensions/plan-mode/utils.ts +172 -0
- package/examples/extensions/preset.ts +426 -0
- package/examples/extensions/prompt-customizer.ts +97 -0
- package/examples/extensions/protected-paths.ts +29 -0
- package/examples/extensions/provider-payload.ts +18 -0
- package/examples/extensions/qna.ts +125 -0
- package/examples/extensions/question.ts +294 -0
- package/examples/extensions/questionnaire.ts +459 -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 +320 -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 +381 -0
- package/examples/extensions/space-invaders.ts +597 -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 +1083 -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 +186 -0
- package/examples/extensions/system-prompt-header.ts +17 -0
- package/examples/extensions/tic-tac-toe.ts +1091 -0
- package/examples/extensions/timed-confirm.ts +70 -0
- package/examples/extensions/titlebar-spinner.ts +58 -0
- package/examples/extensions/todo.ts +306 -0
- package/examples/extensions/tool-override.ts +144 -0
- package/examples/extensions/tools.ts +141 -0
- package/examples/extensions/trigger-compact.ts +50 -0
- package/examples/extensions/truncated-tool.ts +200 -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-session-server/README.md +71 -0
- package/examples/remote-session-server/server.ts +353 -0
- package/examples/rpc-extension-ui.ts +642 -0
- package/examples/sdk/01-minimal.ts +27 -0
- package/examples/sdk/02-custom-model.ts +54 -0
- package/examples/sdk/03-custom-prompt.ts +76 -0
- package/examples/sdk/04-skills.ts +60 -0
- package/examples/sdk/05-tools.ts +55 -0
- package/examples/sdk/06-extensions.ts +94 -0
- package/examples/sdk/07-context-files.ts +47 -0
- package/examples/sdk/08-prompt-templates.ts +56 -0
- package/examples/sdk/09-api-keys-and-oauth.ts +50 -0
- package/examples/sdk/10-settings.ts +58 -0
- package/examples/sdk/11-sessions.ts +54 -0
- package/examples/sdk/12-full-control.ts +79 -0
- package/examples/sdk/13-session-runtime.ts +49 -0
- package/examples/sdk/README.md +94 -0
- package/npm-shrinkwrap.json +1878 -0
- package/package.json +101 -5
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import WebSocket from "ws";
|
|
3
|
+
import { VERSION } from "../../config.js";
|
|
4
|
+
import { DEFAULT_REMOTE_WORKSPACE_PROTOCOL_LIMITS as limits, parseRemoteWorkspaceClientMessage, } from "./contract.js";
|
|
5
|
+
import { GuestOutboundScheduler } from "./guest-shared-outbound-scheduler.js";
|
|
6
|
+
import { parseSharedWorkspaceServerFrame, SHARED_WORKSPACE_WEBSOCKET_PROTOCOL, } from "./shared-transport.js";
|
|
7
|
+
/** Owns one v2 physical socket. Loss invalidates every channel; nothing is replayed. */
|
|
8
|
+
export class GuestSharedUplink {
|
|
9
|
+
channels = new Map();
|
|
10
|
+
opens = new Map();
|
|
11
|
+
failure;
|
|
12
|
+
outbound;
|
|
13
|
+
socket;
|
|
14
|
+
epoch;
|
|
15
|
+
/** Resolves on any terminal uplink failure (including explicit disposal); never reconnects. */
|
|
16
|
+
whenFailed;
|
|
17
|
+
resolveFailure;
|
|
18
|
+
constructor(socket, epoch) {
|
|
19
|
+
this.socket = socket;
|
|
20
|
+
this.epoch = epoch;
|
|
21
|
+
this.whenFailed = new Promise((resolve) => {
|
|
22
|
+
this.resolveFailure = resolve;
|
|
23
|
+
});
|
|
24
|
+
this.outbound = new GuestOutboundScheduler((bytes, callback) => socket.send(bytes, { binary: false, compress: false }, (error) => callback(error ?? undefined)), () => socket.bufferedAmount, (error) => this.fail(error));
|
|
25
|
+
socket.on("message", (data, isBinary) => this.receive(data, isBinary));
|
|
26
|
+
socket.on("close", () => this.fail(new Error("Shared workspace uplink disconnected; operations may have committed")));
|
|
27
|
+
socket.on("error", () => this.fail(new Error("Shared workspace uplink failed; operations may have committed")));
|
|
28
|
+
if (socket.readyState !== WebSocket.OPEN)
|
|
29
|
+
this.fail(new Error("Shared workspace uplink disconnected"));
|
|
30
|
+
}
|
|
31
|
+
receive(data, isBinary) {
|
|
32
|
+
try {
|
|
33
|
+
if (isBinary)
|
|
34
|
+
throw new Error("Unexpected binary shared workspace frame");
|
|
35
|
+
this.route(parseSharedWorkspaceServerFrame(data, limits));
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
this.fail(new Error("Invalid or unrouteable shared workspace response"));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
routeControl(frame) {
|
|
42
|
+
const pending = this.opens.get(frame.id);
|
|
43
|
+
if (!pending)
|
|
44
|
+
throw new Error("Unknown shared workspace control ID");
|
|
45
|
+
this.opens.delete(frame.id);
|
|
46
|
+
if (frame.type === "opened")
|
|
47
|
+
pending.resolve(frame.channelId);
|
|
48
|
+
else
|
|
49
|
+
pending.reject(new Error(`Shared workspace open failed: ${frame.code}`));
|
|
50
|
+
}
|
|
51
|
+
route(frame) {
|
|
52
|
+
if (frame.type === "hello_ack")
|
|
53
|
+
throw new Error("Unexpected shared workspace hello acknowledgement");
|
|
54
|
+
if (frame.type === "opened" || frame.type === "control_error") {
|
|
55
|
+
this.routeControl(frame);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const channel = this.channels.get(frame.channelId);
|
|
59
|
+
if (!channel)
|
|
60
|
+
throw new Error("Unknown shared workspace channel ID");
|
|
61
|
+
if (frame.type === "closed") {
|
|
62
|
+
this.channels.delete(frame.channelId);
|
|
63
|
+
if (frame.reason || !channel.closing) {
|
|
64
|
+
const error = new Error(frame.reason?.message ?? "Shared workspace channel closed unexpectedly");
|
|
65
|
+
channel.rejectClose?.(error);
|
|
66
|
+
channel.onFailure(error);
|
|
67
|
+
}
|
|
68
|
+
else
|
|
69
|
+
channel.resolveClose?.();
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// An in-flight response can race a requested detach; deliver until closed is acknowledged.
|
|
73
|
+
channel.onMessage(frame.payload);
|
|
74
|
+
}
|
|
75
|
+
static async connect(url, token) {
|
|
76
|
+
const endpoint = new URL(url);
|
|
77
|
+
if (!["ws:", "wss:"].includes(endpoint.protocol) ||
|
|
78
|
+
endpoint.username ||
|
|
79
|
+
endpoint.password ||
|
|
80
|
+
endpoint.hash) {
|
|
81
|
+
throw new Error("Invalid shared workspace endpoint");
|
|
82
|
+
}
|
|
83
|
+
const socket = new WebSocket(endpoint.toString(), SHARED_WORKSPACE_WEBSOCKET_PROTOCOL, {
|
|
84
|
+
perMessageDeflate: false,
|
|
85
|
+
...(token ? { headers: { authorization: `Bearer ${token}` } } : {}),
|
|
86
|
+
});
|
|
87
|
+
try {
|
|
88
|
+
await new Promise((resolve, reject) => {
|
|
89
|
+
const timer = setTimeout(() => reject(new Error("Shared workspace connection timed out")), 5000);
|
|
90
|
+
socket.once("open", () => {
|
|
91
|
+
clearTimeout(timer);
|
|
92
|
+
resolve();
|
|
93
|
+
});
|
|
94
|
+
socket.once("error", () => {
|
|
95
|
+
clearTimeout(timer);
|
|
96
|
+
reject(new Error("Shared workspace connection failed"));
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
if (socket.protocol !== SHARED_WORKSPACE_WEBSOCKET_PROTOCOL) {
|
|
100
|
+
throw new Error("Daemon does not support grip.workspace.v2");
|
|
101
|
+
}
|
|
102
|
+
const id = randomBytes(12).toString("hex");
|
|
103
|
+
const epoch = await new Promise((resolve, reject) => {
|
|
104
|
+
let settled = false;
|
|
105
|
+
const timer = setTimeout(() => settle(undefined, new Error("Shared workspace hello timed out")), 5000);
|
|
106
|
+
const settle = (value, error) => {
|
|
107
|
+
if (settled)
|
|
108
|
+
return;
|
|
109
|
+
settled = true;
|
|
110
|
+
clearTimeout(timer);
|
|
111
|
+
socket.off("message", onMessage);
|
|
112
|
+
socket.off("close", onClose);
|
|
113
|
+
socket.off("error", onError);
|
|
114
|
+
if (error)
|
|
115
|
+
reject(error);
|
|
116
|
+
else
|
|
117
|
+
resolve(value);
|
|
118
|
+
};
|
|
119
|
+
const onError = () => settle(undefined, new Error("Shared workspace hello failed"));
|
|
120
|
+
const onClose = () => settle(undefined, new Error("Shared workspace hello failed"));
|
|
121
|
+
const onMessage = (data, isBinary) => {
|
|
122
|
+
try {
|
|
123
|
+
if (isBinary)
|
|
124
|
+
throw new Error("Unexpected binary frame");
|
|
125
|
+
const frame = parseSharedWorkspaceServerFrame(Buffer.from(data), limits);
|
|
126
|
+
if (frame.type !== "hello_ack" || frame.id !== id)
|
|
127
|
+
throw new Error("Unexpected hello response");
|
|
128
|
+
if (frame.daemonVersion !== VERSION) {
|
|
129
|
+
settle(undefined, new Error("Shared workspace daemon version mismatch"));
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
settle(frame.epoch);
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
settle(undefined, new Error("Invalid shared workspace hello response"));
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
socket.on("message", onMessage);
|
|
139
|
+
socket.once("close", onClose);
|
|
140
|
+
socket.once("error", onError);
|
|
141
|
+
socket.send(JSON.stringify({ type: "hello", version: 2, id }), (error) => {
|
|
142
|
+
if (error)
|
|
143
|
+
settle(undefined, new Error("Shared workspace hello send failed"));
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
return new GuestSharedUplink(socket, epoch);
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
socket.on("error", () => undefined);
|
|
150
|
+
socket.terminate();
|
|
151
|
+
throw error;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
async open(root, onMessage, onFailure) {
|
|
155
|
+
if (this.failure)
|
|
156
|
+
throw this.failure;
|
|
157
|
+
if (this.channels.size + this.opens.size >= 32)
|
|
158
|
+
throw new Error("Shared workspace channel limit exceeded");
|
|
159
|
+
const id = randomBytes(12).toString("hex");
|
|
160
|
+
const channelId = await new Promise((resolve, reject) => {
|
|
161
|
+
const timer = setTimeout(() => this.fail(new Error("Shared workspace open timed out; operations may have committed")), 5000);
|
|
162
|
+
this.opens.set(id, {
|
|
163
|
+
resolve: (openedId) => {
|
|
164
|
+
clearTimeout(timer);
|
|
165
|
+
resolve(openedId);
|
|
166
|
+
},
|
|
167
|
+
reject: (error) => {
|
|
168
|
+
clearTimeout(timer);
|
|
169
|
+
reject(error);
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
void this.send({ type: "open", id, root }).catch((error) => {
|
|
173
|
+
const pending = this.opens.get(id);
|
|
174
|
+
this.opens.delete(id);
|
|
175
|
+
pending?.reject(error);
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
if (this.failure)
|
|
179
|
+
throw this.failure;
|
|
180
|
+
const channel = { onMessage, onFailure, closing: false };
|
|
181
|
+
this.channels.set(channelId, channel);
|
|
182
|
+
return {
|
|
183
|
+
id: channelId,
|
|
184
|
+
send: (payload) => {
|
|
185
|
+
if (channel.closing || this.channels.get(channelId) !== channel) {
|
|
186
|
+
return Promise.reject(new Error("Shared workspace channel is closed"));
|
|
187
|
+
}
|
|
188
|
+
parseRemoteWorkspaceClientMessage(payload, limits);
|
|
189
|
+
return this.send({ type: "channel", channelId, payload });
|
|
190
|
+
},
|
|
191
|
+
close: () => {
|
|
192
|
+
if (channel.closePromise)
|
|
193
|
+
return channel.closePromise;
|
|
194
|
+
if (this.channels.get(channelId) !== channel)
|
|
195
|
+
return Promise.resolve();
|
|
196
|
+
channel.closing = true;
|
|
197
|
+
channel.closePromise = new Promise((resolve, reject) => {
|
|
198
|
+
const timer = setTimeout(() => {
|
|
199
|
+
this.fail(new Error("Shared workspace detach timed out; operations may have committed"));
|
|
200
|
+
}, 5000);
|
|
201
|
+
channel.resolveClose = () => {
|
|
202
|
+
clearTimeout(timer);
|
|
203
|
+
resolve();
|
|
204
|
+
};
|
|
205
|
+
channel.rejectClose = (error) => {
|
|
206
|
+
clearTimeout(timer);
|
|
207
|
+
reject(error);
|
|
208
|
+
};
|
|
209
|
+
void this.send({ type: "close", channelId }).catch(channel.rejectClose);
|
|
210
|
+
});
|
|
211
|
+
return channel.closePromise;
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
send(frame) {
|
|
216
|
+
return this.outbound.send(frame);
|
|
217
|
+
}
|
|
218
|
+
fail(error) {
|
|
219
|
+
if (this.failure)
|
|
220
|
+
return;
|
|
221
|
+
this.failure = error;
|
|
222
|
+
this.outbound.fail(error);
|
|
223
|
+
this.socket.terminate();
|
|
224
|
+
for (const pending of this.opens.values())
|
|
225
|
+
pending.reject(error);
|
|
226
|
+
this.opens.clear();
|
|
227
|
+
for (const channel of this.channels.values()) {
|
|
228
|
+
channel.rejectClose?.(error);
|
|
229
|
+
try {
|
|
230
|
+
channel.onFailure(error);
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
// Do not let one local callback block failure delivery to sibling channels.
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
this.channels.clear();
|
|
237
|
+
this.resolveFailure();
|
|
238
|
+
}
|
|
239
|
+
dispose() {
|
|
240
|
+
this.fail(new Error("Shared workspace uplink stopped; operations may have committed"));
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=guest-shared-uplink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guest-shared-uplink.js","sourceRoot":"","sources":["../../../src/core/remote-workspace-protocol/guest-shared-uplink.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport WebSocket from \"ws\";\nimport { VERSION } from \"../../config.ts\";\nimport {\n\tDEFAULT_REMOTE_WORKSPACE_PROTOCOL_LIMITS as limits,\n\tparseRemoteWorkspaceClientMessage,\n\ttype RemoteWorkspaceClientMessage,\n\ttype RemoteWorkspaceServerMessage,\n} from \"./contract.ts\";\nimport { type GuestOutboundFrame, GuestOutboundScheduler } from \"./guest-shared-outbound-scheduler.ts\";\nimport {\n\tparseSharedWorkspaceServerFrame,\n\tSHARED_WORKSPACE_WEBSOCKET_PROTOCOL,\n\ttype SharedWorkspaceServerFrame,\n} from \"./shared-transport.ts\";\n\nexport interface GuestUplinkChannel {\n\treadonly id: string;\n\tsend(message: RemoteWorkspaceClientMessage): Promise<void>;\n\tclose(): Promise<void>;\n}\n\nexport type GuestUplinkMessageHandler = (message: RemoteWorkspaceServerMessage) => void;\nexport type GuestUplinkFailureHandler = (error: Error) => void;\n\ntype Channel = {\n\tonMessage: GuestUplinkMessageHandler;\n\tonFailure: GuestUplinkFailureHandler;\n\tclosing: boolean;\n\tclosePromise?: Promise<void>;\n\tresolveClose?: () => void;\n\trejectClose?: (error: Error) => void;\n};\n\ntype GuestControlFrame = Extract<SharedWorkspaceServerFrame, { type: \"opened\" | \"control_error\" }>;\n\n/** Owns one v2 physical socket. Loss invalidates every channel; nothing is replayed. */\nexport class GuestSharedUplink {\n\tprivate readonly channels = new Map<string, Channel>();\n\tprivate readonly opens = new Map<string, { resolve: (id: string) => void; reject: (error: Error) => void }>();\n\tprivate failure?: Error;\n\tprivate readonly outbound: GuestOutboundScheduler;\n\tprivate readonly socket: WebSocket;\n\treadonly epoch: string;\n\t/** Resolves on any terminal uplink failure (including explicit disposal); never reconnects. */\n\treadonly whenFailed: Promise<void>;\n\tprivate resolveFailure!: () => void;\n\n\tprivate constructor(socket: WebSocket, epoch: string) {\n\t\tthis.socket = socket;\n\t\tthis.epoch = epoch;\n\t\tthis.whenFailed = new Promise<void>((resolve) => {\n\t\t\tthis.resolveFailure = resolve;\n\t\t});\n\t\tthis.outbound = new GuestOutboundScheduler(\n\t\t\t(bytes, callback) =>\n\t\t\t\tsocket.send(bytes, { binary: false, compress: false }, (error) => callback(error ?? undefined)),\n\t\t\t() => socket.bufferedAmount,\n\t\t\t(error) => this.fail(error),\n\t\t);\n\t\tsocket.on(\"message\", (data, isBinary) => this.receive(data as Buffer, isBinary));\n\t\tsocket.on(\"close\", () =>\n\t\t\tthis.fail(new Error(\"Shared workspace uplink disconnected; operations may have committed\")),\n\t\t);\n\t\tsocket.on(\"error\", () => this.fail(new Error(\"Shared workspace uplink failed; operations may have committed\")));\n\t\tif (socket.readyState !== WebSocket.OPEN) this.fail(new Error(\"Shared workspace uplink disconnected\"));\n\t}\n\n\tprivate receive(data: Buffer, isBinary: boolean): void {\n\t\ttry {\n\t\t\tif (isBinary) throw new Error(\"Unexpected binary shared workspace frame\");\n\t\t\tthis.route(parseSharedWorkspaceServerFrame(data, limits));\n\t\t} catch {\n\t\t\tthis.fail(new Error(\"Invalid or unrouteable shared workspace response\"));\n\t\t}\n\t}\n\n\tprivate routeControl(frame: GuestControlFrame): void {\n\t\tconst pending = this.opens.get(frame.id);\n\t\tif (!pending) throw new Error(\"Unknown shared workspace control ID\");\n\t\tthis.opens.delete(frame.id);\n\t\tif (frame.type === \"opened\") pending.resolve(frame.channelId);\n\t\telse pending.reject(new Error(`Shared workspace open failed: ${frame.code}`));\n\t}\n\n\tprivate route(frame: SharedWorkspaceServerFrame): void {\n\t\tif (frame.type === \"hello_ack\") throw new Error(\"Unexpected shared workspace hello acknowledgement\");\n\t\tif (frame.type === \"opened\" || frame.type === \"control_error\") {\n\t\t\tthis.routeControl(frame);\n\t\t\treturn;\n\t\t}\n\t\tconst channel = this.channels.get(frame.channelId);\n\t\tif (!channel) throw new Error(\"Unknown shared workspace channel ID\");\n\t\tif (frame.type === \"closed\") {\n\t\t\tthis.channels.delete(frame.channelId);\n\t\t\tif (frame.reason || !channel.closing) {\n\t\t\t\tconst error = new Error(frame.reason?.message ?? \"Shared workspace channel closed unexpectedly\");\n\t\t\t\tchannel.rejectClose?.(error);\n\t\t\t\tchannel.onFailure(error);\n\t\t\t} else channel.resolveClose?.();\n\t\t\treturn;\n\t\t}\n\t\t// An in-flight response can race a requested detach; deliver until closed is acknowledged.\n\t\tchannel.onMessage(frame.payload);\n\t}\n\n\tstatic async connect(url: string, token?: string): Promise<GuestSharedUplink> {\n\t\tconst endpoint = new URL(url);\n\t\tif (\n\t\t\t!([\"ws:\", \"wss:\"] as string[]).includes(endpoint.protocol) ||\n\t\t\tendpoint.username ||\n\t\t\tendpoint.password ||\n\t\t\tendpoint.hash\n\t\t) {\n\t\t\tthrow new Error(\"Invalid shared workspace endpoint\");\n\t\t}\n\t\tconst socket = new WebSocket(endpoint.toString(), SHARED_WORKSPACE_WEBSOCKET_PROTOCOL, {\n\t\t\tperMessageDeflate: false,\n\t\t\t...(token ? { headers: { authorization: `Bearer ${token}` } } : {}),\n\t\t});\n\t\ttry {\n\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\tconst timer = setTimeout(() => reject(new Error(\"Shared workspace connection timed out\")), 5000);\n\t\t\t\tsocket.once(\"open\", () => {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t\tsocket.once(\"error\", () => {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\treject(new Error(\"Shared workspace connection failed\"));\n\t\t\t\t});\n\t\t\t});\n\t\t\tif (socket.protocol !== SHARED_WORKSPACE_WEBSOCKET_PROTOCOL) {\n\t\t\t\tthrow new Error(\"Daemon does not support grip.workspace.v2\");\n\t\t\t}\n\t\t\tconst id = randomBytes(12).toString(\"hex\");\n\t\t\tconst epoch = await new Promise<string>((resolve, reject) => {\n\t\t\t\tlet settled = false;\n\t\t\t\tconst timer = setTimeout(() => settle(undefined, new Error(\"Shared workspace hello timed out\")), 5000);\n\t\t\t\tconst settle = (value?: string, error?: Error) => {\n\t\t\t\t\tif (settled) return;\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tsocket.off(\"message\", onMessage);\n\t\t\t\t\tsocket.off(\"close\", onClose);\n\t\t\t\t\tsocket.off(\"error\", onError);\n\t\t\t\t\tif (error) reject(error);\n\t\t\t\t\telse resolve(value!);\n\t\t\t\t};\n\t\t\t\tconst onError = () => settle(undefined, new Error(\"Shared workspace hello failed\"));\n\t\t\t\tconst onClose = () => settle(undefined, new Error(\"Shared workspace hello failed\"));\n\t\t\t\tconst onMessage = (data: WebSocket.RawData, isBinary: boolean) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (isBinary) throw new Error(\"Unexpected binary frame\");\n\t\t\t\t\t\tconst frame = parseSharedWorkspaceServerFrame(Buffer.from(data as Buffer), limits);\n\t\t\t\t\t\tif (frame.type !== \"hello_ack\" || frame.id !== id) throw new Error(\"Unexpected hello response\");\n\t\t\t\t\t\tif (frame.daemonVersion !== VERSION) {\n\t\t\t\t\t\t\tsettle(undefined, new Error(\"Shared workspace daemon version mismatch\"));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsettle(frame.epoch);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tsettle(undefined, new Error(\"Invalid shared workspace hello response\"));\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tsocket.on(\"message\", onMessage);\n\t\t\t\tsocket.once(\"close\", onClose);\n\t\t\t\tsocket.once(\"error\", onError);\n\t\t\t\tsocket.send(JSON.stringify({ type: \"hello\", version: 2, id }), (error) => {\n\t\t\t\t\tif (error) settle(undefined, new Error(\"Shared workspace hello send failed\"));\n\t\t\t\t});\n\t\t\t});\n\t\t\treturn new GuestSharedUplink(socket, epoch);\n\t\t} catch (error) {\n\t\t\tsocket.on(\"error\", () => undefined);\n\t\t\tsocket.terminate();\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync open(\n\t\troot: string,\n\t\tonMessage: GuestUplinkMessageHandler,\n\t\tonFailure: GuestUplinkFailureHandler,\n\t): Promise<GuestUplinkChannel> {\n\t\tif (this.failure) throw this.failure;\n\t\tif (this.channels.size + this.opens.size >= 32) throw new Error(\"Shared workspace channel limit exceeded\");\n\t\tconst id = randomBytes(12).toString(\"hex\");\n\t\tconst channelId = await new Promise<string>((resolve, reject) => {\n\t\t\tconst timer = setTimeout(\n\t\t\t\t() => this.fail(new Error(\"Shared workspace open timed out; operations may have committed\")),\n\t\t\t\t5000,\n\t\t\t);\n\t\t\tthis.opens.set(id, {\n\t\t\t\tresolve: (openedId) => {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\tresolve(openedId);\n\t\t\t\t},\n\t\t\t\treject: (error) => {\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\treject(error);\n\t\t\t\t},\n\t\t\t});\n\t\t\tvoid this.send({ type: \"open\", id, root }).catch((error: Error) => {\n\t\t\t\tconst pending = this.opens.get(id);\n\t\t\t\tthis.opens.delete(id);\n\t\t\t\tpending?.reject(error);\n\t\t\t});\n\t\t});\n\t\tif (this.failure) throw this.failure;\n\t\tconst channel: Channel = { onMessage, onFailure, closing: false };\n\t\tthis.channels.set(channelId, channel);\n\t\treturn {\n\t\t\tid: channelId,\n\t\t\tsend: (payload) => {\n\t\t\t\tif (channel.closing || this.channels.get(channelId) !== channel) {\n\t\t\t\t\treturn Promise.reject(new Error(\"Shared workspace channel is closed\"));\n\t\t\t\t}\n\t\t\t\tparseRemoteWorkspaceClientMessage(payload, limits);\n\t\t\t\treturn this.send({ type: \"channel\", channelId, payload });\n\t\t\t},\n\t\t\tclose: () => {\n\t\t\t\tif (channel.closePromise) return channel.closePromise;\n\t\t\t\tif (this.channels.get(channelId) !== channel) return Promise.resolve();\n\t\t\t\tchannel.closing = true;\n\t\t\t\tchannel.closePromise = new Promise<void>((resolve, reject) => {\n\t\t\t\t\tconst timer = setTimeout(() => {\n\t\t\t\t\t\tthis.fail(new Error(\"Shared workspace detach timed out; operations may have committed\"));\n\t\t\t\t\t}, 5000);\n\t\t\t\t\tchannel.resolveClose = () => {\n\t\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t};\n\t\t\t\t\tchannel.rejectClose = (error) => {\n\t\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\t\treject(error);\n\t\t\t\t\t};\n\t\t\t\t\tvoid this.send({ type: \"close\", channelId }).catch(channel.rejectClose);\n\t\t\t\t});\n\t\t\t\treturn channel.closePromise;\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate send(frame: GuestOutboundFrame): Promise<void> {\n\t\treturn this.outbound.send(frame);\n\t}\n\n\tprivate fail(error: Error): void {\n\t\tif (this.failure) return;\n\t\tthis.failure = error;\n\t\tthis.outbound.fail(error);\n\t\tthis.socket.terminate();\n\t\tfor (const pending of this.opens.values()) pending.reject(error);\n\t\tthis.opens.clear();\n\t\tfor (const channel of this.channels.values()) {\n\t\t\tchannel.rejectClose?.(error);\n\t\t\ttry {\n\t\t\t\tchannel.onFailure(error);\n\t\t\t} catch {\n\t\t\t\t// Do not let one local callback block failure delivery to sibling channels.\n\t\t\t}\n\t\t}\n\t\tthis.channels.clear();\n\t\tthis.resolveFailure();\n\t}\n\n\tdispose(): void {\n\t\tthis.fail(new Error(\"Shared workspace uplink stopped; operations may have committed\"));\n\t}\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lima-owner-directory.d.ts","sourceRoot":"","sources":["../../../src/core/remote-workspace-protocol/lima-owner-directory.ts"],"names":[],"mappings":"AAGA,+FAA+F;AAC/F,wBAAsB,+BAA+B,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyB5F","sourcesContent":["import { lstat, mkdir, realpath } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\n/** Private host location for named-VM owner locks. Keep the established directory identity. */\nexport async function prepareSharedLimaOwnerDirectory(baseDirectory: string): Promise<string> {\n\tif (process.platform === \"win32\" || !process.getuid) throw new Error(\"Shared Lima owner requires Unix credentials\");\n\tconst base = await realpath(baseDirectory);\n\tconst baseInfo = await lstat(base);\n\tconst uid = process.getuid();\n\tif (\n\t\t!baseInfo.isDirectory() ||\n\t\t(baseInfo.uid !== uid && baseInfo.uid !== 0) ||\n\t\t((baseInfo.mode & 0o022) !== 0 && (baseInfo.mode & 0o1000) === 0)\n\t) {\n\t\tthrow new Error(\"Shared Lima owner base directory is not owned or sticky-safe\");\n\t}\n\t// Existing owner locks live here; changing this path could bypass a live lock.\n\tconst directory = join(base, `grip-broker-${uid}`);\n\ttry {\n\t\tawait mkdir(directory, { mode: 0o700 });\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n\t}\n\t// Never repair an existing directory: it might belong to another principal.\n\tconst info = await lstat(directory);\n\tif (!info.isDirectory() || info.uid !== uid || (info.mode & 0o077) !== 0) {\n\t\tthrow new Error(\"Shared Lima owner directory is not private and owned by this user\");\n\t}\n\treturn directory;\n}\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { lstat, mkdir, realpath } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
/** Private host location for named-VM owner locks. Keep the established directory identity. */
|
|
4
|
+
export async function prepareSharedLimaOwnerDirectory(baseDirectory) {
|
|
5
|
+
if (process.platform === "win32" || !process.getuid)
|
|
6
|
+
throw new Error("Shared Lima owner requires Unix credentials");
|
|
7
|
+
const base = await realpath(baseDirectory);
|
|
8
|
+
const baseInfo = await lstat(base);
|
|
9
|
+
const uid = process.getuid();
|
|
10
|
+
if (!baseInfo.isDirectory() ||
|
|
11
|
+
(baseInfo.uid !== uid && baseInfo.uid !== 0) ||
|
|
12
|
+
((baseInfo.mode & 0o022) !== 0 && (baseInfo.mode & 0o1000) === 0)) {
|
|
13
|
+
throw new Error("Shared Lima owner base directory is not owned or sticky-safe");
|
|
14
|
+
}
|
|
15
|
+
// Existing owner locks live here; changing this path could bypass a live lock.
|
|
16
|
+
const directory = join(base, `grip-broker-${uid}`);
|
|
17
|
+
try {
|
|
18
|
+
await mkdir(directory, { mode: 0o700 });
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
if (error.code !== "EEXIST")
|
|
22
|
+
throw error;
|
|
23
|
+
}
|
|
24
|
+
// Never repair an existing directory: it might belong to another principal.
|
|
25
|
+
const info = await lstat(directory);
|
|
26
|
+
if (!info.isDirectory() || info.uid !== uid || (info.mode & 0o077) !== 0) {
|
|
27
|
+
throw new Error("Shared Lima owner directory is not private and owned by this user");
|
|
28
|
+
}
|
|
29
|
+
return directory;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=lima-owner-directory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lima-owner-directory.js","sourceRoot":"","sources":["../../../src/core/remote-workspace-protocol/lima-owner-directory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,+FAA+F;AAC/F,MAAM,CAAC,KAAK,UAAU,+BAA+B,CAAC,aAAqB,EAAmB;IAC7F,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACpH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAC7B,IACC,CAAC,QAAQ,CAAC,WAAW,EAAE;QACvB,CAAC,QAAQ,CAAC,GAAG,KAAK,GAAG,IAAI,QAAQ,CAAC,GAAG,KAAK,CAAC,CAAC;QAC5C,CAAC,CAAC,QAAQ,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAChE,CAAC;QACF,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IACjF,CAAC;IACD,+EAA+E;IAC/E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,eAAe,GAAG,EAAE,CAAC,CAAC;IACnD,IAAI,CAAC;QACJ,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC;IACrE,CAAC;IACD,4EAA4E;IAC5E,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;IACpC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1E,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,SAAS,CAAC;AAAA,CACjB","sourcesContent":["import { lstat, mkdir, realpath } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\n/** Private host location for named-VM owner locks. Keep the established directory identity. */\nexport async function prepareSharedLimaOwnerDirectory(baseDirectory: string): Promise<string> {\n\tif (process.platform === \"win32\" || !process.getuid) throw new Error(\"Shared Lima owner requires Unix credentials\");\n\tconst base = await realpath(baseDirectory);\n\tconst baseInfo = await lstat(base);\n\tconst uid = process.getuid();\n\tif (\n\t\t!baseInfo.isDirectory() ||\n\t\t(baseInfo.uid !== uid && baseInfo.uid !== 0) ||\n\t\t((baseInfo.mode & 0o022) !== 0 && (baseInfo.mode & 0o1000) === 0)\n\t) {\n\t\tthrow new Error(\"Shared Lima owner base directory is not owned or sticky-safe\");\n\t}\n\t// Existing owner locks live here; changing this path could bypass a live lock.\n\tconst directory = join(base, `grip-broker-${uid}`);\n\ttry {\n\t\tawait mkdir(directory, { mode: 0o700 });\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n\t}\n\t// Never repair an existing directory: it might belong to another principal.\n\tconst info = await lstat(directory);\n\tif (!info.isDirectory() || info.uid !== uid || (info.mode & 0o077) !== 0) {\n\t\tthrow new Error(\"Shared Lima owner directory is not private and owned by this user\");\n\t}\n\treturn directory;\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface SharedLimaOwnerLock {
|
|
2
|
+
readonly path: string;
|
|
3
|
+
readonly instanceName: string;
|
|
4
|
+
assertHeld(): Promise<void>;
|
|
5
|
+
release(): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
/** Exclusive owner lifetime, not a client lease. Never silently steal a stale lock. */
|
|
8
|
+
export declare function acquireSharedLimaOwnerLock(instanceName: string, baseDirectory?: string): Promise<SharedLimaOwnerLock>;
|
|
9
|
+
//# sourceMappingURL=lima-owner-lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lima-owner-lock.d.ts","sourceRoot":"","sources":["../../../src/core/remote-workspace-protocol/lima-owner-lock.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAiBD,uFAAuF;AACvF,wBAAsB,0BAA0B,CAC/C,YAAY,EAAE,MAAM,EACpB,aAAa,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,mBAAmB,CAAC,CA+D9B","sourcesContent":["import { createHash, randomBytes } from \"node:crypto\";\nimport { type FileHandle, lstat, open, readFile, unlink } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { prepareSharedLimaOwnerDirectory } from \"./lima-owner-directory.ts\";\n\nexport interface SharedLimaOwnerLock {\n\treadonly path: string;\n\treadonly instanceName: string;\n\tassertHeld(): Promise<void>;\n\trelease(): Promise<void>;\n}\n\ninterface LockRecord {\n\tpid: number;\n\tnonce: string;\n}\n\nfunction isAlive(pid: number): boolean {\n\tif (!Number.isSafeInteger(pid) || pid < 1) return false;\n\ttry {\n\t\tprocess.kill(pid, 0);\n\t\treturn true;\n\t} catch (error) {\n\t\treturn (error as NodeJS.ErrnoException).code === \"EPERM\";\n\t}\n}\n\n/** Exclusive owner lifetime, not a client lease. Never silently steal a stale lock. */\nexport async function acquireSharedLimaOwnerLock(\n\tinstanceName: string,\n\tbaseDirectory?: string,\n): Promise<SharedLimaOwnerLock> {\n\tif (!/^[a-z0-9][a-z0-9-]*$/.test(instanceName)) throw new Error(\"Invalid shared Lima instance name\");\n\t// The production lock must not follow TMPDIR: separate processes can otherwise\n\t// claim the same named VM through different private temporary directories.\n\t// An explicit base is reserved for isolated embedded tests.\n\tconst directory = await prepareSharedLimaOwnerDirectory(baseDirectory ?? \"/tmp\");\n\tconst digest = createHash(\"sha256\").update(instanceName).digest(\"hex\").slice(0, 32);\n\tconst path = join(directory, `lima-owner-${digest}.lock`);\n\tconst record: LockRecord = { pid: process.pid, nonce: randomBytes(16).toString(\"hex\") };\n\tlet handle: FileHandle;\n\ttry {\n\t\thandle = await open(path, \"wx\", 0o600);\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n\t\t// Even a dead PID is ambiguous (crash during a mutation or VM startup). Manual\n\t\t// reconciliation is required; another owner must not implicitly take over.\n\t\tlet state = \"unverifiable\";\n\t\ttry {\n\t\t\tconst info = await lstat(path);\n\t\t\tif (info.isFile() && info.uid === process.getuid?.() && (info.mode & 0o077) === 0) {\n\t\t\t\tconst existing = JSON.parse(await readFile(path, \"utf8\")) as Partial<LockRecord>;\n\t\t\t\tstate = typeof existing.pid === \"number\" && isAlive(existing.pid) ? \"occupied\" : \"stale\";\n\t\t\t}\n\t\t} catch {\n\t\t\t// A racing file change is not grounds for a new owner.\n\t\t}\n\t\tthrow new Error(`Shared Lima owner lock ${state}; inspect and reconcile before retrying`);\n\t}\n\ttry {\n\t\tawait handle.writeFile(JSON.stringify(record));\n\t\tconst identity = await handle.stat();\n\t\tlet released = false;\n\t\tconst assertHeld = async (): Promise<void> => {\n\t\t\tif (released) throw new Error(\"Shared Lima owner lock already released\");\n\t\t\tconst current = await lstat(path);\n\t\t\tif (current.dev !== identity.dev || current.ino !== identity.ino || !current.isFile()) {\n\t\t\t\tthrow new Error(\"Shared Lima owner lock identity changed; refusing operation\");\n\t\t\t}\n\t\t\tconst content = JSON.parse(await readFile(path, \"utf8\")) as Partial<LockRecord>;\n\t\t\tif (content.pid !== record.pid || content.nonce !== record.nonce) {\n\t\t\t\tthrow new Error(\"Shared Lima owner lock contents changed; refusing operation\");\n\t\t\t}\n\t\t};\n\t\treturn {\n\t\t\tpath,\n\t\t\tinstanceName,\n\t\t\tassertHeld,\n\t\t\tasync release(): Promise<void> {\n\t\t\t\tif (released) return;\n\t\t\t\ttry {\n\t\t\t\t\tawait assertHeld();\n\t\t\t\t\tawait unlink(path);\n\t\t\t\t\treleased = true;\n\t\t\t\t} finally {\n\t\t\t\t\tawait handle.close();\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t} catch (error) {\n\t\tawait handle.close();\n\t\t// Do not unlink an ambiguous lock after an interrupted write.\n\t\tthrow error;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
2
|
+
import { lstat, open, readFile, unlink } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { prepareSharedLimaOwnerDirectory } from "./lima-owner-directory.js";
|
|
5
|
+
function isAlive(pid) {
|
|
6
|
+
if (!Number.isSafeInteger(pid) || pid < 1)
|
|
7
|
+
return false;
|
|
8
|
+
try {
|
|
9
|
+
process.kill(pid, 0);
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
return error.code === "EPERM";
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/** Exclusive owner lifetime, not a client lease. Never silently steal a stale lock. */
|
|
17
|
+
export async function acquireSharedLimaOwnerLock(instanceName, baseDirectory) {
|
|
18
|
+
if (!/^[a-z0-9][a-z0-9-]*$/.test(instanceName))
|
|
19
|
+
throw new Error("Invalid shared Lima instance name");
|
|
20
|
+
// The production lock must not follow TMPDIR: separate processes can otherwise
|
|
21
|
+
// claim the same named VM through different private temporary directories.
|
|
22
|
+
// An explicit base is reserved for isolated embedded tests.
|
|
23
|
+
const directory = await prepareSharedLimaOwnerDirectory(baseDirectory ?? "/tmp");
|
|
24
|
+
const digest = createHash("sha256").update(instanceName).digest("hex").slice(0, 32);
|
|
25
|
+
const path = join(directory, `lima-owner-${digest}.lock`);
|
|
26
|
+
const record = { pid: process.pid, nonce: randomBytes(16).toString("hex") };
|
|
27
|
+
let handle;
|
|
28
|
+
try {
|
|
29
|
+
handle = await open(path, "wx", 0o600);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
if (error.code !== "EEXIST")
|
|
33
|
+
throw error;
|
|
34
|
+
// Even a dead PID is ambiguous (crash during a mutation or VM startup). Manual
|
|
35
|
+
// reconciliation is required; another owner must not implicitly take over.
|
|
36
|
+
let state = "unverifiable";
|
|
37
|
+
try {
|
|
38
|
+
const info = await lstat(path);
|
|
39
|
+
if (info.isFile() && info.uid === process.getuid?.() && (info.mode & 0o077) === 0) {
|
|
40
|
+
const existing = JSON.parse(await readFile(path, "utf8"));
|
|
41
|
+
state = typeof existing.pid === "number" && isAlive(existing.pid) ? "occupied" : "stale";
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// A racing file change is not grounds for a new owner.
|
|
46
|
+
}
|
|
47
|
+
throw new Error(`Shared Lima owner lock ${state}; inspect and reconcile before retrying`);
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
await handle.writeFile(JSON.stringify(record));
|
|
51
|
+
const identity = await handle.stat();
|
|
52
|
+
let released = false;
|
|
53
|
+
const assertHeld = async () => {
|
|
54
|
+
if (released)
|
|
55
|
+
throw new Error("Shared Lima owner lock already released");
|
|
56
|
+
const current = await lstat(path);
|
|
57
|
+
if (current.dev !== identity.dev || current.ino !== identity.ino || !current.isFile()) {
|
|
58
|
+
throw new Error("Shared Lima owner lock identity changed; refusing operation");
|
|
59
|
+
}
|
|
60
|
+
const content = JSON.parse(await readFile(path, "utf8"));
|
|
61
|
+
if (content.pid !== record.pid || content.nonce !== record.nonce) {
|
|
62
|
+
throw new Error("Shared Lima owner lock contents changed; refusing operation");
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
return {
|
|
66
|
+
path,
|
|
67
|
+
instanceName,
|
|
68
|
+
assertHeld,
|
|
69
|
+
async release() {
|
|
70
|
+
if (released)
|
|
71
|
+
return;
|
|
72
|
+
try {
|
|
73
|
+
await assertHeld();
|
|
74
|
+
await unlink(path);
|
|
75
|
+
released = true;
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
await handle.close();
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
await handle.close();
|
|
85
|
+
// Do not unlink an ambiguous lock after an interrupted write.
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=lima-owner-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lima-owner-lock.js","sourceRoot":"","sources":["../../../src/core/remote-workspace-protocol/lima-owner-lock.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash, randomBytes } from \"node:crypto\";\nimport { type FileHandle, lstat, open, readFile, unlink } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { prepareSharedLimaOwnerDirectory } from \"./lima-owner-directory.ts\";\n\nexport interface SharedLimaOwnerLock {\n\treadonly path: string;\n\treadonly instanceName: string;\n\tassertHeld(): Promise<void>;\n\trelease(): Promise<void>;\n}\n\ninterface LockRecord {\n\tpid: number;\n\tnonce: string;\n}\n\nfunction isAlive(pid: number): boolean {\n\tif (!Number.isSafeInteger(pid) || pid < 1) return false;\n\ttry {\n\t\tprocess.kill(pid, 0);\n\t\treturn true;\n\t} catch (error) {\n\t\treturn (error as NodeJS.ErrnoException).code === \"EPERM\";\n\t}\n}\n\n/** Exclusive owner lifetime, not a client lease. Never silently steal a stale lock. */\nexport async function acquireSharedLimaOwnerLock(\n\tinstanceName: string,\n\tbaseDirectory?: string,\n): Promise<SharedLimaOwnerLock> {\n\tif (!/^[a-z0-9][a-z0-9-]*$/.test(instanceName)) throw new Error(\"Invalid shared Lima instance name\");\n\t// The production lock must not follow TMPDIR: separate processes can otherwise\n\t// claim the same named VM through different private temporary directories.\n\t// An explicit base is reserved for isolated embedded tests.\n\tconst directory = await prepareSharedLimaOwnerDirectory(baseDirectory ?? \"/tmp\");\n\tconst digest = createHash(\"sha256\").update(instanceName).digest(\"hex\").slice(0, 32);\n\tconst path = join(directory, `lima-owner-${digest}.lock`);\n\tconst record: LockRecord = { pid: process.pid, nonce: randomBytes(16).toString(\"hex\") };\n\tlet handle: FileHandle;\n\ttry {\n\t\thandle = await open(path, \"wx\", 0o600);\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n\t\t// Even a dead PID is ambiguous (crash during a mutation or VM startup). Manual\n\t\t// reconciliation is required; another owner must not implicitly take over.\n\t\tlet state = \"unverifiable\";\n\t\ttry {\n\t\t\tconst info = await lstat(path);\n\t\t\tif (info.isFile() && info.uid === process.getuid?.() && (info.mode & 0o077) === 0) {\n\t\t\t\tconst existing = JSON.parse(await readFile(path, \"utf8\")) as Partial<LockRecord>;\n\t\t\t\tstate = typeof existing.pid === \"number\" && isAlive(existing.pid) ? \"occupied\" : \"stale\";\n\t\t\t}\n\t\t} catch {\n\t\t\t// A racing file change is not grounds for a new owner.\n\t\t}\n\t\tthrow new Error(`Shared Lima owner lock ${state}; inspect and reconcile before retrying`);\n\t}\n\ttry {\n\t\tawait handle.writeFile(JSON.stringify(record));\n\t\tconst identity = await handle.stat();\n\t\tlet released = false;\n\t\tconst assertHeld = async (): Promise<void> => {\n\t\t\tif (released) throw new Error(\"Shared Lima owner lock already released\");\n\t\t\tconst current = await lstat(path);\n\t\t\tif (current.dev !== identity.dev || current.ino !== identity.ino || !current.isFile()) {\n\t\t\t\tthrow new Error(\"Shared Lima owner lock identity changed; refusing operation\");\n\t\t\t}\n\t\t\tconst content = JSON.parse(await readFile(path, \"utf8\")) as Partial<LockRecord>;\n\t\t\tif (content.pid !== record.pid || content.nonce !== record.nonce) {\n\t\t\t\tthrow new Error(\"Shared Lima owner lock contents changed; refusing operation\");\n\t\t\t}\n\t\t};\n\t\treturn {\n\t\t\tpath,\n\t\t\tinstanceName,\n\t\t\tassertHeld,\n\t\t\tasync release(): Promise<void> {\n\t\t\t\tif (released) return;\n\t\t\t\ttry {\n\t\t\t\t\tawait assertHeld();\n\t\t\t\t\tawait unlink(path);\n\t\t\t\t\treleased = true;\n\t\t\t\t} finally {\n\t\t\t\t\tawait handle.close();\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t} catch (error) {\n\t\tawait handle.close();\n\t\t// Do not unlink an ambiguous lock after an interrupted write.\n\t\tthrow error;\n\t}\n}\n"]}
|