@sayknow-cli/coding-agent 0.3.11 → 0.3.13
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 +0 -21
- package/package.json +116 -117
- package/scripts/build-binary.ts +2 -43
- package/scripts/compile-args.ts +106 -0
- package/scripts/g004-tmux-smoke.ts +196 -36
- package/scripts/generate-docs-index.ts +3 -0
- package/src/build-metadata.ts +104 -0
- package/src/capability/mcp.ts +3 -1
- package/src/cli/daemon-cli.ts +19 -29
- package/src/cli/malloc-env-guard.test.ts +104 -0
- package/src/cli/malloc-env-guard.ts +149 -0
- package/src/cli/mcp-cli.ts +108 -26
- package/src/cli/notify-cli.ts +78 -14
- package/src/cli/session-picker.ts +23 -40
- package/src/cli/update-cli.ts +56 -37
- package/src/cli.ts +71 -10
- package/src/commands/daemon.ts +19 -5
- package/src/commands/harness.ts +515 -47
- package/src/commands/launch.ts +11 -3
- package/src/commands/mcp.ts +8 -8
- package/src/commands/notify.ts +5 -1
- package/src/commands/session.ts +6 -1
- package/src/commands/stats.ts +6 -2
- package/src/config/keybindings.ts +7 -2
- package/src/config/mcp-schema.json +21 -17
- package/src/config/model-profile-activation.ts +1 -1
- package/src/config/model-profiles.ts +23 -23
- package/src/config/settings-schema.ts +41 -1
- package/src/coordinator-mcp/model-preset.ts +100 -0
- package/src/coordinator-mcp/server.ts +2735 -435
- package/src/daemon/control-types.ts +11 -0
- package/src/daemon/operator-contract.ts +121 -0
- package/src/defaults/skc/extensions/grok-cli-vendor/src/models/catalog.ts +57 -17
- package/src/defaults/skc/extensions/grok-cli-vendor/src/payload/sanitize.ts +15 -2
- package/src/defaults/skc/extensions/grok-cli-vendor/src/provider/register.ts +5 -1
- package/src/discovery/builtin.ts +14 -0
- package/src/discovery/mcp-json.ts +14 -0
- package/src/eval/js/executor.ts +7 -1
- package/src/internal-urls/docs-index.generated.ts +10 -9
- package/src/internal-urls/local-protocol.ts +29 -10
- package/src/internal-urls/skc-protocol.ts +14 -1
- package/src/main.ts +298 -75
- package/src/modes/acp/acp-agent.ts +800 -114
- package/src/modes/acp/acp-client-bridge.ts +27 -5
- package/src/modes/acp/acp-event-mapper.ts +39 -1
- package/src/modes/acp/acp-mode.ts +29 -2
- package/src/modes/components/assistant-message.ts +33 -4
- package/src/modes/components/bash-execution.ts +43 -13
- package/src/modes/components/custom-editor.ts +5 -0
- package/src/modes/components/hook-selector.ts +16 -0
- package/src/modes/components/irc-sidebar.ts +206 -0
- package/src/modes/components/model-selector.ts +17 -6
- package/src/modes/components/pet-selector.ts +55 -0
- package/src/modes/components/sayknow-pet-widget.ts +360 -0
- package/src/modes/components/session-selector.ts +223 -222
- package/src/modes/components/settings-selector.ts +10 -0
- package/src/modes/components/status-line/presets.ts +5 -19
- package/src/modes/components/status-line/segments.ts +14 -0
- package/src/modes/components/status-line/types.ts +6 -0
- package/src/modes/components/status-line.ts +13 -6
- package/src/modes/components/tool-execution.ts +48 -7
- package/src/modes/components/user-message.ts +26 -9
- package/src/modes/components/welcome.ts +4 -1
- package/src/modes/controllers/command-controller.ts +29 -3
- package/src/modes/controllers/event-controller.ts +168 -45
- package/src/modes/controllers/extension-ui-controller.ts +36 -17
- package/src/modes/controllers/input-controller.ts +16 -4
- package/src/modes/controllers/selector-controller.ts +69 -18
- package/src/modes/interactive-mode.ts +194 -10
- package/src/modes/irc-observation-ledger.ts +127 -0
- package/src/modes/rpc/rpc-client.ts +30 -6
- package/src/modes/shared/agent-wire/deep-interview-gate.ts +45 -2
- package/src/modes/shared/agent-wire/unattended-session.ts +288 -1
- package/src/modes/shared/agent-wire/workflow-gate-broker.ts +130 -20
- package/src/modes/types.ts +34 -2
- package/src/modes/utils/hotkeys-markdown.ts +1 -0
- package/src/modes/utils/irc-message.ts +138 -0
- package/src/modes/utils/ui-helpers.ts +368 -80
- package/src/notifications/config.ts +44 -0
- package/src/notifications/daemon-paths.ts +8 -0
- package/src/notifications/index.ts +535 -75
- package/src/notifications/lifecycle-control-runtime.ts +930 -77
- package/src/notifications/notification-service.ts +710 -0
- package/src/notifications/rate-limit-pool.ts +46 -12
- package/src/notifications/telegram-daemon-control.ts +27 -2
- package/src/notifications/telegram-daemon.ts +663 -96
- package/src/notifications/telegram-reference.ts +73 -13
- package/src/notifications/topic-registry.ts +86 -9
- package/src/prompts/system/irc-peer-roster.md +1 -0
- package/src/prompts/system/subagent-system-prompt.md +1 -0
- package/src/prompts/system/system-prompt.md +1 -0
- package/src/prompts/tools/irc.md +1 -1
- package/src/prompts/tools/skill.md +2 -2
- package/src/registry/agent-registry.ts +3 -0
- package/src/runtime-mcp/config-writer.ts +4 -3
- package/src/runtime-mcp/config.ts +1 -0
- package/src/runtime-mcp/types.ts +4 -3
- package/src/sdk.ts +52 -1
- package/src/secrets/obfuscator.ts +4 -2
- package/src/session/agent-session.ts +513 -148
- package/src/session/cache-economics.ts +275 -0
- package/src/session/provider-safety-stop.ts +9 -0
- package/src/session/session-dump-format.ts +6 -0
- package/src/session/session-manager.ts +877 -79
- package/src/session/session-storage.ts +582 -38
- package/src/skc-runtime/session-state-sidecar.ts +756 -135
- package/src/skc-runtime/state-runtime.ts +105 -12
- package/src/skc-runtime/tmux-common.ts +26 -7
- package/src/skc-runtime/tmux-gc.ts +52 -9
- package/src/skc-runtime/tmux-owner-isolation-cli.ts +185 -0
- package/src/skc-runtime/tmux-owner-isolation.ts +2060 -0
- package/src/skc-runtime/tmux-sessions.ts +871 -68
- package/src/skc-runtime/workflow-manifest.generated.json +4 -28
- package/src/skc-runtime/workflow-manifest.ts +1 -7
- package/src/slash-commands/builtin-registry.ts +152 -13
- package/src/task/executor.ts +12 -3
- package/src/task/index.ts +8 -0
- package/src/task/receipt.ts +7 -2
- package/src/task/types.ts +26 -0
- package/src/tools/ask-answer-registry.ts +25 -0
- package/src/tools/bash-interactive.ts +9 -4
- package/src/tools/browser/readable.ts +2 -2
- package/src/tools/browser/tab-supervisor.ts +63 -6
- package/src/tools/browser.ts +8 -3
- package/src/tools/fetch.ts +5 -5
- package/src/tools/index.ts +81 -6
- package/src/tools/skill.ts +14 -11
- package/src/tools/sqlite-reader.ts +8 -4
- package/src/tui/output-block.ts +18 -6
- package/src/utils/external-editor.ts +6 -1
- package/src/utils/linkedom.ts +14 -0
- package/src/utils/pasted-image-path.ts +23 -9
- package/src/web/scrapers/arxiv.ts +2 -2
- package/src/web/scrapers/go-pkg.ts +2 -2
- package/src/web/scrapers/iacr.ts +2 -2
- package/src/web/scrapers/readthedocs.ts +2 -2
- package/src/web/scrapers/twitter.ts +3 -2
- package/src/web/scrapers/wikipedia.ts +2 -2
- package/dist/types/append-only-mode.d.ts +0 -31
- package/dist/types/async/index.d.ts +0 -2
- package/dist/types/async/job-manager.d.ts +0 -328
- package/dist/types/async/support.d.ts +0 -2
- package/dist/types/autoresearch/dashboard.d.ts +0 -4
- package/dist/types/autoresearch/git.d.ts +0 -36
- package/dist/types/autoresearch/helpers.d.ts +0 -24
- package/dist/types/autoresearch/index.d.ts +0 -2
- package/dist/types/autoresearch/state.d.ts +0 -17
- package/dist/types/autoresearch/storage.d.ts +0 -142
- package/dist/types/autoresearch/tools/init-experiment.d.ts +0 -31
- package/dist/types/autoresearch/tools/log-experiment.d.ts +0 -23
- package/dist/types/autoresearch/tools/run-experiment.d.ts +0 -8
- package/dist/types/autoresearch/tools/update-notes.d.ts +0 -12
- package/dist/types/autoresearch/types.d.ts +0 -154
- package/dist/types/capability/context-file.d.ts +0 -17
- package/dist/types/capability/extension-module.d.ts +0 -15
- package/dist/types/capability/extension.d.ts +0 -28
- package/dist/types/capability/fs.d.ts +0 -20
- package/dist/types/capability/hook.d.ts +0 -19
- package/dist/types/capability/index.d.ts +0 -80
- package/dist/types/capability/instruction.d.ts +0 -17
- package/dist/types/capability/mcp.d.ts +0 -47
- package/dist/types/capability/prompt.d.ts +0 -15
- package/dist/types/capability/rule.d.ts +0 -69
- package/dist/types/capability/settings.d.ts +0 -15
- package/dist/types/capability/skill.d.ts +0 -36
- package/dist/types/capability/slash-command.d.ts +0 -17
- package/dist/types/capability/ssh.d.ts +0 -23
- package/dist/types/capability/system-prompt.d.ts +0 -15
- package/dist/types/capability/tool.d.ts +0 -19
- package/dist/types/capability/types.d.ts +0 -154
- package/dist/types/cli/agents-cli.d.ts +0 -12
- package/dist/types/cli/args.d.ts +0 -57
- package/dist/types/cli/auth-broker-cli.d.ts +0 -25
- package/dist/types/cli/auth-gateway-cli.d.ts +0 -18
- package/dist/types/cli/classify-install-target.d.ts +0 -18
- package/dist/types/cli/commands/init-xdg.d.ts +0 -1
- package/dist/types/cli/completion-cli.d.ts +0 -41
- package/dist/types/cli/config-cli.d.ts +0 -23
- package/dist/types/cli/daemon-cli.d.ts +0 -25
- package/dist/types/cli/fast-help.d.ts +0 -1
- package/dist/types/cli/file-processor.d.ts +0 -11
- package/dist/types/cli/fixture-report.d.ts +0 -20
- package/dist/types/cli/fixture-report.test.d.ts +0 -1
- package/dist/types/cli/grep-cli.d.ts +0 -17
- package/dist/types/cli/initial-message.d.ts +0 -17
- package/dist/types/cli/list-models.d.ts +0 -36
- package/dist/types/cli/local-provider-smoke.d.ts +0 -59
- package/dist/types/cli/mcp-cli.d.ts +0 -25
- package/dist/types/cli/migrate-cli.d.ts +0 -20
- package/dist/types/cli/nofile-limit.d.ts +0 -11
- package/dist/types/cli/notify-cli.d.ts +0 -37
- package/dist/types/cli/plugin-cli.d.ts +0 -34
- package/dist/types/cli/read-cli.d.ts +0 -4
- package/dist/types/cli/session-picker.d.ts +0 -3
- package/dist/types/cli/setup-cli.d.ts +0 -73
- package/dist/types/cli/shell-cli.d.ts +0 -8
- package/dist/types/cli/skills-cli.d.ts +0 -9
- package/dist/types/cli/ssh-cli.d.ts +0 -21
- package/dist/types/cli/stats-cli.d.ts +0 -17
- package/dist/types/cli/telegram-cli.d.ts +0 -13
- package/dist/types/cli/update-cli.d.ts +0 -89
- package/dist/types/cli/web-search-cli.d.ts +0 -32
- package/dist/types/cli/worktree-cli.d.ts +0 -26
- package/dist/types/cli.d.ts +0 -135
- package/dist/types/commands/acp.d.ts +0 -12
- package/dist/types/commands/agents.d.ts +0 -34
- package/dist/types/commands/auth-broker.d.ts +0 -54
- package/dist/types/commands/auth-gateway.d.ts +0 -32
- package/dist/types/commands/codex-native-hook.d.ts +0 -6
- package/dist/types/commands/commit.d.ts +0 -27
- package/dist/types/commands/completion.d.ts +0 -29
- package/dist/types/commands/config.d.ts +0 -33
- package/dist/types/commands/contribution-prep.d.ts +0 -18
- package/dist/types/commands/coordinator.d.ts +0 -19
- package/dist/types/commands/daemon.d.ts +0 -41
- package/dist/types/commands/deep-interview.d.ts +0 -54
- package/dist/types/commands/gc.d.ts +0 -26
- package/dist/types/commands/grep.d.ts +0 -42
- package/dist/types/commands/harness.d.ts +0 -43
- package/dist/types/commands/launch.d.ts +0 -130
- package/dist/types/commands/local-provider.d.ts +0 -34
- package/dist/types/commands/mcp-serve.d.ts +0 -24
- package/dist/types/commands/mcp.d.ts +0 -70
- package/dist/types/commands/migrate.d.ts +0 -33
- package/dist/types/commands/notify.d.ts +0 -41
- package/dist/types/commands/plugin.d.ts +0 -58
- package/dist/types/commands/ralplan.d.ts +0 -7
- package/dist/types/commands/read.d.ts +0 -15
- package/dist/types/commands/rlm.d.ts +0 -10
- package/dist/types/commands/session.d.ts +0 -30
- package/dist/types/commands/setup.d.ts +0 -105
- package/dist/types/commands/shell.d.ts +0 -21
- package/dist/types/commands/skills.d.ts +0 -26
- package/dist/types/commands/ssh.d.ts +0 -48
- package/dist/types/commands/state.d.ts +0 -7
- package/dist/types/commands/stats.d.ts +0 -25
- package/dist/types/commands/team.d.ts +0 -24
- package/dist/types/commands/telegram.d.ts +0 -22
- package/dist/types/commands/ultragoal.d.ts +0 -8
- package/dist/types/commands/update.d.ts +0 -20
- package/dist/types/commands/web-search.d.ts +0 -87
- package/dist/types/commands/worktree.d.ts +0 -34
- package/dist/types/commit/agentic/agent.d.ts +0 -31
- package/dist/types/commit/agentic/fallback.d.ts +0 -5
- package/dist/types/commit/agentic/index.d.ts +0 -2
- package/dist/types/commit/agentic/state.d.ts +0 -58
- package/dist/types/commit/agentic/tools/analyze-file.d.ts +0 -19
- package/dist/types/commit/agentic/tools/git-file-diff.d.ts +0 -10
- package/dist/types/commit/agentic/tools/git-hunk.d.ts +0 -9
- package/dist/types/commit/agentic/tools/git-overview.d.ts +0 -9
- package/dist/types/commit/agentic/tools/index.d.ts +0 -16
- package/dist/types/commit/agentic/tools/propose-changelog.d.ts +0 -28
- package/dist/types/commit/agentic/tools/propose-commit.d.ts +0 -36
- package/dist/types/commit/agentic/tools/recent-commits.d.ts +0 -7
- package/dist/types/commit/agentic/tools/schemas.d.ts +0 -27
- package/dist/types/commit/agentic/tools/split-commit.d.ts +0 -53
- package/dist/types/commit/agentic/topo-sort.d.ts +0 -4
- package/dist/types/commit/agentic/trivial.d.ts +0 -7
- package/dist/types/commit/agentic/validation.d.ts +0 -20
- package/dist/types/commit/analysis/conventional.d.ts +0 -22
- package/dist/types/commit/analysis/index.d.ts +0 -4
- package/dist/types/commit/analysis/scope.d.ts +0 -6
- package/dist/types/commit/analysis/summary.d.ts +0 -19
- package/dist/types/commit/analysis/validation.d.ts +0 -8
- package/dist/types/commit/changelog/detect.d.ts +0 -2
- package/dist/types/commit/changelog/generate.d.ts +0 -30
- package/dist/types/commit/changelog/index.d.ts +0 -30
- package/dist/types/commit/changelog/parse.d.ts +0 -2
- package/dist/types/commit/cli.d.ts +0 -3
- package/dist/types/commit/git/diff.d.ts +0 -5
- package/dist/types/commit/index.d.ts +0 -4
- package/dist/types/commit/map-reduce/index.d.ts +0 -28
- package/dist/types/commit/map-reduce/map-phase.d.ts +0 -17
- package/dist/types/commit/map-reduce/reduce-phase.d.ts +0 -13
- package/dist/types/commit/map-reduce/utils.d.ts +0 -2
- package/dist/types/commit/message.d.ts +0 -2
- package/dist/types/commit/model-selection.d.ts +0 -15
- package/dist/types/commit/pipeline.d.ts +0 -5
- package/dist/types/commit/shared-llm.d.ts +0 -54
- package/dist/types/commit/types.d.ts +0 -78
- package/dist/types/commit/utils/exclusions.d.ts +0 -4
- package/dist/types/commit/utils.d.ts +0 -20
- package/dist/types/config/config-file.d.ts +0 -58
- package/dist/types/config/file-lock-gc.d.ts +0 -5
- package/dist/types/config/file-lock.d.ts +0 -36
- package/dist/types/config/keybindings.d.ts +0 -359
- package/dist/types/config/model-equivalence.d.ts +0 -24
- package/dist/types/config/model-profile-activation.d.ts +0 -64
- package/dist/types/config/model-profiles.d.ts +0 -39
- package/dist/types/config/model-registry.d.ts +0 -473
- package/dist/types/config/model-resolver.d.ts +0 -217
- package/dist/types/config/models-config-schema.d.ts +0 -700
- package/dist/types/config/prompt-templates.d.ts +0 -32
- package/dist/types/config/resolve-config-value.d.ts +0 -17
- package/dist/types/config/settings-schema.d.ts +0 -4183
- package/dist/types/config/settings.d.ts +0 -156
- package/dist/types/config/skill-settings-defaults.d.ts +0 -14
- package/dist/types/config/telegram-autostart.d.ts +0 -14
- package/dist/types/config/telegram-env-bridge.d.ts +0 -18
- package/dist/types/config.d.ts +0 -66
- package/dist/types/coordinator/contract.d.ts +0 -4
- package/dist/types/coordinator-mcp/policy.d.ts +0 -24
- package/dist/types/coordinator-mcp/safety.d.ts +0 -26
- package/dist/types/coordinator-mcp/server.d.ts +0 -66
- package/dist/types/cursor.d.ts +0 -24
- package/dist/types/daemon/builtin.d.ts +0 -20
- package/dist/types/daemon/control-types.d.ts +0 -57
- package/dist/types/daemon/runtime.d.ts +0 -25
- package/dist/types/dap/client.d.ts +0 -39
- package/dist/types/dap/config.d.ts +0 -6
- package/dist/types/dap/index.d.ts +0 -4
- package/dist/types/dap/session.d.ts +0 -108
- package/dist/types/dap/types.d.ts +0 -524
- package/dist/types/debug/crash-diagnostics.d.ts +0 -45
- package/dist/types/debug/index.d.ts +0 -15
- package/dist/types/debug/log-formatting.d.ts +0 -4
- package/dist/types/debug/log-viewer.d.ts +0 -68
- package/dist/types/debug/profiler.d.ts +0 -24
- package/dist/types/debug/raw-sse-buffer.d.ts +0 -44
- package/dist/types/debug/raw-sse.d.ts +0 -16
- package/dist/types/debug/report-bundle.d.ts +0 -55
- package/dist/types/debug/runtime-gauges.d.ts +0 -6
- package/dist/types/debug/system-info.d.ts +0 -26
- package/dist/types/deep-interview/plaintext-gate-guard.d.ts +0 -11
- package/dist/types/deep-interview/render-middleware.d.ts +0 -6
- package/dist/types/defaults/skc/extensions/grok-build/index.d.ts +0 -1
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/index.d.ts +0 -1
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/models/catalog.d.ts +0 -25
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/payload/sanitize.d.ts +0 -27
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/billing.d.ts +0 -8
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/register.d.ts +0 -5
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/stream.d.ts +0 -10
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/provider/usage.d.ts +0 -2
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/shared/base-url.d.ts +0 -2
- package/dist/types/defaults/skc/extensions/grok-cli-vendor/src/shared/errors.d.ts +0 -38
- package/dist/types/defaults/skc-defaults.d.ts +0 -64
- package/dist/types/defaults/skc-grok-cli.d.ts +0 -5
- package/dist/types/discovery/agents-md.d.ts +0 -1
- package/dist/types/discovery/agents.d.ts +0 -12
- package/dist/types/discovery/builtin.d.ts +0 -1
- package/dist/types/discovery/claude-plugins.d.ts +0 -1
- package/dist/types/discovery/claude.d.ts +0 -1
- package/dist/types/discovery/cline.d.ts +0 -1
- package/dist/types/discovery/codex.d.ts +0 -1
- package/dist/types/discovery/cursor.d.ts +0 -19
- package/dist/types/discovery/gemini.d.ts +0 -1
- package/dist/types/discovery/github.d.ts +0 -1
- package/dist/types/discovery/helpers.d.ts +0 -271
- package/dist/types/discovery/index.d.ts +0 -48
- package/dist/types/discovery/mcp-json.d.ts +0 -1
- package/dist/types/discovery/opencode.d.ts +0 -1
- package/dist/types/discovery/plugin-dir-roots.d.ts +0 -15
- package/dist/types/discovery/ssh.d.ts +0 -1
- package/dist/types/discovery/substitute-plugin-root.d.ts +0 -5
- package/dist/types/discovery/vscode.d.ts +0 -1
- package/dist/types/discovery/windsurf.d.ts +0 -15
- package/dist/types/edit/apply-patch/index.d.ts +0 -35
- package/dist/types/edit/apply-patch/parser.d.ts +0 -34
- package/dist/types/edit/diff.d.ts +0 -75
- package/dist/types/edit/file-read-cache.d.ts +0 -25
- package/dist/types/edit/index.d.ts +0 -58
- package/dist/types/edit/modes/apply-patch.d.ts +0 -24
- package/dist/types/edit/modes/patch.d.ts +0 -99
- package/dist/types/edit/modes/replace.d.ts +0 -149
- package/dist/types/edit/normalize.d.ts +0 -43
- package/dist/types/edit/notebook.d.ts +0 -26
- package/dist/types/edit/read-file.d.ts +0 -8
- package/dist/types/edit/renderer.d.ts +0 -110
- package/dist/types/edit/streaming.d.ts +0 -66
- package/dist/types/eval/backend.d.ts +0 -40
- package/dist/types/eval/index.d.ts +0 -4
- package/dist/types/eval/js/context-manager.d.ts +0 -27
- package/dist/types/eval/js/executor.d.ts +0 -29
- package/dist/types/eval/js/index.d.ts +0 -10
- package/dist/types/eval/js/shared/helpers.d.ts +0 -38
- package/dist/types/eval/js/shared/indirect-eval.d.ts +0 -14
- package/dist/types/eval/js/shared/prelude.d.ts +0 -1
- package/dist/types/eval/js/shared/rewrite-imports.d.ts +0 -6
- package/dist/types/eval/js/shared/runtime.d.ts +0 -47
- package/dist/types/eval/js/shared/types.d.ts +0 -24
- package/dist/types/eval/js/tool-bridge.d.ts +0 -18
- package/dist/types/eval/js/worker-core.d.ts +0 -5
- package/dist/types/eval/js/worker-entry.d.ts +0 -1
- package/dist/types/eval/js/worker-protocol.d.ts +0 -77
- package/dist/types/eval/py/display.d.ts +0 -25
- package/dist/types/eval/py/executor.d.ts +0 -88
- package/dist/types/eval/py/index.d.ts +0 -10
- package/dist/types/eval/py/kernel.d.ts +0 -65
- package/dist/types/eval/py/prelude.d.ts +0 -1
- package/dist/types/eval/py/runtime.d.ts +0 -29
- package/dist/types/eval/py/tool-bridge.d.ts +0 -20
- package/dist/types/eval/types.d.ts +0 -52
- package/dist/types/exa/factory.d.ts +0 -13
- package/dist/types/exa/index.d.ts +0 -20
- package/dist/types/exa/mcp-client.d.ts +0 -45
- package/dist/types/exa/render.d.ts +0 -19
- package/dist/types/exa/researcher.d.ts +0 -9
- package/dist/types/exa/search.d.ts +0 -9
- package/dist/types/exa/types.d.ts +0 -155
- package/dist/types/exa/websets.d.ts +0 -9
- package/dist/types/exec/bash-executor.d.ts +0 -64
- package/dist/types/exec/exec.d.ts +0 -25
- package/dist/types/exec/idle-timeout-watchdog.d.ts +0 -18
- package/dist/types/exec/non-interactive-env.d.ts +0 -1
- package/dist/types/export/custom-share.d.ts +0 -20
- package/dist/types/export/html/index.d.ts +0 -10
- package/dist/types/export/html/template.generated.d.ts +0 -1
- package/dist/types/export/html/template.macro.d.ts +0 -5
- package/dist/types/export/ttsr.d.ts +0 -55
- package/dist/types/extensibility/custom-commands/bundled/ci-green/index.d.ts +0 -9
- package/dist/types/extensibility/custom-commands/index.d.ts +0 -2
- package/dist/types/extensibility/custom-commands/loader.d.ts +0 -29
- package/dist/types/extensibility/custom-commands/types.d.ts +0 -106
- package/dist/types/extensibility/custom-tools/index.d.ts +0 -6
- package/dist/types/extensibility/custom-tools/loader.d.ts +0 -69
- package/dist/types/extensibility/custom-tools/types.d.ts +0 -229
- package/dist/types/extensibility/custom-tools/wrapper.d.ts +0 -24
- package/dist/types/extensibility/extensions/compact-handler.d.ts +0 -26
- package/dist/types/extensibility/extensions/get-commands-handler.d.ts +0 -29
- package/dist/types/extensibility/extensions/index.d.ts +0 -9
- package/dist/types/extensibility/extensions/loader.d.ts +0 -43
- package/dist/types/extensibility/extensions/prefix-command-bridge.d.ts +0 -35
- package/dist/types/extensibility/extensions/runner.d.ts +0 -135
- package/dist/types/extensibility/extensions/types.d.ts +0 -918
- package/dist/types/extensibility/extensions/wrapper.d.ts +0 -55
- package/dist/types/extensibility/hooks/index.d.ts +0 -5
- package/dist/types/extensibility/hooks/loader.d.ts +0 -89
- package/dist/types/extensibility/hooks/runner.d.ts +0 -126
- package/dist/types/extensibility/hooks/tool-wrapper.d.ts +0 -25
- package/dist/types/extensibility/hooks/types.d.ts +0 -431
- package/dist/types/extensibility/plugins/doctor.d.ts +0 -3
- package/dist/types/extensibility/plugins/git-url.d.ts +0 -34
- package/dist/types/extensibility/plugins/index.d.ts +0 -8
- package/dist/types/extensibility/plugins/installer.d.ts +0 -5
- package/dist/types/extensibility/plugins/legacy-pi-compat.d.ts +0 -2
- package/dist/types/extensibility/plugins/loader.d.ts +0 -31
- package/dist/types/extensibility/plugins/manager.d.ts +0 -65
- package/dist/types/extensibility/plugins/marketplace/cache.d.ts +0 -41
- package/dist/types/extensibility/plugins/marketplace/fetcher.d.ts +0 -48
- package/dist/types/extensibility/plugins/marketplace/index.d.ts +0 -6
- package/dist/types/extensibility/plugins/marketplace/manager.d.ts +0 -57
- package/dist/types/extensibility/plugins/marketplace/registry.d.ts +0 -34
- package/dist/types/extensibility/plugins/marketplace/source-resolver.d.ts +0 -28
- package/dist/types/extensibility/plugins/marketplace/types.d.ts +0 -130
- package/dist/types/extensibility/plugins/parser.d.ts +0 -52
- package/dist/types/extensibility/plugins/security-scanner.d.ts +0 -31
- package/dist/types/extensibility/plugins/types.d.ts +0 -149
- package/dist/types/extensibility/runtime-skill-discovery.d.ts +0 -20
- package/dist/types/extensibility/shared-events.d.ts +0 -281
- package/dist/types/extensibility/skc-plugins/activation.d.ts +0 -14
- package/dist/types/extensibility/skc-plugins/compiler.d.ts +0 -19
- package/dist/types/extensibility/skc-plugins/constrained-hooks.d.ts +0 -29
- package/dist/types/extensibility/skc-plugins/index.d.ts +0 -18
- package/dist/types/extensibility/skc-plugins/injection.d.ts +0 -40
- package/dist/types/extensibility/skc-plugins/installer.d.ts +0 -13
- package/dist/types/extensibility/skc-plugins/loader.d.ts +0 -3
- package/dist/types/extensibility/skc-plugins/mcp-policy.d.ts +0 -26
- package/dist/types/extensibility/skc-plugins/observability.d.ts +0 -27
- package/dist/types/extensibility/skc-plugins/paths.d.ts +0 -8
- package/dist/types/extensibility/skc-plugins/prompt-appendix.d.ts +0 -16
- package/dist/types/extensibility/skc-plugins/registry.d.ts +0 -32
- package/dist/types/extensibility/skc-plugins/runtime-adapters.d.ts +0 -64
- package/dist/types/extensibility/skc-plugins/schema.d.ts +0 -3
- package/dist/types/extensibility/skc-plugins/session-validation.d.ts +0 -42
- package/dist/types/extensibility/skc-plugins/state.d.ts +0 -9
- package/dist/types/extensibility/skc-plugins/tools.d.ts +0 -8
- package/dist/types/extensibility/skc-plugins/types.d.ts +0 -220
- package/dist/types/extensibility/skc-plugins/validation.d.ts +0 -11
- package/dist/types/extensibility/skills.d.ts +0 -82
- package/dist/types/extensibility/slash-commands.d.ts +0 -48
- package/dist/types/extensibility/tool-proxy.d.ts +0 -4
- package/dist/types/extensibility/typebox.d.ts +0 -155
- package/dist/types/extensibility/utils.d.ts +0 -12
- package/dist/types/goals/index.d.ts +0 -3
- package/dist/types/goals/runtime.d.ts +0 -63
- package/dist/types/goals/state.d.ts +0 -32
- package/dist/types/goals/tools/goal-tool.d.ts +0 -62
- package/dist/types/harness-control-plane/classifier.d.ts +0 -13
- package/dist/types/harness-control-plane/control-endpoint.d.ts +0 -31
- package/dist/types/harness-control-plane/finalize.d.ts +0 -60
- package/dist/types/harness-control-plane/gc-adapter.d.ts +0 -3
- package/dist/types/harness-control-plane/operate.d.ts +0 -35
- package/dist/types/harness-control-plane/owner.d.ts +0 -53
- package/dist/types/harness-control-plane/phase-rollup.d.ts +0 -23
- package/dist/types/harness-control-plane/preserve.d.ts +0 -19
- package/dist/types/harness-control-plane/receipt-ingest.d.ts +0 -19
- package/dist/types/harness-control-plane/receipt-spool.d.ts +0 -19
- package/dist/types/harness-control-plane/receipts.d.ts +0 -149
- package/dist/types/harness-control-plane/rpc-adapter.d.ts +0 -69
- package/dist/types/harness-control-plane/seams.d.ts +0 -21
- package/dist/types/harness-control-plane/session-lease.d.ts +0 -65
- package/dist/types/harness-control-plane/state-machine.d.ts +0 -24
- package/dist/types/harness-control-plane/storage.d.ts +0 -81
- package/dist/types/harness-control-plane/types.d.ts +0 -187
- package/dist/types/hashline/anchors.d.ts +0 -20
- package/dist/types/hashline/apply.d.ts +0 -14
- package/dist/types/hashline/constants.d.ts +0 -19
- package/dist/types/hashline/diff-preview.d.ts +0 -2
- package/dist/types/hashline/diff.d.ts +0 -17
- package/dist/types/hashline/execute.d.ts +0 -4
- package/dist/types/hashline/hash.d.ts +0 -123
- package/dist/types/hashline/index.d.ts +0 -13
- package/dist/types/hashline/input.d.ts +0 -11
- package/dist/types/hashline/parser.d.ts +0 -7
- package/dist/types/hashline/prefixes.d.ts +0 -7
- package/dist/types/hashline/recovery.d.ts +0 -27
- package/dist/types/hashline/stream.d.ts +0 -2
- package/dist/types/hashline/types.d.ts +0 -77
- package/dist/types/hindsight/backend.d.ts +0 -13
- package/dist/types/hindsight/bank.d.ts +0 -54
- package/dist/types/hindsight/client.d.ts +0 -224
- package/dist/types/hindsight/config.d.ts +0 -51
- package/dist/types/hindsight/content.d.ts +0 -70
- package/dist/types/hindsight/index.d.ts +0 -8
- package/dist/types/hindsight/mental-models.d.ts +0 -125
- package/dist/types/hindsight/state.d.ts +0 -99
- package/dist/types/hindsight/transcript.d.ts +0 -28
- package/dist/types/hooks/codex-native-hooks-config.d.ts +0 -29
- package/dist/types/hooks/native-skill-hook.d.ts +0 -28
- package/dist/types/hooks/skill-keywords.d.ts +0 -18
- package/dist/types/hooks/skill-state.d.ts +0 -93
- package/dist/types/i18n/index.d.ts +0 -38
- package/dist/types/i18n/messages/de.d.ts +0 -2
- package/dist/types/i18n/messages/de.messages.d.ts +0 -1
- package/dist/types/i18n/messages/de.settings.d.ts +0 -1
- package/dist/types/i18n/messages/en.d.ts +0 -81
- package/dist/types/i18n/messages/es.d.ts +0 -2
- package/dist/types/i18n/messages/es.messages.d.ts +0 -1
- package/dist/types/i18n/messages/es.settings.d.ts +0 -1
- package/dist/types/i18n/messages/fr.d.ts +0 -2
- package/dist/types/i18n/messages/fr.messages.d.ts +0 -1
- package/dist/types/i18n/messages/fr.settings.d.ts +0 -1
- package/dist/types/i18n/messages/ja.d.ts +0 -2
- package/dist/types/i18n/messages/ja.messages.d.ts +0 -1
- package/dist/types/i18n/messages/ja.settings.d.ts +0 -1
- package/dist/types/i18n/messages/ko.d.ts +0 -2
- package/dist/types/i18n/messages/ko.messages.d.ts +0 -1
- package/dist/types/i18n/messages/ko.settings.d.ts +0 -1
- package/dist/types/i18n/messages/zh.d.ts +0 -2
- package/dist/types/i18n/messages/zh.messages.d.ts +0 -1
- package/dist/types/i18n/messages/zh.settings.d.ts +0 -1
- package/dist/types/index.d.ts +0 -33
- package/dist/types/internal-urls/agent-protocol.d.ts +0 -12
- package/dist/types/internal-urls/artifact-protocol.d.ts +0 -6
- package/dist/types/internal-urls/docs-index.generated.d.ts +0 -2
- package/dist/types/internal-urls/index.d.ts +0 -20
- package/dist/types/internal-urls/issue-pr-protocol.d.ts +0 -17
- package/dist/types/internal-urls/json-query.d.ts +0 -30
- package/dist/types/internal-urls/local-protocol.d.ts +0 -39
- package/dist/types/internal-urls/mcp-protocol.d.ts +0 -12
- package/dist/types/internal-urls/memory-protocol.d.ts +0 -23
- package/dist/types/internal-urls/parse.d.ts +0 -19
- package/dist/types/internal-urls/registry-helpers.d.ts +0 -11
- package/dist/types/internal-urls/router.d.ts +0 -14
- package/dist/types/internal-urls/rule-protocol.d.ts +0 -6
- package/dist/types/internal-urls/skc-protocol.d.ts +0 -12
- package/dist/types/internal-urls/skill-protocol.d.ts +0 -13
- package/dist/types/internal-urls/types.d.ts +0 -109
- package/dist/types/lsp/client.d.ts +0 -66
- package/dist/types/lsp/clients/biome-client.d.ts +0 -16
- package/dist/types/lsp/clients/index.d.ts +0 -19
- package/dist/types/lsp/clients/lsp-linter-client.d.ts +0 -16
- package/dist/types/lsp/clients/swiftlint-client.d.ts +0 -20
- package/dist/types/lsp/config.d.ts +0 -65
- package/dist/types/lsp/edits.d.ts +0 -23
- package/dist/types/lsp/index.d.ts +0 -130
- package/dist/types/lsp/lspmux.d.ts +0 -58
- package/dist/types/lsp/render.d.ts +0 -32
- package/dist/types/lsp/startup-events.d.ts +0 -12
- package/dist/types/lsp/types.d.ts +0 -306
- package/dist/types/lsp/utils.d.ts +0 -108
- package/dist/types/main.d.ts +0 -75
- package/dist/types/memories/index.d.ts +0 -28
- package/dist/types/memories/storage.d.ts +0 -110
- package/dist/types/memory-backend/index.d.ts +0 -4
- package/dist/types/memory-backend/local-backend.d.ts +0 -9
- package/dist/types/memory-backend/off-backend.d.ts +0 -7
- package/dist/types/memory-backend/resolve.d.ts +0 -15
- package/dist/types/memory-backend/types.d.ts +0 -61
- package/dist/types/migrate/action-planner.d.ts +0 -11
- package/dist/types/migrate/adapters/claude-code.d.ts +0 -2
- package/dist/types/migrate/adapters/codex.d.ts +0 -5
- package/dist/types/migrate/adapters/index.d.ts +0 -45
- package/dist/types/migrate/adapters/opencode.d.ts +0 -2
- package/dist/types/migrate/executor.d.ts +0 -2
- package/dist/types/migrate/mcp-mapper.d.ts +0 -20
- package/dist/types/migrate/report.d.ts +0 -18
- package/dist/types/migrate/skill-normalizer.d.ts +0 -27
- package/dist/types/migrate/types.d.ts +0 -126
- package/dist/types/modes/acp/acp-agent.d.ts +0 -61
- package/dist/types/modes/acp/acp-client-bridge.d.ts +0 -9
- package/dist/types/modes/acp/acp-event-mapper.d.ts +0 -34
- package/dist/types/modes/acp/acp-mode.d.ts +0 -5
- package/dist/types/modes/acp/index.d.ts +0 -2
- package/dist/types/modes/acp/terminal-auth.d.ts +0 -6
- package/dist/types/modes/bridge/auth.d.ts +0 -12
- package/dist/types/modes/bridge/bridge-client-bridge.d.ts +0 -9
- package/dist/types/modes/bridge/bridge-mode.d.ts +0 -47
- package/dist/types/modes/bridge/bridge-ui-context.d.ts +0 -88
- package/dist/types/modes/bridge/event-stream.d.ts +0 -8
- package/dist/types/modes/components/agent-dashboard.d.ts +0 -21
- package/dist/types/modes/components/assistant-message.d.ts +0 -20
- package/dist/types/modes/components/bash-execution.d.ts +0 -29
- package/dist/types/modes/components/bordered-loader.d.ts +0 -11
- package/dist/types/modes/components/branch-summary-message.d.ts +0 -13
- package/dist/types/modes/components/btw-panel.d.ts +0 -16
- package/dist/types/modes/components/compaction-summary-message.d.ts +0 -13
- package/dist/types/modes/components/countdown-timer.d.ts +0 -14
- package/dist/types/modes/components/custom-editor.d.ts +0 -67
- package/dist/types/modes/components/custom-message.d.ts +0 -15
- package/dist/types/modes/components/custom-model-preset-wizard.d.ts +0 -12
- package/dist/types/modes/components/custom-provider-wizard.d.ts +0 -10
- package/dist/types/modes/components/diff.d.ts +0 -11
- package/dist/types/modes/components/dynamic-border.d.ts +0 -14
- package/dist/types/modes/components/eval-execution.d.ts +0 -23
- package/dist/types/modes/components/execution-shared.d.ts +0 -46
- package/dist/types/modes/components/extensions/extension-dashboard.d.ts +0 -26
- package/dist/types/modes/components/extensions/extension-list.d.ts +0 -39
- package/dist/types/modes/components/extensions/index.d.ts +0 -8
- package/dist/types/modes/components/extensions/inspector-panel.d.ts +0 -8
- package/dist/types/modes/components/extensions/state-manager.d.ts +0 -50
- package/dist/types/modes/components/extensions/types.d.ts +0 -151
- package/dist/types/modes/components/footer.d.ts +0 -30
- package/dist/types/modes/components/history-search.d.ts +0 -7
- package/dist/types/modes/components/hook-editor.d.ts +0 -18
- package/dist/types/modes/components/hook-input.d.ts +0 -15
- package/dist/types/modes/components/hook-message.d.ts +0 -15
- package/dist/types/modes/components/hook-selector.d.ts +0 -53
- package/dist/types/modes/components/index.d.ts +0 -35
- package/dist/types/modes/components/jobs-overlay-model.d.ts +0 -31
- package/dist/types/modes/components/jobs-overlay.d.ts +0 -30
- package/dist/types/modes/components/keybinding-hints.d.ts +0 -40
- package/dist/types/modes/components/login-dialog.d.ts +0 -32
- package/dist/types/modes/components/message-frame.d.ts +0 -42
- package/dist/types/modes/components/model-selector.d.ts +0 -60
- package/dist/types/modes/components/oauth-selector.d.ts +0 -17
- package/dist/types/modes/components/plugin-selector.d.ts +0 -26
- package/dist/types/modes/components/plugin-settings.d.ts +0 -66
- package/dist/types/modes/components/provider-onboarding-selector.d.ts +0 -7
- package/dist/types/modes/components/queue-mode-selector.d.ts +0 -9
- package/dist/types/modes/components/queued-message-selector.d.ts +0 -12
- package/dist/types/modes/components/read-tool-group.d.ts +0 -30
- package/dist/types/modes/components/runtime-mcp-add-wizard.d.ts +0 -26
- package/dist/types/modes/components/session-observer-overlay.d.ts +0 -11
- package/dist/types/modes/components/session-selector.d.ts +0 -30
- package/dist/types/modes/components/settings-defs.d.ts +0 -50
- package/dist/types/modes/components/settings-selector.d.ts +0 -62
- package/dist/types/modes/components/show-images-selector.d.ts +0 -9
- package/dist/types/modes/components/skill-hud/render.d.ts +0 -2
- package/dist/types/modes/components/skill-message.d.ts +0 -10
- package/dist/types/modes/components/status-line/context-thresholds.d.ts +0 -4
- package/dist/types/modes/components/status-line/git-utils.d.ts +0 -28
- package/dist/types/modes/components/status-line/index.d.ts +0 -4
- package/dist/types/modes/components/status-line/presets.d.ts +0 -3
- package/dist/types/modes/components/status-line/segments.d.ts +0 -5
- package/dist/types/modes/components/status-line/separators.d.ts +0 -3
- package/dist/types/modes/components/status-line/token-rate.d.ts +0 -10
- package/dist/types/modes/components/status-line/types.d.ts +0 -77
- package/dist/types/modes/components/status-line.d.ts +0 -103
- package/dist/types/modes/components/theme-selector.d.ts +0 -10
- package/dist/types/modes/components/thinking-selector.d.ts +0 -15
- package/dist/types/modes/components/todo-reminder.d.ts +0 -13
- package/dist/types/modes/components/tool-execution.d.ts +0 -54
- package/dist/types/modes/components/tree-selector.d.ts +0 -31
- package/dist/types/modes/components/ttsr-notification.d.ts +0 -13
- package/dist/types/modes/components/two-column-body.d.ts +0 -9
- package/dist/types/modes/components/user-message-selector.d.ts +0 -28
- package/dist/types/modes/components/user-message.d.ts +0 -7
- package/dist/types/modes/components/visual-truncate.d.ts +0 -19
- package/dist/types/modes/components/welcome.d.ts +0 -45
- package/dist/types/modes/controllers/btw-controller.d.ts +0 -10
- package/dist/types/modes/controllers/command-controller-shared.d.ts +0 -47
- package/dist/types/modes/controllers/command-controller.d.ts +0 -40
- package/dist/types/modes/controllers/event-controller.d.ts +0 -17
- package/dist/types/modes/controllers/extension-ui-controller.d.ts +0 -80
- package/dist/types/modes/controllers/input-controller.d.ts +0 -42
- package/dist/types/modes/controllers/runtime-mcp-command-controller.d.ts +0 -10
- package/dist/types/modes/controllers/selector-controller.d.ts +0 -67
- package/dist/types/modes/controllers/ssh-command-controller.d.ts +0 -10
- package/dist/types/modes/controllers/todo-command-controller.d.ts +0 -7
- package/dist/types/modes/emoji-autocomplete.d.ts +0 -16
- package/dist/types/modes/index.d.ts +0 -10
- package/dist/types/modes/interactive-mode.d.ts +0 -275
- package/dist/types/modes/jobs-observer.d.ts +0 -57
- package/dist/types/modes/oauth-manual-input.d.ts +0 -8
- package/dist/types/modes/print-mode.d.ts +0 -45
- package/dist/types/modes/prompt-action-autocomplete.d.ts +0 -50
- package/dist/types/modes/rpc/host-tools.d.ts +0 -1
- package/dist/types/modes/rpc/host-uris.d.ts +0 -1
- package/dist/types/modes/rpc/rpc-client.d.ts +0 -288
- package/dist/types/modes/rpc/rpc-mode.d.ts +0 -85
- package/dist/types/modes/rpc/rpc-socket-security.d.ts +0 -10
- package/dist/types/modes/rpc/rpc-types.d.ts +0 -794
- package/dist/types/modes/runtime-init.d.ts +0 -21
- package/dist/types/modes/session-observer-registry.d.ts +0 -26
- package/dist/types/modes/shared/agent-wire/approval-gate.d.ts +0 -57
- package/dist/types/modes/shared/agent-wire/command-contract.d.ts +0 -18
- package/dist/types/modes/shared/agent-wire/command-dispatch.d.ts +0 -37
- package/dist/types/modes/shared/agent-wire/command-validation.d.ts +0 -2
- package/dist/types/modes/shared/agent-wire/deep-interview-gate.d.ts +0 -94
- package/dist/types/modes/shared/agent-wire/event-contract.d.ts +0 -103
- package/dist/types/modes/shared/agent-wire/event-envelope.d.ts +0 -60
- package/dist/types/modes/shared/agent-wire/event-observation.d.ts +0 -37
- package/dist/types/modes/shared/agent-wire/handshake.d.ts +0 -56
- package/dist/types/modes/shared/agent-wire/host-tool-bridge.d.ts +0 -16
- package/dist/types/modes/shared/agent-wire/host-uri-bridge.d.ts +0 -17
- package/dist/types/modes/shared/agent-wire/protocol.d.ts +0 -25
- package/dist/types/modes/shared/agent-wire/responses.d.ts +0 -4
- package/dist/types/modes/shared/agent-wire/scopes.d.ts +0 -18
- package/dist/types/modes/shared/agent-wire/session-registry.d.ts +0 -25
- package/dist/types/modes/shared/agent-wire/ui-request-broker.d.ts +0 -42
- package/dist/types/modes/shared/agent-wire/ui-result.d.ts +0 -27
- package/dist/types/modes/shared/agent-wire/unattended-action-policy.d.ts +0 -29
- package/dist/types/modes/shared/agent-wire/unattended-audit.d.ts +0 -68
- package/dist/types/modes/shared/agent-wire/unattended-run-controller.d.ts +0 -161
- package/dist/types/modes/shared/agent-wire/unattended-session.d.ts +0 -82
- package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +0 -114
- package/dist/types/modes/shared/agent-wire/workflow-gate-schema.d.ts +0 -39
- package/dist/types/modes/shared.d.ts +0 -15
- package/dist/types/modes/slash-command-visibility.d.ts +0 -1
- package/dist/types/modes/theme/defaults/index.d.ts +0 -652
- package/dist/types/modes/theme/mermaid-cache.d.ts +0 -9
- package/dist/types/modes/theme/shimmer.d.ts +0 -38
- package/dist/types/modes/theme/theme.d.ts +0 -275
- package/dist/types/modes/tmux-scroll.d.ts +0 -18
- package/dist/types/modes/types.d.ts +0 -292
- package/dist/types/modes/utils/abort-message.d.ts +0 -4
- package/dist/types/modes/utils/context-usage.d.ts +0 -51
- package/dist/types/modes/utils/hotkeys-markdown.d.ts +0 -5
- package/dist/types/modes/utils/injected-user-submission.d.ts +0 -52
- package/dist/types/modes/utils/keybinding-matchers.d.ts +0 -10
- package/dist/types/modes/utils/terminal-bell.d.ts +0 -3
- package/dist/types/modes/utils/tools-markdown.d.ts +0 -5
- package/dist/types/modes/utils/ui-helpers.d.ts +0 -54
- package/dist/types/notifications/attachment-registry.d.ts +0 -17
- package/dist/types/notifications/chat-adapters.d.ts +0 -9
- package/dist/types/notifications/config-commands.d.ts +0 -64
- package/dist/types/notifications/config.d.ts +0 -98
- package/dist/types/notifications/daemon-paths.d.ts +0 -10
- package/dist/types/notifications/engine.d.ts +0 -59
- package/dist/types/notifications/helpers.d.ts +0 -55
- package/dist/types/notifications/html-format.d.ts +0 -75
- package/dist/types/notifications/index.d.ts +0 -192
- package/dist/types/notifications/lifecycle-commands.d.ts +0 -69
- package/dist/types/notifications/lifecycle-control-runtime.d.ts +0 -99
- package/dist/types/notifications/lifecycle-orchestrator.d.ts +0 -144
- package/dist/types/notifications/managed-daemon.d.ts +0 -48
- package/dist/types/notifications/operator-runtime.d.ts +0 -52
- package/dist/types/notifications/rate-limit-pool.d.ts +0 -95
- package/dist/types/notifications/recent-activity.d.ts +0 -39
- package/dist/types/notifications/reply-sent-store.d.ts +0 -53
- package/dist/types/notifications/rich-draft.d.ts +0 -68
- package/dist/types/notifications/rich-render.d.ts +0 -90
- package/dist/types/notifications/telegram-cli.d.ts +0 -19
- package/dist/types/notifications/telegram-daemon-cli.d.ts +0 -28
- package/dist/types/notifications/telegram-daemon-control.d.ts +0 -64
- package/dist/types/notifications/telegram-daemon.d.ts +0 -429
- package/dist/types/notifications/telegram-reference.d.ts +0 -119
- package/dist/types/notifications/threaded-inbound.d.ts +0 -77
- package/dist/types/notifications/threaded-render.d.ts +0 -88
- package/dist/types/notifications/topic-registry.d.ts +0 -69
- package/dist/types/plan-mode/approved-plan.d.ts +0 -49
- package/dist/types/plan-mode/state.d.ts +0 -6
- package/dist/types/registry/agent-registry.d.ts +0 -62
- package/dist/types/reminders/star-reminder.d.ts +0 -115
- package/dist/types/research-plan/index.d.ts +0 -1
- package/dist/types/research-plan/ledger.d.ts +0 -33
- package/dist/types/rlm/artifacts.d.ts +0 -9
- package/dist/types/rlm/complete-research-tool.d.ts +0 -35
- package/dist/types/rlm/data-context.d.ts +0 -6
- package/dist/types/rlm/index.d.ts +0 -47
- package/dist/types/rlm/notebook.d.ts +0 -12
- package/dist/types/rlm/preset.d.ts +0 -23
- package/dist/types/rlm/python-tool.d.ts +0 -16
- package/dist/types/rlm/report.d.ts +0 -14
- package/dist/types/rlm/types.d.ts +0 -37
- package/dist/types/runtime/process-lifecycle.d.ts +0 -108
- package/dist/types/runtime-api-key.d.ts +0 -7
- package/dist/types/runtime-credential-selector.d.ts +0 -7
- package/dist/types/runtime-mcp/client.d.ts +0 -74
- package/dist/types/runtime-mcp/config-writer.d.ts +0 -88
- package/dist/types/runtime-mcp/config.d.ts +0 -77
- package/dist/types/runtime-mcp/discoverable-tool-metadata.d.ts +0 -7
- package/dist/types/runtime-mcp/index.d.ts +0 -18
- package/dist/types/runtime-mcp/json-rpc.d.ts +0 -22
- package/dist/types/runtime-mcp/loader.d.ts +0 -45
- package/dist/types/runtime-mcp/manager.d.ts +0 -195
- package/dist/types/runtime-mcp/oauth-discovery.d.ts +0 -40
- package/dist/types/runtime-mcp/oauth-flow.d.ts +0 -59
- package/dist/types/runtime-mcp/render.d.ts +0 -25
- package/dist/types/runtime-mcp/smithery-auth.d.ts +0 -16
- package/dist/types/runtime-mcp/smithery-connect.d.ts +0 -38
- package/dist/types/runtime-mcp/smithery-registry.d.ts +0 -51
- package/dist/types/runtime-mcp/tool-bridge.d.ts +0 -86
- package/dist/types/runtime-mcp/tool-cache.d.ts +0 -8
- package/dist/types/runtime-mcp/transports/http.d.ts +0 -36
- package/dist/types/runtime-mcp/transports/index.d.ts +0 -5
- package/dist/types/runtime-mcp/transports/stdio.d.ts +0 -29
- package/dist/types/runtime-mcp/types.d.ts +0 -348
- package/dist/types/sdk.d.ts +0 -254
- package/dist/types/secrets/index.d.ts +0 -9
- package/dist/types/secrets/obfuscator.d.ts +0 -23
- package/dist/types/secrets/regex.d.ts +0 -2
- package/dist/types/session/agent-session.d.ts +0 -1185
- package/dist/types/session/agent-storage.d.ts +0 -101
- package/dist/types/session/artifacts.d.ts +0 -64
- package/dist/types/session/auth-broker-config.d.ts +0 -13
- package/dist/types/session/auth-storage.d.ts +0 -6
- package/dist/types/session/blob-store.d.ts +0 -160
- package/dist/types/session/client-bridge.d.ts +0 -88
- package/dist/types/session/contribution-prep.d.ts +0 -47
- package/dist/types/session/file-mention-pruning.d.ts +0 -8
- package/dist/types/session/history-storage.d.ts +0 -16
- package/dist/types/session/messages.d.ts +0 -169
- package/dist/types/session/session-dump-format.d.ts +0 -22
- package/dist/types/session/session-manager.d.ts +0 -660
- package/dist/types/session/session-storage.d.ts +0 -88
- package/dist/types/session/streaming-output.d.ts +0 -209
- package/dist/types/session/tool-choice-queue.d.ts +0 -84
- package/dist/types/session/yield-queue.d.ts +0 -24
- package/dist/types/setup/credential-auto-import.d.ts +0 -63
- package/dist/types/setup/credential-import.d.ts +0 -82
- package/dist/types/setup/hermes-setup.d.ts +0 -78
- package/dist/types/setup/host-plugin-setup.d.ts +0 -39
- package/dist/types/setup/model-onboarding-guidance.d.ts +0 -9
- package/dist/types/setup/provider-onboarding.d.ts +0 -52
- package/dist/types/skc-runtime/cli-write-receipt.d.ts +0 -24
- package/dist/types/skc-runtime/deep-interview-ambiguity.d.ts +0 -39
- package/dist/types/skc-runtime/deep-interview-recorder.d.ts +0 -114
- package/dist/types/skc-runtime/deep-interview-runtime.d.ts +0 -36
- package/dist/types/skc-runtime/deep-interview-state.d.ts +0 -127
- package/dist/types/skc-runtime/gc-render.d.ts +0 -6
- package/dist/types/skc-runtime/gc-runtime.d.ts +0 -134
- package/dist/types/skc-runtime/goal-mode-request.d.ts +0 -53
- package/dist/types/skc-runtime/launch-tmux.d.ts +0 -78
- package/dist/types/skc-runtime/launch-worktree.d.ts +0 -46
- package/dist/types/skc-runtime/ledger-event-renderer.d.ts +0 -68
- package/dist/types/skc-runtime/psmux-detect.d.ts +0 -78
- package/dist/types/skc-runtime/ralplan-runtime.d.ts +0 -26
- package/dist/types/skc-runtime/restricted-role-agent-bash.d.ts +0 -3
- package/dist/types/skc-runtime/session-layout.d.ts +0 -59
- package/dist/types/skc-runtime/session-resolution.d.ts +0 -47
- package/dist/types/skc-runtime/session-state-sidecar.d.ts +0 -39
- package/dist/types/skc-runtime/state-graph.d.ts +0 -4
- package/dist/types/skc-runtime/state-migrations.d.ts +0 -33
- package/dist/types/skc-runtime/state-renderer.d.ts +0 -70
- package/dist/types/skc-runtime/state-runtime.d.ts +0 -38
- package/dist/types/skc-runtime/state-schema.d.ts +0 -319
- package/dist/types/skc-runtime/state-validation.d.ts +0 -6
- package/dist/types/skc-runtime/state-writer.d.ts +0 -244
- package/dist/types/skc-runtime/team-gc.d.ts +0 -7
- package/dist/types/skc-runtime/team-runtime.d.ts +0 -355
- package/dist/types/skc-runtime/tmux-common.d.ts +0 -105
- package/dist/types/skc-runtime/tmux-gc.d.ts +0 -7
- package/dist/types/skc-runtime/tmux-sessions.d.ts +0 -62
- package/dist/types/skc-runtime/ultragoal-guard.d.ts +0 -93
- package/dist/types/skc-runtime/ultragoal-receipt-freshness.d.ts +0 -42
- package/dist/types/skc-runtime/ultragoal-runtime.d.ts +0 -410
- package/dist/types/skc-runtime/workflow-command-ref.d.ts +0 -43
- package/dist/types/skc-runtime/workflow-manifest.d.ts +0 -54
- package/dist/types/skill-state/active-state.d.ts +0 -126
- package/dist/types/skill-state/canonical-skills.d.ts +0 -3
- package/dist/types/skill-state/deep-interview-mutation-guard.d.ts +0 -38
- package/dist/types/skill-state/initial-phase.d.ts +0 -12
- package/dist/types/skill-state/workflow-hud.d.ts +0 -83
- package/dist/types/skill-state/workflow-state-contract.d.ts +0 -57
- package/dist/types/skill-state/workflow-state-version.d.ts +0 -3
- package/dist/types/slash-commands/acp-builtins.d.ts +0 -18
- package/dist/types/slash-commands/builtin-registry.d.ts +0 -24
- package/dist/types/slash-commands/helpers/context-report.d.ts +0 -7
- package/dist/types/slash-commands/helpers/fast-status-report.d.ts +0 -82
- package/dist/types/slash-commands/helpers/format.d.ts +0 -10
- package/dist/types/slash-commands/helpers/mcp.d.ts +0 -3
- package/dist/types/slash-commands/helpers/parse.d.ts +0 -33
- package/dist/types/slash-commands/helpers/ssh.d.ts +0 -3
- package/dist/types/slash-commands/helpers/todo.d.ts +0 -3
- package/dist/types/slash-commands/helpers/usage-report.d.ts +0 -7
- package/dist/types/slash-commands/types.d.ts +0 -120
- package/dist/types/ssh/config-writer.d.ts +0 -49
- package/dist/types/ssh/connection-manager.d.ts +0 -33
- package/dist/types/ssh/ssh-executor.d.ts +0 -37
- package/dist/types/ssh/sshfs-mount.d.ts +0 -6
- package/dist/types/ssh/utils.d.ts +0 -2
- package/dist/types/stt/downloader.d.ts +0 -9
- package/dist/types/stt/index.d.ts +0 -3
- package/dist/types/stt/recorder.d.ts +0 -13
- package/dist/types/stt/setup.d.ts +0 -18
- package/dist/types/stt/stt-controller.d.ts +0 -16
- package/dist/types/stt/transcriber.d.ts +0 -16
- package/dist/types/system-prompt.d.ts +0 -118
- package/dist/types/task/agents.d.ts +0 -28
- package/dist/types/task/commands.d.ts +0 -35
- package/dist/types/task/discovery.d.ts +0 -19
- package/dist/types/task/executor.d.ts +0 -124
- package/dist/types/task/fork-context-advisory.d.ts +0 -13
- package/dist/types/task/fork-context-budget.d.ts +0 -7
- package/dist/types/task/id.d.ts +0 -7
- package/dist/types/task/index.d.ts +0 -43
- package/dist/types/task/name-generator.d.ts +0 -16
- package/dist/types/task/output-manager.d.ts +0 -36
- package/dist/types/task/parallel.d.ts +0 -34
- package/dist/types/task/receipt.d.ts +0 -87
- package/dist/types/task/render.d.ts +0 -28
- package/dist/types/task/roi-reconciliation.d.ts +0 -27
- package/dist/types/task/simple-mode.d.ts +0 -8
- package/dist/types/task/skc-command.d.ts +0 -7
- package/dist/types/task/spawn-gate.d.ts +0 -29
- package/dist/types/task/subprocess-tool-registry.d.ts +0 -72
- package/dist/types/task/token-log.d.ts +0 -30
- package/dist/types/task/token-log.test.d.ts +0 -1
- package/dist/types/task/types.d.ts +0 -508
- package/dist/types/task/worktree.d.ts +0 -94
- package/dist/types/thinking-metadata.d.ts +0 -16
- package/dist/types/thinking.d.ts +0 -22
- package/dist/types/tool-discovery/tool-index.d.ts +0 -112
- package/dist/types/tools/archive-reader.d.ts +0 -40
- package/dist/types/tools/ask-answer-registry.d.ts +0 -13
- package/dist/types/tools/ask.d.ts +0 -123
- package/dist/types/tools/ast-edit.d.ts +0 -77
- package/dist/types/tools/ast-grep.d.ts +0 -69
- package/dist/types/tools/auto-generated-guard.d.ts +0 -17
- package/dist/types/tools/bash-allowed-prefixes.d.ts +0 -10
- package/dist/types/tools/bash-command-fixup.d.ts +0 -11
- package/dist/types/tools/bash-interactive.d.ts +0 -16
- package/dist/types/tools/bash-interceptor.d.ts +0 -24
- package/dist/types/tools/bash-pty-selection.d.ts +0 -7
- package/dist/types/tools/bash-skill-urls.d.ts +0 -31
- package/dist/types/tools/bash.d.ts +0 -157
- package/dist/types/tools/bisect.d.ts +0 -81
- package/dist/types/tools/browser/actions.d.ts +0 -54
- package/dist/types/tools/browser/attach.d.ts +0 -50
- package/dist/types/tools/browser/launch.d.ts +0 -62
- package/dist/types/tools/browser/readable.d.ts +0 -17
- package/dist/types/tools/browser/registry.d.ts +0 -57
- package/dist/types/tools/browser/render.d.ts +0 -53
- package/dist/types/tools/browser/tab-protocol.d.ts +0 -144
- package/dist/types/tools/browser/tab-supervisor.d.ts +0 -103
- package/dist/types/tools/browser/tab-worker-entry.d.ts +0 -1
- package/dist/types/tools/browser/tab-worker.d.ts +0 -19
- package/dist/types/tools/browser.d.ts +0 -211
- package/dist/types/tools/calculator.d.ts +0 -76
- package/dist/types/tools/checkpoint.d.ts +0 -63
- package/dist/types/tools/composer-bash-policy.d.ts +0 -14
- package/dist/types/tools/computer/render.d.ts +0 -17
- package/dist/types/tools/computer-gc.d.ts +0 -23
- package/dist/types/tools/computer.d.ts +0 -465
- package/dist/types/tools/conflict-detect.d.ts +0 -205
- package/dist/types/tools/context.d.ts +0 -19
- package/dist/types/tools/cron.d.ts +0 -91
- package/dist/types/tools/debug.d.ts +0 -209
- package/dist/types/tools/eval.d.ts +0 -108
- package/dist/types/tools/fetch.d.ts +0 -84
- package/dist/types/tools/file-recorder.d.ts +0 -13
- package/dist/types/tools/find.d.ts +0 -95
- package/dist/types/tools/fs-cache-invalidation.d.ts +0 -15
- package/dist/types/tools/gh-format.d.ts +0 -6
- package/dist/types/tools/gh-renderer.d.ts +0 -25
- package/dist/types/tools/gh.d.ts +0 -356
- package/dist/types/tools/github-cache.d.ts +0 -103
- package/dist/types/tools/grouped-file-output.d.ts +0 -36
- package/dist/types/tools/hindsight-recall.d.ts +0 -21
- package/dist/types/tools/hindsight-reflect.d.ts +0 -23
- package/dist/types/tools/hindsight-retain.d.ts +0 -27
- package/dist/types/tools/image-gen.d.ts +0 -79
- package/dist/types/tools/index.d.ts +0 -319
- package/dist/types/tools/irc.d.ts +0 -79
- package/dist/types/tools/job.d.ts +0 -78
- package/dist/types/tools/json-tree.d.ts +0 -23
- package/dist/types/tools/jtd-to-json-schema.d.ts +0 -29
- package/dist/types/tools/jtd-to-typescript.d.ts +0 -26
- package/dist/types/tools/jtd-utils.d.ts +0 -42
- package/dist/types/tools/list-limit.d.ts +0 -12
- package/dist/types/tools/match-line-format.d.ts +0 -11
- package/dist/types/tools/monitor.d.ts +0 -54
- package/dist/types/tools/output-meta.d.ts +0 -204
- package/dist/types/tools/path-utils.d.ts +0 -147
- package/dist/types/tools/plan-mode-guard.d.ts +0 -18
- package/dist/types/tools/read.d.ts +0 -85
- package/dist/types/tools/recipe/index.d.ts +0 -45
- package/dist/types/tools/recipe/render.d.ts +0 -36
- package/dist/types/tools/recipe/runner.d.ts +0 -60
- package/dist/types/tools/recipe/runners/cargo.d.ts +0 -16
- package/dist/types/tools/recipe/runners/index.d.ts +0 -2
- package/dist/types/tools/recipe/runners/just.d.ts +0 -2
- package/dist/types/tools/recipe/runners/make.d.ts +0 -2
- package/dist/types/tools/recipe/runners/pkg.d.ts +0 -2
- package/dist/types/tools/recipe/runners/task.d.ts +0 -2
- package/dist/types/tools/render-mermaid.d.ts +0 -37
- package/dist/types/tools/render-utils.d.ts +0 -158
- package/dist/types/tools/renderers.d.ts +0 -26
- package/dist/types/tools/resolve.d.ts +0 -80
- package/dist/types/tools/resource-gc.d.ts +0 -54
- package/dist/types/tools/review.d.ts +0 -63
- package/dist/types/tools/search-tool-bm25.d.ts +0 -65
- package/dist/types/tools/search.d.ts +0 -93
- package/dist/types/tools/skill-discovery.d.ts +0 -40
- package/dist/types/tools/skill.d.ts +0 -47
- package/dist/types/tools/sqlite-reader.d.ts +0 -94
- package/dist/types/tools/ssh.d.ts +0 -67
- package/dist/types/tools/subagent-render.d.ts +0 -31
- package/dist/types/tools/subagent.d.ts +0 -117
- package/dist/types/tools/telegram-send.d.ts +0 -32
- package/dist/types/tools/todo-write.d.ts +0 -120
- package/dist/types/tools/tool-errors.d.ts +0 -33
- package/dist/types/tools/tool-result.d.ts +0 -30
- package/dist/types/tools/tool-timeouts.d.ts +0 -56
- package/dist/types/tools/ultragoal-ask-guard.d.ts +0 -12
- package/dist/types/tools/vim.d.ts +0 -58
- package/dist/types/tools/write.d.ts +0 -59
- package/dist/types/tools/yield.d.ts +0 -25
- package/dist/types/tui/code-cell.d.ts +0 -32
- package/dist/types/tui/file-list.d.ts +0 -22
- package/dist/types/tui/hyperlink.d.ts +0 -42
- package/dist/types/tui/index.d.ts +0 -11
- package/dist/types/tui/output-block.d.ts +0 -28
- package/dist/types/tui/status-line.d.ts +0 -18
- package/dist/types/tui/tree-list.d.ts +0 -19
- package/dist/types/tui/types.d.ts +0 -13
- package/dist/types/tui/utils.d.ts +0 -36
- package/dist/types/utils/changelog.d.ts +0 -37
- package/dist/types/utils/clipboard.d.ts +0 -22
- package/dist/types/utils/cmux-workspace.d.ts +0 -52
- package/dist/types/utils/command-args.d.ts +0 -9
- package/dist/types/utils/commit-message-generator.d.ts +0 -7
- package/dist/types/utils/edit-mode.d.ts +0 -13
- package/dist/types/utils/event-bus.d.ts +0 -6
- package/dist/types/utils/external-editor.d.ts +0 -17
- package/dist/types/utils/file-display-mode.d.ts +0 -27
- package/dist/types/utils/file-mentions.d.ts +0 -25
- package/dist/types/utils/git.d.ts +0 -393
- package/dist/types/utils/image-loading.d.ts +0 -26
- package/dist/types/utils/image-resize.d.ts +0 -39
- package/dist/types/utils/lang-from-path.d.ts +0 -8
- package/dist/types/utils/markit.d.ts +0 -7
- package/dist/types/utils/open.d.ts +0 -2
- package/dist/types/utils/pasted-image-path.d.ts +0 -30
- package/dist/types/utils/session-color.d.ts +0 -10
- package/dist/types/utils/shell-snapshot.d.ts +0 -5
- package/dist/types/utils/sixel.d.ts +0 -21
- package/dist/types/utils/title-generator.d.ts +0 -31
- package/dist/types/utils/tool-choice.d.ts +0 -20
- package/dist/types/utils/tools-manager.d.ts +0 -9
- package/dist/types/vim/buffer.d.ts +0 -41
- package/dist/types/vim/commands.d.ts +0 -6
- package/dist/types/vim/engine.d.ts +0 -47
- package/dist/types/vim/parser.d.ts +0 -3
- package/dist/types/vim/render.d.ts +0 -25
- package/dist/types/vim/types.d.ts +0 -182
- package/dist/types/web/insane/bridge.d.ts +0 -103
- package/dist/types/web/insane/url-guard.d.ts +0 -25
- package/dist/types/web/kagi.d.ts +0 -23
- package/dist/types/web/parallel.d.ts +0 -58
- package/dist/types/web/scrapers/artifacthub.d.ts +0 -6
- package/dist/types/web/scrapers/arxiv.d.ts +0 -5
- package/dist/types/web/scrapers/aur.d.ts +0 -5
- package/dist/types/web/scrapers/biorxiv.d.ts +0 -5
- package/dist/types/web/scrapers/bluesky.d.ts +0 -5
- package/dist/types/web/scrapers/brew.d.ts +0 -5
- package/dist/types/web/scrapers/cheatsh.d.ts +0 -8
- package/dist/types/web/scrapers/chocolatey.d.ts +0 -5
- package/dist/types/web/scrapers/choosealicense.d.ts +0 -2
- package/dist/types/web/scrapers/cisa-kev.d.ts +0 -5
- package/dist/types/web/scrapers/clojars.d.ts +0 -5
- package/dist/types/web/scrapers/coingecko.d.ts +0 -5
- package/dist/types/web/scrapers/crates-io.d.ts +0 -5
- package/dist/types/web/scrapers/crossref.d.ts +0 -2
- package/dist/types/web/scrapers/devto.d.ts +0 -5
- package/dist/types/web/scrapers/discogs.d.ts +0 -8
- package/dist/types/web/scrapers/discourse.d.ts +0 -5
- package/dist/types/web/scrapers/dockerhub.d.ts +0 -5
- package/dist/types/web/scrapers/docs-rs.d.ts +0 -2
- package/dist/types/web/scrapers/fdroid.d.ts +0 -5
- package/dist/types/web/scrapers/firefox-addons.d.ts +0 -2
- package/dist/types/web/scrapers/flathub.d.ts +0 -2
- package/dist/types/web/scrapers/github-gist.d.ts +0 -5
- package/dist/types/web/scrapers/github.d.ts +0 -12
- package/dist/types/web/scrapers/gitlab.d.ts +0 -5
- package/dist/types/web/scrapers/go-pkg.d.ts +0 -5
- package/dist/types/web/scrapers/hackage.d.ts +0 -5
- package/dist/types/web/scrapers/hackernews.d.ts +0 -2
- package/dist/types/web/scrapers/hex.d.ts +0 -5
- package/dist/types/web/scrapers/huggingface.d.ts +0 -2
- package/dist/types/web/scrapers/iacr.d.ts +0 -5
- package/dist/types/web/scrapers/index.d.ts +0 -84
- package/dist/types/web/scrapers/jetbrains-marketplace.d.ts +0 -2
- package/dist/types/web/scrapers/lemmy.d.ts +0 -2
- package/dist/types/web/scrapers/lobsters.d.ts +0 -5
- package/dist/types/web/scrapers/mastodon.d.ts +0 -5
- package/dist/types/web/scrapers/maven.d.ts +0 -6
- package/dist/types/web/scrapers/mdn.d.ts +0 -2
- package/dist/types/web/scrapers/metacpan.d.ts +0 -5
- package/dist/types/web/scrapers/musicbrainz.d.ts +0 -5
- package/dist/types/web/scrapers/npm.d.ts +0 -5
- package/dist/types/web/scrapers/nuget.d.ts +0 -5
- package/dist/types/web/scrapers/nvd.d.ts +0 -5
- package/dist/types/web/scrapers/ollama.d.ts +0 -2
- package/dist/types/web/scrapers/open-vsx.d.ts +0 -5
- package/dist/types/web/scrapers/opencorporates.d.ts +0 -5
- package/dist/types/web/scrapers/openlibrary.d.ts +0 -5
- package/dist/types/web/scrapers/orcid.d.ts +0 -5
- package/dist/types/web/scrapers/osv.d.ts +0 -5
- package/dist/types/web/scrapers/packagist.d.ts +0 -5
- package/dist/types/web/scrapers/pub-dev.d.ts +0 -5
- package/dist/types/web/scrapers/pubmed.d.ts +0 -5
- package/dist/types/web/scrapers/pypi.d.ts +0 -5
- package/dist/types/web/scrapers/rawg.d.ts +0 -2
- package/dist/types/web/scrapers/readthedocs.d.ts +0 -2
- package/dist/types/web/scrapers/reddit.d.ts +0 -5
- package/dist/types/web/scrapers/repology.d.ts +0 -5
- package/dist/types/web/scrapers/rfc.d.ts +0 -5
- package/dist/types/web/scrapers/rubygems.d.ts +0 -5
- package/dist/types/web/scrapers/searchcode.d.ts +0 -2
- package/dist/types/web/scrapers/sec-edgar.d.ts +0 -5
- package/dist/types/web/scrapers/semantic-scholar.d.ts +0 -2
- package/dist/types/web/scrapers/snapcraft.d.ts +0 -2
- package/dist/types/web/scrapers/sourcegraph.d.ts +0 -2
- package/dist/types/web/scrapers/spdx.d.ts +0 -5
- package/dist/types/web/scrapers/spotify.d.ts +0 -8
- package/dist/types/web/scrapers/stackoverflow.d.ts +0 -6
- package/dist/types/web/scrapers/terraform.d.ts +0 -5
- package/dist/types/web/scrapers/tldr.d.ts +0 -7
- package/dist/types/web/scrapers/twitter.d.ts +0 -5
- package/dist/types/web/scrapers/types.d.ts +0 -83
- package/dist/types/web/scrapers/utils.d.ts +0 -32
- package/dist/types/web/scrapers/vimeo.d.ts +0 -5
- package/dist/types/web/scrapers/vscode-marketplace.d.ts +0 -5
- package/dist/types/web/scrapers/w3c.d.ts +0 -2
- package/dist/types/web/scrapers/wikidata.d.ts +0 -5
- package/dist/types/web/scrapers/wikipedia.d.ts +0 -5
- package/dist/types/web/scrapers/youtube.d.ts +0 -13
- package/dist/types/web/search/index.d.ts +0 -118
- package/dist/types/web/search/provider.d.ts +0 -55
- package/dist/types/web/search/providers/anthropic.d.ts +0 -32
- package/dist/types/web/search/providers/base.d.ts +0 -90
- package/dist/types/web/search/providers/brave.d.ts +0 -27
- package/dist/types/web/search/providers/codex.d.ts +0 -35
- package/dist/types/web/search/providers/duckduckgo.d.ts +0 -57
- package/dist/types/web/search/providers/exa.d.ts +0 -52
- package/dist/types/web/search/providers/gemini.d.ts +0 -57
- package/dist/types/web/search/providers/insane.d.ts +0 -53
- package/dist/types/web/search/providers/jina.d.ts +0 -26
- package/dist/types/web/search/providers/kagi.d.ts +0 -24
- package/dist/types/web/search/providers/kimi.d.ts +0 -27
- package/dist/types/web/search/providers/openai-compatible.d.ts +0 -9
- package/dist/types/web/search/providers/parallel.d.ts +0 -15
- package/dist/types/web/search/providers/perplexity.d.ts +0 -38
- package/dist/types/web/search/providers/searxng.d.ts +0 -44
- package/dist/types/web/search/providers/synthetic.d.ts +0 -21
- package/dist/types/web/search/providers/tavily.d.ts +0 -29
- package/dist/types/web/search/providers/text-citations.d.ts +0 -23
- package/dist/types/web/search/providers/utils.d.ts +0 -88
- package/dist/types/web/search/providers/xai.d.ts +0 -64
- package/dist/types/web/search/providers/zai.d.ts +0 -28
- package/dist/types/web/search/render.d.ts +0 -36
- package/dist/types/web/search/types.d.ts +0 -372
- package/dist/types/web/search/utils.d.ts +0 -4
- package/dist/types/workflow/workflow-intent-diff.d.ts +0 -25
- package/dist/types/workflow/workflow-intent-report-consumer.d.ts +0 -50
- package/dist/types/workflow/workflow-intent-report-schema.d.ts +0 -2
- package/dist/types/workflow/workflow-intent-report.d.ts +0 -48
- package/dist/types/workspace-tree.d.ts +0 -42
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import * as crypto from "node:crypto";
|
|
1
2
|
import * as fs from "node:fs";
|
|
3
|
+
|
|
2
4
|
import * as os from "node:os";
|
|
3
5
|
import * as path from "node:path";
|
|
4
|
-
import type
|
|
6
|
+
import { type AgentMessage, canContinuePersistedHistory } from "@sayknow-cli/agent-core";
|
|
5
7
|
import type {
|
|
6
8
|
ImageContent,
|
|
7
9
|
Message,
|
|
@@ -45,8 +47,6 @@ import {
|
|
|
45
47
|
MemoryBlobStore,
|
|
46
48
|
parseBlobRef,
|
|
47
49
|
ResidentBlobMissingError,
|
|
48
|
-
resolveImageData,
|
|
49
|
-
resolveImageDataUrl,
|
|
50
50
|
resolveResidentImageDataSync,
|
|
51
51
|
resolveResidentImageDataUrlSync,
|
|
52
52
|
resolveTextBlobSync,
|
|
@@ -63,7 +63,15 @@ import {
|
|
|
63
63
|
sanitizeRehydratedOpenAIResponsesAssistantMessage,
|
|
64
64
|
stripInternalDetailsFields,
|
|
65
65
|
} from "./messages";
|
|
66
|
-
import type {
|
|
66
|
+
import type {
|
|
67
|
+
SessionStorage,
|
|
68
|
+
SessionStorageSnapshot,
|
|
69
|
+
SessionStorageStat,
|
|
70
|
+
SessionStorageWriter,
|
|
71
|
+
SessionStorageWriterCloseState,
|
|
72
|
+
VerifiedSessionDeleteResult,
|
|
73
|
+
VerifiedSessionDeleteTarget,
|
|
74
|
+
} from "./session-storage";
|
|
67
75
|
import { FileSessionStorage, MemorySessionStorage } from "./session-storage";
|
|
68
76
|
|
|
69
77
|
export const CURRENT_SESSION_VERSION = 3;
|
|
@@ -147,6 +155,53 @@ export interface SessionMessageEntry extends SessionEntryBase {
|
|
|
147
155
|
evictedContent?: EvictedContentMarker;
|
|
148
156
|
}
|
|
149
157
|
|
|
158
|
+
const sessionMessageEntryIds = new WeakMap<object, string>();
|
|
159
|
+
const sessionMessageViewportAnchorIds = new WeakMap<object, string>();
|
|
160
|
+
const sessionMessageObservationIds = new WeakMap<object, string>();
|
|
161
|
+
|
|
162
|
+
export function associateSessionMessageEntryId(message: AgentMessage, entryId: string): void {
|
|
163
|
+
sessionMessageEntryIds.set(message, entryId);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export function getSessionMessageEntryId(message: AgentMessage): string | undefined {
|
|
167
|
+
return sessionMessageEntryIds.get(message);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export function associateSessionMessageObservationId(message: AgentMessage, observationId: string): string {
|
|
171
|
+
const existing = sessionMessageObservationIds.get(message);
|
|
172
|
+
if (existing) return existing;
|
|
173
|
+
sessionMessageObservationIds.set(message, observationId);
|
|
174
|
+
return observationId;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export function getSessionMessageObservationId(message: AgentMessage): string | undefined {
|
|
178
|
+
return sessionMessageObservationIds.get(message);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export function associateSessionMessageViewportAnchorId(message: AgentMessage, anchorId: string): void {
|
|
182
|
+
sessionMessageViewportAnchorIds.set(message, anchorId);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export function getSessionMessageViewportAnchorId(message: AgentMessage): string | undefined {
|
|
186
|
+
return sessionMessageViewportAnchorIds.get(message);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export function transferSessionMessageIdentity(source: AgentMessage[], target: AgentMessage[]): void {
|
|
190
|
+
if (source.length !== target.length) {
|
|
191
|
+
throw new Error(
|
|
192
|
+
`Cannot transfer session message identity across ${source.length} source and ${target.length} target messages`,
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
for (let index = 0; index < source.length; index++) {
|
|
196
|
+
const entryId = getSessionMessageEntryId(source[index]);
|
|
197
|
+
if (entryId) associateSessionMessageEntryId(target[index], entryId);
|
|
198
|
+
const observationId = getSessionMessageObservationId(source[index]);
|
|
199
|
+
if (observationId) associateSessionMessageObservationId(target[index], observationId);
|
|
200
|
+
const anchorId = getSessionMessageViewportAnchorId(source[index]);
|
|
201
|
+
if (anchorId) associateSessionMessageViewportAnchorId(target[index], anchorId);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
150
205
|
export interface ThinkingLevelChangeEntry extends SessionEntryBase {
|
|
151
206
|
type: "thinking_level_change";
|
|
152
207
|
thinkingLevel?: string | null;
|
|
@@ -334,6 +389,48 @@ export interface SessionContext {
|
|
|
334
389
|
modeData?: Record<string, unknown>;
|
|
335
390
|
}
|
|
336
391
|
|
|
392
|
+
/** Immutable fingerprint captured during read-only resume inspection. */
|
|
393
|
+
export interface ResumeSessionIdentity {
|
|
394
|
+
canonicalPath: string;
|
|
395
|
+
sessionId: string;
|
|
396
|
+
dev: bigint;
|
|
397
|
+
ino: bigint;
|
|
398
|
+
size: number;
|
|
399
|
+
mtimeMs: number;
|
|
400
|
+
mtimeNs: bigint;
|
|
401
|
+
sha256: string;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
export interface ResumeTailResumable {
|
|
405
|
+
kind: "resumable";
|
|
406
|
+
identity: ResumeSessionIdentity;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
export interface ResumeTailTerminal {
|
|
410
|
+
kind: "terminal";
|
|
411
|
+
identity: ResumeSessionIdentity;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
export interface ResumeTailError {
|
|
415
|
+
kind: "error";
|
|
416
|
+
reason: "missing" | "malformed" | "unstable" | "read-failed";
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
export type ResumeTailInspection = ResumeTailResumable | ResumeTailTerminal | ResumeTailError;
|
|
420
|
+
|
|
421
|
+
export interface StrictSessionOpenSuccess {
|
|
422
|
+
kind: "opened";
|
|
423
|
+
manager: SessionManager;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
export interface StrictSessionOpenFailure {
|
|
427
|
+
kind: "error";
|
|
428
|
+
reason: ResumeTailError["reason"] | "identity-mismatch";
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
/** Result of opening an inspected session without create-or-rewrite fallback. */
|
|
432
|
+
export type StrictSessionOpenResult = StrictSessionOpenSuccess | StrictSessionOpenFailure;
|
|
433
|
+
|
|
337
434
|
export interface SessionInfo {
|
|
338
435
|
path: string;
|
|
339
436
|
id: string;
|
|
@@ -350,6 +447,56 @@ export interface SessionInfo {
|
|
|
350
447
|
firstMessage: string;
|
|
351
448
|
allMessagesText: string;
|
|
352
449
|
}
|
|
450
|
+
// =============================================================================
|
|
451
|
+
// Strict ACP authorization inventory (fail-closed, never partial authority)
|
|
452
|
+
// =============================================================================
|
|
453
|
+
|
|
454
|
+
/** Kind of failure surfaced by strict scoped inventory. Any failure grants zero authority. */
|
|
455
|
+
export type StrictInventoryFailureKind =
|
|
456
|
+
| "root"
|
|
457
|
+
| "scan"
|
|
458
|
+
| "lstat"
|
|
459
|
+
| "read"
|
|
460
|
+
| "parse"
|
|
461
|
+
| "stat"
|
|
462
|
+
| "header"
|
|
463
|
+
| "cwd"
|
|
464
|
+
| "containment"
|
|
465
|
+
| "identity";
|
|
466
|
+
|
|
467
|
+
/** Sanitized strict-inventory failure. Never carries raw file content. */
|
|
468
|
+
export interface StrictInventoryFailure {
|
|
469
|
+
kind: StrictInventoryFailureKind;
|
|
470
|
+
message: string;
|
|
471
|
+
path?: string;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
/** One exact-identity candidate suitable for ACP authorization binding. */
|
|
475
|
+
export interface StrictInventoryCandidate {
|
|
476
|
+
/** Canonical absolute transcript path. */
|
|
477
|
+
path: string;
|
|
478
|
+
/** Session id parsed from the header. */
|
|
479
|
+
id: string;
|
|
480
|
+
/** Canonical cwd parsed from the header. */
|
|
481
|
+
cwd: string;
|
|
482
|
+
/** Descriptor-bound transcript identity (dev, ino, ...). */
|
|
483
|
+
identity: SessionStorageStat;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* Strict inventory result. `complete` carries the full validated candidate set;
|
|
488
|
+
* `failure` carries every sanitized failure and grants zero page/cursor/authority.
|
|
489
|
+
* A failure result is never reduced to a partial candidate set.
|
|
490
|
+
*/
|
|
491
|
+
export type StrictInventoryResult =
|
|
492
|
+
| { kind: "complete"; candidates: StrictInventoryCandidate[] }
|
|
493
|
+
| { kind: "failure"; failures: StrictInventoryFailure[] };
|
|
494
|
+
|
|
495
|
+
/** Certainty-aware close outcome for strict ACP disposal. */
|
|
496
|
+
export type SessionManagerCloseOutcome =
|
|
497
|
+
| { kind: "closed" }
|
|
498
|
+
| { kind: "close_failed_retryable"; error: Error }
|
|
499
|
+
| { kind: "close_unknown"; error: Error };
|
|
353
500
|
|
|
354
501
|
export type ReadonlySessionManager = Pick<
|
|
355
502
|
SessionManager,
|
|
@@ -519,6 +666,17 @@ function getDefaultSessionDirName(cwd: string): { encodedDirName: string; resolv
|
|
|
519
666
|
return { encodedDirName, resolvedCwd };
|
|
520
667
|
}
|
|
521
668
|
|
|
669
|
+
/** Default and legacy directory candidates for maintenance-free resume discovery. */
|
|
670
|
+
function getReadOnlyDefaultSessionDirs(cwd: string, sessionsRoot: string = getSessionsDir()): string[] {
|
|
671
|
+
const { encodedDirName, resolvedCwd } = getDefaultSessionDirName(cwd);
|
|
672
|
+
const canonicalCwd = resolveEquivalentPath(resolvedCwd);
|
|
673
|
+
return [
|
|
674
|
+
path.join(sessionsRoot, encodedDirName),
|
|
675
|
+
path.join(sessionsRoot, encodeLegacyAbsoluteSessionDirName(canonicalCwd)),
|
|
676
|
+
path.join(sessionsRoot, encodeLegacyAbsoluteSessionDirName(resolvedCwd)),
|
|
677
|
+
].filter((dir, index, dirs) => dirs.indexOf(dir) === index);
|
|
678
|
+
}
|
|
679
|
+
|
|
522
680
|
/**
|
|
523
681
|
* Migrate old `--<home-encoded>-*--` session dirs to the new `-*` format.
|
|
524
682
|
* Runs once per sessions root on first access, best-effort.
|
|
@@ -604,6 +762,7 @@ export function buildSessionContext(
|
|
|
604
762
|
entries: SessionEntry[],
|
|
605
763
|
leafId?: string | null,
|
|
606
764
|
byId?: Map<string, SessionEntry>,
|
|
765
|
+
sessionIdentityNamespace = "legacy-session",
|
|
607
766
|
): SessionContext {
|
|
608
767
|
// Build uuid index if not available
|
|
609
768
|
if (!byId) {
|
|
@@ -749,18 +908,29 @@ export function buildSessionContext(
|
|
|
749
908
|
|
|
750
909
|
const appendMessage = (entry: SessionEntry) => {
|
|
751
910
|
if (entry.type === "message") {
|
|
911
|
+
associateSessionMessageEntryId(entry.message, entry.id);
|
|
752
912
|
messages.push(entry.message);
|
|
753
913
|
} else if (entry.type === "custom_message") {
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
entry.attribution,
|
|
762
|
-
),
|
|
914
|
+
const message = createCustomMessage(
|
|
915
|
+
entry.customType,
|
|
916
|
+
entry.content,
|
|
917
|
+
entry.display,
|
|
918
|
+
entry.details,
|
|
919
|
+
entry.timestamp,
|
|
920
|
+
entry.attribution,
|
|
763
921
|
);
|
|
922
|
+
associateSessionMessageEntryId(message, entry.id);
|
|
923
|
+
const persistedObservationId =
|
|
924
|
+
entry.details && typeof entry.details === "object" && !Array.isArray(entry.details)
|
|
925
|
+
? (entry.details as Record<string, unknown>).observationId
|
|
926
|
+
: undefined;
|
|
927
|
+
associateSessionMessageObservationId(
|
|
928
|
+
message,
|
|
929
|
+
typeof persistedObservationId === "string"
|
|
930
|
+
? persistedObservationId
|
|
931
|
+
: `session:${sessionIdentityNamespace}:entry:${entry.id}`,
|
|
932
|
+
);
|
|
933
|
+
messages.push(message);
|
|
764
934
|
} else if (entry.type === "branch_summary" && entry.summary) {
|
|
765
935
|
messages.push(createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp));
|
|
766
936
|
}
|
|
@@ -838,9 +1008,11 @@ export function buildSessionContext(
|
|
|
838
1008
|
}
|
|
839
1009
|
|
|
840
1010
|
function cloneSessionContext(context: SessionContext): SessionContext {
|
|
1011
|
+
const messages = cloneJsonSemantic(context.messages);
|
|
1012
|
+
transferSessionMessageIdentity(context.messages, messages);
|
|
841
1013
|
return {
|
|
842
1014
|
...context,
|
|
843
|
-
messages
|
|
1015
|
+
messages,
|
|
844
1016
|
models: { ...context.models },
|
|
845
1017
|
injectedTtsrRules: [...context.injectedTtsrRules],
|
|
846
1018
|
injectedTtsrRuleRecords: context.injectedTtsrRuleRecords?.map(record => ({ ...record })),
|
|
@@ -972,48 +1144,253 @@ export async function loadEntriesFromFile(
|
|
|
972
1144
|
return entries;
|
|
973
1145
|
}
|
|
974
1146
|
|
|
1147
|
+
function sameResumeIdentity(left: ResumeSessionIdentity, right: ResumeSessionIdentity): boolean {
|
|
1148
|
+
return (
|
|
1149
|
+
left.canonicalPath === right.canonicalPath &&
|
|
1150
|
+
left.sessionId === right.sessionId &&
|
|
1151
|
+
left.dev === right.dev &&
|
|
1152
|
+
left.ino === right.ino &&
|
|
1153
|
+
left.size === right.size &&
|
|
1154
|
+
left.mtimeMs === right.mtimeMs &&
|
|
1155
|
+
left.mtimeNs === right.mtimeNs &&
|
|
1156
|
+
left.sha256 === right.sha256
|
|
1157
|
+
);
|
|
1158
|
+
}
|
|
1159
|
+
|
|
1160
|
+
function sameResumeStat(left: SessionStorageStat, right: SessionStorageStat): boolean {
|
|
1161
|
+
return (
|
|
1162
|
+
left.isFile &&
|
|
1163
|
+
right.isFile &&
|
|
1164
|
+
left.dev === right.dev &&
|
|
1165
|
+
left.ino === right.ino &&
|
|
1166
|
+
left.size === right.size &&
|
|
1167
|
+
left.mtimeMs === right.mtimeMs &&
|
|
1168
|
+
left.mtimeNs === right.mtimeNs
|
|
1169
|
+
);
|
|
1170
|
+
}
|
|
1171
|
+
|
|
1172
|
+
interface ResumeInspectionSnapshot {
|
|
1173
|
+
identity: ResumeSessionIdentity;
|
|
1174
|
+
entries: FileEntry[];
|
|
1175
|
+
context: SessionContext;
|
|
1176
|
+
migrationApplied: boolean;
|
|
1177
|
+
}
|
|
1178
|
+
|
|
1179
|
+
function resumeReadFailure(error: unknown, storage: SessionStorage, path: string): ResumeTailError {
|
|
1180
|
+
let missing = isEnoent(error);
|
|
1181
|
+
if (!missing) {
|
|
1182
|
+
try {
|
|
1183
|
+
missing = !storage.existsSync(path);
|
|
1184
|
+
} catch {
|
|
1185
|
+
// Preserve the primary read/stat failure when existence cannot be checked.
|
|
1186
|
+
}
|
|
1187
|
+
}
|
|
1188
|
+
return { kind: "error", reason: missing ? "missing" : "read-failed" };
|
|
1189
|
+
}
|
|
1190
|
+
|
|
1191
|
+
function hasStrictSessionSchema(entries: FileEntry[]): boolean {
|
|
1192
|
+
for (const entry of entries) {
|
|
1193
|
+
const value = entry as unknown as Record<string, unknown>;
|
|
1194
|
+
if (typeof value.type !== "string") return false;
|
|
1195
|
+
if (value.type === "session") {
|
|
1196
|
+
if (typeof value.id !== "string" || typeof value.cwd !== "string" || typeof value.timestamp !== "string")
|
|
1197
|
+
return false;
|
|
1198
|
+
continue;
|
|
1199
|
+
}
|
|
1200
|
+
if (
|
|
1201
|
+
typeof value.id !== "string" ||
|
|
1202
|
+
(value.parentId !== null && typeof value.parentId !== "string") ||
|
|
1203
|
+
typeof value.timestamp !== "string"
|
|
1204
|
+
) {
|
|
1205
|
+
return false;
|
|
1206
|
+
}
|
|
1207
|
+
switch (value.type) {
|
|
1208
|
+
case "message": {
|
|
1209
|
+
if (typeof value.message !== "object" || value.message === null) return false;
|
|
1210
|
+
const message = value.message as Record<string, unknown>;
|
|
1211
|
+
if (typeof message.role !== "string") return false;
|
|
1212
|
+
break;
|
|
1213
|
+
}
|
|
1214
|
+
case "model_change":
|
|
1215
|
+
if (
|
|
1216
|
+
typeof value.model !== "string" &&
|
|
1217
|
+
!(typeof value.provider === "string" && typeof value.modelId === "string")
|
|
1218
|
+
)
|
|
1219
|
+
return false;
|
|
1220
|
+
break;
|
|
1221
|
+
case "compaction":
|
|
1222
|
+
if (
|
|
1223
|
+
typeof value.summary !== "string" ||
|
|
1224
|
+
typeof value.firstKeptEntryId !== "string" ||
|
|
1225
|
+
typeof value.tokensBefore !== "number"
|
|
1226
|
+
)
|
|
1227
|
+
return false;
|
|
1228
|
+
break;
|
|
1229
|
+
case "branch_summary":
|
|
1230
|
+
if (typeof value.fromId !== "string" || typeof value.summary !== "string") return false;
|
|
1231
|
+
break;
|
|
1232
|
+
case "custom":
|
|
1233
|
+
if (typeof value.customType !== "string") return false;
|
|
1234
|
+
break;
|
|
1235
|
+
case "custom_message":
|
|
1236
|
+
if (
|
|
1237
|
+
typeof value.customType !== "string" ||
|
|
1238
|
+
(typeof value.content !== "string" && !Array.isArray(value.content)) ||
|
|
1239
|
+
typeof value.display !== "boolean"
|
|
1240
|
+
)
|
|
1241
|
+
return false;
|
|
1242
|
+
break;
|
|
1243
|
+
case "label":
|
|
1244
|
+
if (typeof value.targetId !== "string" || (value.label !== undefined && typeof value.label !== "string"))
|
|
1245
|
+
return false;
|
|
1246
|
+
break;
|
|
1247
|
+
case "ttsr_injection":
|
|
1248
|
+
if (!Array.isArray(value.injectedRules) || !value.injectedRules.every(rule => typeof rule === "string"))
|
|
1249
|
+
return false;
|
|
1250
|
+
break;
|
|
1251
|
+
case "mcp_tool_selection":
|
|
1252
|
+
if (
|
|
1253
|
+
!Array.isArray(value.selectedToolNames) ||
|
|
1254
|
+
!value.selectedToolNames.every(name => typeof name === "string")
|
|
1255
|
+
)
|
|
1256
|
+
return false;
|
|
1257
|
+
break;
|
|
1258
|
+
case "session_init":
|
|
1259
|
+
if (
|
|
1260
|
+
typeof value.systemPrompt !== "string" ||
|
|
1261
|
+
typeof value.task !== "string" ||
|
|
1262
|
+
!Array.isArray(value.tools) ||
|
|
1263
|
+
!value.tools.every(tool => typeof tool === "string")
|
|
1264
|
+
)
|
|
1265
|
+
return false;
|
|
1266
|
+
break;
|
|
1267
|
+
case "mode_change":
|
|
1268
|
+
if (typeof value.mode !== "string") return false;
|
|
1269
|
+
break;
|
|
1270
|
+
case "thinking_level_change":
|
|
1271
|
+
if (
|
|
1272
|
+
value.thinkingLevel !== undefined &&
|
|
1273
|
+
value.thinkingLevel !== null &&
|
|
1274
|
+
typeof value.thinkingLevel !== "string"
|
|
1275
|
+
)
|
|
1276
|
+
return false;
|
|
1277
|
+
break;
|
|
1278
|
+
case "service_tier_change":
|
|
1279
|
+
if (value.serviceTier !== null && typeof value.serviceTier !== "string") return false;
|
|
1280
|
+
break;
|
|
1281
|
+
default:
|
|
1282
|
+
return false;
|
|
1283
|
+
}
|
|
1284
|
+
}
|
|
1285
|
+
return true;
|
|
1286
|
+
}
|
|
1287
|
+
|
|
1288
|
+
function inspectResumeSessionFile(
|
|
1289
|
+
filePath: string,
|
|
1290
|
+
storage: SessionStorage,
|
|
1291
|
+
): ResumeInspectionSnapshot | ResumeTailError {
|
|
1292
|
+
const canonicalPath = resolveEquivalentPath(path.resolve(filePath));
|
|
1293
|
+
let before: SessionStorageStat;
|
|
1294
|
+
try {
|
|
1295
|
+
before = storage.statSync(canonicalPath);
|
|
1296
|
+
} catch (error) {
|
|
1297
|
+
return resumeReadFailure(error, storage, canonicalPath);
|
|
1298
|
+
}
|
|
1299
|
+
if (!before.isFile || !storage.readSnapshotSync) {
|
|
1300
|
+
return { kind: "error", reason: "read-failed" };
|
|
1301
|
+
}
|
|
1302
|
+
|
|
1303
|
+
let bytes: Uint8Array;
|
|
1304
|
+
let snapshot: SessionStorageStat;
|
|
1305
|
+
let after: SessionStorageStat;
|
|
1306
|
+
try {
|
|
1307
|
+
const readSnapshot = storage.readSnapshotSync(canonicalPath);
|
|
1308
|
+
bytes = readSnapshot.bytes;
|
|
1309
|
+
snapshot = readSnapshot.stat;
|
|
1310
|
+
after = storage.statSync(canonicalPath);
|
|
1311
|
+
} catch (error) {
|
|
1312
|
+
return resumeReadFailure(error, storage, canonicalPath);
|
|
1313
|
+
}
|
|
1314
|
+
if (!sameResumeStat(before, snapshot) || !sameResumeStat(snapshot, after)) {
|
|
1315
|
+
return { kind: "error", reason: "unstable" };
|
|
1316
|
+
}
|
|
1317
|
+
|
|
1318
|
+
try {
|
|
1319
|
+
const content = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
|
|
1320
|
+
for (const line of content.split(/\r?\n/)) {
|
|
1321
|
+
if (line.length === 0) continue;
|
|
1322
|
+
JSON.parse(line);
|
|
1323
|
+
}
|
|
1324
|
+
const entries = parseSessionEntries(content);
|
|
1325
|
+
const header = entries[0] as SessionHeader | undefined;
|
|
1326
|
+
if (header?.type !== "session" || typeof header.id !== "string") {
|
|
1327
|
+
return { kind: "error", reason: "malformed" };
|
|
1328
|
+
}
|
|
1329
|
+
const migrationApplied = migrateToCurrentVersion(entries);
|
|
1330
|
+
if (!hasStrictSessionSchema(entries)) return { kind: "error", reason: "malformed" };
|
|
1331
|
+
const context = buildSessionContext(
|
|
1332
|
+
entries.filter((entry): entry is SessionEntry => entry.type !== "session"),
|
|
1333
|
+
undefined,
|
|
1334
|
+
undefined,
|
|
1335
|
+
header.id,
|
|
1336
|
+
);
|
|
1337
|
+
const identity: ResumeSessionIdentity = {
|
|
1338
|
+
canonicalPath,
|
|
1339
|
+
sessionId: header.id,
|
|
1340
|
+
dev: snapshot.dev,
|
|
1341
|
+
ino: snapshot.ino,
|
|
1342
|
+
size: snapshot.size,
|
|
1343
|
+
mtimeMs: snapshot.mtimeMs,
|
|
1344
|
+
mtimeNs: snapshot.mtimeNs,
|
|
1345
|
+
sha256: crypto.createHash("sha256").update(bytes).digest("hex"),
|
|
1346
|
+
};
|
|
1347
|
+
return { identity, entries, context, migrationApplied };
|
|
1348
|
+
} catch {
|
|
1349
|
+
return { kind: "error", reason: "malformed" };
|
|
1350
|
+
}
|
|
1351
|
+
}
|
|
1352
|
+
|
|
975
1353
|
/**
|
|
976
|
-
*
|
|
977
|
-
*
|
|
1354
|
+
* Convert legacy persisted blob references in loaded entries into resident sentinels.
|
|
1355
|
+
* Images then materialize lazily at provider/display/export chokepoints instead of
|
|
1356
|
+
* pinning every historical base64 string for the lifetime of a resumed session.
|
|
978
1357
|
*/
|
|
979
1358
|
function hasImageUrl(value: unknown): value is { image_url: string | { url?: string } } {
|
|
980
1359
|
return typeof value === "object" && value !== null && "image_url" in value;
|
|
981
1360
|
}
|
|
982
1361
|
|
|
983
|
-
|
|
1362
|
+
function residentizePersistedBlobRefs(value: unknown, key?: string): void {
|
|
984
1363
|
if (Array.isArray(value)) {
|
|
985
|
-
|
|
1364
|
+
for (const item of value) residentizePersistedBlobRefs(item, key);
|
|
986
1365
|
return;
|
|
987
1366
|
}
|
|
988
1367
|
|
|
989
1368
|
if (typeof value !== "object" || value === null) return;
|
|
990
1369
|
|
|
991
1370
|
if (isImageBlock(value) && isBlobRef(value.data)) {
|
|
992
|
-
value.data =
|
|
1371
|
+
value.data = residentBlobSentinel("imageData", value.data) as unknown as string;
|
|
993
1372
|
}
|
|
994
1373
|
|
|
995
1374
|
if (hasImageUrl(value)) {
|
|
996
1375
|
if (typeof value.image_url === "string" && isBlobRef(value.image_url)) {
|
|
997
|
-
value.image_url =
|
|
1376
|
+
value.image_url = residentBlobSentinel("imageUrl", value.image_url) as unknown as string;
|
|
998
1377
|
} else if (
|
|
999
1378
|
typeof value.image_url === "object" &&
|
|
1000
1379
|
value.image_url !== null &&
|
|
1001
1380
|
typeof value.image_url.url === "string" &&
|
|
1002
1381
|
isBlobRef(value.image_url.url)
|
|
1003
1382
|
) {
|
|
1004
|
-
value.image_url.url =
|
|
1383
|
+
value.image_url.url = residentBlobSentinel("imageUrl", value.image_url.url) as unknown as string;
|
|
1005
1384
|
}
|
|
1006
1385
|
}
|
|
1007
1386
|
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
}),
|
|
1016
|
-
);
|
|
1387
|
+
for (const [childKey, item] of Object.entries(value)) {
|
|
1388
|
+
if (childKey === "data" && typeof item === "string" && isBlobRef(item) && key !== TEXT_CONTENT_KEY) {
|
|
1389
|
+
(value as Record<string, unknown>)[childKey] = residentBlobSentinel("imageUrl", item);
|
|
1390
|
+
continue;
|
|
1391
|
+
}
|
|
1392
|
+
residentizePersistedBlobRefs(item, childKey);
|
|
1393
|
+
}
|
|
1017
1394
|
}
|
|
1018
1395
|
|
|
1019
1396
|
/**
|
|
@@ -1035,28 +1412,13 @@ async function runWithConcurrency(tasks: Array<() => Promise<void>>, limit: numb
|
|
|
1035
1412
|
await Promise.all(Array.from({ length: workerCount }, () => worker()));
|
|
1036
1413
|
}
|
|
1037
1414
|
|
|
1038
|
-
async function resolveBlobRefsInEntries(entries: FileEntry[],
|
|
1415
|
+
async function resolveBlobRefsInEntries(entries: FileEntry[], _blobStore: BlobStore): Promise<void> {
|
|
1039
1416
|
const tasks: Array<() => Promise<void>> = [];
|
|
1040
1417
|
|
|
1041
1418
|
for (const entry of entries) {
|
|
1042
1419
|
if (entry.type === "session") continue;
|
|
1043
|
-
|
|
1044
|
-
let contentArray: unknown[] | undefined;
|
|
1045
|
-
if (entry.type === "message" && "content" in entry.message && Array.isArray(entry.message.content)) {
|
|
1046
|
-
contentArray = entry.message.content;
|
|
1047
|
-
} else if (entry.type === "custom_message" && Array.isArray(entry.content)) {
|
|
1048
|
-
contentArray = entry.content;
|
|
1049
|
-
}
|
|
1050
|
-
|
|
1051
1420
|
tasks.push(async () => {
|
|
1052
|
-
|
|
1053
|
-
for (const block of contentArray) {
|
|
1054
|
-
if (isImageBlock(block) && isBlobRef(block.data)) {
|
|
1055
|
-
block.data = await resolveImageData(blobStore, block.data);
|
|
1056
|
-
}
|
|
1057
|
-
}
|
|
1058
|
-
}
|
|
1059
|
-
await resolvePersistedBlobRefs(entry, blobStore);
|
|
1421
|
+
residentizePersistedBlobRefs(entry);
|
|
1060
1422
|
});
|
|
1061
1423
|
}
|
|
1062
1424
|
|
|
@@ -1314,6 +1676,33 @@ function containsResidentSentinel(value: unknown, seen = new WeakSet<object>()):
|
|
|
1314
1676
|
return false;
|
|
1315
1677
|
}
|
|
1316
1678
|
|
|
1679
|
+
function containsResidentImageSentinel(value: unknown, seen = new WeakSet<object>()): boolean {
|
|
1680
|
+
if (value === null || value === undefined || typeof value !== "object") return false;
|
|
1681
|
+
if (isResidentBlobSentinel(value)) return value.kind === "imageUrl" || value.kind === "imageData";
|
|
1682
|
+
if (seen.has(value)) return false;
|
|
1683
|
+
seen.add(value);
|
|
1684
|
+
if (Array.isArray(value)) return value.some(item => containsResidentImageSentinel(item, seen));
|
|
1685
|
+
for (const child of Object.values(value)) {
|
|
1686
|
+
if (containsResidentImageSentinel(child, seen)) return true;
|
|
1687
|
+
}
|
|
1688
|
+
return false;
|
|
1689
|
+
}
|
|
1690
|
+
|
|
1691
|
+
function collectResidentImageRefs(value: unknown, refs: Set<string>, seen = new WeakSet<object>()): void {
|
|
1692
|
+
if (value === null || value === undefined || typeof value !== "object") return;
|
|
1693
|
+
if (isResidentBlobSentinel(value)) {
|
|
1694
|
+
if (value.kind === "imageUrl" || value.kind === "imageData") refs.add(value.ref);
|
|
1695
|
+
return;
|
|
1696
|
+
}
|
|
1697
|
+
if (seen.has(value)) return;
|
|
1698
|
+
seen.add(value);
|
|
1699
|
+
if (Array.isArray(value)) {
|
|
1700
|
+
for (const item of value) collectResidentImageRefs(item, refs, seen);
|
|
1701
|
+
return;
|
|
1702
|
+
}
|
|
1703
|
+
for (const child of Object.values(value)) collectResidentImageRefs(child, refs, seen);
|
|
1704
|
+
}
|
|
1705
|
+
|
|
1317
1706
|
/**
|
|
1318
1707
|
* Recursively truncate large strings in an object for session persistence.
|
|
1319
1708
|
* - Truncates any oversized string fields (key-agnostic)
|
|
@@ -1596,11 +1985,13 @@ function cloneJsonSemantic<T>(value: T): T {
|
|
|
1596
1985
|
}
|
|
1597
1986
|
|
|
1598
1987
|
function cloneAgentMessage<T extends AgentMessage>(message: T): T {
|
|
1599
|
-
|
|
1988
|
+
const cloned = {
|
|
1600
1989
|
...message,
|
|
1601
1990
|
...("content" in message ? { content: cloneJsonSemantic(message.content) } : {}),
|
|
1602
1991
|
...("providerPayload" in message ? { providerPayload: cloneJsonSemantic(message.providerPayload) } : {}),
|
|
1603
|
-
};
|
|
1992
|
+
} as T;
|
|
1993
|
+
transferSessionMessageIdentity([message], [cloned]);
|
|
1994
|
+
return cloned;
|
|
1604
1995
|
}
|
|
1605
1996
|
|
|
1606
1997
|
function cloneSessionEntry(entry: SessionEntry): SessionEntry {
|
|
@@ -2187,6 +2578,7 @@ class NdjsonFileWriter {
|
|
|
2187
2578
|
#error: Error | undefined;
|
|
2188
2579
|
#pendingWrites: Promise<void> = Promise.resolve();
|
|
2189
2580
|
#onError: ((err: Error) => void) | undefined;
|
|
2581
|
+
#closeDrained = false;
|
|
2190
2582
|
|
|
2191
2583
|
constructor(storage: SessionStorage, path: string, options?: { flags?: "a" | "w"; onError?: (err: Error) => void }) {
|
|
2192
2584
|
this.#onError = options?.onError;
|
|
@@ -2280,35 +2672,61 @@ class NdjsonFileWriter {
|
|
|
2280
2672
|
}
|
|
2281
2673
|
}
|
|
2282
2674
|
|
|
2283
|
-
/** Close the writer, flushing all data. */
|
|
2675
|
+
/** Close the writer, flushing all data. Retryable across certified pre-dispatch failures. */
|
|
2284
2676
|
async close(): Promise<void> {
|
|
2285
|
-
|
|
2286
|
-
this.#
|
|
2677
|
+
// Terminal (confirmed closed or quarantined close_unknown): no further attempts.
|
|
2678
|
+
if (this.#closed) return;
|
|
2679
|
+
// Re-entry guard: once a fresh attempt has started draining, block concurrent
|
|
2680
|
+
// close() calls. A retry after a certified pre-dispatch failure has #closing
|
|
2681
|
+
// reset and #closeDrained set, so it re-enters to actually re-dispatch the
|
|
2682
|
+
// underlying OS close — the wrapper must NOT mark itself closed on a retryable
|
|
2683
|
+
// failure, and must allow a genuine later retry.
|
|
2684
|
+
if (this.#closing) return;
|
|
2287
2685
|
|
|
2288
|
-
|
|
2289
|
-
try {
|
|
2290
|
-
await this.flush();
|
|
2291
|
-
} catch (err) {
|
|
2292
|
-
closeError = toError(err);
|
|
2293
|
-
}
|
|
2686
|
+
this.#closing = true;
|
|
2294
2687
|
|
|
2295
|
-
|
|
2296
|
-
|
|
2297
|
-
|
|
2298
|
-
|
|
2688
|
+
let drainError: Error | undefined;
|
|
2689
|
+
// Only drain once: a retry after a pre-dispatch failure has already flushed
|
|
2690
|
+
// pending writes, and the underlying writer rejects further flushes while in
|
|
2691
|
+
// the retryable state. Re-draining would mask the close retry with that error.
|
|
2692
|
+
if (!this.#closeDrained) {
|
|
2693
|
+
try {
|
|
2694
|
+
await this.flush();
|
|
2695
|
+
} catch (err) {
|
|
2696
|
+
drainError = toError(err);
|
|
2697
|
+
}
|
|
2698
|
+
try {
|
|
2699
|
+
await this.#pendingWrites;
|
|
2700
|
+
} catch (err) {
|
|
2701
|
+
if (!drainError) drainError = toError(err);
|
|
2702
|
+
}
|
|
2703
|
+
this.#closeDrained = true;
|
|
2299
2704
|
}
|
|
2300
2705
|
|
|
2301
2706
|
try {
|
|
2302
2707
|
await this.#writer.close();
|
|
2303
2708
|
} catch (err) {
|
|
2304
|
-
|
|
2305
|
-
|
|
2709
|
+
if (this.#writer.getCloseState() === "close_failed_retryable") {
|
|
2710
|
+
// Certified pre-dispatch failure: the numeric fd is still owned and a
|
|
2711
|
+
// later retry is safe. Do NOT mark the wrapper closed, do NOT poison
|
|
2712
|
+
// #error (the retry must still be able to flush/close), and reset
|
|
2713
|
+
// #closing so the retry can actually re-dispatch. Surface the failure —
|
|
2714
|
+
// a partial close is never reported as success.
|
|
2715
|
+
this.#closing = false;
|
|
2716
|
+
throw toError(err);
|
|
2717
|
+
}
|
|
2718
|
+
// close_unknown (quarantined) or other dispatched failure: terminal. Record
|
|
2719
|
+
// the error and mark the wrapper closed so no retry/finalizer touches the
|
|
2720
|
+
// uncertain fd again.
|
|
2721
|
+
this.#closed = true;
|
|
2722
|
+
throw this.#recordError(err);
|
|
2306
2723
|
}
|
|
2307
2724
|
|
|
2725
|
+
// Confirmed closed (underlying close succeeded).
|
|
2308
2726
|
this.#closed = true;
|
|
2309
2727
|
|
|
2310
|
-
if (
|
|
2311
|
-
if (
|
|
2728
|
+
if (drainError) throw drainError;
|
|
2729
|
+
if (this.#error) throw this.#error;
|
|
2312
2730
|
}
|
|
2313
2731
|
|
|
2314
2732
|
/** Check if there's a stored error. */
|
|
@@ -2316,16 +2734,49 @@ class NdjsonFileWriter {
|
|
|
2316
2734
|
return this.#error;
|
|
2317
2735
|
}
|
|
2318
2736
|
|
|
2319
|
-
/**
|
|
2737
|
+
/**
|
|
2738
|
+
* True only while the writer accepts new writes. A retryable close failure
|
|
2739
|
+
* leaves the wrapper non-terminal but the underlying fd rejects writes, so
|
|
2740
|
+
* callers route appends around it rather than through it.
|
|
2741
|
+
*/
|
|
2320
2742
|
isOpen(): boolean {
|
|
2321
|
-
|
|
2743
|
+
if (this.#closed || this.#closing) return false;
|
|
2744
|
+
return this.#writer.getCloseState() === "open";
|
|
2322
2745
|
}
|
|
2323
2746
|
|
|
2747
|
+
/**
|
|
2748
|
+
* Truthful synchronous close used by the atomic-rewrite path: dispatches the
|
|
2749
|
+
* underlying close synchronously and throws on failure so a close failure is
|
|
2750
|
+
* observable BEFORE the rename step. No fire-and-forget: the old suppression
|
|
2751
|
+
* (`close().catch(() => {})`) let a rename proceed on an unclosed file.
|
|
2752
|
+
*/
|
|
2324
2753
|
closeSync(): void {
|
|
2325
2754
|
if (this.#closed) return;
|
|
2755
|
+
if (this.#closing) return;
|
|
2756
|
+
// The sync path's writeSync bypasses the async queue, so #pendingWrites is
|
|
2757
|
+
// not applicable; the caller has already issued every writeSync before this.
|
|
2758
|
+
try {
|
|
2759
|
+
this.#writer.closeSync();
|
|
2760
|
+
} catch (err) {
|
|
2761
|
+
if (this.#writer.getCloseState() === "close_failed_retryable") {
|
|
2762
|
+
// Retryable: keep the wrapper open for the cleanup retry in the caller's
|
|
2763
|
+
// catch block; surface the failure so the rename is skipped.
|
|
2764
|
+
throw toError(err);
|
|
2765
|
+
}
|
|
2766
|
+
this.#closed = true;
|
|
2767
|
+
throw this.#recordError(err);
|
|
2768
|
+
}
|
|
2326
2769
|
this.#closed = true;
|
|
2327
|
-
|
|
2328
|
-
|
|
2770
|
+
}
|
|
2771
|
+
|
|
2772
|
+
/** Certainty-aware close state of the underlying storage writer. */
|
|
2773
|
+
getCloseState(): SessionStorageWriterCloseState {
|
|
2774
|
+
return this.#writer.getCloseState();
|
|
2775
|
+
}
|
|
2776
|
+
|
|
2777
|
+
/** Stored error for a non-success underlying close state. */
|
|
2778
|
+
getCloseError(): Error | undefined {
|
|
2779
|
+
return this.#writer.getCloseError();
|
|
2329
2780
|
}
|
|
2330
2781
|
}
|
|
2331
2782
|
|
|
@@ -2912,6 +3363,26 @@ export class SessionManager {
|
|
|
2912
3363
|
await this.setSessionFile(sessionFile);
|
|
2913
3364
|
}
|
|
2914
3365
|
|
|
3366
|
+
async #hydrateExistingSession(sessionFile: string, entries: FileEntry[], migrationApplied: boolean): Promise<void> {
|
|
3367
|
+
const header = entries[0] as SessionHeader;
|
|
3368
|
+
this.#sessionFile = path.resolve(sessionFile);
|
|
3369
|
+
this.#sessionId = header.id;
|
|
3370
|
+
this.#sessionName = header.title;
|
|
3371
|
+
this.#titleSource = header.titleSource;
|
|
3372
|
+
this.#needsFullRewriteOnNextPersist = migrationApplied;
|
|
3373
|
+
await resolveBlobRefsInEntries(entries, this.#blobStore);
|
|
3374
|
+
this.#fileEntries = entries;
|
|
3375
|
+
this.#resetResidentTextBlobStore();
|
|
3376
|
+
this.#fileEntries = this.#fileEntries.map(entry =>
|
|
3377
|
+
prepareEntryForResidentSync(entry, this.#residentBlobStores()),
|
|
3378
|
+
);
|
|
3379
|
+
this.sanitizeLoadedOpenAIResponsesReplayMetadata();
|
|
3380
|
+
this.#buildIndex();
|
|
3381
|
+
this.#bumpAllRevisions();
|
|
3382
|
+
this.#flushed = true;
|
|
3383
|
+
this.#ensuredOnDisk = true;
|
|
3384
|
+
}
|
|
3385
|
+
|
|
2915
3386
|
/** Initialize with a new session (used by factory methods) */
|
|
2916
3387
|
#initNewSession(): void {
|
|
2917
3388
|
this.#newSessionSync();
|
|
@@ -3437,7 +3908,15 @@ export class SessionManager {
|
|
|
3437
3908
|
writer.closeSync();
|
|
3438
3909
|
this.#replaceSessionFileSync(tempPath, this.#sessionFile);
|
|
3439
3910
|
} catch (err) {
|
|
3440
|
-
|
|
3911
|
+
// closeSync is now truthful and may throw; wrap the best-effort cleanup so
|
|
3912
|
+
// the original error (write/close failure) is the one surfaced, not the
|
|
3913
|
+
// cleanup failure. The rename above was already skipped because closeSync
|
|
3914
|
+
// threw before it.
|
|
3915
|
+
try {
|
|
3916
|
+
writer.closeSync();
|
|
3917
|
+
} catch {
|
|
3918
|
+
// Best-effort cleanup of the temp writer's descriptor.
|
|
3919
|
+
}
|
|
3441
3920
|
void this.storage.unlink(tempPath).catch(() => {});
|
|
3442
3921
|
throw toError(err);
|
|
3443
3922
|
}
|
|
@@ -3535,6 +4014,73 @@ export class SessionManager {
|
|
|
3535
4014
|
this.#disposeResidentTextBlobStore();
|
|
3536
4015
|
if (this.#persistError) throw this.#persistError;
|
|
3537
4016
|
}
|
|
4017
|
+
/** Flush while open, then strictly close; retryable close skips the invalid second flush. */
|
|
4018
|
+
async flushAndCloseStrict(): Promise<SessionManagerCloseOutcome> {
|
|
4019
|
+
if (this.#persistWriter?.getCloseState() !== "close_failed_retryable") {
|
|
4020
|
+
await this.flush();
|
|
4021
|
+
}
|
|
4022
|
+
return this.closeStrict();
|
|
4023
|
+
}
|
|
4024
|
+
|
|
4025
|
+
/**
|
|
4026
|
+
* Strictly flush and close the persist writer, returning the certainty-aware close
|
|
4027
|
+
* outcome without manufacturing success. The existing {@link close} path is
|
|
4028
|
+
* preserved for best-effort callers; this seam lets strict ACP disposal prove
|
|
4029
|
+
* writer closure before any destructive operation.
|
|
4030
|
+
*/
|
|
4031
|
+
async closeStrict(): Promise<SessionManagerCloseOutcome> {
|
|
4032
|
+
let outcome: SessionManagerCloseOutcome = { kind: "closed" };
|
|
4033
|
+
await this.#queuePersistTask(async () => {
|
|
4034
|
+
const writer = this.#persistWriter;
|
|
4035
|
+
if (!writer) {
|
|
4036
|
+
this.#flushed = true;
|
|
4037
|
+
return;
|
|
4038
|
+
}
|
|
4039
|
+
try {
|
|
4040
|
+
await writer.close();
|
|
4041
|
+
} catch {
|
|
4042
|
+
// Outcome is captured from the underlying writer's close state below.
|
|
4043
|
+
}
|
|
4044
|
+
outcome = this.#closeOutcomeFromWriter(writer);
|
|
4045
|
+
if (outcome.kind === "closed") {
|
|
4046
|
+
this.#flushed = true;
|
|
4047
|
+
// Confirmed closed: release writer ownership.
|
|
4048
|
+
this.#persistWriter = undefined;
|
|
4049
|
+
this.#persistWriterPath = undefined;
|
|
4050
|
+
} else if (outcome.kind === "close_unknown") {
|
|
4051
|
+
// Quarantined (terminal): release ownership so no retry/finalizer
|
|
4052
|
+
// touches the uncertain fd again.
|
|
4053
|
+
this.#persistWriter = undefined;
|
|
4054
|
+
this.#persistWriterPath = undefined;
|
|
4055
|
+
}
|
|
4056
|
+
// close_failed_retryable: RETAIN the writer so a later closeStrict() call
|
|
4057
|
+
// can actually re-dispatch the OS close (ownership stays proven). The
|
|
4058
|
+
// wrapper must not manufacture success or surrender a retryable fd.
|
|
4059
|
+
});
|
|
4060
|
+
// Only tear down the resident blob store on a terminal outcome; a retryable
|
|
4061
|
+
// close leaves the session live for a genuine retry.
|
|
4062
|
+
if (!this.#persistWriter) {
|
|
4063
|
+
this.#disposeResidentTextBlobStore();
|
|
4064
|
+
}
|
|
4065
|
+
return outcome;
|
|
4066
|
+
}
|
|
4067
|
+
|
|
4068
|
+
#closeOutcomeFromWriter(writer: NdjsonFileWriter): SessionManagerCloseOutcome {
|
|
4069
|
+
const state = writer.getCloseState();
|
|
4070
|
+
const error = writer.getCloseError();
|
|
4071
|
+
switch (state) {
|
|
4072
|
+
case "closed":
|
|
4073
|
+
return { kind: "closed" };
|
|
4074
|
+
case "close_failed_retryable":
|
|
4075
|
+
return { kind: "close_failed_retryable", error: error ?? new Error("Writer close failed before dispatch") };
|
|
4076
|
+
case "close_unknown":
|
|
4077
|
+
return { kind: "close_unknown", error: error ?? new Error("Writer close outcome is unknown") };
|
|
4078
|
+
default:
|
|
4079
|
+
// "open" should not occur after close() returned, but treat defensively as
|
|
4080
|
+
// a non-quiescent terminal state rather than confirmed closed.
|
|
4081
|
+
return { kind: "close_unknown", error: error ?? new Error("Writer close did not dispatch") };
|
|
4082
|
+
}
|
|
4083
|
+
}
|
|
3538
4084
|
|
|
3539
4085
|
getCwd(): string {
|
|
3540
4086
|
return this.cwd;
|
|
@@ -3865,7 +4411,10 @@ export class SessionManager {
|
|
|
3865
4411
|
timestamp: new Date().toISOString(),
|
|
3866
4412
|
message,
|
|
3867
4413
|
};
|
|
4414
|
+
associateSessionMessageEntryId(message, entry.id);
|
|
3868
4415
|
this.#appendEntry(entry);
|
|
4416
|
+
const residentEntry = this.#byId.get(entry.id);
|
|
4417
|
+
if (residentEntry?.type === "message") transferSessionMessageIdentity([message], [residentEntry.message]);
|
|
3869
4418
|
return entry.id;
|
|
3870
4419
|
}
|
|
3871
4420
|
|
|
@@ -4058,7 +4607,15 @@ export class SessionManager {
|
|
|
4058
4607
|
display: boolean,
|
|
4059
4608
|
details?: T,
|
|
4060
4609
|
attribution: MessageAttribution = "agent",
|
|
4610
|
+
observationId?: string,
|
|
4061
4611
|
): string {
|
|
4612
|
+
const entryId = generateId(this.#byId);
|
|
4613
|
+
const stableObservationId =
|
|
4614
|
+
observationId ?? (customType.startsWith("irc:") ? `session:${this.#sessionId}:entry:${entryId}` : undefined);
|
|
4615
|
+
const persistedDetails =
|
|
4616
|
+
stableObservationId && details && typeof details === "object" && !Array.isArray(details)
|
|
4617
|
+
? ({ ...details, observationId: stableObservationId } as T)
|
|
4618
|
+
: details;
|
|
4062
4619
|
const entry: CustomMessageEntry<T> = {
|
|
4063
4620
|
type: "custom_message",
|
|
4064
4621
|
customType,
|
|
@@ -4067,9 +4624,9 @@ export class SessionManager {
|
|
|
4067
4624
|
// Drop AgentSession-internal transient fields (allowlist in
|
|
4068
4625
|
// `INTERNAL_DETAILS_FIELDS`) before disk persistence. Single
|
|
4069
4626
|
// chokepoint covers every CustomMessage write path.
|
|
4070
|
-
details: stripInternalDetailsFields(
|
|
4627
|
+
details: stripInternalDetailsFields(persistedDetails),
|
|
4071
4628
|
attribution,
|
|
4072
|
-
id:
|
|
4629
|
+
id: entryId,
|
|
4073
4630
|
parentId: this.#leafId,
|
|
4074
4631
|
timestamp: new Date().toISOString(),
|
|
4075
4632
|
};
|
|
@@ -4148,6 +4705,22 @@ export class SessionManager {
|
|
|
4148
4705
|
return entry ? materializeResidentEntryForReadSync(entry, this.#residentBlobStores(), new Map()) : undefined;
|
|
4149
4706
|
}
|
|
4150
4707
|
|
|
4708
|
+
getResidentImageBytes(): number {
|
|
4709
|
+
const refs = new Set<string>();
|
|
4710
|
+
for (const entry of this.#fileEntries) collectResidentImageRefs(entry, refs);
|
|
4711
|
+
let bytes = 0;
|
|
4712
|
+
for (const ref of refs) {
|
|
4713
|
+
const hash = parseBlobRef(ref);
|
|
4714
|
+
if (!hash) continue;
|
|
4715
|
+
try {
|
|
4716
|
+
bytes += fs.statSync(path.join(this.#residentImageBlobStore.dir, hash)).size;
|
|
4717
|
+
} catch (err) {
|
|
4718
|
+
if (!isEnoent(err)) throw err;
|
|
4719
|
+
}
|
|
4720
|
+
}
|
|
4721
|
+
return bytes;
|
|
4722
|
+
}
|
|
4723
|
+
|
|
4151
4724
|
/**
|
|
4152
4725
|
* Get the most recent model role from the current session path.
|
|
4153
4726
|
* Returns undefined if no model change has been recorded.
|
|
@@ -4471,7 +5044,12 @@ export class SessionManager {
|
|
|
4471
5044
|
return cloneSessionContext(cached);
|
|
4472
5045
|
}
|
|
4473
5046
|
this.#pathOnlyContextBuildCount++;
|
|
4474
|
-
const context = buildSessionContext(
|
|
5047
|
+
const context = buildSessionContext(
|
|
5048
|
+
this.#getActivePathEntriesForProviderContext(),
|
|
5049
|
+
this.#leafId,
|
|
5050
|
+
undefined,
|
|
5051
|
+
this.#sessionId,
|
|
5052
|
+
);
|
|
4475
5053
|
this.#sessionContextCache = new WeakRef(context);
|
|
4476
5054
|
this.#sessionContextEntryRevision = this.#entryRevision;
|
|
4477
5055
|
this.#sessionContextLeafRevision = this.#leafRevision;
|
|
@@ -4521,6 +5099,9 @@ export class SessionManager {
|
|
|
4521
5099
|
this.#residentBlobStoresForColdRehydrate(),
|
|
4522
5100
|
);
|
|
4523
5101
|
if (rehydrated !== materialized) this.#coldSpillReadCount += this.#countColdSpillPayloads(entry);
|
|
5102
|
+
if (entry.type === "message" && rehydrated.type === "message") {
|
|
5103
|
+
transferSessionMessageIdentity([entry.message], [rehydrated.message]);
|
|
5104
|
+
}
|
|
4524
5105
|
return rehydrated;
|
|
4525
5106
|
}
|
|
4526
5107
|
|
|
@@ -4571,11 +5152,14 @@ export class SessionManager {
|
|
|
4571
5152
|
}
|
|
4572
5153
|
this.#materializedEntriesCachePopulateCount++;
|
|
4573
5154
|
const resolvedTextBlobCache = new Map<string, string>();
|
|
4574
|
-
const
|
|
4575
|
-
|
|
4576
|
-
|
|
4577
|
-
|
|
4578
|
-
|
|
5155
|
+
const sourceEntries = this.#fileEntries.filter((e): e is SessionEntry => e.type !== "session");
|
|
5156
|
+
const materializedEntries = sourceEntries.map(entry =>
|
|
5157
|
+
materializeResidentEntryForReadSync(entry, this.#residentBlobStores(), resolvedTextBlobCache),
|
|
5158
|
+
);
|
|
5159
|
+
if (!sourceEntries.some(entry => containsResidentImageSentinel(entry))) {
|
|
5160
|
+
this.#materializedEntriesCache = materializedEntries;
|
|
5161
|
+
this.#materializedEntriesRevision = this.#entryRevision;
|
|
5162
|
+
}
|
|
4579
5163
|
return materializedEntries;
|
|
4580
5164
|
}
|
|
4581
5165
|
|
|
@@ -4909,6 +5493,71 @@ export class SessionManager {
|
|
|
4909
5493
|
return manager;
|
|
4910
5494
|
}
|
|
4911
5495
|
|
|
5496
|
+
/**
|
|
5497
|
+
* List sessions for the resume picker without recovery or other maintenance writes.
|
|
5498
|
+
*/
|
|
5499
|
+
static async listForResumePickerReadOnly(
|
|
5500
|
+
cwd: string,
|
|
5501
|
+
sessionDir?: string,
|
|
5502
|
+
storage: SessionStorage = new FileSessionStorage(),
|
|
5503
|
+
): Promise<SessionInfo[]> {
|
|
5504
|
+
const dirs = sessionDir ? [sessionDir] : getReadOnlyDefaultSessionDirs(cwd);
|
|
5505
|
+
try {
|
|
5506
|
+
const files = new Set<string>();
|
|
5507
|
+
for (const dir of dirs) {
|
|
5508
|
+
for (const filePath of storage.listFilesSync(dir, "*.jsonl")) files.add(filePath);
|
|
5509
|
+
}
|
|
5510
|
+
return await collectSessionsFromFiles([...files], storage);
|
|
5511
|
+
} catch {
|
|
5512
|
+
return [];
|
|
5513
|
+
}
|
|
5514
|
+
}
|
|
5515
|
+
|
|
5516
|
+
/** Inspect a selected session without acquiring write-capable ownership. */
|
|
5517
|
+
static async inspectSessionTailReadOnly(
|
|
5518
|
+
filePath: string,
|
|
5519
|
+
storage: SessionStorage = new FileSessionStorage(),
|
|
5520
|
+
): Promise<ResumeTailInspection> {
|
|
5521
|
+
const inspected = inspectResumeSessionFile(filePath, storage);
|
|
5522
|
+
if ("kind" in inspected) return inspected;
|
|
5523
|
+
return canContinuePersistedHistory(inspected.context.messages)
|
|
5524
|
+
? { kind: "resumable", identity: inspected.identity }
|
|
5525
|
+
: { kind: "terminal", identity: inspected.identity };
|
|
5526
|
+
}
|
|
5527
|
+
|
|
5528
|
+
/**
|
|
5529
|
+
* Main startup code MUST retain the consented inspection identity and branch on
|
|
5530
|
+
* the returned discriminant; an error result never creates, rewrites, or adopts
|
|
5531
|
+
* the selected path. Breadcrumb ownership begins only after `kind: "opened"`.
|
|
5532
|
+
*/
|
|
5533
|
+
static async openExistingStrict(
|
|
5534
|
+
identity: ResumeSessionIdentity,
|
|
5535
|
+
sessionDir?: string,
|
|
5536
|
+
storage: SessionStorage = new FileSessionStorage(),
|
|
5537
|
+
): Promise<StrictSessionOpenResult> {
|
|
5538
|
+
const inspected = inspectResumeSessionFile(identity.canonicalPath, storage);
|
|
5539
|
+
if ("kind" in inspected) return inspected;
|
|
5540
|
+
if (!sameResumeIdentity(identity, inspected.identity)) {
|
|
5541
|
+
return { kind: "error", reason: "identity-mismatch" };
|
|
5542
|
+
}
|
|
5543
|
+
const entries = structuredClone(inspected.entries) as FileEntry[];
|
|
5544
|
+
const header = entries[0] as SessionHeader;
|
|
5545
|
+
const dir = sessionDir ?? path.resolve(identity.canonicalPath, "..");
|
|
5546
|
+
const manager = new SessionManager(header.cwd || getProjectDir(), dir, true, storage);
|
|
5547
|
+
await manager.#hydrateExistingSession(identity.canonicalPath, entries, inspected.migrationApplied);
|
|
5548
|
+
const ownershipInspection = inspectResumeSessionFile(identity.canonicalPath, storage);
|
|
5549
|
+
if ("kind" in ownershipInspection) {
|
|
5550
|
+
await manager.close();
|
|
5551
|
+
return ownershipInspection;
|
|
5552
|
+
}
|
|
5553
|
+
if (!sameResumeIdentity(identity, ownershipInspection.identity)) {
|
|
5554
|
+
await manager.close();
|
|
5555
|
+
return { kind: "error", reason: "identity-mismatch" };
|
|
5556
|
+
}
|
|
5557
|
+
writeTerminalBreadcrumb(manager.cwd, identity.canonicalPath);
|
|
5558
|
+
return { kind: "opened", manager };
|
|
5559
|
+
}
|
|
5560
|
+
|
|
4912
5561
|
/**
|
|
4913
5562
|
* Continue the most recent session, or create new if none.
|
|
4914
5563
|
* @param cwd Working directory
|
|
@@ -4986,4 +5635,153 @@ export class SessionManager {
|
|
|
4986
5635
|
return [];
|
|
4987
5636
|
}
|
|
4988
5637
|
}
|
|
5638
|
+
/**
|
|
5639
|
+
* Strict raw scoped inventory for ACP authorization. Enumerates the scoped
|
|
5640
|
+
* session directory without suppressing any root/scan/lstat/read/parse/stat/
|
|
5641
|
+
* header/cwd/containment/identity failure. A failure result carries every
|
|
5642
|
+
* sanitized failure and grants zero authority — it is never reduced to a
|
|
5643
|
+
* partial candidate set. Display/global {@link list} behavior is unaffected.
|
|
5644
|
+
*/
|
|
5645
|
+
static inventorySessionsStrict(
|
|
5646
|
+
cwd: string,
|
|
5647
|
+
options?: { sessionDir?: string; storage?: SessionStorage },
|
|
5648
|
+
): StrictInventoryResult {
|
|
5649
|
+
const storage = options?.storage ?? new FileSessionStorage();
|
|
5650
|
+
const dir = options?.sessionDir ?? SessionManager.getDefaultSessionDir(cwd, undefined, storage);
|
|
5651
|
+
if (!storage.listFilesStrictSync) {
|
|
5652
|
+
return {
|
|
5653
|
+
kind: "failure",
|
|
5654
|
+
failures: [{ kind: "scan", message: "Strict scoped session scan is unavailable", path: dir }],
|
|
5655
|
+
};
|
|
5656
|
+
}
|
|
5657
|
+
const strictScan = storage.listFilesStrictSync.bind(storage);
|
|
5658
|
+
|
|
5659
|
+
let files: string[];
|
|
5660
|
+
try {
|
|
5661
|
+
files = strictScan(dir, "*.jsonl");
|
|
5662
|
+
} catch (err) {
|
|
5663
|
+
const code = (err as NodeJS.ErrnoException)?.code;
|
|
5664
|
+
// Only a confirmed ENOENT proves the scoped root is genuinely absent,
|
|
5665
|
+
// which is a complete (zero-candidate) inventory. Any other root/scan
|
|
5666
|
+
// error (EACCES/EIO/EPERM/ENOTDIR/...) is fail-closed: it must never
|
|
5667
|
+
// reduce to authoritative absence and grants zero authority. The
|
|
5668
|
+
// forgiving existsSync preflight is intentionally absent — fs.existsSync
|
|
5669
|
+
// collapses EACCES/EIO/EPERM onto a false return and would let a
|
|
5670
|
+
// permission-denied root masquerade as a confirmed-empty directory.
|
|
5671
|
+
if (code === "ENOENT") {
|
|
5672
|
+
return { kind: "complete", candidates: [] };
|
|
5673
|
+
}
|
|
5674
|
+
void err;
|
|
5675
|
+
const failureKind: StrictInventoryFailureKind =
|
|
5676
|
+
code === "EACCES" || code === "EPERM" || code === "ENOTDIR" ? "root" : "scan";
|
|
5677
|
+
return {
|
|
5678
|
+
kind: "failure",
|
|
5679
|
+
failures: [
|
|
5680
|
+
{
|
|
5681
|
+
kind: failureKind,
|
|
5682
|
+
message:
|
|
5683
|
+
failureKind === "root"
|
|
5684
|
+
? "Scoped session root could not be inspected"
|
|
5685
|
+
: "Scoped session directory scan failed",
|
|
5686
|
+
path: dir,
|
|
5687
|
+
},
|
|
5688
|
+
],
|
|
5689
|
+
};
|
|
5690
|
+
}
|
|
5691
|
+
|
|
5692
|
+
const failures: StrictInventoryFailure[] = [];
|
|
5693
|
+
const candidates: StrictInventoryCandidate[] = [];
|
|
5694
|
+
for (const file of files) {
|
|
5695
|
+
const candidate = inventoryReadCandidate(storage, file, cwd, dir);
|
|
5696
|
+
if ("failures" in candidate) {
|
|
5697
|
+
failures.push(...candidate.failures);
|
|
5698
|
+
continue;
|
|
5699
|
+
}
|
|
5700
|
+
candidates.push(candidate.candidate);
|
|
5701
|
+
}
|
|
5702
|
+
if (failures.length > 0) {
|
|
5703
|
+
return { kind: "failure", failures };
|
|
5704
|
+
}
|
|
5705
|
+
return { kind: "complete", candidates };
|
|
5706
|
+
}
|
|
5707
|
+
|
|
5708
|
+
/**
|
|
5709
|
+
* Propagate the storage-layer verified hard delete bound to exact identity evidence.
|
|
5710
|
+
* Never performs ID lookup or first-match selection; the caller supplies the exact
|
|
5711
|
+
* authorization target captured from a complete strict inventory.
|
|
5712
|
+
*/
|
|
5713
|
+
async deleteSessionVerified(target: VerifiedSessionDeleteTarget): Promise<VerifiedSessionDeleteResult> {
|
|
5714
|
+
if (!this.storage.deleteSessionVerified) {
|
|
5715
|
+
throw new Error("Storage backend does not support verified session deletion");
|
|
5716
|
+
}
|
|
5717
|
+
return this.storage.deleteSessionVerified(target);
|
|
5718
|
+
}
|
|
5719
|
+
}
|
|
5720
|
+
const strictInventoryDecoder = new TextDecoder("utf-8", { fatal: false });
|
|
5721
|
+
|
|
5722
|
+
/** Strictly read + validate one scoped session candidate. Never suppresses a failure. */
|
|
5723
|
+
function inventoryReadCandidate(
|
|
5724
|
+
storage: SessionStorage,
|
|
5725
|
+
file: string,
|
|
5726
|
+
expectedCwd: string,
|
|
5727
|
+
sessionDir: string,
|
|
5728
|
+
): { candidate: StrictInventoryCandidate } | { failures: StrictInventoryFailure[] } {
|
|
5729
|
+
const failures: StrictInventoryFailure[] = [];
|
|
5730
|
+
const resolvedFile = path.resolve(file);
|
|
5731
|
+
if (!pathIsWithin(path.resolve(sessionDir), resolvedFile)) {
|
|
5732
|
+
return {
|
|
5733
|
+
failures: [{ kind: "containment", message: "Candidate is outside the scoped session directory", path: file }],
|
|
5734
|
+
};
|
|
5735
|
+
}
|
|
5736
|
+
if (!storage.readSnapshotSync) {
|
|
5737
|
+
return { failures: [{ kind: "read", message: "Storage backend cannot read exact bytes", path: file }] };
|
|
5738
|
+
}
|
|
5739
|
+
let snapshot: SessionStorageSnapshot;
|
|
5740
|
+
try {
|
|
5741
|
+
snapshot = storage.readSnapshotSync(file);
|
|
5742
|
+
} catch (err) {
|
|
5743
|
+
const code = (err as NodeJS.ErrnoException)?.code;
|
|
5744
|
+
if (code === "ELOOP" || code === "SYMLINK") {
|
|
5745
|
+
failures.push({ kind: "lstat", message: "Candidate is a symlink", path: file });
|
|
5746
|
+
} else {
|
|
5747
|
+
failures.push({ kind: "read", message: "Candidate could not be read", path: file });
|
|
5748
|
+
}
|
|
5749
|
+
return { failures };
|
|
5750
|
+
}
|
|
5751
|
+
if (!snapshot.stat.isFile) {
|
|
5752
|
+
failures.push({ kind: "lstat", message: "Candidate is not a regular file", path: file });
|
|
5753
|
+
return { failures };
|
|
5754
|
+
}
|
|
5755
|
+
const newline = snapshot.bytes.indexOf(0x0a);
|
|
5756
|
+
const headerBytes = newline === -1 ? snapshot.bytes : snapshot.bytes.subarray(0, newline);
|
|
5757
|
+
let header: Record<string, unknown> | undefined;
|
|
5758
|
+
try {
|
|
5759
|
+
const text = strictInventoryDecoder.decode(headerBytes).trim();
|
|
5760
|
+
const value: unknown = text ? JSON.parse(text) : undefined;
|
|
5761
|
+
header = typeof value === "object" && value !== null ? (value as Record<string, unknown>) : undefined;
|
|
5762
|
+
} catch {
|
|
5763
|
+
header = undefined;
|
|
5764
|
+
}
|
|
5765
|
+
if (!header) {
|
|
5766
|
+
failures.push({ kind: "parse", message: "Candidate header is not valid JSON", path: file });
|
|
5767
|
+
return { failures };
|
|
5768
|
+
}
|
|
5769
|
+
if (header.type !== "session") {
|
|
5770
|
+
failures.push({ kind: "header", message: "Candidate header is not a session header", path: file });
|
|
5771
|
+
return { failures };
|
|
5772
|
+
}
|
|
5773
|
+
if (typeof header.id !== "string" || header.id.length === 0) {
|
|
5774
|
+
failures.push({ kind: "identity", message: "Candidate header is missing a session id", path: file });
|
|
5775
|
+
return { failures };
|
|
5776
|
+
}
|
|
5777
|
+
if (typeof header.cwd !== "string") {
|
|
5778
|
+
failures.push({ kind: "cwd", message: "Candidate header is missing a cwd", path: file });
|
|
5779
|
+
return { failures };
|
|
5780
|
+
}
|
|
5781
|
+
const canonicalHeaderCwd = resolveEquivalentPath(header.cwd);
|
|
5782
|
+
if (canonicalHeaderCwd !== resolveEquivalentPath(expectedCwd)) {
|
|
5783
|
+
failures.push({ kind: "cwd", message: "Candidate cwd does not match the scoped workspace", path: file });
|
|
5784
|
+
return { failures };
|
|
5785
|
+
}
|
|
5786
|
+
return { candidate: { path: resolvedFile, id: header.id, cwd: header.cwd, identity: snapshot.stat } };
|
|
4989
5787
|
}
|