@fleetagent/pi-coding-agent 0.0.1
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 +4518 -0
- package/README.md +660 -0
- package/dist/bun/cli.d.ts +3 -0
- package/dist/bun/cli.d.ts.map +1 -0
- package/dist/bun/cli.js +9 -0
- package/dist/bun/cli.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 +56 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +356 -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 +83 -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 +18 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +95 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +418 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent-session.d.ts +600 -0
- package/dist/core/agent-session.d.ts.map +1 -0
- package/dist/core/agent-session.js +2505 -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 +141 -0
- package/dist/core/auth-storage.d.ts.map +1 -0
- package/dist/core/auth-storage.js +442 -0
- package/dist/core/auth-storage.js.map +1 -0
- package/dist/core/bash-executor.d.ts +32 -0
- package/dist/core/bash-executor.d.ts.map +1 -0
- package/dist/core/bash-executor.js +111 -0
- package/dist/core/bash-executor.js.map +1 -0
- package/dist/core/compaction/branch-summarization.d.ts +88 -0
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
- package/dist/core/compaction/branch-summarization.js +243 -0
- package/dist/core/compaction/branch-summarization.js.map +1 -0
- package/dist/core/compaction/compaction.d.ts +121 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -0
- package/dist/core/compaction/compaction.js +625 -0
- package/dist/core/compaction/compaction.js.map +1 -0
- package/dist/core/compaction/index.d.ts +7 -0
- package/dist/core/compaction/index.d.ts.map +1 -0
- package/dist/core/compaction/index.js +7 -0
- package/dist/core/compaction/index.js.map +1 -0
- package/dist/core/compaction/utils.d.ts +38 -0
- package/dist/core/compaction/utils.d.ts.map +1 -0
- package/dist/core/compaction/utils.js +153 -0
- package/dist/core/compaction/utils.js.map +1 -0
- package/dist/core/defaults.d.ts +3 -0
- package/dist/core/defaults.d.ts.map +1 -0
- package/dist/core/defaults.js +2 -0
- package/dist/core/defaults.js.map +1 -0
- package/dist/core/diagnostics.d.ts +15 -0
- package/dist/core/diagnostics.d.ts.map +1 -0
- package/dist/core/diagnostics.js +2 -0
- package/dist/core/diagnostics.js.map +1 -0
- package/dist/core/event-bus.d.ts +9 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/event-bus.js +25 -0
- package/dist/core/event-bus.js.map +1 -0
- package/dist/core/exec.d.ts +29 -0
- package/dist/core/exec.d.ts.map +1 -0
- package/dist/core/exec.js +75 -0
- package/dist/core/exec.js.map +1 -0
- package/dist/core/export-html/ansi-to-html.d.ts +22 -0
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
- package/dist/core/export-html/ansi-to-html.js +249 -0
- package/dist/core/export-html/ansi-to-html.js.map +1 -0
- package/dist/core/export-html/index.d.ts +37 -0
- package/dist/core/export-html/index.d.ts.map +1 -0
- package/dist/core/export-html/index.js +226 -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 +1848 -0
- package/dist/core/export-html/tool-renderer.d.ts +34 -0
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
- package/dist/core/export-html/tool-renderer.js +108 -0
- package/dist/core/export-html/tool-renderer.js.map +1 -0
- package/dist/core/export-html/vendor/highlight.min.js +1213 -0
- package/dist/core/export-html/vendor/marked.min.js +6 -0
- package/dist/core/extensions/index.d.ts +12 -0
- package/dist/core/extensions/index.d.ts.map +1 -0
- package/dist/core/extensions/index.js +9 -0
- package/dist/core/extensions/index.js.map +1 -0
- package/dist/core/extensions/loader.d.ts +24 -0
- package/dist/core/extensions/loader.d.ts.map +1 -0
- package/dist/core/extensions/loader.js +484 -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 +824 -0
- package/dist/core/extensions/runner.js.map +1 -0
- package/dist/core/extensions/types.d.ts +1175 -0
- package/dist/core/extensions/types.d.ts.map +1 -0
- package/dist/core/extensions/types.js +45 -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 +310 -0
- package/dist/core/footer-data-provider.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 +48 -0
- package/dist/core/http-dispatcher.js.map +1 -0
- package/dist/core/index.d.ts +11 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +11 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/keybindings.d.ts +353 -0
- package/dist/core/keybindings.d.ts.map +1 -0
- package/dist/core/keybindings.js +295 -0
- package/dist/core/keybindings.js.map +1 -0
- package/dist/core/messages.d.ts +77 -0
- package/dist/core/messages.d.ts.map +1 -0
- package/dist/core/messages.js +123 -0
- package/dist/core/messages.js.map +1 -0
- package/dist/core/model-registry.d.ts +150 -0
- package/dist/core/model-registry.d.ts.map +1 -0
- package/dist/core/model-registry.js +729 -0
- package/dist/core/model-registry.js.map +1 -0
- package/dist/core/model-resolver.d.ts +110 -0
- package/dist/core/model-resolver.d.ts.map +1 -0
- package/dist/core/model-resolver.js +495 -0
- package/dist/core/model-resolver.js.map +1 -0
- package/dist/core/output-guard.d.ts +6 -0
- package/dist/core/output-guard.d.ts.map +1 -0
- package/dist/core/output-guard.js +59 -0
- package/dist/core/output-guard.js.map +1 -0
- package/dist/core/package-manager.d.ts +204 -0
- package/dist/core/package-manager.d.ts.map +1 -0
- package/dist/core/package-manager.js +2021 -0
- package/dist/core/package-manager.js.map +1 -0
- package/dist/core/pi-agent.d.ts +191 -0
- package/dist/core/pi-agent.d.ts.map +1 -0
- package/dist/core/pi-agent.js +655 -0
- package/dist/core/pi-agent.js.map +1 -0
- package/dist/core/prompt-templates.d.ts +52 -0
- package/dist/core/prompt-templates.d.ts.map +1 -0
- package/dist/core/prompt-templates.js +238 -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/resolve-config-value.d.ts +23 -0
- package/dist/core/resolve-config-value.d.ts.map +1 -0
- package/dist/core/resolve-config-value.js +126 -0
- package/dist/core/resolve-config-value.js.map +1 -0
- package/dist/core/resource-loader.d.ts +194 -0
- package/dist/core/resource-loader.d.ts.map +1 -0
- package/dist/core/resource-loader.js +734 -0
- package/dist/core/resource-loader.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.d.ts +9 -0
- package/dist/core/session/context.d.ts.map +1 -0
- package/dist/core/session/context.js +94 -0
- package/dist/core/session/context.js.map +1 -0
- package/dist/core/session/ids.d.ts +6 -0
- package/dist/core/session/ids.d.ts.map +1 -0
- package/dist/core/session/ids.js +15 -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 +42 -0
- package/dist/core/session/in-memory-session-manager.js.map +1 -0
- package/dist/core/session/in-memory-session.d.ts +5 -0
- package/dist/core/session/in-memory-session.d.ts.map +1 -0
- package/dist/core/session/in-memory-session.js +8 -0
- package/dist/core/session/in-memory-session.js.map +1 -0
- package/dist/core/session/index.d.ts +16 -0
- package/dist/core/session/index.d.ts.map +1 -0
- package/dist/core/session/index.js +13 -0
- package/dist/core/session/index.js.map +1 -0
- package/dist/core/session/jsonl-helpers.d.ts +13 -0
- package/dist/core/session/jsonl-helpers.d.ts.map +1 -0
- package/dist/core/session/jsonl-helpers.js +18 -0
- package/dist/core/session/jsonl-helpers.js.map +1 -0
- package/dist/core/session/local-session-manager.d.ts +22 -0
- package/dist/core/session/local-session-manager.d.ts.map +1 -0
- package/dist/core/session/local-session-manager.js +102 -0
- package/dist/core/session/local-session-manager.js.map +1 -0
- package/dist/core/session/local-session.d.ts +5 -0
- package/dist/core/session/local-session.d.ts.map +1 -0
- package/dist/core/session/local-session.js +8 -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 +73 -0
- package/dist/core/session/remote-session-client.d.ts.map +1 -0
- package/dist/core/session/remote-session-client.js +69 -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 +91 -0
- package/dist/core/session/remote-session-manager.js.map +1 -0
- package/dist/core/session/remote-session.d.ts +17 -0
- package/dist/core/session/remote-session.d.ts.map +1 -0
- package/dist/core/session/remote-session.js +30 -0
- package/dist/core/session/remote-session.js.map +1 -0
- package/dist/core/session/session-manager.d.ts +17 -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 +135 -0
- package/dist/core/session/session.d.ts.map +1 -0
- package/dist/core/session/session.js +380 -0
- package/dist/core/session/session.js.map +1 -0
- package/dist/core/session/stores/in-memory-session-store.d.ts +51 -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 +199 -0
- package/dist/core/session/stores/in-memory-session-store.js.map +1 -0
- package/dist/core/session/stores/jsonl-session-store.d.ts +30 -0
- package/dist/core/session/stores/jsonl-session-store.d.ts.map +1 -0
- package/dist/core/session/stores/jsonl-session-store.js +380 -0
- package/dist/core/session/stores/jsonl-session-store.js.map +1 -0
- package/dist/core/session/stores/remote-session-store.d.ts +43 -0
- package/dist/core/session/stores/remote-session-store.d.ts.map +1 -0
- package/dist/core/session/stores/remote-session-store.js +124 -0
- package/dist/core/session/stores/remote-session-store.js.map +1 -0
- package/dist/core/session/stores/session-store.d.ts +48 -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 +138 -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-cwd.d.ts +19 -0
- package/dist/core/session-cwd.d.ts.map +1 -0
- package/dist/core/session-cwd.js +38 -0
- package/dist/core/session-cwd.js.map +1 -0
- package/dist/core/session-manager.d.ts +2 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +2 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/settings-manager.d.ts +264 -0
- package/dist/core/settings-manager.d.ts.map +1 -0
- package/dist/core/settings-manager.js +795 -0
- package/dist/core/settings-manager.js.map +1 -0
- package/dist/core/skills.d.ts +60 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +387 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/slash-commands.d.ts +14 -0
- package/dist/core/slash-commands.d.ts.map +1 -0
- package/dist/core/slash-commands.js +25 -0
- package/dist/core/slash-commands.js.map +1 -0
- package/dist/core/source-info.d.ts +18 -0
- package/dist/core/source-info.d.ts.map +1 -0
- package/dist/core/source-info.js +19 -0
- package/dist/core/source-info.js.map +1 -0
- package/dist/core/system-prompt.d.ts +28 -0
- package/dist/core/system-prompt.d.ts.map +1 -0
- package/dist/core/system-prompt.js +123 -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 +8 -0
- package/dist/core/timings.d.ts.map +1 -0
- package/dist/core/timings.js +31 -0
- package/dist/core/timings.js.map +1 -0
- package/dist/core/tools/bash.d.ts +68 -0
- package/dist/core/tools/bash.d.ts.map +1 -0
- package/dist/core/tools/bash.js +342 -0
- package/dist/core/tools/bash.js.map +1 -0
- package/dist/core/tools/edit-diff.d.ts +87 -0
- package/dist/core/tools/edit-diff.d.ts.map +1 -0
- package/dist/core/tools/edit-diff.js +345 -0
- package/dist/core/tools/edit-diff.js.map +1 -0
- package/dist/core/tools/edit.d.ts +51 -0
- package/dist/core/tools/edit.d.ts.map +1 -0
- package/dist/core/tools/edit.js +325 -0
- package/dist/core/tools/edit.js.map +1 -0
- package/dist/core/tools/file-mutation-queue.d.ts +6 -0
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
- package/dist/core/tools/file-mutation-queue.js +37 -0
- package/dist/core/tools/file-mutation-queue.js.map +1 -0
- package/dist/core/tools/find.d.ts +35 -0
- package/dist/core/tools/find.d.ts.map +1 -0
- package/dist/core/tools/find.js +298 -0
- package/dist/core/tools/find.js.map +1 -0
- package/dist/core/tools/grep.d.ts +37 -0
- package/dist/core/tools/grep.d.ts.map +1 -0
- package/dist/core/tools/grep.js +304 -0
- package/dist/core/tools/grep.js.map +1 -0
- package/dist/core/tools/index.d.ts +40 -0
- package/dist/core/tools/index.d.ts.map +1 -0
- package/dist/core/tools/index.js +112 -0
- package/dist/core/tools/index.js.map +1 -0
- package/dist/core/tools/ls.d.ts +37 -0
- package/dist/core/tools/ls.d.ts.map +1 -0
- package/dist/core/tools/ls.js +169 -0
- package/dist/core/tools/ls.js.map +1 -0
- package/dist/core/tools/output-accumulator.d.ts +52 -0
- package/dist/core/tools/output-accumulator.d.ts.map +1 -0
- package/dist/core/tools/output-accumulator.js +184 -0
- package/dist/core/tools/output-accumulator.js.map +1 -0
- package/dist/core/tools/path-utils.d.ts +8 -0
- package/dist/core/tools/path-utils.d.ts.map +1 -0
- package/dist/core/tools/path-utils.js +62 -0
- package/dist/core/tools/path-utils.js.map +1 -0
- package/dist/core/tools/read.d.ts +35 -0
- package/dist/core/tools/read.d.ts.map +1 -0
- package/dist/core/tools/read.js +289 -0
- package/dist/core/tools/read.js.map +1 -0
- package/dist/core/tools/render-utils.d.ts +21 -0
- package/dist/core/tools/render-utils.d.ts.map +1 -0
- package/dist/core/tools/render-utils.js +49 -0
- package/dist/core/tools/render-utils.js.map +1 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
- package/dist/core/tools/tool-definition-wrapper.js +34 -0
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
- package/dist/core/tools/truncate.d.ts +70 -0
- package/dist/core/tools/truncate.d.ts.map +1 -0
- package/dist/core/tools/truncate.js +215 -0
- package/dist/core/tools/truncate.js.map +1 -0
- package/dist/core/tools/write.d.ts +26 -0
- package/dist/core/tools/write.d.ts.map +1 -0
- package/dist/core/tools/write.js +213 -0
- package/dist/core/tools/write.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +12 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +532 -0
- package/dist/main.js.map +1 -0
- package/dist/migrations.d.ts +33 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +281 -0
- package/dist/migrations.js.map +1 -0
- package/dist/modes/index.d.ts +9 -0
- package/dist/modes/index.d.ts.map +1 -0
- package/dist/modes/index.js +8 -0
- package/dist/modes/index.js.map +1 -0
- package/dist/modes/interactive/assets/clankolas.png +0 -0
- package/dist/modes/interactive/components/armin.d.ts +34 -0
- package/dist/modes/interactive/components/armin.d.ts.map +1 -0
- package/dist/modes/interactive/components/armin.js +333 -0
- package/dist/modes/interactive/components/armin.js.map +1 -0
- package/dist/modes/interactive/components/assistant-message.d.ts +20 -0
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/assistant-message.js +121 -0
- package/dist/modes/interactive/components/assistant-message.js.map +1 -0
- package/dist/modes/interactive/components/bash-execution.d.ts +34 -0
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/bash-execution.js +175 -0
- package/dist/modes/interactive/components/bash-execution.js.map +1 -0
- package/dist/modes/interactive/components/bordered-loader.d.ts +16 -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 +16 -0
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/branch-summary-message.js +44 -0
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
- package/dist/modes/interactive/components/config-selector.d.ts +71 -0
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/config-selector.js +506 -0
- package/dist/modes/interactive/components/config-selector.js.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
- package/dist/modes/interactive/components/countdown-timer.js +33 -0
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
- package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-editor.js +70 -0
- package/dist/modes/interactive/components/custom-editor.js.map +1 -0
- package/dist/modes/interactive/components/custom-message.d.ts +20 -0
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/custom-message.js +79 -0
- package/dist/modes/interactive/components/custom-message.js.map +1 -0
- package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
- package/dist/modes/interactive/components/daxnuts.js +140 -0
- package/dist/modes/interactive/components/daxnuts.js.map +1 -0
- package/dist/modes/interactive/components/diff.d.ts +12 -0
- package/dist/modes/interactive/components/diff.d.ts.map +1 -0
- package/dist/modes/interactive/components/diff.js +133 -0
- package/dist/modes/interactive/components/diff.js.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
- package/dist/modes/interactive/components/dynamic-border.js +21 -0
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
- package/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
- package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -0
- package/dist/modes/interactive/components/earendil-announcement.js +40 -0
- package/dist/modes/interactive/components/earendil-announcement.js.map +1 -0
- package/dist/modes/interactive/components/extension-editor.d.ts +20 -0
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
- package/dist/modes/interactive/components/extension-editor.js +119 -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 +27 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -0
- package/dist/modes/interactive/components/footer.js +201 -0
- package/dist/modes/interactive/components/footer.js.map +1 -0
- package/dist/modes/interactive/components/index.d.ts +32 -0
- package/dist/modes/interactive/components/index.d.ts.map +1 -0
- package/dist/modes/interactive/components/index.js +33 -0
- package/dist/modes/interactive/components/index.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 +54 -0
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
- package/dist/modes/interactive/components/login-dialog.js +180 -0
- package/dist/modes/interactive/components/login-dialog.js.map +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts +47 -0
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/model-selector.js +278 -0
- package/dist/modes/interactive/components/model-selector.js.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts +31 -0
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/oauth-selector.js +165 -0
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +42 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/scoped-models-selector.js +290 -0
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.js +155 -0
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
- package/dist/modes/interactive/components/session-selector.d.ts +96 -0
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/session-selector.js +861 -0
- package/dist/modes/interactive/components/session-selector.js.map +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +69 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/settings-selector.js +390 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/show-images-selector.js +39 -0
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
- package/dist/modes/interactive/components/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 +63 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
- package/dist/modes/interactive/components/tool-execution.js +295 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector.d.ts +89 -0
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
- package/dist/modes/interactive/components/tree-selector.js +1093 -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 +10 -0
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/user-message.js +29 -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 +370 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-mode.js +4653 -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 +100 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
- package/dist/modes/interactive/theme/theme.js +1024 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -0
- package/dist/modes/print-mode.d.ts +28 -0
- package/dist/modes/print-mode.d.ts.map +1 -0
- package/dist/modes/print-mode.js +131 -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 +234 -0
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
- package/dist/modes/rpc/rpc-client.js +418 -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 +603 -0
- package/dist/modes/rpc/rpc-mode.js.map +1 -0
- package/dist/modes/rpc/rpc-types.d.ts +420 -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 +515 -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 +52 -0
- package/dist/utils/ansi.js.map +1 -0
- package/dist/utils/changelog.d.ts +21 -0
- package/dist/utils/changelog.d.ts.map +1 -0
- package/dist/utils/changelog.js +87 -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 +11 -0
- package/dist/utils/clipboard-image.d.ts.map +1 -0
- package/dist/utils/clipboard-image.js +245 -0
- package/dist/utils/clipboard-image.js.map +1 -0
- package/dist/utils/clipboard-native.d.ts +8 -0
- package/dist/utils/clipboard-native.d.ts.map +1 -0
- package/dist/utils/clipboard-native.js +14 -0
- package/dist/utils/clipboard-native.js.map +1 -0
- package/dist/utils/clipboard.d.ts +2 -0
- package/dist/utils/clipboard.d.ts.map +1 -0
- package/dist/utils/clipboard.js +117 -0
- package/dist/utils/clipboard.js.map +1 -0
- package/dist/utils/exif-orientation.d.ts +5 -0
- package/dist/utils/exif-orientation.d.ts.map +1 -0
- package/dist/utils/exif-orientation.js +158 -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 +26 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +163 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/html.d.ts +7 -0
- package/dist/utils/html.d.ts.map +1 -0
- package/dist/utils/html.js +40 -0
- package/dist/utils/html.js.map +1 -0
- package/dist/utils/image-convert.d.ts +9 -0
- package/dist/utils/image-convert.d.ts.map +1 -0
- package/dist/utils/image-convert.js +39 -0
- package/dist/utils/image-convert.js.map +1 -0
- package/dist/utils/image-resize.d.ts +36 -0
- package/dist/utils/image-resize.d.ts.map +1 -0
- package/dist/utils/image-resize.js +137 -0
- package/dist/utils/image-resize.js.map +1 -0
- package/dist/utils/mime.d.ts +3 -0
- package/dist/utils/mime.d.ts.map +1 -0
- package/dist/utils/mime.js +69 -0
- package/dist/utils/mime.js.map +1 -0
- package/dist/utils/paths.d.ts +31 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +92 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/photon.d.ts +21 -0
- package/dist/utils/photon.d.ts.map +1 -0
- package/dist/utils/photon.js +121 -0
- package/dist/utils/photon.js.map +1 -0
- package/dist/utils/pi-user-agent.d.ts +2 -0
- package/dist/utils/pi-user-agent.d.ts.map +1 -0
- package/dist/utils/pi-user-agent.js +5 -0
- package/dist/utils/pi-user-agent.js.map +1 -0
- package/dist/utils/shell.d.ts +30 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +195 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/sleep.d.ts +5 -0
- package/dist/utils/sleep.d.ts.map +1 -0
- package/dist/utils/sleep.js +17 -0
- package/dist/utils/sleep.js.map +1 -0
- package/dist/utils/syntax-highlight.d.ts +12 -0
- package/dist/utils/syntax-highlight.d.ts.map +1 -0
- package/dist/utils/syntax-highlight.js +118 -0
- package/dist/utils/syntax-highlight.js.map +1 -0
- package/dist/utils/tools-manager.d.ts +3 -0
- package/dist/utils/tools-manager.d.ts.map +1 -0
- package/dist/utils/tools-manager.js +328 -0
- package/dist/utils/tools-manager.js.map +1 -0
- package/dist/utils/version-check.d.ts +15 -0
- package/dist/utils/version-check.d.ts.map +1 -0
- package/dist/utils/version-check.js +82 -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 +394 -0
- package/docs/custom-provider.md +701 -0
- package/docs/development.md +71 -0
- package/docs/docs.json +148 -0
- package/docs/extensions.md +2596 -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 +80 -0
- package/docs/json.md +82 -0
- package/docs/keybindings.md +197 -0
- package/docs/models.md +474 -0
- package/docs/packages.md +225 -0
- package/docs/prompt-templates.md +88 -0
- package/docs/providers.md +243 -0
- package/docs/quickstart.md +164 -0
- package/docs/rpc.md +1407 -0
- package/docs/sdk.md +257 -0
- package/docs/session-format.md +412 -0
- package/docs/sessions.md +137 -0
- package/docs/settings.md +277 -0
- package/docs/shell-aliases.md +13 -0
- package/docs/skills.md +231 -0
- package/docs/terminal-setup.md +106 -0
- package/docs/termux.md +127 -0
- package/docs/themes.md +295 -0
- package/docs/tmux.md +61 -0
- package/docs/tui.md +918 -0
- package/docs/usage.md +279 -0
- package/docs/windows.md +17 -0
- package/examples/README.md +25 -0
- package/examples/extensions/README.md +208 -0
- package/examples/extensions/auto-commit-on-exit.ts +49 -0
- package/examples/extensions/bash-spawn-hook.ts +30 -0
- package/examples/extensions/bookmark.ts +50 -0
- package/examples/extensions/border-status-editor.ts +150 -0
- package/examples/extensions/built-in-tool-renderer.ts +249 -0
- package/examples/extensions/claude-rules.ts +86 -0
- package/examples/extensions/commands.ts +72 -0
- package/examples/extensions/confirm-destructive.ts +59 -0
- package/examples/extensions/custom-compaction.ts +127 -0
- package/examples/extensions/custom-footer.ts +64 -0
- package/examples/extensions/custom-header.ts +73 -0
- package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
- package/examples/extensions/custom-provider-anthropic/package.json +19 -0
- package/examples/extensions/custom-provider-gitlab-duo/index.ts +349 -0
- package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
- package/examples/extensions/dirty-repo-guard.ts +56 -0
- package/examples/extensions/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 +132 -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/SKILL.md +8 -0
- package/examples/extensions/dynamic-resources/dynamic.json +79 -0
- package/examples/extensions/dynamic-resources/dynamic.md +5 -0
- package/examples/extensions/dynamic-resources/index.ts +15 -0
- package/examples/extensions/dynamic-tools.ts +74 -0
- package/examples/extensions/event-bus.ts +43 -0
- package/examples/extensions/file-trigger.ts +41 -0
- package/examples/extensions/git-checkpoint.ts +53 -0
- package/examples/extensions/github-issue-autocomplete.ts +185 -0
- package/examples/extensions/handoff.ts +191 -0
- package/examples/extensions/hello.ts +26 -0
- package/examples/extensions/hidden-thinking-label.ts +53 -0
- package/examples/extensions/inline-bash.ts +94 -0
- package/examples/extensions/input-transform.ts +43 -0
- package/examples/extensions/interactive-shell.ts +196 -0
- package/examples/extensions/mac-system-theme.ts +47 -0
- package/examples/extensions/message-renderer.ts +59 -0
- package/examples/extensions/minimal-mode.ts +426 -0
- package/examples/extensions/modal-editor.ts +85 -0
- package/examples/extensions/model-status.ts +31 -0
- package/examples/extensions/notify.ts +55 -0
- package/examples/extensions/overlay-qa-tests.ts +1379 -0
- package/examples/extensions/overlay-test.ts +153 -0
- package/examples/extensions/permission-gate.ts +34 -0
- package/examples/extensions/pirate.ts +47 -0
- package/examples/extensions/plan-mode/README.md +65 -0
- package/examples/extensions/plan-mode/index.ts +340 -0
- package/examples/extensions/plan-mode/utils.ts +168 -0
- package/examples/extensions/preset.ts +430 -0
- package/examples/extensions/prompt-customizer.ts +97 -0
- package/examples/extensions/protected-paths.ts +30 -0
- package/examples/extensions/provider-payload.ts +18 -0
- package/examples/extensions/qna.ts +122 -0
- package/examples/extensions/question.ts +264 -0
- package/examples/extensions/questionnaire.ts +427 -0
- package/examples/extensions/rainbow-editor.ts +88 -0
- package/examples/extensions/reload-runtime.ts +37 -0
- package/examples/extensions/rpc-demo.ts +118 -0
- package/examples/extensions/sandbox/index.ts +321 -0
- package/examples/extensions/sandbox/package-lock.json +92 -0
- package/examples/extensions/sandbox/package.json +19 -0
- package/examples/extensions/send-user-message.ts +97 -0
- package/examples/extensions/session-name.ts +27 -0
- package/examples/extensions/shutdown-command.ts +63 -0
- package/examples/extensions/snake.ts +343 -0
- package/examples/extensions/space-invaders.ts +560 -0
- package/examples/extensions/ssh.ts +220 -0
- package/examples/extensions/status-line.ts +32 -0
- package/examples/extensions/structured-output.ts +65 -0
- package/examples/extensions/subagent/README.md +175 -0
- package/examples/extensions/subagent/agents/planner.md +37 -0
- package/examples/extensions/subagent/agents/reviewer.md +35 -0
- package/examples/extensions/subagent/agents/scout.md +50 -0
- package/examples/extensions/subagent/agents/worker.md +24 -0
- package/examples/extensions/subagent/agents.ts +126 -0
- package/examples/extensions/subagent/index.ts +1009 -0
- package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
- package/examples/extensions/subagent/prompts/implement.md +10 -0
- package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
- package/examples/extensions/summarize.ts +206 -0
- package/examples/extensions/system-prompt-header.ts +17 -0
- package/examples/extensions/tic-tac-toe.ts +1008 -0
- package/examples/extensions/timed-confirm.ts +70 -0
- package/examples/extensions/titlebar-spinner.ts +58 -0
- package/examples/extensions/todo.ts +297 -0
- package/examples/extensions/tool-override.ts +144 -0
- package/examples/extensions/tools.ts +141 -0
- package/examples/extensions/trigger-compact.ts +50 -0
- package/examples/extensions/truncated-tool.ts +195 -0
- package/examples/extensions/widget-placement.ts +9 -0
- package/examples/extensions/with-deps/index.ts +32 -0
- package/examples/extensions/with-deps/package-lock.json +31 -0
- package/examples/extensions/with-deps/package.json +22 -0
- package/examples/extensions/working-indicator.ts +123 -0
- package/examples/extensions/working-message-test.ts +25 -0
- package/examples/rpc-extension-ui.ts +632 -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 +51 -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 +46 -0
- package/examples/sdk/10-settings.ts +57 -0
- package/examples/sdk/11-sessions.ts +54 -0
- package/examples/sdk/12-full-control.ts +78 -0
- package/examples/sdk/13-session-runtime.ts +49 -0
- package/examples/sdk/README.md +95 -0
- package/npm-shrinkwrap.json +1789 -0
- package/package.json +98 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { copyFileSync, existsSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { basename, join, resolve } from "node:path";
|
|
3
|
+
import { CURRENT_SESSION_VERSION } from "./constants.js";
|
|
4
|
+
import { createSessionId } from "./ids.js";
|
|
5
|
+
import { findMostRecentSession, getDefaultSessionDir, jsonlSessionStore, loadEntriesFromFile, } from "./jsonl-helpers.js";
|
|
6
|
+
import { LocalSession } from "./local-session.js";
|
|
7
|
+
export class LocalSessionManager {
|
|
8
|
+
cwd;
|
|
9
|
+
sessionDir;
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.cwd = options.cwd;
|
|
12
|
+
this.sessionDir = options.sessionDir;
|
|
13
|
+
}
|
|
14
|
+
create(options) {
|
|
15
|
+
const dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);
|
|
16
|
+
const session = new LocalSession(this.cwd, dir, undefined);
|
|
17
|
+
if (options?.id || options?.parentSession) {
|
|
18
|
+
session.newSession(options);
|
|
19
|
+
}
|
|
20
|
+
return session;
|
|
21
|
+
}
|
|
22
|
+
openReference(reference, options) {
|
|
23
|
+
const entries = loadEntriesFromFile(reference);
|
|
24
|
+
const header = entries.find((entry) => entry.type === "session");
|
|
25
|
+
const cwd = options?.cwdOverride ?? header?.cwd ?? this.cwd;
|
|
26
|
+
const dir = this.sessionDir ?? jsonlSessionStore.getSessionDirForReference(reference);
|
|
27
|
+
return new LocalSession(cwd, dir, reference);
|
|
28
|
+
}
|
|
29
|
+
continueRecent() {
|
|
30
|
+
const dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);
|
|
31
|
+
const mostRecent = findMostRecentSession(dir);
|
|
32
|
+
if (mostRecent) {
|
|
33
|
+
return new LocalSession(this.cwd, dir, mostRecent);
|
|
34
|
+
}
|
|
35
|
+
return new LocalSession(this.cwd, dir, undefined);
|
|
36
|
+
}
|
|
37
|
+
forkFrom(reference) {
|
|
38
|
+
const sourceEntries = loadEntriesFromFile(reference);
|
|
39
|
+
if (sourceEntries.length === 0) {
|
|
40
|
+
throw new Error(`Cannot fork: source session is empty or invalid: ${reference}`);
|
|
41
|
+
}
|
|
42
|
+
const sourceHeader = sourceEntries.find((entry) => entry.type === "session");
|
|
43
|
+
if (!sourceHeader) {
|
|
44
|
+
throw new Error(`Cannot fork: source session has no header: ${reference}`);
|
|
45
|
+
}
|
|
46
|
+
const dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);
|
|
47
|
+
jsonlSessionStore.ensureDir(dir);
|
|
48
|
+
const newSessionId = createSessionId();
|
|
49
|
+
const timestamp = new Date().toISOString();
|
|
50
|
+
const newHeader = {
|
|
51
|
+
type: "session",
|
|
52
|
+
version: CURRENT_SESSION_VERSION,
|
|
53
|
+
id: newSessionId,
|
|
54
|
+
timestamp,
|
|
55
|
+
cwd: this.cwd,
|
|
56
|
+
parentSession: reference,
|
|
57
|
+
};
|
|
58
|
+
const newSessionReference = jsonlSessionStore.forkSession(dir, newHeader, sourceEntries);
|
|
59
|
+
return new LocalSession(this.cwd, dir, newSessionReference);
|
|
60
|
+
}
|
|
61
|
+
forkSession(source, targetLeafId) {
|
|
62
|
+
const parentSession = source.getSessionReference();
|
|
63
|
+
if (!targetLeafId) {
|
|
64
|
+
const session = this.create();
|
|
65
|
+
session.newSession({ parentSession });
|
|
66
|
+
return session;
|
|
67
|
+
}
|
|
68
|
+
const branchSource = parentSession ? this.openReference(parentSession) : source;
|
|
69
|
+
const forkedReference = branchSource.createBranchedSession(targetLeafId);
|
|
70
|
+
if (!forkedReference) {
|
|
71
|
+
throw new Error("Failed to create forked session");
|
|
72
|
+
}
|
|
73
|
+
return this.openReference(forkedReference);
|
|
74
|
+
}
|
|
75
|
+
importJsonl(inputPath, options) {
|
|
76
|
+
const resolvedPath = resolve(inputPath);
|
|
77
|
+
if (!existsSync(resolvedPath)) {
|
|
78
|
+
throw new Error(`File not found: ${resolvedPath}`);
|
|
79
|
+
}
|
|
80
|
+
const dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);
|
|
81
|
+
if (!existsSync(dir)) {
|
|
82
|
+
mkdirSync(dir, { recursive: true });
|
|
83
|
+
}
|
|
84
|
+
const destinationPath = join(dir, basename(resolvedPath));
|
|
85
|
+
if (resolve(destinationPath) !== resolvedPath) {
|
|
86
|
+
copyFileSync(resolvedPath, destinationPath);
|
|
87
|
+
}
|
|
88
|
+
return this.openReference(destinationPath, options);
|
|
89
|
+
}
|
|
90
|
+
async list(onProgress) {
|
|
91
|
+
const dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);
|
|
92
|
+
const sessions = await jsonlSessionStore.list(dir, onProgress);
|
|
93
|
+
sessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());
|
|
94
|
+
return sessions;
|
|
95
|
+
}
|
|
96
|
+
async listAll(onProgress) {
|
|
97
|
+
const sessions = await jsonlSessionStore.listAll(jsonlSessionStore.getSessionsRoot(), onProgress);
|
|
98
|
+
sessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());
|
|
99
|
+
return sessions;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=local-session-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-session-manager.js","sourceRoot":"","sources":["../../../src/core/session/local-session-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { copyFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { basename, join, resolve } from \"node:path\";\nimport { CURRENT_SESSION_VERSION } from \"./constants.ts\";\nimport { createSessionId } from \"./ids.ts\";\nimport {\n\tfindMostRecentSession,\n\tgetDefaultSessionDir,\n\tjsonlSessionStore,\n\tloadEntriesFromFile,\n} from \"./jsonl-helpers.ts\";\nimport { LocalSession } from \"./local-session.ts\";\nimport type { Session } from \"./session.ts\";\nimport type { OpenSessionOptions, SessionManager } from \"./session-manager.ts\";\nimport type { NewSessionOptions, SessionHeader, SessionInfo, SessionListProgress } from \"./types.ts\";\n\nexport interface LocalSessionManagerOptions {\n\tcwd: string;\n\tsessionDir?: string;\n}\n\nexport class LocalSessionManager implements SessionManager {\n\tprivate readonly cwd: string;\n\tprivate readonly sessionDir?: string;\n\n\tconstructor(options: LocalSessionManagerOptions) {\n\t\tthis.cwd = options.cwd;\n\t\tthis.sessionDir = options.sessionDir;\n\t}\n\n\tcreate(options?: NewSessionOptions): LocalSession {\n\t\tconst dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);\n\t\tconst session = new LocalSession(this.cwd, dir, undefined);\n\t\tif (options?.id || options?.parentSession) {\n\t\t\tsession.newSession(options);\n\t\t}\n\t\treturn session;\n\t}\n\n\topenReference(reference: string, options?: OpenSessionOptions): LocalSession {\n\t\tconst entries = loadEntriesFromFile(reference);\n\t\tconst header = entries.find((entry) => entry.type === \"session\") as SessionHeader | undefined;\n\t\tconst cwd = options?.cwdOverride ?? header?.cwd ?? this.cwd;\n\t\tconst dir = this.sessionDir ?? jsonlSessionStore.getSessionDirForReference(reference);\n\t\treturn new LocalSession(cwd, dir, reference);\n\t}\n\n\tcontinueRecent(): LocalSession {\n\t\tconst dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);\n\t\tconst mostRecent = findMostRecentSession(dir);\n\t\tif (mostRecent) {\n\t\t\treturn new LocalSession(this.cwd, dir, mostRecent);\n\t\t}\n\t\treturn new LocalSession(this.cwd, dir, undefined);\n\t}\n\n\tforkFrom(reference: string): LocalSession {\n\t\tconst sourceEntries = loadEntriesFromFile(reference);\n\t\tif (sourceEntries.length === 0) {\n\t\t\tthrow new Error(`Cannot fork: source session is empty or invalid: ${reference}`);\n\t\t}\n\n\t\tconst sourceHeader = sourceEntries.find((entry) => entry.type === \"session\") as SessionHeader | undefined;\n\t\tif (!sourceHeader) {\n\t\t\tthrow new Error(`Cannot fork: source session has no header: ${reference}`);\n\t\t}\n\n\t\tconst dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);\n\t\tjsonlSessionStore.ensureDir(dir);\n\n\t\tconst newSessionId = createSessionId();\n\t\tconst timestamp = new Date().toISOString();\n\t\tconst newHeader: SessionHeader = {\n\t\t\ttype: \"session\",\n\t\t\tversion: CURRENT_SESSION_VERSION,\n\t\t\tid: newSessionId,\n\t\t\ttimestamp,\n\t\t\tcwd: this.cwd,\n\t\t\tparentSession: reference,\n\t\t};\n\t\tconst newSessionReference = jsonlSessionStore.forkSession(dir, newHeader, sourceEntries);\n\n\t\treturn new LocalSession(this.cwd, dir, newSessionReference);\n\t}\n\n\tforkSession(source: Session, targetLeafId: string | null): LocalSession {\n\t\tconst parentSession = source.getSessionReference();\n\t\tif (!targetLeafId) {\n\t\t\tconst session = this.create();\n\t\t\tsession.newSession({ parentSession });\n\t\t\treturn session;\n\t\t}\n\n\t\tconst branchSource = parentSession ? this.openReference(parentSession) : source;\n\t\tconst forkedReference = branchSource.createBranchedSession(targetLeafId);\n\t\tif (!forkedReference) {\n\t\t\tthrow new Error(\"Failed to create forked session\");\n\t\t}\n\t\treturn this.openReference(forkedReference);\n\t}\n\n\timportJsonl(inputPath: string, options?: OpenSessionOptions): LocalSession {\n\t\tconst resolvedPath = resolve(inputPath);\n\t\tif (!existsSync(resolvedPath)) {\n\t\t\tthrow new Error(`File not found: ${resolvedPath}`);\n\t\t}\n\n\t\tconst dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);\n\t\tif (!existsSync(dir)) {\n\t\t\tmkdirSync(dir, { recursive: true });\n\t\t}\n\n\t\tconst destinationPath = join(dir, basename(resolvedPath));\n\t\tif (resolve(destinationPath) !== resolvedPath) {\n\t\t\tcopyFileSync(resolvedPath, destinationPath);\n\t\t}\n\t\treturn this.openReference(destinationPath, options);\n\t}\n\n\tasync list(onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\tconst dir = this.sessionDir ?? getDefaultSessionDir(this.cwd);\n\t\tconst sessions = await jsonlSessionStore.list(dir, onProgress);\n\t\tsessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());\n\t\treturn sessions;\n\t}\n\n\tasync listAll(onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\tconst sessions = await jsonlSessionStore.listAll(jsonlSessionStore.getSessionsRoot(), onProgress);\n\t\tsessions.sort((a, b) => b.modified.getTime() - a.modified.getTime());\n\t\treturn sessions;\n\t}\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-session.d.ts","sourceRoot":"","sources":["../../../src/core/session/local-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,qBAAa,YAAa,SAAQ,OAAO;IACxC,YAAY,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,SAAS,EAEhF;CACD","sourcesContent":["import { Session } from \"./session.ts\";\nimport { JsonlSessionStore } from \"./stores/jsonl-session-store.ts\";\n\nexport class LocalSession extends Session {\n\tconstructor(cwd: string, sessionDir: string, sessionReference: string | undefined) {\n\t\tsuper(cwd, sessionDir, sessionReference, new JsonlSessionStore());\n\t}\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Session } from "./session.js";
|
|
2
|
+
import { JsonlSessionStore } from "./stores/jsonl-session-store.js";
|
|
3
|
+
export class LocalSession extends Session {
|
|
4
|
+
constructor(cwd, sessionDir, sessionReference) {
|
|
5
|
+
super(cwd, sessionDir, sessionReference, new JsonlSessionStore());
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=local-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-session.js","sourceRoot":"","sources":["../../../src/core/session/local-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEpE,MAAM,OAAO,YAAa,SAAQ,OAAO;IACxC,YAAY,GAAW,EAAE,UAAkB,EAAE,gBAAoC,EAAE;QAClF,KAAK,CAAC,GAAG,EAAE,UAAU,EAAE,gBAAgB,EAAE,IAAI,iBAAiB,EAAE,CAAC,CAAC;IAAA,CAClE;CACD","sourcesContent":["import { Session } from \"./session.ts\";\nimport { JsonlSessionStore } from \"./stores/jsonl-session-store.ts\";\n\nexport class LocalSession extends Session {\n\tconstructor(cwd: string, sessionDir: string, sessionReference: string | undefined) {\n\t\tsuper(cwd, sessionDir, sessionReference, new JsonlSessionStore());\n\t}\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { FileEntry } from "./types.ts";
|
|
2
|
+
/**
|
|
3
|
+
* Run all necessary migrations to bring entries to current version.
|
|
4
|
+
* Mutates entries in place. Returns true if any migration was applied.
|
|
5
|
+
*/
|
|
6
|
+
export declare function migrateToCurrentVersion(entries: FileEntry[]): boolean;
|
|
7
|
+
/** Exported for testing. */
|
|
8
|
+
export declare function migrateSessionEntries(entries: FileEntry[]): void;
|
|
9
|
+
/** Exported for compaction tests. */
|
|
10
|
+
export declare function parseSessionEntries(content: string): FileEntry[];
|
|
11
|
+
//# sourceMappingURL=migrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../src/core/session/migrations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAmB,SAAS,EAAsC,MAAM,YAAY,CAAC;AA+CjG;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,CAUrE;AAED,4BAA4B;AAC5B,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,CAEhE;AAED,qCAAqC;AACrC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,CAehE","sourcesContent":["import { CURRENT_SESSION_VERSION } from \"./constants.ts\";\nimport { generateId } from \"./ids.ts\";\nimport type { CompactionEntry, FileEntry, SessionHeader, SessionMessageEntry } from \"./types.ts\";\n\n/** Migrate v1 → v2: add id/parentId tree structure. Mutates in place. */\nfunction migrateV1ToV2(entries: FileEntry[]): void {\n\tconst ids = new Set<string>();\n\tlet prevId: string | null = null;\n\n\tfor (const entry of entries) {\n\t\tif (entry.type === \"session\") {\n\t\t\tentry.version = 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\tentry.id = generateId(ids);\n\t\tentry.parentId = prevId;\n\t\tprevId = entry.id;\n\n\t\tif (entry.type === \"compaction\") {\n\t\t\tconst comp = entry as CompactionEntry & { firstKeptEntryIndex?: number };\n\t\t\tif (typeof comp.firstKeptEntryIndex === \"number\") {\n\t\t\t\tconst targetEntry = entries[comp.firstKeptEntryIndex];\n\t\t\t\tif (targetEntry && targetEntry.type !== \"session\") {\n\t\t\t\t\tcomp.firstKeptEntryId = targetEntry.id;\n\t\t\t\t}\n\t\t\t\tdelete comp.firstKeptEntryIndex;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/** Migrate v2 → v3: rename hookMessage role to custom. Mutates in place. */\nfunction migrateV2ToV3(entries: FileEntry[]): void {\n\tfor (const entry of entries) {\n\t\tif (entry.type === \"session\") {\n\t\t\tentry.version = 3;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (entry.type === \"message\") {\n\t\t\tconst msgEntry = entry as SessionMessageEntry;\n\t\t\tif (msgEntry.message && (msgEntry.message as { role: string }).role === \"hookMessage\") {\n\t\t\t\t(msgEntry.message as { role: string }).role = \"custom\";\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Run all necessary migrations to bring entries to current version.\n * Mutates entries in place. Returns true if any migration was applied.\n */\nexport function migrateToCurrentVersion(entries: FileEntry[]): boolean {\n\tconst header = entries.find((entry) => entry.type === \"session\") as SessionHeader | undefined;\n\tconst version = header?.version ?? 1;\n\n\tif (version >= CURRENT_SESSION_VERSION) return false;\n\n\tif (version < 2) migrateV1ToV2(entries);\n\tif (version < 3) migrateV2ToV3(entries);\n\n\treturn true;\n}\n\n/** Exported for testing. */\nexport function migrateSessionEntries(entries: FileEntry[]): void {\n\tmigrateToCurrentVersion(entries);\n}\n\n/** Exported for compaction tests. */\nexport function parseSessionEntries(content: string): FileEntry[] {\n\tconst entries: FileEntry[] = [];\n\tconst lines = content.trim().split(\"\\n\");\n\n\tfor (const line of lines) {\n\t\tif (!line.trim()) continue;\n\t\ttry {\n\t\t\tconst entry = JSON.parse(line) as FileEntry;\n\t\t\tentries.push(entry);\n\t\t} catch {\n\t\t\t// Skip malformed lines.\n\t\t}\n\t}\n\n\treturn entries;\n}\n"]}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { CURRENT_SESSION_VERSION } from "./constants.js";
|
|
2
|
+
import { generateId } from "./ids.js";
|
|
3
|
+
/** Migrate v1 → v2: add id/parentId tree structure. Mutates in place. */
|
|
4
|
+
function migrateV1ToV2(entries) {
|
|
5
|
+
const ids = new Set();
|
|
6
|
+
let prevId = null;
|
|
7
|
+
for (const entry of entries) {
|
|
8
|
+
if (entry.type === "session") {
|
|
9
|
+
entry.version = 2;
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
entry.id = generateId(ids);
|
|
13
|
+
entry.parentId = prevId;
|
|
14
|
+
prevId = entry.id;
|
|
15
|
+
if (entry.type === "compaction") {
|
|
16
|
+
const comp = entry;
|
|
17
|
+
if (typeof comp.firstKeptEntryIndex === "number") {
|
|
18
|
+
const targetEntry = entries[comp.firstKeptEntryIndex];
|
|
19
|
+
if (targetEntry && targetEntry.type !== "session") {
|
|
20
|
+
comp.firstKeptEntryId = targetEntry.id;
|
|
21
|
+
}
|
|
22
|
+
delete comp.firstKeptEntryIndex;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** Migrate v2 → v3: rename hookMessage role to custom. Mutates in place. */
|
|
28
|
+
function migrateV2ToV3(entries) {
|
|
29
|
+
for (const entry of entries) {
|
|
30
|
+
if (entry.type === "session") {
|
|
31
|
+
entry.version = 3;
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (entry.type === "message") {
|
|
35
|
+
const msgEntry = entry;
|
|
36
|
+
if (msgEntry.message && msgEntry.message.role === "hookMessage") {
|
|
37
|
+
msgEntry.message.role = "custom";
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Run all necessary migrations to bring entries to current version.
|
|
44
|
+
* Mutates entries in place. Returns true if any migration was applied.
|
|
45
|
+
*/
|
|
46
|
+
export function migrateToCurrentVersion(entries) {
|
|
47
|
+
const header = entries.find((entry) => entry.type === "session");
|
|
48
|
+
const version = header?.version ?? 1;
|
|
49
|
+
if (version >= CURRENT_SESSION_VERSION)
|
|
50
|
+
return false;
|
|
51
|
+
if (version < 2)
|
|
52
|
+
migrateV1ToV2(entries);
|
|
53
|
+
if (version < 3)
|
|
54
|
+
migrateV2ToV3(entries);
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
/** Exported for testing. */
|
|
58
|
+
export function migrateSessionEntries(entries) {
|
|
59
|
+
migrateToCurrentVersion(entries);
|
|
60
|
+
}
|
|
61
|
+
/** Exported for compaction tests. */
|
|
62
|
+
export function parseSessionEntries(content) {
|
|
63
|
+
const entries = [];
|
|
64
|
+
const lines = content.trim().split("\n");
|
|
65
|
+
for (const line of lines) {
|
|
66
|
+
if (!line.trim())
|
|
67
|
+
continue;
|
|
68
|
+
try {
|
|
69
|
+
const entry = JSON.parse(line);
|
|
70
|
+
entries.push(entry);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// Skip malformed lines.
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return entries;
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=migrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../../src/core/session/migrations.ts"],"names":[],"mappings":"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","sourcesContent":["import { CURRENT_SESSION_VERSION } from \"./constants.ts\";\nimport { generateId } from \"./ids.ts\";\nimport type { CompactionEntry, FileEntry, SessionHeader, SessionMessageEntry } from \"./types.ts\";\n\n/** Migrate v1 → v2: add id/parentId tree structure. Mutates in place. */\nfunction migrateV1ToV2(entries: FileEntry[]): void {\n\tconst ids = new Set<string>();\n\tlet prevId: string | null = null;\n\n\tfor (const entry of entries) {\n\t\tif (entry.type === \"session\") {\n\t\t\tentry.version = 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\tentry.id = generateId(ids);\n\t\tentry.parentId = prevId;\n\t\tprevId = entry.id;\n\n\t\tif (entry.type === \"compaction\") {\n\t\t\tconst comp = entry as CompactionEntry & { firstKeptEntryIndex?: number };\n\t\t\tif (typeof comp.firstKeptEntryIndex === \"number\") {\n\t\t\t\tconst targetEntry = entries[comp.firstKeptEntryIndex];\n\t\t\t\tif (targetEntry && targetEntry.type !== \"session\") {\n\t\t\t\t\tcomp.firstKeptEntryId = targetEntry.id;\n\t\t\t\t}\n\t\t\t\tdelete comp.firstKeptEntryIndex;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/** Migrate v2 → v3: rename hookMessage role to custom. Mutates in place. */\nfunction migrateV2ToV3(entries: FileEntry[]): void {\n\tfor (const entry of entries) {\n\t\tif (entry.type === \"session\") {\n\t\t\tentry.version = 3;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (entry.type === \"message\") {\n\t\t\tconst msgEntry = entry as SessionMessageEntry;\n\t\t\tif (msgEntry.message && (msgEntry.message as { role: string }).role === \"hookMessage\") {\n\t\t\t\t(msgEntry.message as { role: string }).role = \"custom\";\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Run all necessary migrations to bring entries to current version.\n * Mutates entries in place. Returns true if any migration was applied.\n */\nexport function migrateToCurrentVersion(entries: FileEntry[]): boolean {\n\tconst header = entries.find((entry) => entry.type === \"session\") as SessionHeader | undefined;\n\tconst version = header?.version ?? 1;\n\n\tif (version >= CURRENT_SESSION_VERSION) return false;\n\n\tif (version < 2) migrateV1ToV2(entries);\n\tif (version < 3) migrateV2ToV3(entries);\n\n\treturn true;\n}\n\n/** Exported for testing. */\nexport function migrateSessionEntries(entries: FileEntry[]): void {\n\tmigrateToCurrentVersion(entries);\n}\n\n/** Exported for compaction tests. */\nexport function parseSessionEntries(content: string): FileEntry[] {\n\tconst entries: FileEntry[] = [];\n\tconst lines = content.trim().split(\"\\n\");\n\n\tfor (const line of lines) {\n\t\tif (!line.trim()) continue;\n\t\ttry {\n\t\t\tconst entry = JSON.parse(line) as FileEntry;\n\t\t\tentries.push(entry);\n\t\t} catch {\n\t\t\t// Skip malformed lines.\n\t\t}\n\t}\n\n\treturn entries;\n}\n"]}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { FileEntry, SessionInfo } from "./types.ts";
|
|
2
|
+
export interface RemoteSessionClientOptions {
|
|
3
|
+
baseUrl: string;
|
|
4
|
+
token: string;
|
|
5
|
+
fetch?: typeof fetch;
|
|
6
|
+
}
|
|
7
|
+
export interface RemoteSessionSnapshot {
|
|
8
|
+
reference: string;
|
|
9
|
+
id: string;
|
|
10
|
+
version?: number;
|
|
11
|
+
entries: FileEntry[];
|
|
12
|
+
etag?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface CreateRemoteSessionRequest {
|
|
15
|
+
id?: string;
|
|
16
|
+
cwd: string;
|
|
17
|
+
projectId?: string;
|
|
18
|
+
parentSession?: string;
|
|
19
|
+
metadata?: Record<string, unknown>;
|
|
20
|
+
}
|
|
21
|
+
export interface AppendRemoteSessionEntriesRequest {
|
|
22
|
+
baseEtag?: string;
|
|
23
|
+
entries: FileEntry[];
|
|
24
|
+
}
|
|
25
|
+
export interface AppendRemoteSessionEntriesResponse {
|
|
26
|
+
etag?: string;
|
|
27
|
+
accepted: number;
|
|
28
|
+
}
|
|
29
|
+
export interface ReplaceRemoteSessionSnapshotRequest {
|
|
30
|
+
baseEtag?: string;
|
|
31
|
+
entries: FileEntry[];
|
|
32
|
+
}
|
|
33
|
+
export interface ReplaceRemoteSessionSnapshotResponse {
|
|
34
|
+
etag?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface ForkRemoteSessionRequest {
|
|
37
|
+
cwd: string;
|
|
38
|
+
projectId?: string;
|
|
39
|
+
leafId?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface ImportRemoteSessionJsonlRequest {
|
|
42
|
+
cwd: string;
|
|
43
|
+
projectId?: string;
|
|
44
|
+
sourceName?: string;
|
|
45
|
+
entries: FileEntry[];
|
|
46
|
+
metadata?: Record<string, unknown>;
|
|
47
|
+
}
|
|
48
|
+
export interface ListRemoteSessionsResponse {
|
|
49
|
+
sessions: SessionInfo[];
|
|
50
|
+
}
|
|
51
|
+
export declare class RemoteSessionClientError extends Error {
|
|
52
|
+
readonly status: number;
|
|
53
|
+
readonly responseText: string;
|
|
54
|
+
constructor(status: number, responseText: string);
|
|
55
|
+
}
|
|
56
|
+
export declare class RemoteSessionClient {
|
|
57
|
+
private readonly baseUrl;
|
|
58
|
+
private readonly token;
|
|
59
|
+
private readonly fetchImpl;
|
|
60
|
+
constructor(options: RemoteSessionClientOptions);
|
|
61
|
+
createSession(request: CreateRemoteSessionRequest): Promise<RemoteSessionSnapshot>;
|
|
62
|
+
openSession(sessionIdOrReference: string): Promise<RemoteSessionSnapshot>;
|
|
63
|
+
appendEntries(sessionIdOrReference: string, request: AppendRemoteSessionEntriesRequest): Promise<AppendRemoteSessionEntriesResponse>;
|
|
64
|
+
replaceSnapshot(sessionIdOrReference: string, request: ReplaceRemoteSessionSnapshotRequest): Promise<ReplaceRemoteSessionSnapshotResponse>;
|
|
65
|
+
listSessions(): Promise<ListRemoteSessionsResponse>;
|
|
66
|
+
getRecentSession(): Promise<RemoteSessionSnapshot>;
|
|
67
|
+
forkSession(sessionIdOrReference: string, request: ForkRemoteSessionRequest): Promise<RemoteSessionSnapshot>;
|
|
68
|
+
importJsonl(request: ImportRemoteSessionJsonlRequest): Promise<RemoteSessionSnapshot>;
|
|
69
|
+
private request;
|
|
70
|
+
}
|
|
71
|
+
export declare function parseRemoteSessionId(reference: string): string;
|
|
72
|
+
export declare function formatRemoteSessionReference(sessionId: string): string;
|
|
73
|
+
//# sourceMappingURL=remote-session-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-session-client.d.ts","sourceRoot":"","sources":["../../../src/core/session/remote-session-client.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FileEntry, SessionInfo } from \"./types.ts\";\n\nexport interface RemoteSessionClientOptions {\n\tbaseUrl: string;\n\ttoken: string;\n\tfetch?: typeof fetch;\n}\n\nexport interface RemoteSessionSnapshot {\n\treference: string;\n\tid: string;\n\tversion?: number;\n\tentries: FileEntry[];\n\tetag?: string;\n}\n\nexport interface CreateRemoteSessionRequest {\n\tid?: string;\n\tcwd: string;\n\tprojectId?: string;\n\tparentSession?: string;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface AppendRemoteSessionEntriesRequest {\n\tbaseEtag?: string;\n\tentries: FileEntry[];\n}\n\nexport interface AppendRemoteSessionEntriesResponse {\n\tetag?: string;\n\taccepted: number;\n}\n\nexport interface ReplaceRemoteSessionSnapshotRequest {\n\tbaseEtag?: string;\n\tentries: FileEntry[];\n}\n\nexport interface ReplaceRemoteSessionSnapshotResponse {\n\tetag?: string;\n}\n\nexport interface ForkRemoteSessionRequest {\n\tcwd: string;\n\tprojectId?: string;\n\tleafId?: string;\n}\n\nexport interface ImportRemoteSessionJsonlRequest {\n\tcwd: string;\n\tprojectId?: string;\n\tsourceName?: string;\n\tentries: FileEntry[];\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface ListRemoteSessionsResponse {\n\tsessions: SessionInfo[];\n}\n\nexport class RemoteSessionClientError extends Error {\n\treadonly status: number;\n\treadonly responseText: string;\n\n\tconstructor(status: number, responseText: string) {\n\t\tsuper(`Remote session request failed with status ${status}: ${responseText}`);\n\t\tthis.name = \"RemoteSessionClientError\";\n\t\tthis.status = status;\n\t\tthis.responseText = responseText;\n\t}\n}\n\nexport class RemoteSessionClient {\n\tprivate readonly baseUrl: string;\n\tprivate readonly token: string;\n\tprivate readonly fetchImpl: typeof fetch;\n\n\tconstructor(options: RemoteSessionClientOptions) {\n\t\tthis.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n\t\tthis.token = options.token;\n\t\tthis.fetchImpl = options.fetch ?? fetch;\n\t}\n\n\tcreateSession(request: CreateRemoteSessionRequest): Promise<RemoteSessionSnapshot> {\n\t\treturn this.request(\"POST\", \"/v1/sessions\", request);\n\t}\n\n\topenSession(sessionIdOrReference: string): Promise<RemoteSessionSnapshot> {\n\t\treturn this.request(\"GET\", `/v1/sessions/${encodeURIComponent(parseRemoteSessionId(sessionIdOrReference))}`);\n\t}\n\n\tappendEntries(\n\t\tsessionIdOrReference: string,\n\t\trequest: AppendRemoteSessionEntriesRequest,\n\t): Promise<AppendRemoteSessionEntriesResponse> {\n\t\treturn this.request(\n\t\t\t\"POST\",\n\t\t\t`/v1/sessions/${encodeURIComponent(parseRemoteSessionId(sessionIdOrReference))}/entries`,\n\t\t\trequest,\n\t\t);\n\t}\n\n\treplaceSnapshot(\n\t\tsessionIdOrReference: string,\n\t\trequest: ReplaceRemoteSessionSnapshotRequest,\n\t): Promise<ReplaceRemoteSessionSnapshotResponse> {\n\t\treturn this.request(\n\t\t\t\"PUT\",\n\t\t\t`/v1/sessions/${encodeURIComponent(parseRemoteSessionId(sessionIdOrReference))}/snapshot`,\n\t\t\trequest,\n\t\t);\n\t}\n\n\tlistSessions(): Promise<ListRemoteSessionsResponse> {\n\t\treturn this.request(\"GET\", \"/v1/sessions\");\n\t}\n\n\tgetRecentSession(): Promise<RemoteSessionSnapshot> {\n\t\treturn this.request(\"GET\", \"/v1/sessions/recent\");\n\t}\n\n\tforkSession(sessionIdOrReference: string, request: ForkRemoteSessionRequest): Promise<RemoteSessionSnapshot> {\n\t\treturn this.request(\n\t\t\t\"POST\",\n\t\t\t`/v1/sessions/${encodeURIComponent(parseRemoteSessionId(sessionIdOrReference))}/fork`,\n\t\t\trequest,\n\t\t);\n\t}\n\n\timportJsonl(request: ImportRemoteSessionJsonlRequest): Promise<RemoteSessionSnapshot> {\n\t\treturn this.request(\"POST\", \"/v1/sessions/import-jsonl\", request);\n\t}\n\n\tprivate async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n\t\tconst response = await this.fetchImpl(`${this.baseUrl}${path}`, {\n\t\t\tmethod,\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${this.token}`,\n\t\t\t\tAccept: \"application/json\",\n\t\t\t\t...(body === undefined ? {} : { \"Content-Type\": \"application/json\" }),\n\t\t\t},\n\t\t\tbody: body === undefined ? undefined : JSON.stringify(body),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tthrow new RemoteSessionClientError(response.status, await response.text());\n\t\t}\n\n\t\tif (response.status === 204) {\n\t\t\treturn undefined as T;\n\t\t}\n\n\t\treturn (await response.json()) as T;\n\t}\n}\n\nexport function parseRemoteSessionId(reference: string): string {\n\treturn reference.startsWith(\"remote:\") ? reference.slice(\"remote:\".length) : reference;\n}\n\nexport function formatRemoteSessionReference(sessionId: string): string {\n\treturn sessionId.startsWith(\"remote:\") ? sessionId : `remote:${sessionId}`;\n}\n"]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export class RemoteSessionClientError extends Error {
|
|
2
|
+
status;
|
|
3
|
+
responseText;
|
|
4
|
+
constructor(status, responseText) {
|
|
5
|
+
super(`Remote session request failed with status ${status}: ${responseText}`);
|
|
6
|
+
this.name = "RemoteSessionClientError";
|
|
7
|
+
this.status = status;
|
|
8
|
+
this.responseText = responseText;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export class RemoteSessionClient {
|
|
12
|
+
baseUrl;
|
|
13
|
+
token;
|
|
14
|
+
fetchImpl;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
this.baseUrl = options.baseUrl.replace(/\/+$/, "");
|
|
17
|
+
this.token = options.token;
|
|
18
|
+
this.fetchImpl = options.fetch ?? fetch;
|
|
19
|
+
}
|
|
20
|
+
createSession(request) {
|
|
21
|
+
return this.request("POST", "/v1/sessions", request);
|
|
22
|
+
}
|
|
23
|
+
openSession(sessionIdOrReference) {
|
|
24
|
+
return this.request("GET", `/v1/sessions/${encodeURIComponent(parseRemoteSessionId(sessionIdOrReference))}`);
|
|
25
|
+
}
|
|
26
|
+
appendEntries(sessionIdOrReference, request) {
|
|
27
|
+
return this.request("POST", `/v1/sessions/${encodeURIComponent(parseRemoteSessionId(sessionIdOrReference))}/entries`, request);
|
|
28
|
+
}
|
|
29
|
+
replaceSnapshot(sessionIdOrReference, request) {
|
|
30
|
+
return this.request("PUT", `/v1/sessions/${encodeURIComponent(parseRemoteSessionId(sessionIdOrReference))}/snapshot`, request);
|
|
31
|
+
}
|
|
32
|
+
listSessions() {
|
|
33
|
+
return this.request("GET", "/v1/sessions");
|
|
34
|
+
}
|
|
35
|
+
getRecentSession() {
|
|
36
|
+
return this.request("GET", "/v1/sessions/recent");
|
|
37
|
+
}
|
|
38
|
+
forkSession(sessionIdOrReference, request) {
|
|
39
|
+
return this.request("POST", `/v1/sessions/${encodeURIComponent(parseRemoteSessionId(sessionIdOrReference))}/fork`, request);
|
|
40
|
+
}
|
|
41
|
+
importJsonl(request) {
|
|
42
|
+
return this.request("POST", "/v1/sessions/import-jsonl", request);
|
|
43
|
+
}
|
|
44
|
+
async request(method, path, body) {
|
|
45
|
+
const response = await this.fetchImpl(`${this.baseUrl}${path}`, {
|
|
46
|
+
method,
|
|
47
|
+
headers: {
|
|
48
|
+
Authorization: `Bearer ${this.token}`,
|
|
49
|
+
Accept: "application/json",
|
|
50
|
+
...(body === undefined ? {} : { "Content-Type": "application/json" }),
|
|
51
|
+
},
|
|
52
|
+
body: body === undefined ? undefined : JSON.stringify(body),
|
|
53
|
+
});
|
|
54
|
+
if (!response.ok) {
|
|
55
|
+
throw new RemoteSessionClientError(response.status, await response.text());
|
|
56
|
+
}
|
|
57
|
+
if (response.status === 204) {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
return (await response.json());
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export function parseRemoteSessionId(reference) {
|
|
64
|
+
return reference.startsWith("remote:") ? reference.slice("remote:".length) : reference;
|
|
65
|
+
}
|
|
66
|
+
export function formatRemoteSessionReference(sessionId) {
|
|
67
|
+
return sessionId.startsWith("remote:") ? sessionId : `remote:${sessionId}`;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=remote-session-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-session-client.js","sourceRoot":"","sources":["../../../src/core/session/remote-session-client.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FileEntry, SessionInfo } from \"./types.ts\";\n\nexport interface RemoteSessionClientOptions {\n\tbaseUrl: string;\n\ttoken: string;\n\tfetch?: typeof fetch;\n}\n\nexport interface RemoteSessionSnapshot {\n\treference: string;\n\tid: string;\n\tversion?: number;\n\tentries: FileEntry[];\n\tetag?: string;\n}\n\nexport interface CreateRemoteSessionRequest {\n\tid?: string;\n\tcwd: string;\n\tprojectId?: string;\n\tparentSession?: string;\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface AppendRemoteSessionEntriesRequest {\n\tbaseEtag?: string;\n\tentries: FileEntry[];\n}\n\nexport interface AppendRemoteSessionEntriesResponse {\n\tetag?: string;\n\taccepted: number;\n}\n\nexport interface ReplaceRemoteSessionSnapshotRequest {\n\tbaseEtag?: string;\n\tentries: FileEntry[];\n}\n\nexport interface ReplaceRemoteSessionSnapshotResponse {\n\tetag?: string;\n}\n\nexport interface ForkRemoteSessionRequest {\n\tcwd: string;\n\tprojectId?: string;\n\tleafId?: string;\n}\n\nexport interface ImportRemoteSessionJsonlRequest {\n\tcwd: string;\n\tprojectId?: string;\n\tsourceName?: string;\n\tentries: FileEntry[];\n\tmetadata?: Record<string, unknown>;\n}\n\nexport interface ListRemoteSessionsResponse {\n\tsessions: SessionInfo[];\n}\n\nexport class RemoteSessionClientError extends Error {\n\treadonly status: number;\n\treadonly responseText: string;\n\n\tconstructor(status: number, responseText: string) {\n\t\tsuper(`Remote session request failed with status ${status}: ${responseText}`);\n\t\tthis.name = \"RemoteSessionClientError\";\n\t\tthis.status = status;\n\t\tthis.responseText = responseText;\n\t}\n}\n\nexport class RemoteSessionClient {\n\tprivate readonly baseUrl: string;\n\tprivate readonly token: string;\n\tprivate readonly fetchImpl: typeof fetch;\n\n\tconstructor(options: RemoteSessionClientOptions) {\n\t\tthis.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n\t\tthis.token = options.token;\n\t\tthis.fetchImpl = options.fetch ?? fetch;\n\t}\n\n\tcreateSession(request: CreateRemoteSessionRequest): Promise<RemoteSessionSnapshot> {\n\t\treturn this.request(\"POST\", \"/v1/sessions\", request);\n\t}\n\n\topenSession(sessionIdOrReference: string): Promise<RemoteSessionSnapshot> {\n\t\treturn this.request(\"GET\", `/v1/sessions/${encodeURIComponent(parseRemoteSessionId(sessionIdOrReference))}`);\n\t}\n\n\tappendEntries(\n\t\tsessionIdOrReference: string,\n\t\trequest: AppendRemoteSessionEntriesRequest,\n\t): Promise<AppendRemoteSessionEntriesResponse> {\n\t\treturn this.request(\n\t\t\t\"POST\",\n\t\t\t`/v1/sessions/${encodeURIComponent(parseRemoteSessionId(sessionIdOrReference))}/entries`,\n\t\t\trequest,\n\t\t);\n\t}\n\n\treplaceSnapshot(\n\t\tsessionIdOrReference: string,\n\t\trequest: ReplaceRemoteSessionSnapshotRequest,\n\t): Promise<ReplaceRemoteSessionSnapshotResponse> {\n\t\treturn this.request(\n\t\t\t\"PUT\",\n\t\t\t`/v1/sessions/${encodeURIComponent(parseRemoteSessionId(sessionIdOrReference))}/snapshot`,\n\t\t\trequest,\n\t\t);\n\t}\n\n\tlistSessions(): Promise<ListRemoteSessionsResponse> {\n\t\treturn this.request(\"GET\", \"/v1/sessions\");\n\t}\n\n\tgetRecentSession(): Promise<RemoteSessionSnapshot> {\n\t\treturn this.request(\"GET\", \"/v1/sessions/recent\");\n\t}\n\n\tforkSession(sessionIdOrReference: string, request: ForkRemoteSessionRequest): Promise<RemoteSessionSnapshot> {\n\t\treturn this.request(\n\t\t\t\"POST\",\n\t\t\t`/v1/sessions/${encodeURIComponent(parseRemoteSessionId(sessionIdOrReference))}/fork`,\n\t\t\trequest,\n\t\t);\n\t}\n\n\timportJsonl(request: ImportRemoteSessionJsonlRequest): Promise<RemoteSessionSnapshot> {\n\t\treturn this.request(\"POST\", \"/v1/sessions/import-jsonl\", request);\n\t}\n\n\tprivate async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n\t\tconst response = await this.fetchImpl(`${this.baseUrl}${path}`, {\n\t\t\tmethod,\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${this.token}`,\n\t\t\t\tAccept: \"application/json\",\n\t\t\t\t...(body === undefined ? {} : { \"Content-Type\": \"application/json\" }),\n\t\t\t},\n\t\t\tbody: body === undefined ? undefined : JSON.stringify(body),\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tthrow new RemoteSessionClientError(response.status, await response.text());\n\t\t}\n\n\t\tif (response.status === 204) {\n\t\t\treturn undefined as T;\n\t\t}\n\n\t\treturn (await response.json()) as T;\n\t}\n}\n\nexport function parseRemoteSessionId(reference: string): string {\n\treturn reference.startsWith(\"remote:\") ? reference.slice(\"remote:\".length) : reference;\n}\n\nexport function formatRemoteSessionReference(sessionId: string): string {\n\treturn sessionId.startsWith(\"remote:\") ? sessionId : `remote:${sessionId}`;\n}\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { RemoteSession } from "./remote-session.ts";
|
|
2
|
+
import type { Session } from "./session.ts";
|
|
3
|
+
import type { OpenSessionOptions, SessionManager } from "./session-manager.ts";
|
|
4
|
+
import type { NewSessionOptions, SessionInfo, SessionListProgress } from "./types.ts";
|
|
5
|
+
export interface RemoteSessionManagerOptions {
|
|
6
|
+
baseUrl: string;
|
|
7
|
+
token: string;
|
|
8
|
+
cwd: string;
|
|
9
|
+
projectId?: string;
|
|
10
|
+
fetch?: typeof fetch;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Remote session manager skeleton.
|
|
14
|
+
*
|
|
15
|
+
* Lifecycle methods are async-compatible through SessionManager so this backend
|
|
16
|
+
* can fetch/create snapshots before returning an active Session.
|
|
17
|
+
*/
|
|
18
|
+
export declare class RemoteSessionManager implements SessionManager {
|
|
19
|
+
private readonly client;
|
|
20
|
+
private readonly cwd;
|
|
21
|
+
private readonly projectId;
|
|
22
|
+
constructor(options: RemoteSessionManagerOptions);
|
|
23
|
+
create(options?: NewSessionOptions): Promise<RemoteSession>;
|
|
24
|
+
openReference(reference: string, options?: OpenSessionOptions): Promise<RemoteSession>;
|
|
25
|
+
continueRecent(): Promise<RemoteSession>;
|
|
26
|
+
forkFrom(reference: string): Promise<RemoteSession>;
|
|
27
|
+
forkSession(source: Session, targetLeafId: string | null): Promise<RemoteSession>;
|
|
28
|
+
importJsonl(inputPath: string, options?: OpenSessionOptions): Promise<RemoteSession>;
|
|
29
|
+
list(_onProgress?: SessionListProgress): Promise<SessionInfo[]>;
|
|
30
|
+
listAll(_onProgress?: SessionListProgress): Promise<SessionInfo[]>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=remote-session-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-session-manager.d.ts","sourceRoot":"","sources":["../../../src/core/session/remote-session-manager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAiB,WAAW,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAErG,MAAM,WAAW,2BAA2B;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACrB;AAOD;;;;;GAKG;AACH,qBAAa,oBAAqB,YAAW,cAAc;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAE/C,YAAY,OAAO,EAAE,2BAA2B,EAI/C;IAEK,MAAM,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,aAAa,CAAC,CAQhE;IAEK,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC,CAO3F;IAEK,cAAc,IAAI,OAAO,CAAC,aAAa,CAAC,CAG7C;IAEK,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAGxD;IAEK,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,CAWtF;IAEK,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC,CAoBzF;IAEK,IAAI,CAAC,WAAW,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAGpE;IAEK,OAAO,CAAC,WAAW,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAGvE;CACD","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { basename, resolve } from \"node:path\";\nimport { loadEntriesFromFile } from \"./jsonl-helpers.ts\";\nimport { migrateToCurrentVersion } from \"./migrations.ts\";\nimport { RemoteSession } from \"./remote-session.ts\";\nimport type { RemoteSessionSnapshot } from \"./remote-session-client.ts\";\nimport { RemoteSessionClient } from \"./remote-session-client.ts\";\nimport type { Session } from \"./session.ts\";\nimport type { OpenSessionOptions, SessionManager } from \"./session-manager.ts\";\nimport type { NewSessionOptions, SessionHeader, SessionInfo, SessionListProgress } from \"./types.ts\";\n\nexport interface RemoteSessionManagerOptions {\n\tbaseUrl: string;\n\ttoken: string;\n\tcwd: string;\n\tprojectId?: string;\n\tfetch?: typeof fetch;\n}\n\nfunction getSnapshotCwd(snapshot: RemoteSessionSnapshot, fallback: string): string {\n\tconst header = snapshot.entries.find((entry) => entry.type === \"session\") as SessionHeader | undefined;\n\treturn header?.cwd ?? fallback;\n}\n\n/**\n * Remote session manager skeleton.\n *\n * Lifecycle methods are async-compatible through SessionManager so this backend\n * can fetch/create snapshots before returning an active Session.\n */\nexport class RemoteSessionManager implements SessionManager {\n\tprivate readonly client: RemoteSessionClient;\n\tprivate readonly cwd: string;\n\tprivate readonly projectId: string | undefined;\n\n\tconstructor(options: RemoteSessionManagerOptions) {\n\t\tthis.client = new RemoteSessionClient({ baseUrl: options.baseUrl, token: options.token, fetch: options.fetch });\n\t\tthis.cwd = options.cwd;\n\t\tthis.projectId = options.projectId;\n\t}\n\n\tasync create(options?: NewSessionOptions): Promise<RemoteSession> {\n\t\tconst snapshot = await this.client.createSession({\n\t\t\tid: options?.id,\n\t\t\tcwd: this.cwd,\n\t\t\tprojectId: this.projectId,\n\t\t\tparentSession: options?.parentSession,\n\t\t});\n\t\treturn new RemoteSession({ client: this.client, cwd: this.cwd, snapshot });\n\t}\n\n\tasync openReference(reference: string, options?: OpenSessionOptions): Promise<RemoteSession> {\n\t\tconst snapshot = await this.client.openSession(reference);\n\t\treturn new RemoteSession({\n\t\t\tclient: this.client,\n\t\t\tcwd: options?.cwdOverride ?? getSnapshotCwd(snapshot, this.cwd),\n\t\t\tsnapshot,\n\t\t});\n\t}\n\n\tasync continueRecent(): Promise<RemoteSession> {\n\t\tconst snapshot = await this.client.getRecentSession();\n\t\treturn new RemoteSession({ client: this.client, cwd: getSnapshotCwd(snapshot, this.cwd), snapshot });\n\t}\n\n\tasync forkFrom(reference: string): Promise<RemoteSession> {\n\t\tconst snapshot = await this.client.forkSession(reference, { cwd: this.cwd, projectId: this.projectId });\n\t\treturn new RemoteSession({ client: this.client, cwd: this.cwd, snapshot });\n\t}\n\n\tasync forkSession(source: Session, targetLeafId: string | null): Promise<RemoteSession> {\n\t\tconst reference = source.getSessionReference();\n\t\tif (!reference) {\n\t\t\tthrow new Error(\"Cannot fork a remote session without a session reference\");\n\t\t}\n\t\tconst snapshot = await this.client.forkSession(reference, {\n\t\t\tcwd: this.cwd,\n\t\t\tprojectId: this.projectId,\n\t\t\tleafId: targetLeafId ?? undefined,\n\t\t});\n\t\treturn new RemoteSession({ client: this.client, cwd: this.cwd, snapshot });\n\t}\n\n\tasync importJsonl(inputPath: string, options?: OpenSessionOptions): Promise<RemoteSession> {\n\t\tconst resolvedPath = resolve(inputPath);\n\t\tif (!existsSync(resolvedPath)) {\n\t\t\tthrow new Error(`File not found: ${resolvedPath}`);\n\t\t}\n\n\t\tconst entries = loadEntriesFromFile(resolvedPath);\n\t\tif (entries.length === 0) {\n\t\t\tthrow new Error(`Cannot import empty or invalid session JSONL: ${resolvedPath}`);\n\t\t}\n\t\tmigrateToCurrentVersion(entries);\n\n\t\tconst cwd = options?.cwdOverride ?? getSnapshotCwd({ id: \"\", reference: \"\", entries }, this.cwd);\n\t\tconst snapshot = await this.client.importJsonl({\n\t\t\tcwd,\n\t\t\tprojectId: this.projectId,\n\t\t\tsourceName: basename(resolvedPath),\n\t\t\tentries,\n\t\t});\n\t\treturn new RemoteSession({ client: this.client, cwd: getSnapshotCwd(snapshot, cwd), snapshot });\n\t}\n\n\tasync list(_onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\tconst response = await this.client.listSessions();\n\t\treturn response.sessions;\n\t}\n\n\tasync listAll(_onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\tconst response = await this.client.listSessions();\n\t\treturn response.sessions;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { basename, resolve } from "node:path";
|
|
3
|
+
import { loadEntriesFromFile } from "./jsonl-helpers.js";
|
|
4
|
+
import { migrateToCurrentVersion } from "./migrations.js";
|
|
5
|
+
import { RemoteSession } from "./remote-session.js";
|
|
6
|
+
import { RemoteSessionClient } from "./remote-session-client.js";
|
|
7
|
+
function getSnapshotCwd(snapshot, fallback) {
|
|
8
|
+
const header = snapshot.entries.find((entry) => entry.type === "session");
|
|
9
|
+
return header?.cwd ?? fallback;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Remote session manager skeleton.
|
|
13
|
+
*
|
|
14
|
+
* Lifecycle methods are async-compatible through SessionManager so this backend
|
|
15
|
+
* can fetch/create snapshots before returning an active Session.
|
|
16
|
+
*/
|
|
17
|
+
export class RemoteSessionManager {
|
|
18
|
+
client;
|
|
19
|
+
cwd;
|
|
20
|
+
projectId;
|
|
21
|
+
constructor(options) {
|
|
22
|
+
this.client = new RemoteSessionClient({ baseUrl: options.baseUrl, token: options.token, fetch: options.fetch });
|
|
23
|
+
this.cwd = options.cwd;
|
|
24
|
+
this.projectId = options.projectId;
|
|
25
|
+
}
|
|
26
|
+
async create(options) {
|
|
27
|
+
const snapshot = await this.client.createSession({
|
|
28
|
+
id: options?.id,
|
|
29
|
+
cwd: this.cwd,
|
|
30
|
+
projectId: this.projectId,
|
|
31
|
+
parentSession: options?.parentSession,
|
|
32
|
+
});
|
|
33
|
+
return new RemoteSession({ client: this.client, cwd: this.cwd, snapshot });
|
|
34
|
+
}
|
|
35
|
+
async openReference(reference, options) {
|
|
36
|
+
const snapshot = await this.client.openSession(reference);
|
|
37
|
+
return new RemoteSession({
|
|
38
|
+
client: this.client,
|
|
39
|
+
cwd: options?.cwdOverride ?? getSnapshotCwd(snapshot, this.cwd),
|
|
40
|
+
snapshot,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
async continueRecent() {
|
|
44
|
+
const snapshot = await this.client.getRecentSession();
|
|
45
|
+
return new RemoteSession({ client: this.client, cwd: getSnapshotCwd(snapshot, this.cwd), snapshot });
|
|
46
|
+
}
|
|
47
|
+
async forkFrom(reference) {
|
|
48
|
+
const snapshot = await this.client.forkSession(reference, { cwd: this.cwd, projectId: this.projectId });
|
|
49
|
+
return new RemoteSession({ client: this.client, cwd: this.cwd, snapshot });
|
|
50
|
+
}
|
|
51
|
+
async forkSession(source, targetLeafId) {
|
|
52
|
+
const reference = source.getSessionReference();
|
|
53
|
+
if (!reference) {
|
|
54
|
+
throw new Error("Cannot fork a remote session without a session reference");
|
|
55
|
+
}
|
|
56
|
+
const snapshot = await this.client.forkSession(reference, {
|
|
57
|
+
cwd: this.cwd,
|
|
58
|
+
projectId: this.projectId,
|
|
59
|
+
leafId: targetLeafId ?? undefined,
|
|
60
|
+
});
|
|
61
|
+
return new RemoteSession({ client: this.client, cwd: this.cwd, snapshot });
|
|
62
|
+
}
|
|
63
|
+
async importJsonl(inputPath, options) {
|
|
64
|
+
const resolvedPath = resolve(inputPath);
|
|
65
|
+
if (!existsSync(resolvedPath)) {
|
|
66
|
+
throw new Error(`File not found: ${resolvedPath}`);
|
|
67
|
+
}
|
|
68
|
+
const entries = loadEntriesFromFile(resolvedPath);
|
|
69
|
+
if (entries.length === 0) {
|
|
70
|
+
throw new Error(`Cannot import empty or invalid session JSONL: ${resolvedPath}`);
|
|
71
|
+
}
|
|
72
|
+
migrateToCurrentVersion(entries);
|
|
73
|
+
const cwd = options?.cwdOverride ?? getSnapshotCwd({ id: "", reference: "", entries }, this.cwd);
|
|
74
|
+
const snapshot = await this.client.importJsonl({
|
|
75
|
+
cwd,
|
|
76
|
+
projectId: this.projectId,
|
|
77
|
+
sourceName: basename(resolvedPath),
|
|
78
|
+
entries,
|
|
79
|
+
});
|
|
80
|
+
return new RemoteSession({ client: this.client, cwd: getSnapshotCwd(snapshot, cwd), snapshot });
|
|
81
|
+
}
|
|
82
|
+
async list(_onProgress) {
|
|
83
|
+
const response = await this.client.listSessions();
|
|
84
|
+
return response.sessions;
|
|
85
|
+
}
|
|
86
|
+
async listAll(_onProgress) {
|
|
87
|
+
const response = await this.client.listSessions();
|
|
88
|
+
return response.sessions;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=remote-session-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-session-manager.js","sourceRoot":"","sources":["../../../src/core/session/remote-session-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { basename, resolve } from \"node:path\";\nimport { loadEntriesFromFile } from \"./jsonl-helpers.ts\";\nimport { migrateToCurrentVersion } from \"./migrations.ts\";\nimport { RemoteSession } from \"./remote-session.ts\";\nimport type { RemoteSessionSnapshot } from \"./remote-session-client.ts\";\nimport { RemoteSessionClient } from \"./remote-session-client.ts\";\nimport type { Session } from \"./session.ts\";\nimport type { OpenSessionOptions, SessionManager } from \"./session-manager.ts\";\nimport type { NewSessionOptions, SessionHeader, SessionInfo, SessionListProgress } from \"./types.ts\";\n\nexport interface RemoteSessionManagerOptions {\n\tbaseUrl: string;\n\ttoken: string;\n\tcwd: string;\n\tprojectId?: string;\n\tfetch?: typeof fetch;\n}\n\nfunction getSnapshotCwd(snapshot: RemoteSessionSnapshot, fallback: string): string {\n\tconst header = snapshot.entries.find((entry) => entry.type === \"session\") as SessionHeader | undefined;\n\treturn header?.cwd ?? fallback;\n}\n\n/**\n * Remote session manager skeleton.\n *\n * Lifecycle methods are async-compatible through SessionManager so this backend\n * can fetch/create snapshots before returning an active Session.\n */\nexport class RemoteSessionManager implements SessionManager {\n\tprivate readonly client: RemoteSessionClient;\n\tprivate readonly cwd: string;\n\tprivate readonly projectId: string | undefined;\n\n\tconstructor(options: RemoteSessionManagerOptions) {\n\t\tthis.client = new RemoteSessionClient({ baseUrl: options.baseUrl, token: options.token, fetch: options.fetch });\n\t\tthis.cwd = options.cwd;\n\t\tthis.projectId = options.projectId;\n\t}\n\n\tasync create(options?: NewSessionOptions): Promise<RemoteSession> {\n\t\tconst snapshot = await this.client.createSession({\n\t\t\tid: options?.id,\n\t\t\tcwd: this.cwd,\n\t\t\tprojectId: this.projectId,\n\t\t\tparentSession: options?.parentSession,\n\t\t});\n\t\treturn new RemoteSession({ client: this.client, cwd: this.cwd, snapshot });\n\t}\n\n\tasync openReference(reference: string, options?: OpenSessionOptions): Promise<RemoteSession> {\n\t\tconst snapshot = await this.client.openSession(reference);\n\t\treturn new RemoteSession({\n\t\t\tclient: this.client,\n\t\t\tcwd: options?.cwdOverride ?? getSnapshotCwd(snapshot, this.cwd),\n\t\t\tsnapshot,\n\t\t});\n\t}\n\n\tasync continueRecent(): Promise<RemoteSession> {\n\t\tconst snapshot = await this.client.getRecentSession();\n\t\treturn new RemoteSession({ client: this.client, cwd: getSnapshotCwd(snapshot, this.cwd), snapshot });\n\t}\n\n\tasync forkFrom(reference: string): Promise<RemoteSession> {\n\t\tconst snapshot = await this.client.forkSession(reference, { cwd: this.cwd, projectId: this.projectId });\n\t\treturn new RemoteSession({ client: this.client, cwd: this.cwd, snapshot });\n\t}\n\n\tasync forkSession(source: Session, targetLeafId: string | null): Promise<RemoteSession> {\n\t\tconst reference = source.getSessionReference();\n\t\tif (!reference) {\n\t\t\tthrow new Error(\"Cannot fork a remote session without a session reference\");\n\t\t}\n\t\tconst snapshot = await this.client.forkSession(reference, {\n\t\t\tcwd: this.cwd,\n\t\t\tprojectId: this.projectId,\n\t\t\tleafId: targetLeafId ?? undefined,\n\t\t});\n\t\treturn new RemoteSession({ client: this.client, cwd: this.cwd, snapshot });\n\t}\n\n\tasync importJsonl(inputPath: string, options?: OpenSessionOptions): Promise<RemoteSession> {\n\t\tconst resolvedPath = resolve(inputPath);\n\t\tif (!existsSync(resolvedPath)) {\n\t\t\tthrow new Error(`File not found: ${resolvedPath}`);\n\t\t}\n\n\t\tconst entries = loadEntriesFromFile(resolvedPath);\n\t\tif (entries.length === 0) {\n\t\t\tthrow new Error(`Cannot import empty or invalid session JSONL: ${resolvedPath}`);\n\t\t}\n\t\tmigrateToCurrentVersion(entries);\n\n\t\tconst cwd = options?.cwdOverride ?? getSnapshotCwd({ id: \"\", reference: \"\", entries }, this.cwd);\n\t\tconst snapshot = await this.client.importJsonl({\n\t\t\tcwd,\n\t\t\tprojectId: this.projectId,\n\t\t\tsourceName: basename(resolvedPath),\n\t\t\tentries,\n\t\t});\n\t\treturn new RemoteSession({ client: this.client, cwd: getSnapshotCwd(snapshot, cwd), snapshot });\n\t}\n\n\tasync list(_onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\tconst response = await this.client.listSessions();\n\t\treturn response.sessions;\n\t}\n\n\tasync listAll(_onProgress?: SessionListProgress): Promise<SessionInfo[]> {\n\t\tconst response = await this.client.listSessions();\n\t\treturn response.sessions;\n\t}\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { RemoteSessionClient, RemoteSessionSnapshot } from "./remote-session-client.ts";
|
|
2
|
+
import { Session } from "./session.ts";
|
|
3
|
+
import type { NewSessionOptions } from "./types.ts";
|
|
4
|
+
export interface RemoteSessionOptions {
|
|
5
|
+
client: RemoteSessionClient;
|
|
6
|
+
cwd: string;
|
|
7
|
+
reference?: string;
|
|
8
|
+
snapshot?: RemoteSessionSnapshot;
|
|
9
|
+
}
|
|
10
|
+
export declare class RemoteSession extends Session {
|
|
11
|
+
private remoteStore;
|
|
12
|
+
constructor(options: RemoteSessionOptions);
|
|
13
|
+
newSession(options?: NewSessionOptions): string | undefined;
|
|
14
|
+
flushPendingSync(): Promise<void>;
|
|
15
|
+
getLastSyncError(): unknown;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=remote-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-session.d.ts","sourceRoot":"","sources":["../../../src/core/session/remote-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAE7F,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,qBAAqB,CAAC;CACjC;AAED,qBAAa,aAAc,SAAQ,OAAO;IACzC,OAAO,CAAC,WAAW,CAAiC;IAEpD,YAAY,OAAO,EAAE,oBAAoB,EAYxC;IAEQ,UAAU,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,MAAM,GAAG,SAAS,CAInE;IAED,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAEhC;IAED,gBAAgB,IAAI,OAAO,CAE1B;CACD","sourcesContent":["import type { RemoteSessionClient, RemoteSessionSnapshot } from \"./remote-session-client.ts\";\nimport { formatRemoteSessionReference } from \"./remote-session-client.ts\";\nimport { Session } from \"./session.ts\";\nimport { RemoteSessionStore } from \"./stores/remote-session-store.ts\";\nimport type { NewSessionOptions } from \"./types.ts\";\n\nexport interface RemoteSessionOptions {\n\tclient: RemoteSessionClient;\n\tcwd: string;\n\treference?: string;\n\tsnapshot?: RemoteSessionSnapshot;\n}\n\nexport class RemoteSession extends Session {\n\tprivate remoteStore: RemoteSessionStore | undefined;\n\n\tconstructor(options: RemoteSessionOptions) {\n\t\tconst reference =\n\t\t\toptions.reference ??\n\t\t\toptions.snapshot?.reference ??\n\t\t\t(options.snapshot ? formatRemoteSessionReference(options.snapshot.id) : undefined);\n\t\tconst store = new RemoteSessionStore({\n\t\t\tclient: options.client,\n\t\t\treference,\n\t\t\tsnapshot: options.snapshot,\n\t\t});\n\t\tsuper(options.cwd, \"\", reference, store);\n\t\tthis.remoteStore = store;\n\t}\n\n\toverride newSession(options?: NewSessionOptions): string | undefined {\n\t\tconst reference = super.newSession(options);\n\t\tthis.remoteStore?.saveSnapshot();\n\t\treturn reference;\n\t}\n\n\tflushPendingSync(): Promise<void> {\n\t\treturn this.remoteStore?.flushPendingSync() ?? Promise.resolve();\n\t}\n\n\tgetLastSyncError(): unknown {\n\t\treturn this.remoteStore?.getLastSyncError();\n\t}\n}\n"]}
|