@caupulican/pi-adaptative 0.81.42 → 0.81.43
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 +37 -0
- package/dist/bun/cli.d.ts.map +1 -1
- package/dist/bun/cli.js.map +1 -1
- package/dist/bun/register-bedrock.d.ts.map +1 -1
- package/dist/bun/restore-sandbox-env.d.ts.map +1 -1
- package/dist/bun/restore-sandbox-env.js.map +1 -1
- package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts.map +1 -1
- package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js.map +1 -1
- package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts.map +1 -1
- package/dist/bundled-resources/extensions/tmux-agent-manager/index.js +52 -49
- package/dist/bundled-resources/extensions/tmux-agent-manager/index.js.map +1 -1
- package/dist/bundled-resources/extensions/tmux-agent-manager/index.ts +62 -57
- package/dist/bundled-resources/prompts/skillify.md +1 -1
- package/dist/bundled-resources/runtimes/pi-shell-engine/commands/fs.py +16 -19
- package/dist/bundled-resources/runtimes/pi-shell-engine/commands/search.py +12 -26
- package/dist/bundled-resources/runtimes/pi-shell-engine/commands/strings.py +15 -121
- package/dist/bundled-resources/runtimes/pi-shell-engine/commands/text.py +52 -79
- package/dist/bundled-resources/runtimes/pi-shell-engine/escapes.py +70 -0
- package/dist/bundled-resources/runtimes/pi-shell-engine/exec.py +110 -61
- package/dist/bundled-resources/runtimes/pi-shell-engine/main.py +106 -23
- package/dist/bundled-resources/runtimes/pi-shell-engine/paths.py +10 -0
- package/dist/bundled-resources/runtimes/pi-shell-engine/proc.py +12 -4
- package/dist/bundled-resources/runtimes/pi-shell-engine/shell_args.py +22 -0
- package/dist/bundled-resources/runtimes/pi-shell-engine/state.py +9 -2
- package/dist/bundled-resources/runtimes/pi-shell-engine/tokens.py +129 -259
- package/dist/bundled-resources/skills/authorized-web-security-audit/SKILL.md +187 -0
- package/dist/bundled-resources/skills/authorized-web-security-audit/references/assessment-contract.md +92 -0
- package/dist/bundled-resources/skills/deduplicate-by-evidence/SKILL.md +134 -0
- package/dist/bundled-resources/skills/evidence-gated-tdd/SKILL.md +93 -0
- package/dist/bundled-resources/skills/evidence-gated-tdd/references/evidence-model.md +27 -0
- package/dist/bundled-resources/skills/evidence-gated-tdd/references/security-scanners.md +24 -0
- package/dist/bundled-resources/skills/harness-self-adaptation/SKILL.md +4 -2
- package/dist/bundled-resources/skills/secure-agent-tool-surfaces/SKILL.md +217 -0
- package/dist/bundled-resources/skills/secure-agent-tool-surfaces/references/defensive-exploit-catalogue.md +175 -0
- package/dist/bundled-resources/skills/secure-agent-tool-surfaces/references/tool-boundary-checklist.md +87 -0
- package/dist/bundled-resources/skills/skill-architect/SKILL.md +2 -2
- package/dist/bundled-resources/skills/skill-creator/SKILL.md +188 -0
- package/dist/bundled-resources/skills/skill-creator/references/pi-skill-contract.md +73 -0
- package/dist/bundled-resources/skills/skill-creator/scripts/init-skill.mjs +142 -0
- package/dist/bundled-resources/skills/skill-creator/scripts/validate-skill.mjs +122 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js +8 -8
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/cli/initial-message.d.ts +1 -1
- package/dist/cli/initial-message.d.ts.map +1 -1
- package/dist/cli/initial-message.js.map +1 -1
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli/piped-stdin.d.ts +4 -0
- package/dist/cli/piped-stdin.d.ts.map +1 -0
- package/dist/cli/piped-stdin.js +13 -0
- package/dist/cli/piped-stdin.js.map +1 -0
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +9 -14
- package/dist/config.js.map +1 -1
- package/dist/core/agent-directory-layout.d.ts.map +1 -1
- package/dist/core/agent-directory-layout.js.map +1 -1
- package/dist/core/agent-paths.d.ts.map +1 -1
- package/dist/core/agent-paths.js.map +1 -1
- package/dist/core/agent-session-contracts.d.ts +5 -9
- package/dist/core/agent-session-contracts.d.ts.map +1 -1
- package/dist/core/agent-session-contracts.js +1 -12
- package/dist/core/agent-session-contracts.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +10 -25
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +24 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +210 -237
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-guidance.d.ts.map +1 -1
- package/dist/core/auth-guidance.js.map +1 -1
- package/dist/core/auth-storage.d.ts +4 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +13 -39
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/autonomy/approval-gate.d.ts.map +1 -1
- package/dist/core/autonomy/approval-gate.js.map +1 -1
- package/dist/core/autonomy/bounded-completion.d.ts.map +1 -1
- package/dist/core/autonomy/bounded-completion.js.map +1 -1
- package/dist/core/autonomy/contracts.d.ts.map +1 -1
- package/dist/core/autonomy/envelope-enforcement.d.ts.map +1 -1
- package/dist/core/autonomy/envelope-enforcement.js.map +1 -1
- package/dist/core/autonomy/evidence-finding-projection.d.ts +11 -0
- package/dist/core/autonomy/evidence-finding-projection.d.ts.map +1 -0
- package/dist/core/autonomy/evidence-finding-projection.js +37 -0
- package/dist/core/autonomy/evidence-finding-projection.js.map +1 -0
- package/dist/core/autonomy/foreground-envelope.d.ts.map +1 -1
- package/dist/core/autonomy/foreground-envelope.js.map +1 -1
- package/dist/core/autonomy/gates.d.ts.map +1 -1
- package/dist/core/autonomy/gates.js.map +1 -1
- package/dist/core/autonomy/lane-private-paths.d.ts.map +1 -1
- package/dist/core/autonomy/lane-private-paths.js.map +1 -1
- package/dist/core/autonomy/lane-tool-surface.d.ts.map +1 -1
- package/dist/core/autonomy/lane-tool-surface.js.map +1 -1
- package/dist/core/autonomy/lane-tracker.d.ts.map +1 -1
- package/dist/core/autonomy/lane-tracker.js +2 -3
- package/dist/core/autonomy/lane-tracker.js.map +1 -1
- package/dist/core/autonomy/path-scope.d.ts.map +1 -1
- package/dist/core/autonomy/path-scope.js.map +1 -1
- package/dist/core/autonomy/risk-assessment.d.ts.map +1 -1
- package/dist/core/autonomy/session-lane-record.d.ts.map +1 -1
- package/dist/core/autonomy/session-lane-record.js.map +1 -1
- package/dist/core/autonomy/status.d.ts.map +1 -1
- package/dist/core/autonomy/status.js.map +1 -1
- package/dist/core/autonomy/subagent-prompt.d.ts.map +1 -1
- package/dist/core/autonomy/subagent-prompt.js.map +1 -1
- package/dist/core/autonomy/telemetry-events.d.ts.map +1 -1
- package/dist/core/autonomy/telemetry-events.js.map +1 -1
- package/dist/core/autonomy-telemetry.d.ts.map +1 -1
- package/dist/core/autonomy-telemetry.js +2 -4
- package/dist/core/autonomy-telemetry.js.map +1 -1
- package/dist/core/background-lane-controller.d.ts.map +1 -1
- package/dist/core/background-lane-controller.js +2 -15
- package/dist/core/background-lane-controller.js.map +1 -1
- package/dist/core/background-tool-task-controller.d.ts +88 -0
- package/dist/core/background-tool-task-controller.d.ts.map +1 -0
- package/dist/core/background-tool-task-controller.js +470 -0
- package/dist/core/background-tool-task-controller.js.map +1 -0
- package/dist/core/bash-execution-controller.d.ts +1 -0
- package/dist/core/bash-execution-controller.d.ts.map +1 -1
- package/dist/core/bash-execution-controller.js +5 -4
- package/dist/core/bash-execution-controller.js.map +1 -1
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/bedrock-sso-login.d.ts.map +1 -1
- package/dist/core/bedrock-sso-login.js.map +1 -1
- package/dist/core/billing-failover-controller.d.ts.map +1 -1
- package/dist/core/billing-failover-controller.js +3 -3
- package/dist/core/billing-failover-controller.js.map +1 -1
- package/dist/core/billing-failover.d.ts.map +1 -1
- package/dist/core/billing-failover.js.map +1 -1
- package/dist/core/capability-contract.d.ts.map +1 -1
- package/dist/core/catalog-manager.d.ts.map +1 -1
- package/dist/core/catalog-manager.js +0 -0
- package/dist/core/catalog-manager.js.map +1 -1
- package/dist/core/compaction-controller.d.ts +2 -0
- package/dist/core/compaction-controller.d.ts.map +1 -1
- package/dist/core/compaction-controller.js +21 -8
- package/dist/core/compaction-controller.js.map +1 -1
- package/dist/core/compaction-support.d.ts +8 -0
- package/dist/core/compaction-support.d.ts.map +1 -1
- package/dist/core/compaction-support.js +0 -2
- package/dist/core/compaction-support.js.map +1 -1
- package/dist/core/context/artifact-retrieval.d.ts.map +1 -1
- package/dist/core/context/artifact-retrieval.js.map +1 -1
- package/dist/core/context/brain-curator.d.ts.map +1 -1
- package/dist/core/context/brain-curator.js +14 -33
- package/dist/core/context/brain-curator.js.map +1 -1
- package/dist/core/context/context-artifacts.d.ts.map +1 -1
- package/dist/core/context/context-artifacts.js +16 -24
- package/dist/core/context/context-artifacts.js.map +1 -1
- package/dist/core/context/context-audit.d.ts.map +1 -1
- package/dist/core/context/context-audit.js +3 -17
- package/dist/core/context/context-audit.js.map +1 -1
- package/dist/core/context/context-composition.d.ts.map +1 -1
- package/dist/core/context/context-composition.js.map +1 -1
- package/dist/core/context/context-item.d.ts.map +1 -1
- package/dist/core/context/context-item.js.map +1 -1
- package/dist/core/context/context-prompt-enforcement.d.ts.map +1 -1
- package/dist/core/context/context-prompt-enforcement.js +3 -16
- package/dist/core/context/context-prompt-enforcement.js.map +1 -1
- package/dist/core/context/context-prompt-policy.d.ts.map +1 -1
- package/dist/core/context/context-prompt-policy.js.map +1 -1
- package/dist/core/context/context-retention.d.ts.map +1 -1
- package/dist/core/context/context-retention.js.map +1 -1
- package/dist/core/context/context-store-retention.d.ts.map +1 -1
- package/dist/core/context/context-store-retention.js.map +1 -1
- package/dist/core/context/context-store.d.ts.map +1 -1
- package/dist/core/context/context-store.js.map +1 -1
- package/dist/core/context/context-tool-result.d.ts +4 -0
- package/dist/core/context/context-tool-result.d.ts.map +1 -0
- package/dist/core/context/context-tool-result.js +15 -0
- package/dist/core/context/context-tool-result.js.map +1 -0
- package/dist/core/context/current-work-memory.d.ts.map +1 -1
- package/dist/core/context/current-work-memory.js.map +1 -1
- package/dist/core/context/file-store-memory-provider.d.ts.map +1 -1
- package/dist/core/context/file-store-memory-provider.js +7 -28
- package/dist/core/context/file-store-memory-provider.js.map +1 -1
- package/dist/core/context/local-memory-search.d.ts +11 -0
- package/dist/core/context/local-memory-search.d.ts.map +1 -0
- package/dist/core/context/local-memory-search.js +37 -0
- package/dist/core/context/local-memory-search.js.map +1 -0
- package/dist/core/context/long-term-memory-trigger.d.ts.map +1 -1
- package/dist/core/context/long-term-memory-trigger.js.map +1 -1
- package/dist/core/context/memory-diagnostics.d.ts.map +1 -1
- package/dist/core/context/memory-diagnostics.js.map +1 -1
- package/dist/core/context/memory-index-store.d.ts.map +1 -1
- package/dist/core/context/memory-index-store.js.map +1 -1
- package/dist/core/context/memory-prompt-block.d.ts.map +1 -1
- package/dist/core/context/memory-prompt-block.js.map +1 -1
- package/dist/core/context/memory-prompt-budget.d.ts.map +1 -1
- package/dist/core/context/memory-prompt-budget.js.map +1 -1
- package/dist/core/context/memory-provider-contract.d.ts.map +1 -1
- package/dist/core/context/memory-provider-contract.js.map +1 -1
- package/dist/core/context/memory-retrieval.d.ts.map +1 -1
- package/dist/core/context/memory-retrieval.js.map +1 -1
- package/dist/core/context/memory-tier-composer.d.ts.map +1 -1
- package/dist/core/context/memory-tier-composer.js.map +1 -1
- package/dist/core/context/message-text.d.ts +7 -0
- package/dist/core/context/message-text.d.ts.map +1 -0
- package/dist/core/context/message-text.js +68 -0
- package/dist/core/context/message-text.js.map +1 -0
- package/dist/core/context/okf-memory-provider.d.ts.map +1 -1
- package/dist/core/context/okf-memory-provider.js +4 -30
- package/dist/core/context/okf-memory-provider.js.map +1 -1
- package/dist/core/context/okf-memory.d.ts.map +1 -1
- package/dist/core/context/okf-memory.js.map +1 -1
- package/dist/core/context/policy-engine.d.ts.map +1 -1
- package/dist/core/context/policy-engine.js.map +1 -1
- package/dist/core/context/policy-types.d.ts.map +1 -1
- package/dist/core/context/sqlite-runtime-index.d.ts.map +1 -1
- package/dist/core/context/sqlite-runtime-index.js.map +1 -1
- package/dist/core/context/storage-authority.d.ts.map +1 -1
- package/dist/core/context/tool-output-packer.d.ts.map +1 -1
- package/dist/core/context/tool-output-packer.js.map +1 -1
- package/dist/core/context-gc.d.ts.map +1 -1
- package/dist/core/context-gc.js +14 -21
- package/dist/core/context-gc.js.map +1 -1
- package/dist/core/context-pipeline.d.ts +1 -3
- package/dist/core/context-pipeline.d.ts.map +1 -1
- package/dist/core/context-pipeline.js +64 -145
- package/dist/core/context-pipeline.js.map +1 -1
- package/dist/core/cost/cost-summary.d.ts.map +1 -1
- package/dist/core/cost/cost-summary.js.map +1 -1
- package/dist/core/cost/daily-usage.d.ts.map +1 -1
- package/dist/core/cost/daily-usage.js.map +1 -1
- package/dist/core/cost/session-usage.d.ts.map +1 -1
- package/dist/core/cost/session-usage.js.map +1 -1
- package/dist/core/cost-guard.d.ts.map +1 -1
- package/dist/core/cost-guard.js.map +1 -1
- package/dist/core/default-tool-surface.d.ts.map +1 -1
- package/dist/core/default-tool-surface.js +1 -0
- package/dist/core/default-tool-surface.js.map +1 -1
- package/dist/core/defaults.d.ts.map +1 -1
- package/dist/core/delegation/managed-lane-controller.d.ts.map +1 -1
- package/dist/core/delegation/managed-lane-controller.js +2 -6
- package/dist/core/delegation/managed-lane-controller.js.map +1 -1
- package/dist/core/delegation/session-worker-claim.d.ts.map +1 -1
- package/dist/core/delegation/session-worker-claim.js.map +1 -1
- package/dist/core/delegation/worker-action-journal.d.ts.map +1 -1
- package/dist/core/delegation/worker-action-journal.js +0 -4
- package/dist/core/delegation/worker-action-journal.js.map +1 -1
- package/dist/core/delegation/worker-actions.d.ts.map +1 -1
- package/dist/core/delegation/worker-actions.js.map +1 -1
- package/dist/core/delegation/worker-agent-control-coordinator.d.ts +1 -0
- package/dist/core/delegation/worker-agent-control-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-agent-control-coordinator.js +13 -15
- package/dist/core/delegation/worker-agent-control-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-agent-control.d.ts.map +1 -1
- package/dist/core/delegation/worker-agent-control.js +1 -4
- package/dist/core/delegation/worker-agent-control.js.map +1 -1
- package/dist/core/delegation/worker-attempt-executor.d.ts.map +1 -1
- package/dist/core/delegation/worker-attempt-executor.js.map +1 -1
- package/dist/core/delegation/worker-claim.d.ts.map +1 -1
- package/dist/core/delegation/worker-claim.js.map +1 -1
- package/dist/core/delegation/worker-conversation-store.d.ts.map +1 -1
- package/dist/core/delegation/worker-conversation-store.js +0 -2
- package/dist/core/delegation/worker-conversation-store.js.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.d.ts.map +1 -1
- package/dist/core/delegation/worker-delegation-controller.js +5 -14
- package/dist/core/delegation/worker-delegation-controller.js.map +1 -1
- package/dist/core/delegation/worker-delegation-request.d.ts.map +1 -1
- package/dist/core/delegation/worker-dispatch-scheduler.d.ts.map +1 -1
- package/dist/core/delegation/worker-dispatch-scheduler.js +5 -6
- package/dist/core/delegation/worker-dispatch-scheduler.js.map +1 -1
- package/dist/core/delegation/worker-execution-policy.d.ts.map +1 -1
- package/dist/core/delegation/worker-execution-policy.js.map +1 -1
- package/dist/core/delegation/worker-lane-projection.d.ts.map +1 -1
- package/dist/core/delegation/worker-lane-projection.js.map +1 -1
- package/dist/core/delegation/worker-lifecycle.d.ts.map +1 -1
- package/dist/core/delegation/worker-lifecycle.js +0 -3
- package/dist/core/delegation/worker-lifecycle.js.map +1 -1
- package/dist/core/delegation/worker-notification-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-notification-coordinator.js +4 -5
- package/dist/core/delegation/worker-notification-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-process-owner.d.ts.map +1 -1
- package/dist/core/delegation/worker-process-owner.js.map +1 -1
- package/dist/core/delegation/worker-profile-resolver.d.ts.map +1 -1
- package/dist/core/delegation/worker-profile-resolver.js +1 -2
- package/dist/core/delegation/worker-profile-resolver.js.map +1 -1
- package/dist/core/delegation/worker-recovery-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-recovery-coordinator.js +3 -4
- package/dist/core/delegation/worker-recovery-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-resource-catalog.d.ts.map +1 -1
- package/dist/core/delegation/worker-resource-catalog.js.map +1 -1
- package/dist/core/delegation/worker-resource-materializer.d.ts.map +1 -1
- package/dist/core/delegation/worker-resource-materializer.js +1 -4
- package/dist/core/delegation/worker-resource-materializer.js.map +1 -1
- package/dist/core/delegation/worker-runner.d.ts +2 -4
- package/dist/core/delegation/worker-runner.d.ts.map +1 -1
- package/dist/core/delegation/worker-runner.js +6 -18
- package/dist/core/delegation/worker-runner.js.map +1 -1
- package/dist/core/delegation/worker-task-label.d.ts.map +1 -1
- package/dist/core/delegation/worker-task-label.js.map +1 -1
- package/dist/core/delegation/worker-terminal-finalizer.d.ts.map +1 -1
- package/dist/core/delegation/worker-terminal-finalizer.js.map +1 -1
- package/dist/core/delegation/worker-write-reservation-coordinator.d.ts.map +1 -1
- package/dist/core/delegation/worker-write-reservation-coordinator.js +1 -4
- package/dist/core/delegation/worker-write-reservation-coordinator.js.map +1 -1
- package/dist/core/delegation/worker-write-reservation.d.ts.map +1 -1
- package/dist/core/delegation/worker-write-reservation.js +0 -2
- package/dist/core/delegation/worker-write-reservation.js.map +1 -1
- package/dist/core/diagnostics.d.ts.map +1 -1
- package/dist/core/doctor.d.ts.map +1 -1
- package/dist/core/doctor.js.map +1 -1
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/exec.d.ts.map +1 -1
- package/dist/core/exec.js +26 -7
- package/dist/core/exec.js.map +1 -1
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
- package/dist/core/export-html/ansi-to-html.js +21 -74
- package/dist/core/export-html/ansi-to-html.js.map +1 -1
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js +4 -0
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/export-html/session-tree-foundations.d.mts +67 -0
- package/dist/core/export-html/session-tree-foundations.mjs +313 -0
- package/dist/core/export-html/template.css +14 -41
- package/dist/core/export-html/template.html +3 -1
- package/dist/core/export-html/template.js +26 -435
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js.map +1 -1
- package/dist/core/extension-import-authority.d.ts.map +1 -1
- package/dist/core/extension-import-authority.js.map +1 -1
- package/dist/core/extension-metadata.d.ts.map +1 -1
- package/dist/core/extension-metadata.js.map +1 -1
- package/dist/core/extensions/builtin.d.ts +17 -0
- package/dist/core/extensions/builtin.d.ts.map +1 -1
- package/dist/core/extensions/builtin.js +18 -54
- package/dist/core/extensions/builtin.js.map +1 -1
- package/dist/core/extensions/entry-resolution.d.ts +3 -0
- package/dist/core/extensions/entry-resolution.d.ts.map +1 -0
- package/dist/core/extensions/entry-resolution.js +17 -0
- package/dist/core/extensions/entry-resolution.js.map +1 -0
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +76 -21
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +2 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +41 -112
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/stale-context.d.ts.map +1 -1
- package/dist/core/extensions/storage.d.ts.map +1 -1
- package/dist/core/extensions/storage.js.map +1 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.js.map +1 -1
- package/dist/core/failure-corpus.d.ts.map +1 -1
- package/dist/core/failure-corpus.js +2 -5
- package/dist/core/failure-corpus.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js +27 -33
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/foreground-recovery-controller.d.ts.map +1 -1
- package/dist/core/foreground-recovery-controller.js +0 -4
- package/dist/core/foreground-recovery-controller.js.map +1 -1
- package/dist/core/gateways/channel-provider.d.ts.map +1 -1
- package/dist/core/gateways/channel-provider.js +7 -5
- package/dist/core/gateways/channel-provider.js.map +1 -1
- package/dist/core/goal-loop-controller.d.ts.map +1 -1
- package/dist/core/goal-loop-controller.js +0 -1
- package/dist/core/goal-loop-controller.js.map +1 -1
- package/dist/core/goals/compact-goal-context.d.ts.map +1 -1
- package/dist/core/goals/compact-goal-context.js +2 -4
- package/dist/core/goals/compact-goal-context.js.map +1 -1
- package/dist/core/goals/goal-acceptance.d.ts.map +1 -1
- package/dist/core/goals/goal-acceptance.js.map +1 -1
- package/dist/core/goals/goal-auto-continue-controller.d.ts.map +1 -1
- package/dist/core/goals/goal-auto-continue-controller.js +1 -3
- package/dist/core/goals/goal-auto-continue-controller.js.map +1 -1
- package/dist/core/goals/goal-continuation-controller.d.ts.map +1 -1
- package/dist/core/goals/goal-continuation-controller.js.map +1 -1
- package/dist/core/goals/goal-continuation-defaults.d.ts.map +1 -1
- package/dist/core/goals/goal-continuation-prompt.d.ts.map +1 -1
- package/dist/core/goals/goal-continuation-prompt.js.map +1 -1
- package/dist/core/goals/goal-lifecycle.d.ts.map +1 -1
- package/dist/core/goals/goal-lifecycle.js.map +1 -1
- package/dist/core/goals/goal-record.d.ts.map +1 -1
- package/dist/core/goals/goal-record.js.map +1 -1
- package/dist/core/goals/goal-runtime-snapshot.d.ts.map +1 -1
- package/dist/core/goals/goal-runtime-snapshot.js.map +1 -1
- package/dist/core/goals/goal-session-controller.d.ts +15 -0
- package/dist/core/goals/goal-session-controller.d.ts.map +1 -1
- package/dist/core/goals/goal-session-controller.js +27 -3
- package/dist/core/goals/goal-session-controller.js.map +1 -1
- package/dist/core/goals/goal-state.d.ts.map +1 -1
- package/dist/core/goals/goal-state.js +35 -51
- package/dist/core/goals/goal-state.js.map +1 -1
- package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
- package/dist/core/goals/goal-tool-core.js.map +1 -1
- package/dist/core/goals/natural-language-goal.d.ts +9 -0
- package/dist/core/goals/natural-language-goal.d.ts.map +1 -0
- package/dist/core/goals/natural-language-goal.js +23 -0
- package/dist/core/goals/natural-language-goal.js.map +1 -0
- package/dist/core/goals/session-goal-state.d.ts.map +1 -1
- package/dist/core/goals/session-goal-state.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/human-input-controller.d.ts.map +1 -1
- package/dist/core/human-input-controller.js +2 -3
- package/dist/core/human-input-controller.js.map +1 -1
- package/dist/core/human-input.d.ts.map +1 -1
- package/dist/core/human-input.js.map +1 -1
- package/dist/core/improvement-loop.d.ts.map +1 -1
- package/dist/core/improvement-loop.js +11 -11
- package/dist/core/improvement-loop.js.map +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/install-telemetry.d.ts.map +1 -1
- package/dist/core/install-telemetry.js.map +1 -1
- package/dist/core/isolated-text-completion.d.ts +17 -0
- package/dist/core/isolated-text-completion.d.ts.map +1 -0
- package/dist/core/isolated-text-completion.js +15 -0
- package/dist/core/isolated-text-completion.js.map +1 -0
- package/dist/core/keybindings.d.ts +47 -2
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +12 -1
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/learning/learning-audit.d.ts.map +1 -1
- package/dist/core/learning/learning-audit.js.map +1 -1
- package/dist/core/learning/learning-gate.d.ts.map +1 -1
- package/dist/core/learning/learning-gate.js.map +1 -1
- package/dist/core/learning/observation-store.d.ts.map +1 -1
- package/dist/core/learning/observation-store.js +0 -2
- package/dist/core/learning/observation-store.js.map +1 -1
- package/dist/core/learning/reflection-engine.d.ts +1 -1
- package/dist/core/learning/reflection-engine.d.ts.map +1 -1
- package/dist/core/learning/reflection-engine.js +3 -0
- package/dist/core/learning/reflection-engine.js.map +1 -1
- package/dist/core/learning/reflection-turn-analysis.d.ts +20 -0
- package/dist/core/learning/reflection-turn-analysis.d.ts.map +1 -0
- package/dist/core/learning/reflection-turn-analysis.js +136 -0
- package/dist/core/learning/reflection-turn-analysis.js.map +1 -0
- package/dist/core/learning/session-learning-decision.d.ts.map +1 -1
- package/dist/core/learning/session-learning-decision.js.map +1 -1
- package/dist/core/learning/skill-curator.d.ts.map +1 -1
- package/dist/core/learning/skill-curator.js +0 -3
- package/dist/core/learning/skill-curator.js.map +1 -1
- package/dist/core/local-runtime-controller.d.ts +39 -0
- package/dist/core/local-runtime-controller.d.ts.map +1 -1
- package/dist/core/local-runtime-controller.js +41 -62
- package/dist/core/local-runtime-controller.js.map +1 -1
- package/dist/core/memory/effectiveness-tracker.d.ts.map +1 -1
- package/dist/core/memory/effectiveness-tracker.js +4 -2
- package/dist/core/memory/effectiveness-tracker.js.map +1 -1
- package/dist/core/memory/memory-manager.d.ts.map +1 -1
- package/dist/core/memory/memory-manager.js +7 -7
- package/dist/core/memory/memory-manager.js.map +1 -1
- package/dist/core/memory/memory-provider.d.ts.map +1 -1
- package/dist/core/memory/providers/file-store.d.ts +7 -0
- package/dist/core/memory/providers/file-store.d.ts.map +1 -1
- package/dist/core/memory/providers/file-store.js +48 -13
- package/dist/core/memory/providers/file-store.js.map +1 -1
- package/dist/core/memory/providers/transcript-recall-worker-protocol.d.ts +47 -0
- package/dist/core/memory/providers/transcript-recall-worker-protocol.d.ts.map +1 -0
- package/dist/core/memory/providers/transcript-recall-worker-protocol.js +50 -0
- package/dist/core/memory/providers/transcript-recall-worker-protocol.js.map +1 -0
- package/dist/core/memory/providers/transcript-recall-worker.d.ts +2 -0
- package/dist/core/memory/providers/transcript-recall-worker.d.ts.map +1 -0
- package/dist/core/memory/providers/transcript-recall-worker.js +143 -0
- package/dist/core/memory/providers/transcript-recall-worker.js.map +1 -0
- package/dist/core/memory/providers/transcript-recall.d.ts +24 -13
- package/dist/core/memory/providers/transcript-recall.d.ts.map +1 -1
- package/dist/core/memory/providers/transcript-recall.js +143 -141
- package/dist/core/memory/providers/transcript-recall.js.map +1 -1
- package/dist/core/memory/providers/user-memory-archive.d.ts +39 -0
- package/dist/core/memory/providers/user-memory-archive.d.ts.map +1 -0
- package/dist/core/memory/providers/user-memory-archive.js +258 -0
- package/dist/core/memory/providers/user-memory-archive.js.map +1 -0
- package/dist/core/memory/transcript-index.d.ts.map +1 -1
- package/dist/core/memory/transcript-index.js +1 -1
- package/dist/core/memory/transcript-index.js.map +1 -1
- package/dist/core/memory-controller.d.ts +9 -0
- package/dist/core/memory-controller.d.ts.map +1 -1
- package/dist/core/memory-controller.js +57 -16
- package/dist/core/memory-controller.js.map +1 -1
- package/dist/core/model-capability.d.ts.map +1 -1
- package/dist/core/model-capability.js.map +1 -1
- package/dist/core/model-output-json.d.ts +10 -0
- package/dist/core/model-output-json.d.ts.map +1 -0
- package/dist/core/model-output-json.js +43 -0
- package/dist/core/model-output-json.js.map +1 -0
- package/dist/core/model-registry.d.ts +8 -8
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +29 -52
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +1 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-router/config-diagnostics.d.ts.map +1 -1
- package/dist/core/model-router/config-diagnostics.js.map +1 -1
- package/dist/core/model-router/executor-route.d.ts.map +1 -1
- package/dist/core/model-router/executor-route.js.map +1 -1
- package/dist/core/model-router/fitness-gate.d.ts.map +1 -1
- package/dist/core/model-router/fitness-gate.js.map +1 -1
- package/dist/core/model-router/intent-classifier.d.ts.map +1 -1
- package/dist/core/model-router/route-judge.d.ts.map +1 -1
- package/dist/core/model-router/route-judge.js +18 -36
- package/dist/core/model-router/route-judge.js.map +1 -1
- package/dist/core/model-router/session-buffer.d.ts.map +1 -1
- package/dist/core/model-router/session-buffer.js.map +1 -1
- package/dist/core/model-router/status.d.ts.map +1 -1
- package/dist/core/model-router/status.js.map +1 -1
- package/dist/core/model-router/tool-escalation.d.ts.map +1 -1
- package/dist/core/model-router/tool-escalation.js.map +1 -1
- package/dist/core/model-router-controller.d.ts +1 -0
- package/dist/core/model-router-controller.d.ts.map +1 -1
- package/dist/core/model-router-controller.js +25 -56
- package/dist/core/model-router-controller.js.map +1 -1
- package/dist/core/model-selection-controller.d.ts +10 -0
- package/dist/core/model-selection-controller.d.ts.map +1 -1
- package/dist/core/model-selection-controller.js +0 -1
- package/dist/core/model-selection-controller.js.map +1 -1
- package/dist/core/model-tool-protocol.d.ts.map +1 -1
- package/dist/core/model-tool-protocol.js.map +1 -1
- package/dist/core/models/adaptation-store.d.ts.map +1 -1
- package/dist/core/models/adaptation-store.js +0 -1
- package/dist/core/models/adaptation-store.js.map +1 -1
- package/dist/core/models/context-sizing.d.ts.map +1 -1
- package/dist/core/models/context-sizing.js.map +1 -1
- package/dist/core/models/default-model-suggestions.d.ts.map +1 -1
- package/dist/core/models/default-model-suggestions.js.map +1 -1
- package/dist/core/models/fitness-store.d.ts.map +1 -1
- package/dist/core/models/fitness-store.js +0 -1
- package/dist/core/models/fitness-store.js.map +1 -1
- package/dist/core/models/host-state-store.d.ts.map +1 -1
- package/dist/core/models/host-state-store.js +1 -6
- package/dist/core/models/host-state-store.js.map +1 -1
- package/dist/core/models/llamacpp-runtime.d.ts +4 -19
- package/dist/core/models/llamacpp-runtime.d.ts.map +1 -1
- package/dist/core/models/llamacpp-runtime.js +32 -136
- package/dist/core/models/llamacpp-runtime.js.map +1 -1
- package/dist/core/models/local-registration.d.ts.map +1 -1
- package/dist/core/models/local-registration.js +82 -115
- package/dist/core/models/local-registration.js.map +1 -1
- package/dist/core/models/local-runtime.d.ts +12 -18
- package/dist/core/models/local-runtime.d.ts.map +1 -1
- package/dist/core/models/local-runtime.js +60 -204
- package/dist/core/models/local-runtime.js.map +1 -1
- package/dist/core/models/model-endpoint.d.ts.map +1 -1
- package/dist/core/models/model-endpoint.js.map +1 -1
- package/dist/core/models/model-ref.d.ts.map +1 -1
- package/dist/core/models/model-ref.js.map +1 -1
- package/dist/core/models/needle-runtime.d.ts +7 -3
- package/dist/core/models/needle-runtime.d.ts.map +1 -1
- package/dist/core/models/needle-runtime.js +16 -92
- package/dist/core/models/needle-runtime.js.map +1 -1
- package/dist/core/models/perf-profile.d.ts +1 -1
- package/dist/core/models/perf-profile.d.ts.map +1 -1
- package/dist/core/models/perf-profile.js +6 -13
- package/dist/core/models/perf-profile.js.map +1 -1
- package/dist/core/models/prism-llamacpp-lifecycle.d.ts.map +1 -1
- package/dist/core/models/prism-llamacpp-lifecycle.js.map +1 -1
- package/dist/core/models/runtime-arbiter.d.ts.map +1 -1
- package/dist/core/models/runtime-arbiter.js +3 -15
- package/dist/core/models/runtime-arbiter.js.map +1 -1
- package/dist/core/models/runtime-process.d.ts +100 -0
- package/dist/core/models/runtime-process.d.ts.map +1 -0
- package/dist/core/models/runtime-process.js +183 -0
- package/dist/core/models/runtime-process.js.map +1 -0
- package/dist/core/orchestration/agent-resume.d.ts.map +1 -1
- package/dist/core/orchestration/agent-resume.js.map +1 -1
- package/dist/core/orchestration/attempt-usage.d.ts.map +1 -1
- package/dist/core/orchestration/attempt-usage.js.map +1 -1
- package/dist/core/orchestration/capability-gateway.d.ts.map +1 -1
- package/dist/core/orchestration/capability-gateway.js +0 -14
- package/dist/core/orchestration/capability-gateway.js.map +1 -1
- package/dist/core/orchestration/contracts.d.ts.map +1 -1
- package/dist/core/orchestration/contracts.js.map +1 -1
- package/dist/core/orchestration/delegation-ledger.d.ts.map +1 -1
- package/dist/core/orchestration/delegation-ledger.js +0 -2
- package/dist/core/orchestration/delegation-ledger.js.map +1 -1
- package/dist/core/orchestration/event-store.d.ts.map +1 -1
- package/dist/core/orchestration/event-store.js +1 -14
- package/dist/core/orchestration/event-store.js.map +1 -1
- package/dist/core/orchestration/lane-tool-manifests.d.ts.map +1 -1
- package/dist/core/orchestration/lane-tool-manifests.js.map +1 -1
- package/dist/core/orchestration/model-binding.d.ts.map +1 -1
- package/dist/core/orchestration/model-binding.js.map +1 -1
- package/dist/core/orchestration/policy-compiler.d.ts.map +1 -1
- package/dist/core/orchestration/policy-compiler.js +0 -3
- package/dist/core/orchestration/policy-compiler.js.map +1 -1
- package/dist/core/orchestration/policy-gate.d.ts.map +1 -1
- package/dist/core/orchestration/policy-gate.js +0 -2
- package/dist/core/orchestration/policy-gate.js.map +1 -1
- package/dist/core/orchestration/profile-registry.d.ts.map +1 -1
- package/dist/core/orchestration/profile-registry.js +1 -1
- package/dist/core/orchestration/profile-registry.js.map +1 -1
- package/dist/core/orchestration/profile-store.d.ts.map +1 -1
- package/dist/core/orchestration/profile-store.js +0 -3
- package/dist/core/orchestration/profile-store.js.map +1 -1
- package/dist/core/orchestration/risk-budget.d.ts.map +1 -1
- package/dist/core/orchestration/risk-budget.js.map +1 -1
- package/dist/core/orchestration/task-runtime.d.ts +1 -0
- package/dist/core/orchestration/task-runtime.d.ts.map +1 -1
- package/dist/core/orchestration/task-runtime.js +27 -42
- package/dist/core/orchestration/task-runtime.js.map +1 -1
- package/dist/core/orchestration/work-state-projection.d.ts.map +1 -1
- package/dist/core/orchestration/work-state-projection.js.map +1 -1
- package/dist/core/orchestration/worker-execution-contract.d.ts.map +1 -1
- package/dist/core/orchestration/worker-execution-contract.js.map +1 -1
- package/dist/core/orchestration/worker-result-adapter.d.ts.map +1 -1
- package/dist/core/orchestration/worker-result-adapter.js.map +1 -1
- package/dist/core/output-guard.d.ts.map +1 -1
- package/dist/core/output-guard.js.map +1 -1
- package/dist/core/package-manager.d.ts +3 -0
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +88 -353
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/process-identity.d.ts.map +1 -1
- package/dist/core/process-identity.js.map +1 -1
- package/dist/core/process-liveness.d.ts +3 -0
- package/dist/core/process-liveness.d.ts.map +1 -0
- package/dist/core/process-liveness.js +17 -0
- package/dist/core/process-liveness.js.map +1 -0
- package/dist/core/process-matrix/codes.d.ts.map +1 -1
- package/dist/core/process-matrix/resume-launcher.d.ts.map +1 -1
- package/dist/core/process-matrix/resume-launcher.js.map +1 -1
- package/dist/core/process-matrix/runtime.d.ts.map +1 -1
- package/dist/core/process-matrix/runtime.js.map +1 -1
- package/dist/core/process-matrix/store.d.ts.map +1 -1
- package/dist/core/process-matrix/store.js.map +1 -1
- package/dist/core/process-matrix/supervisor.d.ts.map +1 -1
- package/dist/core/process-matrix/supervisor.js.map +1 -1
- package/dist/core/profile-filter-controller.d.ts.map +1 -1
- package/dist/core/profile-filter-controller.js +7 -8
- package/dist/core/profile-filter-controller.js.map +1 -1
- package/dist/core/profile-registry.d.ts.map +1 -1
- package/dist/core/profile-registry.js +1 -2
- package/dist/core/profile-registry.js.map +1 -1
- package/dist/core/profile-resource-selection.d.ts.map +1 -1
- package/dist/core/profile-resource-selection.js +18 -59
- package/dist/core/profile-resource-selection.js.map +1 -1
- package/dist/core/prompt-markup.d.ts +3 -0
- package/dist/core/prompt-markup.d.ts.map +1 -0
- package/dist/core/prompt-markup.js +7 -0
- package/dist/core/prompt-markup.js.map +1 -0
- package/dist/core/prompt-templates.d.ts.map +1 -1
- package/dist/core/prompt-templates.js +13 -39
- package/dist/core/prompt-templates.js.map +1 -1
- package/dist/core/provider-display-names.d.ts.map +1 -1
- package/dist/core/python-runtime.d.ts.map +1 -1
- package/dist/core/python-runtime.js.map +1 -1
- package/dist/core/reflection-controller.d.ts +22 -1
- package/dist/core/reflection-controller.d.ts.map +1 -1
- package/dist/core/reflection-controller.js +143 -25
- package/dist/core/reflection-controller.js.map +1 -1
- package/dist/core/reload-blockers.d.ts +2 -1
- package/dist/core/reload-blockers.d.ts.map +1 -1
- package/dist/core/reload-blockers.js +4 -14
- package/dist/core/reload-blockers.js.map +1 -1
- package/dist/core/request-auth.d.ts.map +1 -1
- package/dist/core/request-auth.js.map +1 -1
- package/dist/core/research/automata-provider.d.ts.map +1 -1
- package/dist/core/research/automata-provider.js.map +1 -1
- package/dist/core/research/evidence-bundle.d.ts.map +1 -1
- package/dist/core/research/evidence-bundle.js.map +1 -1
- package/dist/core/research/lane-model-resolver.d.ts.map +1 -1
- package/dist/core/research/lane-model-resolver.js +0 -1
- package/dist/core/research/lane-model-resolver.js.map +1 -1
- package/dist/core/research/model-fitness-controller.d.ts.map +1 -1
- package/dist/core/research/model-fitness-controller.js +17 -33
- package/dist/core/research/model-fitness-controller.js.map +1 -1
- package/dist/core/research/model-fitness.d.ts.map +1 -1
- package/dist/core/research/model-fitness.js +4 -25
- package/dist/core/research/model-fitness.js.map +1 -1
- package/dist/core/research/research-gate.d.ts.map +1 -1
- package/dist/core/research/research-gate.js.map +1 -1
- package/dist/core/research/research-lane-controller.d.ts.map +1 -1
- package/dist/core/research/research-lane-controller.js +5 -10
- package/dist/core/research/research-lane-controller.js.map +1 -1
- package/dist/core/research/research-runner.d.ts +2 -4
- package/dist/core/research/research-runner.d.ts.map +1 -1
- package/dist/core/research/research-runner.js +17 -48
- package/dist/core/research/research-runner.js.map +1 -1
- package/dist/core/research/session-evidence-bundle.d.ts.map +1 -1
- package/dist/core/research/session-evidence-bundle.js.map +1 -1
- package/dist/core/research/workspace-collector.d.ts.map +1 -1
- package/dist/core/research/workspace-collector.js.map +1 -1
- package/dist/core/resolve-config-value.d.ts.map +1 -1
- package/dist/core/resolve-config-value.js.map +1 -1
- package/dist/core/resource-ignore.d.ts +6 -0
- package/dist/core/resource-ignore.d.ts.map +1 -0
- package/dist/core/resource-ignore.js +44 -0
- package/dist/core/resource-ignore.js.map +1 -0
- package/dist/core/resource-loader.d.ts +0 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +52 -187
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/resource-profile-blocks.d.ts +3 -1
- package/dist/core/resource-profile-blocks.d.ts.map +1 -1
- package/dist/core/resource-profile-blocks.js +8 -5
- package/dist/core/resource-profile-blocks.js.map +1 -1
- package/dist/core/resource-profile-equality.d.ts.map +1 -1
- package/dist/core/resource-profile-equality.js.map +1 -1
- package/dist/core/resource-traversal.d.ts +43 -0
- package/dist/core/resource-traversal.d.ts.map +1 -0
- package/dist/core/resource-traversal.js +84 -0
- package/dist/core/resource-traversal.js.map +1 -0
- package/dist/core/risk-classifier.d.ts.map +1 -1
- package/dist/core/risk-classifier.js.map +1 -1
- package/dist/core/runtime-builder.d.ts +4 -1
- package/dist/core/runtime-builder.d.ts.map +1 -1
- package/dist/core/runtime-builder.js +25 -50
- package/dist/core/runtime-builder.js.map +1 -1
- package/dist/core/scout-controller.d.ts.map +1 -1
- package/dist/core/scout-controller.js +0 -1
- package/dist/core/scout-controller.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/secrets/credential-exposure-guard.d.ts.map +1 -1
- package/dist/core/secrets/credential-exposure-guard.js +70 -44
- package/dist/core/secrets/credential-exposure-guard.js.map +1 -1
- package/dist/core/secrets/secret-dotenv.d.ts.map +1 -1
- package/dist/core/secrets/secret-dotenv.js +0 -1
- package/dist/core/secrets/secret-dotenv.js.map +1 -1
- package/dist/core/secrets/secret-vault-format.d.ts.map +1 -1
- package/dist/core/secrets/secret-vault-format.js +0 -1
- package/dist/core/secrets/secret-vault-format.js.map +1 -1
- package/dist/core/secrets/secret-vault.d.ts.map +1 -1
- package/dist/core/secrets/secret-vault.js +2 -10
- package/dist/core/secrets/secret-vault.js.map +1 -1
- package/dist/core/security/secret-text.d.ts.map +1 -1
- package/dist/core/security/secret-text.js.map +1 -1
- package/dist/core/security/untrusted-boundary.d.ts.map +1 -1
- package/dist/core/security/untrusted-boundary.js.map +1 -1
- package/dist/core/session-analytics.d.ts.map +1 -1
- package/dist/core/session-analytics.js +18 -50
- package/dist/core/session-analytics.js.map +1 -1
- package/dist/core/session-artifact-bundle.d.ts.map +1 -1
- package/dist/core/session-artifact-bundle.js.map +1 -1
- package/dist/core/session-cwd.d.ts.map +1 -1
- package/dist/core/session-cwd.js +0 -1
- package/dist/core/session-cwd.js.map +1 -1
- package/dist/core/session-entry-index.d.ts +8 -0
- package/dist/core/session-entry-index.d.ts.map +1 -0
- package/dist/core/session-entry-index.js +16 -0
- package/dist/core/session-entry-index.js.map +1 -0
- package/dist/core/session-image-store.d.ts.map +1 -1
- package/dist/core/session-image-store.js +0 -3
- package/dist/core/session-image-store.js.map +1 -1
- package/dist/core/session-jsonl-writer.d.ts +3 -0
- package/dist/core/session-jsonl-writer.d.ts.map +1 -0
- package/dist/core/session-jsonl-writer.js +38 -0
- package/dist/core/session-jsonl-writer.js.map +1 -0
- package/dist/core/session-manager-factory.d.ts.map +1 -1
- package/dist/core/session-manager-factory.js.map +1 -1
- package/dist/core/session-role.d.ts.map +1 -1
- package/dist/core/session-role.js.map +1 -1
- package/dist/core/session-snapshot.d.ts.map +1 -1
- package/dist/core/session-snapshot.js.map +1 -1
- package/dist/core/session-supervision-runtime.d.ts.map +1 -1
- package/dist/core/session-supervision-runtime.js +1 -4
- package/dist/core/session-supervision-runtime.js.map +1 -1
- package/dist/core/session-tree-navigator.d.ts.map +1 -1
- package/dist/core/session-tree-navigator.js +0 -1
- package/dist/core/session-tree-navigator.js.map +1 -1
- package/dist/core/settings-manager.d.ts +2 -1
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +64 -162
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skill-block.d.mts +8 -0
- package/dist/core/skill-block.mjs +52 -0
- package/dist/core/skill-discovery.d.ts +5 -0
- package/dist/core/skill-discovery.d.ts.map +1 -0
- package/dist/core/skill-discovery.js +34 -0
- package/dist/core/skill-discovery.js.map +1 -0
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js +23 -159
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/source-info.d.ts.map +1 -1
- package/dist/core/source-info.js.map +1 -1
- package/dist/core/spawned-usage.d.ts +21 -0
- package/dist/core/spawned-usage.d.ts.map +1 -0
- package/dist/core/spawned-usage.js +29 -0
- package/dist/core/spawned-usage.js.map +1 -0
- package/dist/core/system-prompt-builder.d.ts +4 -0
- package/dist/core/system-prompt-builder.d.ts.map +1 -1
- package/dist/core/system-prompt-builder.js +15 -8
- package/dist/core/system-prompt-builder.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +52 -35
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tasks/session-task-state.d.ts.map +1 -1
- package/dist/core/tasks/session-task-state.js.map +1 -1
- package/dist/core/tasks/task-command.d.ts.map +1 -1
- package/dist/core/tasks/task-command.js.map +1 -1
- package/dist/core/tasks/task-contract-monitor.d.ts.map +1 -1
- package/dist/core/tasks/task-contract-monitor.js.map +1 -1
- package/dist/core/tasks/task-projection.d.ts.map +1 -1
- package/dist/core/tasks/task-projection.js.map +1 -1
- package/dist/core/tasks/task-state.d.ts.map +1 -1
- package/dist/core/tasks/task-state.js.map +1 -1
- package/dist/core/text-preview.d.ts +4 -0
- package/dist/core/text-preview.d.ts.map +1 -0
- package/dist/core/text-preview.js +33 -0
- package/dist/core/text-preview.js.map +1 -0
- package/dist/core/timings.d.ts.map +1 -1
- package/dist/core/timings.js.map +1 -1
- package/dist/core/tool-capability-policy.d.ts.map +1 -1
- package/dist/core/tool-capability-policy.js.map +1 -1
- package/dist/core/tool-gate-controller.d.ts.map +1 -1
- package/dist/core/tool-gate-controller.js +86 -87
- package/dist/core/tool-gate-controller.js.map +1 -1
- package/dist/core/tool-protocol-controller.d.ts +4 -1
- package/dist/core/tool-protocol-controller.d.ts.map +1 -1
- package/dist/core/tool-protocol-controller.js +19 -23
- package/dist/core/tool-protocol-controller.js.map +1 -1
- package/dist/core/tool-recovery-log-records.d.ts.map +1 -1
- package/dist/core/tool-recovery-log-records.js.map +1 -1
- package/dist/core/tool-recovery-log-worker.d.ts.map +1 -1
- package/dist/core/tool-recovery-log-worker.js.map +1 -1
- package/dist/core/tool-recovery-logger.d.ts.map +1 -1
- package/dist/core/tool-recovery-logger.js +12 -24
- package/dist/core/tool-recovery-logger.js.map +1 -1
- package/dist/core/tool-recovery-stats.d.ts.map +1 -1
- package/dist/core/tool-recovery-stats.js +16 -22
- package/dist/core/tool-recovery-stats.js.map +1 -1
- package/dist/core/tool-repair-health.d.ts.map +1 -1
- package/dist/core/tool-repair-health.js.map +1 -1
- package/dist/core/tool-repair-settings.d.ts.map +1 -1
- package/dist/core/tool-repair-settings.js.map +1 -1
- package/dist/core/tool-selection/expected-utility.d.ts.map +1 -1
- package/dist/core/tool-selection/expected-utility.js.map +1 -1
- package/dist/core/tool-selection/promotion.d.ts.map +1 -1
- package/dist/core/tool-selection/promotion.js.map +1 -1
- package/dist/core/tool-selection/tool-performance-store.d.ts +2 -0
- package/dist/core/tool-selection/tool-performance-store.d.ts.map +1 -1
- package/dist/core/tool-selection/tool-performance-store.js +49 -7
- package/dist/core/tool-selection/tool-performance-store.js.map +1 -1
- package/dist/core/tool-selection/tool-phase-timing.d.ts +19 -0
- package/dist/core/tool-selection/tool-phase-timing.d.ts.map +1 -0
- package/dist/core/tool-selection/tool-phase-timing.js +63 -0
- package/dist/core/tool-selection/tool-phase-timing.js.map +1 -0
- package/dist/core/tool-selection/tool-selection-controller.d.ts +2 -5
- package/dist/core/tool-selection/tool-selection-controller.d.ts.map +1 -1
- package/dist/core/tool-selection/tool-selection-controller.js +50 -30
- package/dist/core/tool-selection/tool-selection-controller.js.map +1 -1
- package/dist/core/toolkit/reflex-interpreter.d.ts +16 -0
- package/dist/core/toolkit/reflex-interpreter.d.ts.map +1 -1
- package/dist/core/toolkit/reflex-interpreter.js +21 -0
- package/dist/core/toolkit/reflex-interpreter.js.map +1 -1
- package/dist/core/toolkit/script-registry.d.ts.map +1 -1
- package/dist/core/toolkit/script-registry.js.map +1 -1
- package/dist/core/toolkit/script-runner.d.ts.map +1 -1
- package/dist/core/toolkit/script-runner.js.map +1 -1
- package/dist/core/tools/artifact-retrieve.d.ts.map +1 -1
- package/dist/core/tools/artifact-retrieve.js.map +1 -1
- package/dist/core/tools/ask-question.d.ts +2 -3
- package/dist/core/tools/ask-question.d.ts.map +1 -1
- package/dist/core/tools/ask-question.js +14 -40
- package/dist/core/tools/ask-question.js.map +1 -1
- package/dist/core/tools/bash.d.ts +2 -0
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +83 -30
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/context-scout.d.ts.map +1 -1
- package/dist/core/tools/context-scout.js.map +1 -1
- package/dist/core/tools/delegate-status.d.ts.map +1 -1
- package/dist/core/tools/delegate-status.js +9 -7
- package/dist/core/tools/delegate-status.js.map +1 -1
- package/dist/core/tools/delegate.d.ts.map +1 -1
- package/dist/core/tools/delegate.js +6 -6
- package/dist/core/tools/delegate.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/extensionify.d.ts.map +1 -1
- package/dist/core/tools/extensionify.js.map +1 -1
- package/dist/core/tools/fff-search-backend.d.ts +19 -0
- package/dist/core/tools/fff-search-backend.d.ts.map +1 -1
- package/dist/core/tools/fff-search-backend.js +28 -2
- package/dist/core/tools/fff-search-backend.js.map +1 -1
- package/dist/core/tools/file-encoding-policy.d.ts.map +1 -1
- package/dist/core/tools/file-encoding-policy.js.map +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-queue.js.map +1 -1
- package/dist/core/tools/find.d.ts +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +44 -108
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/git-filter.d.ts.map +1 -1
- package/dist/core/tools/git-filter.js.map +1 -1
- package/dist/core/tools/goal.d.ts.map +1 -1
- package/dist/core/tools/goal.js +7 -7
- package/dist/core/tools/goal.js.map +1 -1
- package/dist/core/tools/grep.d.ts +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +42 -102
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +20 -36
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/model-fitness.d.ts.map +1 -1
- package/dist/core/tools/model-fitness.js.map +1 -1
- package/dist/core/tools/orchestration-panel.d.ts +5 -0
- package/dist/core/tools/orchestration-panel.d.ts.map +1 -1
- package/dist/core/tools/orchestration-panel.js +5 -5
- package/dist/core/tools/orchestration-panel.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts +2 -0
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +24 -36
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/core/tools/path-utils.d.ts.map +1 -1
- package/dist/core/tools/path-utils.js.map +1 -1
- package/dist/core/tools/persistent-process-coordinator.d.ts +31 -0
- package/dist/core/tools/persistent-process-coordinator.d.ts.map +1 -0
- package/dist/core/tools/persistent-process-coordinator.js +123 -0
- package/dist/core/tools/persistent-process-coordinator.js.map +1 -0
- package/dist/core/tools/python.d.ts.map +1 -1
- package/dist/core/tools/python.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +14 -13
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts +29 -0
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js +31 -1
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/run-process.d.ts.map +1 -1
- package/dist/core/tools/run-process.js.map +1 -1
- package/dist/core/tools/run-toolkit-script.d.ts.map +1 -1
- package/dist/core/tools/run-toolkit-script.js.map +1 -1
- package/dist/core/tools/search-command-guard.d.ts +10 -0
- package/dist/core/tools/search-command-guard.d.ts.map +1 -1
- package/dist/core/tools/search-command-guard.js +118 -31
- package/dist/core/tools/search-command-guard.js.map +1 -1
- package/dist/core/tools/search-router.d.ts.map +1 -1
- package/dist/core/tools/search-router.js.map +1 -1
- package/dist/core/tools/search-tool-runtime.d.ts +19 -0
- package/dist/core/tools/search-tool-runtime.d.ts.map +1 -0
- package/dist/core/tools/search-tool-runtime.js +12 -0
- package/dist/core/tools/search-tool-runtime.js.map +1 -0
- package/dist/core/tools/secret-store.d.ts.map +1 -1
- package/dist/core/tools/secret-store.js.map +1 -1
- package/dist/core/tools/shell-command-parser.d.ts.map +1 -1
- package/dist/core/tools/shell-command-parser.js.map +1 -1
- package/dist/core/tools/shell-contract-router.d.ts.map +1 -1
- package/dist/core/tools/shell-contract-router.js +4 -1
- package/dist/core/tools/shell-contract-router.js.map +1 -1
- package/dist/core/tools/shell-execution-session.d.ts +4 -0
- package/dist/core/tools/shell-execution-session.d.ts.map +1 -0
- package/dist/core/tools/shell-execution-session.js +11 -0
- package/dist/core/tools/shell-execution-session.js.map +1 -0
- package/dist/core/tools/shell-output-projection.d.ts +49 -0
- package/dist/core/tools/shell-output-projection.d.ts.map +1 -0
- package/dist/core/tools/shell-output-projection.js +381 -0
- package/dist/core/tools/shell-output-projection.js.map +1 -0
- package/dist/core/tools/shell-session.d.ts +2 -13
- package/dist/core/tools/shell-session.d.ts.map +1 -1
- package/dist/core/tools/shell-session.js +36 -136
- package/dist/core/tools/shell-session.js.map +1 -1
- package/dist/core/tools/skill-audit.d.ts.map +1 -1
- package/dist/core/tools/skill-audit.js.map +1 -1
- package/dist/core/tools/skillify.d.ts.map +1 -1
- package/dist/core/tools/skillify.js.map +1 -1
- package/dist/core/tools/task-steps.d.ts +8 -8
- package/dist/core/tools/task-steps.d.ts.map +1 -1
- package/dist/core/tools/task-steps.js +17 -18
- package/dist/core/tools/task-steps.js.map +1 -1
- package/dist/core/tools/tmux-dispatch.d.ts.map +1 -1
- package/dist/core/tools/tmux-dispatch.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/tools/tool-task.d.ts +23 -0
- package/dist/core/tools/tool-task.d.ts.map +1 -0
- package/dist/core/tools/tool-task.js +93 -0
- package/dist/core/tools/tool-task.js.map +1 -0
- package/dist/core/tools/windows-shell-engine.d.ts +17 -11
- package/dist/core/tools/windows-shell-engine.d.ts.map +1 -1
- package/dist/core/tools/windows-shell-engine.js +339 -117
- package/dist/core/tools/windows-shell-engine.js.map +1 -1
- package/dist/core/tools/windows-shell-state.d.ts.map +1 -1
- package/dist/core/tools/windows-shell-state.js.map +1 -1
- package/dist/core/tools/worktree-sync.d.ts.map +1 -1
- package/dist/core/tools/worktree-sync.js +8 -12
- package/dist/core/tools/worktree-sync.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +0 -1
- package/dist/core/tools/write.js.map +1 -1
- package/dist/core/trust-manager.d.ts.map +1 -1
- package/dist/core/trust-manager.js +7 -40
- package/dist/core/trust-manager.js.map +1 -1
- package/dist/core/util/atomic-file.d.ts +19 -0
- package/dist/core/util/atomic-file.d.ts.map +1 -1
- package/dist/core/util/atomic-file.js +50 -15
- package/dist/core/util/atomic-file.js.map +1 -1
- package/dist/core/util/bounded-file.d.ts.map +1 -1
- package/dist/core/util/bounded-file.js.map +1 -1
- package/dist/core/util/bounded-jsonl.d.ts.map +1 -1
- package/dist/core/util/bounded-jsonl.js +2 -9
- package/dist/core/util/bounded-jsonl.js.map +1 -1
- package/dist/core/util/bounded-value.d.ts.map +1 -1
- package/dist/core/util/bounded-value.js.map +1 -1
- package/dist/core/util/json-size.d.ts +3 -0
- package/dist/core/util/json-size.d.ts.map +1 -0
- package/dist/core/util/json-size.js +95 -0
- package/dist/core/util/json-size.js.map +1 -0
- package/dist/core/util/minimatch-cache.d.ts.map +1 -1
- package/dist/core/util/minimatch-cache.js.map +1 -1
- package/dist/core/util/value-guards.d.ts.map +1 -1
- package/dist/core/util/value-guards.js.map +1 -1
- package/dist/core/worktree-sync/codes.d.ts.map +1 -1
- package/dist/core/worktree-sync/git-engine.d.ts.map +1 -1
- package/dist/core/worktree-sync/git-engine.js +20 -36
- package/dist/core/worktree-sync/git-engine.js.map +1 -1
- package/dist/core/worktree-sync/lane-gate.d.ts.map +1 -1
- package/dist/core/worktree-sync/lane-gate.js +1 -4
- package/dist/core/worktree-sync/lane-gate.js.map +1 -1
- package/dist/core/worktree-sync/runtime.d.ts.map +1 -1
- package/dist/core/worktree-sync/runtime.js.map +1 -1
- package/dist/core/worktree-sync/store.d.ts.map +1 -1
- package/dist/core/worktree-sync/store.js.map +1 -1
- package/dist/core/worktree-sync/watcher.d.ts.map +1 -1
- package/dist/core/worktree-sync/watcher.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +10 -32
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +6 -19
- package/dist/migrations.js.map +1 -1
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/interactive/auth-dialogs-controller.d.ts +3 -0
- package/dist/modes/interactive/auth-dialogs-controller.d.ts.map +1 -1
- package/dist/modes/interactive/auth-dialogs-controller.js +96 -132
- package/dist/modes/interactive/auth-dialogs-controller.js.map +1 -1
- package/dist/modes/interactive/auto-learn-controller.d.ts +1 -31
- package/dist/modes/interactive/auto-learn-controller.d.ts.map +1 -1
- package/dist/modes/interactive/auto-learn-controller.js +86 -307
- package/dist/modes/interactive/auto-learn-controller.js.map +1 -1
- package/dist/modes/interactive/autocomplete-provider.d.ts.map +1 -1
- package/dist/modes/interactive/autocomplete-provider.js.map +1 -1
- package/dist/modes/interactive/autonomy-commands.d.ts.map +1 -1
- package/dist/modes/interactive/autonomy-commands.js +2 -8
- package/dist/modes/interactive/autonomy-commands.js.map +1 -1
- package/dist/modes/interactive/clipboard-input.d.ts +5 -1
- package/dist/modes/interactive/clipboard-input.d.ts.map +1 -1
- package/dist/modes/interactive/clipboard-input.js +17 -0
- package/dist/modes/interactive/clipboard-input.js.map +1 -1
- package/dist/modes/interactive/compaction-queue.d.ts.map +1 -1
- package/dist/modes/interactive/compaction-queue.js +13 -18
- package/dist/modes/interactive/compaction-queue.js.map +1 -1
- package/dist/modes/interactive/components/activity-lane.d.ts.map +1 -1
- package/dist/modes/interactive/components/activity-lane.js +6 -10
- package/dist/modes/interactive/components/activity-lane.js.map +1 -1
- package/dist/modes/interactive/components/armin.d.ts +1 -0
- package/dist/modes/interactive/components/armin.d.ts.map +1 -1
- package/dist/modes/interactive/components/armin.js +10 -21
- package/dist/modes/interactive/components/armin.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +1 -6
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +4 -9
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.js +0 -3
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts +3 -8
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +13 -35
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +3 -8
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +14 -36
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts +1 -0
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +20 -43
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.js +0 -5
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts +2 -0
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +4 -8
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +1 -6
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
- package/dist/modes/interactive/components/daxnuts.js +6 -8
- package/dist/modes/interactive/components/daxnuts.js.map +1 -1
- package/dist/modes/interactive/components/diff.d.ts.map +1 -1
- package/dist/modes/interactive/components/diff.js.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.js +0 -1
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
- package/dist/modes/interactive/components/expandable-markdown-message.d.ts +21 -0
- package/dist/modes/interactive/components/expandable-markdown-message.d.ts.map +1 -0
- package/dist/modes/interactive/components/expandable-markdown-message.js +48 -0
- package/dist/modes/interactive/components/expandable-markdown-message.js.map +1 -0
- package/dist/modes/interactive/components/expandable-text.d.ts.map +1 -1
- package/dist/modes/interactive/components/expandable-text.js +0 -2
- package/dist/modes/interactive/components/expandable-text.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js +1 -9
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-input.js +2 -8
- package/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js +5 -20
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/fitness-role-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/fitness-role-selector.js +0 -1
- package/dist/modes/interactive/components/fitness-role-selector.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +1 -5
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +4 -10
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts +2 -2
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +21 -44
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/model-suggestion-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-suggestion-selector.js +0 -1
- package/dist/modes/interactive/components/model-suggestion-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +16 -32
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/profile-resource-editor.d.ts +3 -4
- package/dist/modes/interactive/components/profile-resource-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/profile-resource-editor.js +34 -93
- package/dist/modes/interactive/components/profile-resource-editor.js.map +1 -1
- package/dist/modes/interactive/components/profile-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/profile-selector.js +0 -1
- package/dist/modes/interactive/components/profile-selector.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +3 -4
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +34 -79
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/selector-list.d.ts +63 -0
- package/dist/modes/interactive/components/selector-list.d.ts.map +1 -0
- package/dist/modes/interactive/components/selector-list.js +186 -0
- package/dist/modes/interactive/components/selector-list.js.map +1 -0
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +34 -59
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +40 -138
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts +2 -4
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.js +9 -28
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +3 -8
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +12 -40
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts +2 -5
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.js +11 -37
- package/dist/modes/interactive/components/theme-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts +2 -4
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +9 -31
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +9 -28
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tool-group.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-group.js +2 -3
- package/dist/modes/interactive/components/tool-group.js.map +1 -1
- package/dist/modes/interactive/components/tool-panel-registry.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-panel-registry.js +5 -3
- package/dist/modes/interactive/components/tool-panel-registry.js.map +1 -1
- package/dist/modes/interactive/components/tool-title.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-title.js +0 -4
- package/dist/modes/interactive/components/tool-title.js.map +1 -1
- package/dist/modes/interactive/components/transcript-pager.d.ts +26 -0
- package/dist/modes/interactive/components/transcript-pager.d.ts.map +1 -0
- package/dist/modes/interactive/components/transcript-pager.js +81 -0
- package/dist/modes/interactive/components/transcript-pager.js.map +1 -0
- package/dist/modes/interactive/components/tree-selector.d.ts +1 -12
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +42 -402
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/trust-selector.js +4 -16
- package/dist/modes/interactive/components/trust-selector.js.map +1 -1
- package/dist/modes/interactive/components/usage-action-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/usage-action-selector.js +2 -10
- package/dist/modes/interactive/components/usage-action-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.js +3 -6
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +0 -1
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
- package/dist/modes/interactive/config-backup.d.ts.map +1 -1
- package/dist/modes/interactive/config-backup.js.map +1 -1
- package/dist/modes/interactive/editor-overlay-host.d.ts.map +1 -1
- package/dist/modes/interactive/editor-overlay-host.js +0 -3
- package/dist/modes/interactive/editor-overlay-host.js.map +1 -1
- package/dist/modes/interactive/extension-ui-host.d.ts +2 -0
- package/dist/modes/interactive/extension-ui-host.d.ts.map +1 -1
- package/dist/modes/interactive/extension-ui-host.js +51 -72
- package/dist/modes/interactive/extension-ui-host.js.map +1 -1
- package/dist/modes/interactive/external-editor.d.ts.map +1 -1
- package/dist/modes/interactive/external-editor.js +2 -15
- package/dist/modes/interactive/external-editor.js.map +1 -1
- package/dist/modes/interactive/history-reload-math.d.ts.map +1 -1
- package/dist/modes/interactive/history-reload-math.js.map +1 -1
- package/dist/modes/interactive/interactive-event-controller.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-event-controller.js +23 -16
- package/dist/modes/interactive/interactive-event-controller.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +13 -4
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +123 -204
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/interactive-selection-prompts.d.ts +20 -0
- package/dist/modes/interactive/interactive-selection-prompts.d.ts.map +1 -0
- package/dist/modes/interactive/interactive-selection-prompts.js +43 -0
- package/dist/modes/interactive/interactive-selection-prompts.js.map +1 -0
- package/dist/modes/interactive/key-handlers.d.ts +2 -1
- package/dist/modes/interactive/key-handlers.d.ts.map +1 -1
- package/dist/modes/interactive/key-handlers.js +4 -2
- package/dist/modes/interactive/key-handlers.js.map +1 -1
- package/dist/modes/interactive/loaded-resources-view.d.ts.map +1 -1
- package/dist/modes/interactive/loaded-resources-view.js.map +1 -1
- package/dist/modes/interactive/local-model-commands.d.ts.map +1 -1
- package/dist/modes/interactive/local-model-commands.js +4 -9
- package/dist/modes/interactive/local-model-commands.js.map +1 -1
- package/dist/modes/interactive/model-fitness-presentation.d.ts +21 -0
- package/dist/modes/interactive/model-fitness-presentation.d.ts.map +1 -0
- package/dist/modes/interactive/model-fitness-presentation.js +13 -0
- package/dist/modes/interactive/model-fitness-presentation.js.map +1 -0
- package/dist/modes/interactive/profile-menu-controller.d.ts +2 -0
- package/dist/modes/interactive/profile-menu-controller.d.ts.map +1 -1
- package/dist/modes/interactive/profile-menu-controller.js +79 -171
- package/dist/modes/interactive/profile-menu-controller.js.map +1 -1
- package/dist/modes/interactive/report-commands.d.ts +2 -0
- package/dist/modes/interactive/report-commands.d.ts.map +1 -1
- package/dist/modes/interactive/report-commands.js +12 -6
- package/dist/modes/interactive/report-commands.js.map +1 -1
- package/dist/modes/interactive/resource-display.d.ts.map +1 -1
- package/dist/modes/interactive/resource-display.js.map +1 -1
- package/dist/modes/interactive/resource-shell-commands.d.ts.map +1 -1
- package/dist/modes/interactive/resource-shell-commands.js +6 -23
- package/dist/modes/interactive/resource-shell-commands.js.map +1 -1
- package/dist/modes/interactive/session-flow-commands.d.ts.map +1 -1
- package/dist/modes/interactive/session-flow-commands.js +21 -25
- package/dist/modes/interactive/session-flow-commands.js.map +1 -1
- package/dist/modes/interactive/session-io-commands.d.ts.map +1 -1
- package/dist/modes/interactive/session-io-commands.js.map +1 -1
- package/dist/modes/interactive/session-replacement-errors.d.ts.map +1 -1
- package/dist/modes/interactive/session-replacement-errors.js.map +1 -1
- package/dist/modes/interactive/settings-selector-flow.d.ts.map +1 -1
- package/dist/modes/interactive/settings-selector-flow.js.map +1 -1
- package/dist/modes/interactive/signal-lifecycle.d.ts.map +1 -1
- package/dist/modes/interactive/signal-lifecycle.js.map +1 -1
- package/dist/modes/interactive/startup-checks.d.ts.map +1 -1
- package/dist/modes/interactive/startup-checks.js +12 -8
- package/dist/modes/interactive/startup-checks.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +10 -76
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/interactive/usage-commands.d.ts.map +1 -1
- package/dist/modes/interactive/usage-commands.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +5 -22
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/jsonl.d.ts.map +1 -1
- package/dist/modes/rpc/jsonl.js +1 -1
- package/dist/modes/rpc/jsonl.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +7 -8
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +5 -20
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/modes/termination-signals.d.ts +4 -0
- package/dist/modes/termination-signals.d.ts.map +1 -0
- package/dist/modes/termination-signals.js +21 -0
- package/dist/modes/termination-signals.js.map +1 -0
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/utils/ansi-colors.d.ts +5 -0
- package/dist/utils/ansi-colors.d.ts.map +1 -0
- package/dist/utils/ansi-colors.js +38 -0
- package/dist/utils/ansi-colors.js.map +1 -0
- package/dist/utils/ansi.d.ts.map +1 -1
- package/dist/utils/ansi.js.map +1 -1
- package/dist/utils/changelog.d.ts.map +1 -1
- package/dist/utils/changelog.js.map +1 -1
- package/dist/utils/child-process.d.ts.map +1 -1
- package/dist/utils/child-process.js.map +1 -1
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/clipboard-native.d.ts.map +1 -1
- package/dist/utils/clipboard-native.js.map +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/deprecation.d.ts.map +1 -1
- package/dist/utils/deprecation.js.map +1 -1
- package/dist/utils/exif-orientation.d.ts.map +1 -1
- package/dist/utils/exif-orientation.js.map +1 -1
- package/dist/utils/external-editor-command.d.ts.map +1 -1
- package/dist/utils/external-editor-command.js.map +1 -1
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/fs-watch.d.ts.map +1 -1
- package/dist/utils/fs-watch.js.map +1 -1
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +20 -28
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/highlight-js-languages.d.ts.map +1 -1
- package/dist/utils/html.d.ts.map +1 -1
- package/dist/utils/html.js.map +1 -1
- package/dist/utils/image-convert.d.ts.map +1 -1
- package/dist/utils/image-convert.js.map +1 -1
- package/dist/utils/image-resize-core.d.ts.map +1 -1
- package/dist/utils/image-resize-core.js.map +1 -1
- package/dist/utils/image-resize-worker.d.ts.map +1 -1
- package/dist/utils/image-resize-worker.js.map +1 -1
- package/dist/utils/image-resize.d.ts.map +1 -1
- package/dist/utils/image-resize.js.map +1 -1
- package/dist/utils/json.d.ts.map +1 -1
- package/dist/utils/json.js.map +1 -1
- package/dist/utils/mime.d.ts.map +1 -1
- package/dist/utils/mime.js.map +1 -1
- package/dist/utils/open-browser.d.ts.map +1 -1
- package/dist/utils/open-browser.js.map +1 -1
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/photon.d.ts.map +1 -1
- package/dist/utils/photon.js.map +1 -1
- package/dist/utils/pi-user-agent.d.ts.map +1 -1
- package/dist/utils/pi-user-agent.js.map +1 -1
- package/dist/utils/platform.d.ts.map +1 -1
- package/dist/utils/platform.js.map +1 -1
- package/dist/utils/process-memory.d.ts.map +1 -1
- package/dist/utils/process-memory.js.map +1 -1
- package/dist/utils/safe-write-stream.d.ts.map +1 -1
- package/dist/utils/safe-write-stream.js.map +1 -1
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/sleep.d.ts.map +1 -1
- package/dist/utils/sleep.js +2 -15
- package/dist/utils/sleep.js.map +1 -1
- package/dist/utils/stdin-events.d.ts +8 -0
- package/dist/utils/stdin-events.d.ts.map +1 -0
- package/dist/utils/stdin-events.js +19 -0
- package/dist/utils/stdin-events.js.map +1 -0
- package/dist/utils/syntax-highlight.d.ts.map +1 -1
- package/dist/utils/syntax-highlight.js +20 -13
- package/dist/utils/syntax-highlight.js.map +1 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js.map +1 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js.map +1 -1
- package/dist/utils/windows-self-update.d.ts.map +1 -1
- package/dist/utils/windows-self-update.js.map +1 -1
- package/dist/utils/work-directory.d.ts.map +1 -1
- package/dist/utils/work-directory.js.map +1 -1
- package/docs/compaction.md +11 -3
- package/docs/sessions.md +6 -0
- package/docs/settings.md +1 -1
- package/docs/windows.md +26 -1
- package/docs/work-directory.md +9 -1
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +16 -16
- package/package.json +10 -10
- package/dist/utils/streaming-lines.d.ts +0 -20
- package/dist/utils/streaming-lines.d.ts.map +0 -1
- package/dist/utils/streaming-lines.js +0 -79
- package/dist/utils/streaming-lines.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bounded-jsonl.js","sourceRoot":"","sources":["../../../src/core/util/bounded-jsonl.ts"],"names":[],"mappings":"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","sourcesContent":["import { appendFileSync, promises as fsPromises, type Stats, statSync } from \"node:fs\";\nimport { withFileLock, withFileLockSync, writeFileAtomic, writeFileAtomicSync } from \"./atomic-file.ts\";\nimport { readBoundedTextFile, readBoundedTextFileSync } from \"./bounded-file.ts\";\n\nexport interface BoundedJsonlLimits {\n\tmaxBytes: number;\n\ttargetBytes: number;\n\tmaxRecords: number;\n}\n\nconst asyncAppendTails = new Map<string, Promise<void>>();\nconst MAX_CACHED_FILES = 128;\n\ninterface JsonlFileState {\n\tstats: Stats;\n\trecordCount: number;\n}\n\nconst fileStates = new Map<string, JsonlFileState>();\n\nfunction sameFileState(left: Stats, right: Stats): boolean {\n\treturn (\n\t\tleft.dev === right.dev &&\n\t\tleft.ino === right.ino &&\n\t\tleft.size === right.size &&\n\t\tleft.mtimeMs === right.mtimeMs &&\n\t\tleft.ctimeMs === right.ctimeMs\n\t);\n}\n\nfunction cachedRecordCount(filePath: string, stats: Stats): number | undefined {\n\tconst cached = fileStates.get(filePath);\n\tif (!cached || !sameFileState(cached.stats, stats)) return undefined;\n\tfileStates.delete(filePath);\n\tfileStates.set(filePath, cached);\n\treturn cached.recordCount;\n}\n\nfunction rememberFileState(filePath: string, stats: Stats, recordCount: number): void {\n\tfileStates.delete(filePath);\n\tfileStates.set(filePath, { stats, recordCount });\n\twhile (fileStates.size > MAX_CACHED_FILES) {\n\t\tconst oldest = fileStates.keys().next().value;\n\t\tif (oldest === undefined) break;\n\t\tfileStates.delete(oldest);\n\t}\n}\n\nfunction recordCount(content: string): number {\n\tlet count = 0;\n\tfor (const line of content.split(\"\\n\")) {\n\t\tif (line.trim().length > 0) count++;\n\t}\n\treturn count;\n}\n\nfunction validateLimits(limits: BoundedJsonlLimits): void {\n\tif (\n\t\t!Number.isSafeInteger(limits.maxBytes) ||\n\t\t!Number.isSafeInteger(limits.targetBytes) ||\n\t\t!Number.isSafeInteger(limits.maxRecords) ||\n\t\tlimits.maxBytes <= 0 ||\n\t\tlimits.targetBytes <= 0 ||\n\t\tlimits.targetBytes > limits.maxBytes ||\n\t\tlimits.maxRecords <= 0\n\t) {\n\t\tthrow new TypeError(\"Bounded JSONL limits require positive integers and targetBytes <= maxBytes.\");\n\t}\n}\n\nfunction retainedContent(content: string, limits: BoundedJsonlLimits): string {\n\tconst lines = content.split(\"\\n\").filter((line) => line.trim().length > 0);\n\tconst retained: string[] = [];\n\tlet retainedBytes = 0;\n\tfor (let index = lines.length - 1; index >= 0 && retained.length < limits.maxRecords; index--) {\n\t\tconst line = lines[index]!;\n\t\tconst lineBytes = Buffer.byteLength(line, \"utf-8\") + 1;\n\t\tif (lineBytes > limits.maxBytes) continue;\n\t\tif (retained.length > 0 && retainedBytes + lineBytes > limits.targetBytes) break;\n\t\tretained.push(line);\n\t\tretainedBytes += lineBytes;\n\t\tif (retainedBytes >= limits.targetBytes) break;\n\t}\n\tretained.reverse();\n\treturn retained.length > 0 ? `${retained.join(\"\\n\")}\\n` : \"\";\n}\n\nfunction serializeLine(value: unknown): string {\n\tconst encoded = JSON.stringify(value);\n\tif (encoded === undefined) throw new TypeError(\"Bounded JSONL records must be JSON-serializable values.\");\n\treturn `${encoded}\\n`;\n}\n\nfunction assertLineFits(line: string, limits: BoundedJsonlLimits): number {\n\tconst bytes = Buffer.byteLength(line, \"utf-8\");\n\tif (bytes > limits.maxBytes) throw new Error(\"Bounded JSONL record exceeds maxBytes.\");\n\treturn bytes;\n}\n\nfunction existingStatsSync(filePath: string): Stats | undefined {\n\ttry {\n\t\treturn statSync(filePath);\n\t} catch (error) {\n\t\tif (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") return undefined;\n\t\tthrow error;\n\t}\n}\n\nasync function existingStats(filePath: string): Promise<Stats | undefined> {\n\ttry {\n\t\treturn await fsPromises.stat(filePath);\n\t} catch (error) {\n\t\tif (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") return undefined;\n\t\tthrow error;\n\t}\n}\n\n/** Append one JSON record and rotate to the newest low-water tail under one exclusive lock. */\nexport function appendBoundedJsonLineSync(filePath: string, value: unknown, limits: BoundedJsonlLimits): void {\n\tvalidateLimits(limits);\n\tconst line = serializeLine(value);\n\tconst lineBytes = assertLineFits(line, limits);\n\twithFileLockSync(filePath, () => {\n\t\ttry {\n\t\t\tconst before = existingStatsSync(filePath);\n\t\t\tif (!before || before.size > limits.maxBytes) {\n\t\t\t\twriteFileAtomicSync(filePath, line);\n\t\t\t\trememberFileState(filePath, statSync(filePath), 1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet content: string | undefined;\n\t\t\tlet count = cachedRecordCount(filePath, before);\n\t\t\tif (count === undefined) {\n\t\t\t\tcontent = readBoundedTextFileSync(filePath, limits.maxBytes, \"Bounded JSONL file\");\n\t\t\t\tcount = recordCount(content);\n\t\t\t}\n\t\t\tif (before.size + lineBytes <= limits.maxBytes && count + 1 <= limits.maxRecords) {\n\t\t\t\tappendFileSync(filePath, line, \"utf-8\");\n\t\t\t\trememberFileState(filePath, statSync(filePath), count + 1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcontent ??= readBoundedTextFileSync(filePath, limits.maxBytes, \"Bounded JSONL file\");\n\t\t\tconst retained = retainedContent(`${content}${line}`, limits);\n\t\t\twriteFileAtomicSync(filePath, retained);\n\t\t\trememberFileState(filePath, statSync(filePath), recordCount(retained));\n\t\t} catch (error) {\n\t\t\tfileStates.delete(filePath);\n\t\t\tthrow error;\n\t\t}\n\t});\n}\n\n/** Async counterpart of {@link appendBoundedJsonLineSync}. */\nexport async function appendBoundedJsonLine(\n\tfilePath: string,\n\tvalue: unknown,\n\tlimits: BoundedJsonlLimits,\n): Promise<void> {\n\tvalidateLimits(limits);\n\tconst line = serializeLine(value);\n\tconst lineBytes = assertLineFits(line, limits);\n\tconst previous = asyncAppendTails.get(filePath) ?? Promise.resolve();\n\tconst operation = previous\n\t\t.catch(() => undefined)\n\t\t.then(async () => {\n\t\t\tawait withFileLock(filePath, async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst before = await existingStats(filePath);\n\t\t\t\t\tif (!before || before.size > limits.maxBytes) {\n\t\t\t\t\t\tawait writeFileAtomic(filePath, line);\n\t\t\t\t\t\trememberFileState(filePath, await fsPromises.stat(filePath), 1);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlet content: string | undefined;\n\t\t\t\t\tlet count = cachedRecordCount(filePath, before);\n\t\t\t\t\tif (count === undefined) {\n\t\t\t\t\t\tcontent = await readBoundedTextFile(filePath, limits.maxBytes, \"Bounded JSONL file\");\n\t\t\t\t\t\tcount = recordCount(content);\n\t\t\t\t\t}\n\t\t\t\t\tif (before.size + lineBytes <= limits.maxBytes && count + 1 <= limits.maxRecords) {\n\t\t\t\t\t\tawait fsPromises.appendFile(filePath, line, \"utf-8\");\n\t\t\t\t\t\trememberFileState(filePath, await fsPromises.stat(filePath), count + 1);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tcontent ??= await readBoundedTextFile(filePath, limits.maxBytes, \"Bounded JSONL file\");\n\t\t\t\t\tconst retained = retainedContent(`${content}${line}`, limits);\n\t\t\t\t\tawait writeFileAtomic(filePath, retained);\n\t\t\t\t\trememberFileState(filePath, await fsPromises.stat(filePath), recordCount(retained));\n\t\t\t\t} catch (error) {\n\t\t\t\t\tfileStates.delete(filePath);\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\tasyncAppendTails.set(filePath, operation);\n\ttry {\n\t\tawait operation;\n\t} finally {\n\t\tif (asyncAppendTails.get(filePath) === operation) asyncAppendTails.delete(filePath);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"bounded-jsonl.js","sourceRoot":"","sources":["../../../src/core/util/bounded-jsonl.ts"],"names":[],"mappings":"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","sourcesContent":["import { appendFileSync, promises as fsPromises, type Stats, statSync } from \"node:fs\";\nimport { withFileLock, withFileLockSync, writeFileAtomic, writeFileAtomicSync } from \"./atomic-file.ts\";\nimport { readBoundedTextFile, readBoundedTextFileSync, sameFileVersion } from \"./bounded-file.ts\";\n\nexport interface BoundedJsonlLimits {\n\tmaxBytes: number;\n\ttargetBytes: number;\n\tmaxRecords: number;\n}\n\nconst asyncAppendTails = new Map<string, Promise<void>>();\nconst MAX_CACHED_FILES = 128;\n\ninterface JsonlFileState {\n\tstats: Stats;\n\trecordCount: number;\n}\n\nconst fileStates = new Map<string, JsonlFileState>();\n\nfunction cachedRecordCount(filePath: string, stats: Stats): number | undefined {\n\tconst cached = fileStates.get(filePath);\n\tif (!cached || !sameFileVersion(cached.stats, stats)) return undefined;\n\tfileStates.delete(filePath);\n\tfileStates.set(filePath, cached);\n\treturn cached.recordCount;\n}\n\nfunction rememberFileState(filePath: string, stats: Stats, recordCount: number): void {\n\tfileStates.delete(filePath);\n\tfileStates.set(filePath, { stats, recordCount });\n\twhile (fileStates.size > MAX_CACHED_FILES) {\n\t\tconst oldest = fileStates.keys().next().value;\n\t\tif (oldest === undefined) break;\n\t\tfileStates.delete(oldest);\n\t}\n}\n\nfunction recordCount(content: string): number {\n\tlet count = 0;\n\tfor (const line of content.split(\"\\n\")) {\n\t\tif (line.trim().length > 0) count++;\n\t}\n\treturn count;\n}\n\nfunction validateLimits(limits: BoundedJsonlLimits): void {\n\tif (\n\t\t!Number.isSafeInteger(limits.maxBytes) ||\n\t\t!Number.isSafeInteger(limits.targetBytes) ||\n\t\t!Number.isSafeInteger(limits.maxRecords) ||\n\t\tlimits.maxBytes <= 0 ||\n\t\tlimits.targetBytes <= 0 ||\n\t\tlimits.targetBytes > limits.maxBytes ||\n\t\tlimits.maxRecords <= 0\n\t) {\n\t\tthrow new TypeError(\"Bounded JSONL limits require positive integers and targetBytes <= maxBytes.\");\n\t}\n}\n\nfunction retainedContent(content: string, limits: BoundedJsonlLimits): string {\n\tconst lines = content.split(\"\\n\").filter((line) => line.trim().length > 0);\n\tconst retained: string[] = [];\n\tlet retainedBytes = 0;\n\tfor (let index = lines.length - 1; index >= 0 && retained.length < limits.maxRecords; index--) {\n\t\tconst line = lines[index]!;\n\t\tconst lineBytes = Buffer.byteLength(line, \"utf-8\") + 1;\n\t\tif (lineBytes > limits.maxBytes) continue;\n\t\tif (retained.length > 0 && retainedBytes + lineBytes > limits.targetBytes) break;\n\t\tretained.push(line);\n\t\tretainedBytes += lineBytes;\n\t\tif (retainedBytes >= limits.targetBytes) break;\n\t}\n\tretained.reverse();\n\treturn retained.length > 0 ? `${retained.join(\"\\n\")}\\n` : \"\";\n}\n\nfunction serializeLine(value: unknown): string {\n\tconst encoded = JSON.stringify(value);\n\tif (encoded === undefined) throw new TypeError(\"Bounded JSONL records must be JSON-serializable values.\");\n\treturn `${encoded}\\n`;\n}\n\nfunction assertLineFits(line: string, limits: BoundedJsonlLimits): number {\n\tconst bytes = Buffer.byteLength(line, \"utf-8\");\n\tif (bytes > limits.maxBytes) throw new Error(\"Bounded JSONL record exceeds maxBytes.\");\n\treturn bytes;\n}\n\nfunction existingStatsSync(filePath: string): Stats | undefined {\n\ttry {\n\t\treturn statSync(filePath);\n\t} catch (error) {\n\t\tif (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") return undefined;\n\t\tthrow error;\n\t}\n}\n\nasync function existingStats(filePath: string): Promise<Stats | undefined> {\n\ttry {\n\t\treturn await fsPromises.stat(filePath);\n\t} catch (error) {\n\t\tif (typeof error === \"object\" && error !== null && \"code\" in error && error.code === \"ENOENT\") return undefined;\n\t\tthrow error;\n\t}\n}\n\n/** Append one JSON record and rotate to the newest low-water tail under one exclusive lock. */\nexport function appendBoundedJsonLineSync(filePath: string, value: unknown, limits: BoundedJsonlLimits): void {\n\tvalidateLimits(limits);\n\tconst line = serializeLine(value);\n\tconst lineBytes = assertLineFits(line, limits);\n\twithFileLockSync(filePath, () => {\n\t\ttry {\n\t\t\tconst before = existingStatsSync(filePath);\n\t\t\tif (!before || before.size > limits.maxBytes) {\n\t\t\t\twriteFileAtomicSync(filePath, line);\n\t\t\t\trememberFileState(filePath, statSync(filePath), 1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet content: string | undefined;\n\t\t\tlet count = cachedRecordCount(filePath, before);\n\t\t\tif (count === undefined) {\n\t\t\t\tcontent = readBoundedTextFileSync(filePath, limits.maxBytes, \"Bounded JSONL file\");\n\t\t\t\tcount = recordCount(content);\n\t\t\t}\n\t\t\tif (before.size + lineBytes <= limits.maxBytes && count + 1 <= limits.maxRecords) {\n\t\t\t\tappendFileSync(filePath, line, \"utf-8\");\n\t\t\t\trememberFileState(filePath, statSync(filePath), count + 1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcontent ??= readBoundedTextFileSync(filePath, limits.maxBytes, \"Bounded JSONL file\");\n\t\t\tconst retained = retainedContent(`${content}${line}`, limits);\n\t\t\twriteFileAtomicSync(filePath, retained);\n\t\t\trememberFileState(filePath, statSync(filePath), recordCount(retained));\n\t\t} catch (error) {\n\t\t\tfileStates.delete(filePath);\n\t\t\tthrow error;\n\t\t}\n\t});\n}\n\n/** Async counterpart of {@link appendBoundedJsonLineSync}. */\nexport async function appendBoundedJsonLine(\n\tfilePath: string,\n\tvalue: unknown,\n\tlimits: BoundedJsonlLimits,\n): Promise<void> {\n\tvalidateLimits(limits);\n\tconst line = serializeLine(value);\n\tconst lineBytes = assertLineFits(line, limits);\n\tconst previous = asyncAppendTails.get(filePath) ?? Promise.resolve();\n\tconst operation = previous\n\t\t.catch(() => undefined)\n\t\t.then(async () => {\n\t\t\tawait withFileLock(filePath, async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst before = await existingStats(filePath);\n\t\t\t\t\tif (!before || before.size > limits.maxBytes) {\n\t\t\t\t\t\tawait writeFileAtomic(filePath, line);\n\t\t\t\t\t\trememberFileState(filePath, await fsPromises.stat(filePath), 1);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tlet content: string | undefined;\n\t\t\t\t\tlet count = cachedRecordCount(filePath, before);\n\t\t\t\t\tif (count === undefined) {\n\t\t\t\t\t\tcontent = await readBoundedTextFile(filePath, limits.maxBytes, \"Bounded JSONL file\");\n\t\t\t\t\t\tcount = recordCount(content);\n\t\t\t\t\t}\n\t\t\t\t\tif (before.size + lineBytes <= limits.maxBytes && count + 1 <= limits.maxRecords) {\n\t\t\t\t\t\tawait fsPromises.appendFile(filePath, line, \"utf-8\");\n\t\t\t\t\t\trememberFileState(filePath, await fsPromises.stat(filePath), count + 1);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tcontent ??= await readBoundedTextFile(filePath, limits.maxBytes, \"Bounded JSONL file\");\n\t\t\t\t\tconst retained = retainedContent(`${content}${line}`, limits);\n\t\t\t\t\tawait writeFileAtomic(filePath, retained);\n\t\t\t\t\trememberFileState(filePath, await fsPromises.stat(filePath), recordCount(retained));\n\t\t\t\t} catch (error) {\n\t\t\t\t\tfileStates.delete(filePath);\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\tasyncAppendTails.set(filePath, operation);\n\ttry {\n\t\tawait operation;\n\t} finally {\n\t\tif (asyncAppendTails.get(filePath) === operation) asyncAppendTails.delete(filePath);\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bounded-value.d.ts","sourceRoot":"","sources":["../../../src/core/util/bounded-value.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAS/F"
|
|
1
|
+
{"version":3,"file":"bounded-value.d.ts","sourceRoot":"","sources":["../../../src/core/util/bounded-value.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAS/F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bounded-value.js","sourceRoot":"","sources":["../../../src/core/util/bounded-value.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,MAAM,UAAU,yBAAyB,CAAC,KAAa,EAAE,OAAe,EAAE,KAAa
|
|
1
|
+
{"version":3,"file":"bounded-value.js","sourceRoot":"","sources":["../../../src/core/util/bounded-value.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,MAAM,UAAU,yBAAyB,CAAC,KAAa,EAAE,OAAe,EAAE,KAAa;IACtF,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,SAAS,CAAC,yDAAyD,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;QAC1C,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,0BAA0B,OAAO,cAAc,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC","sourcesContent":["/** One primitive for required, trimmed durable text fields shared across control-plane stores. */\nexport function requireBoundedTrimmedText(value: string, maximum: number, label: string): string {\n\tif (!Number.isSafeInteger(maximum) || maximum < 1) {\n\t\tthrow new TypeError(\"A bounded text maximum must be a positive safe integer.\");\n\t}\n\tconst trimmed = value.trim();\n\tif (!trimmed || trimmed.length > maximum) {\n\t\tthrow new TypeError(`${label} must be between 1 and ${maximum} characters.`);\n\t}\n\treturn trimmed;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-size.d.ts","sourceRoot":"","sources":["../../../src/core/util/json-size.ts"],"names":[],"mappings":"AAsFA,wGAAwG;AACxG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAEpE"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
function jsonStringLength(value) {
|
|
2
|
+
let length = 2;
|
|
3
|
+
for (let index = 0; index < value.length; index++) {
|
|
4
|
+
const code = value.charCodeAt(index);
|
|
5
|
+
if (code === 0x22 ||
|
|
6
|
+
code === 0x5c ||
|
|
7
|
+
code === 0x08 ||
|
|
8
|
+
code === 0x09 ||
|
|
9
|
+
code === 0x0a ||
|
|
10
|
+
code === 0x0c ||
|
|
11
|
+
code === 0x0d) {
|
|
12
|
+
length += 2;
|
|
13
|
+
}
|
|
14
|
+
else if (code < 0x20) {
|
|
15
|
+
length += 6;
|
|
16
|
+
}
|
|
17
|
+
else if (code >= 0xd800 && code <= 0xdbff) {
|
|
18
|
+
const next = value.charCodeAt(index + 1);
|
|
19
|
+
if (next >= 0xdc00 && next <= 0xdfff) {
|
|
20
|
+
length += 2;
|
|
21
|
+
index++;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
length += 6;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
else if (code >= 0xdc00 && code <= 0xdfff) {
|
|
28
|
+
length += 6;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
length++;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return length;
|
|
35
|
+
}
|
|
36
|
+
function measuredJsonValue(value, key, active) {
|
|
37
|
+
if (typeof value === "object" && value !== null) {
|
|
38
|
+
const toJSON = Reflect.get(value, "toJSON");
|
|
39
|
+
if (typeof toJSON === "function")
|
|
40
|
+
value = Reflect.apply(toJSON, value, [key]);
|
|
41
|
+
}
|
|
42
|
+
switch (typeof value) {
|
|
43
|
+
case "string":
|
|
44
|
+
return jsonStringLength(value);
|
|
45
|
+
case "number":
|
|
46
|
+
return Number.isFinite(value) ? (Object.is(value, -0) ? 1 : String(value).length) : 4;
|
|
47
|
+
case "boolean":
|
|
48
|
+
return value ? 4 : 5;
|
|
49
|
+
case "bigint":
|
|
50
|
+
throw new TypeError("Do not know how to serialize a BigInt");
|
|
51
|
+
case "undefined":
|
|
52
|
+
case "function":
|
|
53
|
+
case "symbol":
|
|
54
|
+
return undefined;
|
|
55
|
+
case "object":
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
if (value === null)
|
|
59
|
+
return 4;
|
|
60
|
+
if (value instanceof String || value instanceof Number || value instanceof Boolean) {
|
|
61
|
+
return measuredJsonValue(value.valueOf(), key, active);
|
|
62
|
+
}
|
|
63
|
+
if (active.has(value))
|
|
64
|
+
throw new TypeError("Converting circular structure to JSON");
|
|
65
|
+
active.add(value);
|
|
66
|
+
try {
|
|
67
|
+
if (Array.isArray(value)) {
|
|
68
|
+
let length = 2 + Math.max(0, value.length - 1);
|
|
69
|
+
for (let index = 0; index < value.length; index++) {
|
|
70
|
+
length += measuredJsonValue(value[index], String(index), active) ?? 4;
|
|
71
|
+
}
|
|
72
|
+
return length;
|
|
73
|
+
}
|
|
74
|
+
let length = 2;
|
|
75
|
+
let fields = 0;
|
|
76
|
+
for (const field of Object.keys(value)) {
|
|
77
|
+
const fieldLength = measuredJsonValue(Reflect.get(value, field), field, active);
|
|
78
|
+
if (fieldLength === undefined)
|
|
79
|
+
continue;
|
|
80
|
+
if (fields > 0)
|
|
81
|
+
length++;
|
|
82
|
+
length += jsonStringLength(field) + 1 + fieldLength;
|
|
83
|
+
fields++;
|
|
84
|
+
}
|
|
85
|
+
return length;
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
active.delete(value);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/** Exact UTF-16 length of standard JSON-compatible data without constructing the serialized payload. */
|
|
92
|
+
export function measureJsonLength(value) {
|
|
93
|
+
return measuredJsonValue(value, "", new Set());
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=json-size.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-size.js","sourceRoot":"","sources":["../../../src/core/util/json-size.ts"],"names":[],"mappings":"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","sourcesContent":["function jsonStringLength(value: string): number {\n\tlet length = 2;\n\tfor (let index = 0; index < value.length; index++) {\n\t\tconst code = value.charCodeAt(index);\n\t\tif (\n\t\t\tcode === 0x22 ||\n\t\t\tcode === 0x5c ||\n\t\t\tcode === 0x08 ||\n\t\t\tcode === 0x09 ||\n\t\t\tcode === 0x0a ||\n\t\t\tcode === 0x0c ||\n\t\t\tcode === 0x0d\n\t\t) {\n\t\t\tlength += 2;\n\t\t} else if (code < 0x20) {\n\t\t\tlength += 6;\n\t\t} else if (code >= 0xd800 && code <= 0xdbff) {\n\t\t\tconst next = value.charCodeAt(index + 1);\n\t\t\tif (next >= 0xdc00 && next <= 0xdfff) {\n\t\t\t\tlength += 2;\n\t\t\t\tindex++;\n\t\t\t} else {\n\t\t\t\tlength += 6;\n\t\t\t}\n\t\t} else if (code >= 0xdc00 && code <= 0xdfff) {\n\t\t\tlength += 6;\n\t\t} else {\n\t\t\tlength++;\n\t\t}\n\t}\n\treturn length;\n}\n\nfunction measuredJsonValue(value: unknown, key: string, active: Set<object>): number | undefined {\n\tif (typeof value === \"object\" && value !== null) {\n\t\tconst toJSON = Reflect.get(value, \"toJSON\");\n\t\tif (typeof toJSON === \"function\") value = Reflect.apply(toJSON, value, [key]) as unknown;\n\t}\n\n\tswitch (typeof value) {\n\t\tcase \"string\":\n\t\t\treturn jsonStringLength(value);\n\t\tcase \"number\":\n\t\t\treturn Number.isFinite(value) ? (Object.is(value, -0) ? 1 : String(value).length) : 4;\n\t\tcase \"boolean\":\n\t\t\treturn value ? 4 : 5;\n\t\tcase \"bigint\":\n\t\t\tthrow new TypeError(\"Do not know how to serialize a BigInt\");\n\t\tcase \"undefined\":\n\t\tcase \"function\":\n\t\tcase \"symbol\":\n\t\t\treturn undefined;\n\t\tcase \"object\":\n\t\t\tbreak;\n\t}\n\n\tif (value === null) return 4;\n\tif (value instanceof String || value instanceof Number || value instanceof Boolean) {\n\t\treturn measuredJsonValue(value.valueOf(), key, active);\n\t}\n\tif (active.has(value)) throw new TypeError(\"Converting circular structure to JSON\");\n\tactive.add(value);\n\ttry {\n\t\tif (Array.isArray(value)) {\n\t\t\tlet length = 2 + Math.max(0, value.length - 1);\n\t\t\tfor (let index = 0; index < value.length; index++) {\n\t\t\t\tlength += measuredJsonValue(value[index], String(index), active) ?? 4;\n\t\t\t}\n\t\t\treturn length;\n\t\t}\n\n\t\tlet length = 2;\n\t\tlet fields = 0;\n\t\tfor (const field of Object.keys(value)) {\n\t\t\tconst fieldLength = measuredJsonValue(Reflect.get(value, field), field, active);\n\t\t\tif (fieldLength === undefined) continue;\n\t\t\tif (fields > 0) length++;\n\t\t\tlength += jsonStringLength(field) + 1 + fieldLength;\n\t\t\tfields++;\n\t\t}\n\t\treturn length;\n\t} finally {\n\t\tactive.delete(value);\n\t}\n}\n\n/** Exact UTF-16 length of standard JSON-compatible data without constructing the serialized payload. */\nexport function measureJsonLength(value: unknown): number | undefined {\n\treturn measuredJsonValue(value, \"\", new Set());\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"minimatch-cache.d.ts","sourceRoot":"","sources":["../../../src/core/util/minimatch-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAgB7D;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAE9G"
|
|
1
|
+
{"version":3,"file":"minimatch-cache.d.ts","sourceRoot":"","sources":["../../../src/core/util/minimatch-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAgB7D;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAE9G"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"minimatch-cache.js","sourceRoot":"","sources":["../../../src/core/util/minimatch-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,SAAS,EAAyB,MAAM,WAAW,CAAC;AAE7D,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAqB,CAAC;AAE1D,SAAS,kBAAkB,CAAC,OAAe,EAAE,OAA0B
|
|
1
|
+
{"version":3,"file":"minimatch-cache.js","sourceRoot":"","sources":["../../../src/core/util/minimatch-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAE,SAAS,EAAyB,MAAM,WAAW,CAAC;AAE7D,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAqB,CAAC;AAE1D,SAAS,kBAAkB,CAAC,OAAe,EAAE,OAA0B;IACtE,wFAAwF;IACxF,kDAAkD;IAClD,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IACxE,IAAI,QAAQ,GAAG,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,QAAQ,GAAG,IAAI,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3C,oBAAoB,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAiB,EAAE,OAAe,EAAE,OAA0B;IACpG,OAAO,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;AAC9D,CAAC","sourcesContent":["/**\n * Shared compiled-pattern cache (C2): `matchesAnyPattern` in `package-manager.ts` and\n * `matchesResourceProfilePattern` in `settings-manager.ts` each test up to 6 candidate strings\n * (relative path, basename, absolute path, and the same 3 for the parent directory) against every\n * configured glob pattern, per file, on every reload/profile switch. The functional `minimatch(p,\n * pattern, options)` re-parses `pattern` into a `Minimatch` instance on EVERY call — so the same\n * pattern was being compiled up to 6x per file per call site.\n *\n * `new Minimatch(pattern, options).match(p)` is exactly what the functional form does internally\n * (see `minimatch`'s own implementation: `assertValidPattern(pattern)` then\n * `new Minimatch(pattern, options).match(p)`, with comment/empty-pattern short-circuits handled\n * inside the class itself), so precompiling and reusing the `Minimatch` instance is behaviorally\n * identical to calling the functional form each time — only the redundant re-parsing is removed.\n *\n * Both call sites invoke `minimatch(candidate, pattern)` with NO options argument (always the\n * library default `{}`), so the cache key is the pattern string alone. If a future caller needs\n * non-default options, extend the key to include a serialized options object rather than reusing\n * this cache blind — a `Minimatch` compiled under different options is not interchangeable.\n *\n * The cache is a plain, unbounded module-level `Map`. That is safe here because patterns are not\n * arbitrary/untrusted input: they come from a small, operator-controlled set (package resource\n * patterns in settings, `.gitignore`-style profile overrides) that is bounded by how much a human\n * hand-authors into settings/profile files, not by file count or request volume. It never grows\n * per-file or per-scan.\n */\n\nimport { Minimatch, type MinimatchOptions } from \"minimatch\";\n\nconst compiledPatternCache = new Map<string, Minimatch>();\n\nfunction getCompiledPattern(pattern: string, options?: MinimatchOptions): Minimatch {\n\t// Both current call sites omit `options`, so this collapses to a single default-options\n\t// instance per unique pattern string in practice.\n\tconst key = options ? `${JSON.stringify(options)}\u0000${pattern}` : pattern;\n\tlet compiled = compiledPatternCache.get(key);\n\tif (!compiled) {\n\t\tcompiled = new Minimatch(pattern, options);\n\t\tcompiledPatternCache.set(key, compiled);\n\t}\n\treturn compiled;\n}\n\n/**\n * Drop-in replacement for `minimatch(candidate, pattern, options)` that compiles each unique\n * `(pattern, options)` pair once and reuses it. Match results are identical to the functional\n * form; only the redundant glob-compilation work is eliminated.\n */\nexport function matchesCompiledPattern(candidate: string, pattern: string, options?: MinimatchOptions): boolean {\n\treturn getCompiledPattern(pattern, options).match(candidate);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"value-guards.d.ts","sourceRoot":"","sources":["../../../src/core/util/value-guards.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE/E;AAED,uFAAuF;AACvF,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAI9E;AAED,wFAAwF;AACxF,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAGhG"
|
|
1
|
+
{"version":3,"file":"value-guards.d.ts","sourceRoot":"","sources":["../../../src/core/util/value-guards.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE/E;AAED,uFAAuF;AACvF,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAI9E;AAED,wFAAwF;AACxF,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAGhG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"value-guards.js","sourceRoot":"","sources":["../../../src/core/util/value-guards.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,MAAM,UAAU,cAAc,CAAC,KAAc
|
|
1
|
+
{"version":3,"file":"value-guards.js","sourceRoot":"","sources":["../../../src/core/util/value-guards.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,MAAM,UAAU,cAAc,CAAC,KAAc;IAC5C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC7E,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,aAAa,CAAC,KAAc;IAC3C,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACzC,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC/C,OAAO,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC;AAC7D,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,WAAW,CAAC,MAA+B,EAAE,OAA0B;IACtF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IACpC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAChE,CAAC","sourcesContent":["/** Accepts non-null object records while excluding arrays; custom prototypes remain valid. */\nexport function isRecordObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** Accepts only ordinary JSON-style records, including null-prototype dictionaries. */\nexport function isPlainRecord(value: unknown): value is Record<string, unknown> {\n\tif (!isRecordObject(value)) return false;\n\tconst prototype = Object.getPrototypeOf(value);\n\treturn prototype === Object.prototype || prototype === null;\n}\n\n/** Fail closed when an untrusted record contains a field outside its typed contract. */\nexport function hasOnlyKeys(record: Record<string, unknown>, allowed: readonly string[]): boolean {\n\tconst allowedSet = new Set(allowed);\n\treturn Object.keys(record).every((key) => allowedSet.has(key));\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codes.d.ts","sourceRoot":"","sources":["../../../src/core/worktree-sync/codes.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Worktree-sync SSOT for tagged result codes and shared record types.\n *\n * Every worktree-sync operation reports its outcome through one of these string-literal codes in\n * a typed result -- callers branch on `code`, NEVER on message/stderr substrings (the\n * `classifyDispatchError` substring compromise is deliberately not repeated here). Git stderr is\n * carried alongside as evidence for humans, not as a branch condition.\n */\n\n/** Cap on `WorktreeSyncEpoch.changedPaths`; beyond it the list is truncated and overlap checks\n * treat the land as conservatively overlapping EVERYTHING (deterministic, never optimistic). */\nexport const EPOCH_CHANGED_PATHS_CAP = 500;\n\n/** Branch namespace for lane branches: `pi/wt/<laneKey>`. */\nexport const LANE_BRANCH_PREFIX = \"pi/wt/\";\n\nexport type WorktreeSyncCode =\n\t| \"ok\"\n\t| \"disabled\"\n\t| \"not_a_git_repo\"\n\t| \"default_branch_unresolved\"\n\t| \"hub_missing\"\n\t| \"invalid_lane_key\"\n\t| \"lane_exists\"\n\t| \"lane_not_found\"\n\t| \"max_lanes_reached\"\n\t| \"lane_dirty\"\n\t| \"hub_dirty\"\n\t| \"stale_lane\"\n\t| \"sync_required\"\n\t| \"sync_clean\"\n\t| \"sync_conflicts\"\n\t| \"rebase_in_progress\"\n\t| \"no_rebase_in_progress\"\n\t| \"conflict_markers_present\"\n\t| \"gate_command_unset\"\n\t| \"gate_failed\"\n\t| \"lane_changed_during_gate\"\n\t| \"ff_failed\"\n\t| \"lock_busy\"\n\t| \"lock_takeover\"\n\t| \"nothing_to_land\"\n\t| \"main_mutation_refused\"\n\t| \"lane_unlanded_work\"\n\t| \"worktree_missing\"\n\t| \"released\"\n\t| \"reconciled\"\n\t| \"git_error\"\n\t| \"role_forbidden\"\n\t| \"path_outside_lane\"\n\t| \"lane_owner_conflict\";\n\n/**\n * A refusal/failure outcome. `message` is deterministic text assembled from facts (safe to show a\n * model verbatim); `gitStderr` is bounded raw evidence; `paths` names offending files where the\n * refusal is about specific files (dirty files, conflict markers); `holder` identifies the\n * integration-lock holder on `lock_busy`.\n */\nexport interface WorktreeSyncRefusal<C extends WorktreeSyncCode = WorktreeSyncCode> {\n\tcode: C;\n\tmessage: string;\n\tgitStderr?: string;\n\tpaths?: string[];\n\tholder?: IntegrationLockOwner;\n}\n\n/** Staleness-propagation policy (D9). `on_land_mandatory` is the default: every land marks every\n * other active lane sync_required. `overlap_mandatory` requires it only on changed-file overlap.\n * `land_time_only` keeps staleness advisory until the land gate (G3 always enforces). */\nexport type WorktreeSyncPolicy = \"on_land_mandatory\" | \"overlap_mandatory\" | \"land_time_only\";\n\n/** One lane registration record (`lanes/<laneKey>.json`). Identity/binding fields ONLY -- git\n * truths (freshness, dirtiness, ahead/behind) are always re-derived live, never stored here. */\nexport interface LaneRegistration {\n\tlaneKey: string;\n\tbranch: string;\n\tworktreePath: string;\n\tstatus: \"active\" | \"released\" | \"orphaned\";\n\tcreatedAt: string;\n\tupdatedAt: string;\n\tgoalId?: string;\n\trequirementId?: string;\n\t/** Host `LaneRecord.laneId` after dispatch correlation (tmux/in-process worker binding). */\n\tboundLaneId?: string;\n\townerPid?: number;\n\townerSessionId?: string;\n}\n\n/** `epoch.json` -- the integration epoch. `epoch` is monotonic messaging/audit sugar; correctness\n * always derives from git shas (`merge-base --is-ancestor`), never from this counter. */\nexport interface WorktreeSyncEpoch {\n\tepoch: number;\n\tmainSha: string;\n\tpreviousMainSha?: string;\n\tlandedLaneKey?: string;\n\tlandedAt?: string;\n\tchangedPaths: string[];\n\tchangedPathsTruncated: boolean;\n}\n\n/** Live, git-derived facts about one lane. Computed fresh per call -- there is no cached copy to\n * go stale, which is the point. */\nexport interface LaneFacts {\n\tlaneKey: string;\n\tbranch: string;\n\tworktreePath: string;\n\tregistrationStatus: LaneRegistration[\"status\"];\n\t/** Lane branch tip sha; undefined when the branch no longer exists. */\n\tbranchSha?: string;\n\t/** True iff current main is an ancestor of the lane tip (`merge-base --is-ancestor`). */\n\tfresh: boolean;\n\t/** True when `status --porcelain` in the lane worktree is non-empty. */\n\tdirty: boolean;\n\trebaseInProgress: boolean;\n\taheadOfMain: number;\n\tbehindMain: number;\n\tworktreePresent: boolean;\n\t/** Undefined when the lane has no recorded owner pid. */\n\townerAlive?: boolean;\n}\n\nexport interface IntegrationLockOwner {\n\tpid: number;\n\thostname: string;\n\t/** Random acquisition identity; PID/session are diagnostic only and never authorize release. */\n\ttoken: string;\n\tsessionId?: string;\n\tlaneKey?: string;\n\tacquiredAt: string;\n}\n\nexport type IntegrationLockAcquisition =\n\t| { acquired: true; takeover: boolean; token: string }\n\t| { acquired: false; holder?: IntegrationLockOwner; holderAlive: boolean };\n\n/** One conflicted file in a sync stopped on conflicts. */\nexport interface ConflictWorklistFile {\n\tpath: string;\n\t/** Both-modified is the common case; add/add and modify/delete surface as their index states. */\n\tkind: \"both_modified\" | \"both_added\" | \"deleted_by_us\" | \"deleted_by_them\" | \"unknown\";\n\t/** True when git rerere already replayed a recorded resolution for this file -- review, not re-resolve. */\n\tresolvedByRerere: boolean;\n}\n\n/** Structured conflict worklist returned when a sync/continue stops on conflicts. */\nexport interface ConflictWorklist {\n\t/** e.g. \"2/5\" -- rebase progress (stopped step / total steps). */\n\tstep: string;\n\tstoppedAtCommit?: { sha: string; subject: string };\n\tfiles: ConflictWorklistFile[];\n}\n\nexport type BindLaneWorkerResult =\n\t| { code: \"bound\"; laneKey: string; laneId: string }\n\t| { code: \"already_bound\"; laneKey: string; laneId: string }\n\t| { code: \"binding_conflict\"; laneKey: string; boundLaneId: string }\n\t| { code: \"lane_not_found\"; message: string }\n\t| { code: \"lane_not_active\"; message: string }\n\t| { code: \"store_error\"; message: string };\n\nexport type CreateLaneResult =\n\t| { code: \"ok\"; lane: LaneRegistration }\n\t| WorktreeSyncRefusal<\n\t\t\t| \"not_a_git_repo\"\n\t\t\t| \"default_branch_unresolved\"\n\t\t\t| \"invalid_lane_key\"\n\t\t\t| \"lane_exists\"\n\t\t\t| \"max_lanes_reached\"\n\t\t\t| \"git_error\"\n\t >;\n\nexport type ReleaseLaneResult =\n\t| { code: \"released\"; laneKey: string }\n\t| WorktreeSyncRefusal<\n\t\t\t| \"not_a_git_repo\"\n\t\t\t| \"default_branch_unresolved\"\n\t\t\t| \"lane_not_found\"\n\t\t\t| \"lane_unlanded_work\"\n\t\t\t| \"lane_owner_conflict\"\n\t\t\t| \"git_error\"\n\t >;\n\nexport interface LandingTransaction {\n\tlaneKey: string;\n\tpriorMainSha: string;\n\ttestedTipSha: string;\n\tchangedPaths: string[];\n\tchangedPathsTruncated: boolean;\n\tlockToken: string;\n\tgate: \"passed\" | \"off\";\n\tstage: \"ready_to_merge\" | \"main_moved\" | \"epoch_written\" | \"audit_logged\";\n}\n\nexport interface ReconcileSummary {\n\tcode: \"reconciled\";\n\torphanedLaneKeys: string[];\n\treRegisteredLaneKeys: string[];\n\townerClearedLaneKeys: string[];\n\tstaleLockReleased: boolean;\n}\n\nexport type ReconcileResult =\n\t| ReconcileSummary\n\t| WorktreeSyncRefusal<\"not_a_git_repo\" | \"default_branch_unresolved\" | \"git_error\">;\n\nexport type SyncLaneResult =\n\t| { code: \"sync_clean\"; laneKey: string; alreadyFresh: boolean; autoContinued: number }\n\t| { code: \"sync_conflicts\"; laneKey: string; worklist: ConflictWorklist }\n\t| WorktreeSyncRefusal<\n\t\t\t| \"not_a_git_repo\"\n\t\t\t| \"default_branch_unresolved\"\n\t\t\t| \"lane_not_found\"\n\t\t\t| \"worktree_missing\"\n\t\t\t| \"lane_dirty\"\n\t\t\t| \"rebase_in_progress\"\n\t\t\t| \"git_error\"\n\t >;\n\nexport type ContinueSyncResult =\n\t| { code: \"sync_clean\"; laneKey: string; autoContinued: number }\n\t| { code: \"sync_conflicts\"; laneKey: string; worklist: ConflictWorklist }\n\t| WorktreeSyncRefusal<\n\t\t\t| \"not_a_git_repo\"\n\t\t\t| \"default_branch_unresolved\"\n\t\t\t| \"lane_not_found\"\n\t\t\t| \"worktree_missing\"\n\t\t\t| \"no_rebase_in_progress\"\n\t\t\t| \"conflict_markers_present\"\n\t\t\t| \"git_error\"\n\t >;\n\nexport type AbortSyncResult =\n\t| { code: \"ok\"; laneKey: string }\n\t| WorktreeSyncRefusal<\n\t\t\t\"not_a_git_repo\" | \"default_branch_unresolved\" | \"lane_not_found\" | \"no_rebase_in_progress\" | \"git_error\"\n\t >;\n\nexport type LandResult =\n\t| { code: \"ok\"; laneKey: string; epoch: number; mainSha: string; gate: \"passed\" | \"off\" }\n\t| WorktreeSyncRefusal<\n\t\t\t| \"not_a_git_repo\"\n\t\t\t| \"default_branch_unresolved\"\n\t\t\t| \"lane_not_found\"\n\t\t\t| \"worktree_missing\"\n\t\t\t| \"rebase_in_progress\"\n\t\t\t| \"lane_dirty\"\n\t\t\t| \"stale_lane\"\n\t\t\t| \"hub_missing\"\n\t\t\t| \"hub_dirty\"\n\t\t\t| \"gate_command_unset\"\n\t\t\t| \"gate_failed\"\n\t\t\t| \"lane_changed_during_gate\"\n\t\t\t| \"ff_failed\"\n\t\t\t| \"lock_busy\"\n\t\t\t| \"nothing_to_land\"\n\t\t\t| \"lane_owner_conflict\"\n\t\t\t| \"git_error\"\n\t >;\n\n/** One lane's full status entry: live git facts plus registry identity plus policy derivation. */\nexport interface LaneStatusEntry extends LaneFacts {\n\tgoalId?: string;\n\trequirementId?: string;\n\tboundLaneId?: string;\n\t/** Not fresh: main moved past this lane's base. Derived, never stored. */\n\tstale: boolean;\n\t/** Stale AND the active policy makes syncing mandatory NOW (G8 gates on this). */\n\tsyncRequired: boolean;\n\t/** Lane-changed files intersecting the last land's changed files (conservatively the whole\n\t * lane-changed list when the epoch's changedPaths were truncated). */\n\toverlapWithLastLand: string[];\n}\n\n/** The deterministic full picture (`status` action): everything an agent would otherwise infer\n * probabilistically from porcelain output, computed mechanically. */\nexport interface SyncStatus {\n\tcode: \"ok\";\n\tmainBranch: string;\n\tmainSha: string;\n\tepoch: number;\n\thub?: { path: string; clean: boolean };\n\tlock: { held: boolean; holder?: IntegrationLockOwner; holderAlive?: boolean };\n\tlanes: LaneStatusEntry[];\n\t/** One deterministic advisory sentence assembled from the codes above; never model-generated. */\n\tadvice?: string;\n}\n\nexport type SyncStatusResult =\n\t| SyncStatus\n\t| WorktreeSyncRefusal<\"not_a_git_repo\" | \"default_branch_unresolved\" | \"git_error\">;\n"]}
|
|
1
|
+
{"version":3,"file":"codes.d.ts","sourceRoot":"","sources":["../../../src/core/worktree-sync/codes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-engine.d.ts","sourceRoot":"","sources":["../../../src/core/worktree-sync/git-engine.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Worktree-sync git engine: every git-touching operation of the subsystem, built on one injected\n * `exec` seam (the `improvement-loop.ts` pattern) so each function is unit-testable with a\n * scripted exec fake and integration-testable against real git.\n *\n * Doctrine (see docs/worktree-sync.md):\n * - Git is the single source of truth. Freshness (\"is current main an ancestor of the lane\n * tip?\"), dirtiness, ahead/behind, and rebase-in-progress are RE-DERIVED per call -- the JSON\n * store (`store.ts`) contributes identity/binding only and is rebuildable via {@link reconcile}.\n * - Policy refusals are RETURNED as tagged codes (`codes.ts`), never thrown; git's own stderr\n * rides along as evidence, never as a branch condition.\n * - Nothing here deletes user work silently: releasing a lane with unlanded commits or dirty\n * files requires the explicit discard confirmation, and reconcile only marks orphans.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { hostname as osHostname } from \"node:os\";\nimport { join } from \"node:path\";\nimport { type ExecResult, execCommand } from \"../exec.ts\";\nimport { withFileLock } from \"../util/atomic-file.ts\";\nimport {\n\ttype AbortSyncResult,\n\ttype BindLaneWorkerResult,\n\ttype ConflictWorklist,\n\ttype ConflictWorklistFile,\n\ttype ContinueSyncResult,\n\ttype CreateLaneResult,\n\tEPOCH_CHANGED_PATHS_CAP,\n\tLANE_BRANCH_PREFIX,\n\ttype LandingTransaction,\n\ttype LandResult,\n\ttype LaneFacts,\n\ttype LaneRegistration,\n\ttype LaneStatusEntry,\n\ttype ReconcileResult,\n\ttype ReleaseLaneResult,\n\ttype SyncLaneResult,\n\ttype SyncStatusResult,\n\ttype WorktreeSyncPolicy,\n\ttype WorktreeSyncRefusal,\n} from \"./codes.ts\";\nimport {\n\tacquireIntegrationLock,\n\tappendAuditEvent,\n\tclearLandingTransaction,\n\tdefaultIsPidAlive,\n\tlistLanes,\n\treadEpoch,\n\treadLandingTransaction,\n\treadLane,\n\treadLockHolder,\n\treleaseIntegrationLock,\n\trepoSlug,\n\ttype SyncStorePaths,\n\tsyncStorePaths,\n\twriteEpoch,\n\twriteLandingTransaction,\n\twriteLane,\n} from \"./store.ts\";\n\nexport type WorktreeSyncExec = (\n\tcommand: string,\n\targs: string[],\n\toptions: { cwd: string; timeout?: number; signal?: AbortSignal; maxBuffer?: number; env?: NodeJS.ProcessEnv },\n) => Promise<ExecResult>;\n\nexport interface WorktreeSyncEngineOptions {\n\t/** Overrides default-branch resolution; unset resolves local `main`, then `master` (D13). */\n\tmainBranchOverride?: string;\n\t/** Active-lane ceiling; `create_lane` refuses beyond it. */\n\tmaxLanes: number;\n}\n\nexport interface WorktreeSyncEngineDeps {\n\texec: WorktreeSyncExec;\n\t/** Session cwd -- any directory inside the repo (hub checkout or a lane worktree). */\n\tcwd: string;\n\t/** Base for lane checkouts (`agent-paths.worktreesDir(agentDir)`); engine appends `<repo-slug>/<laneKey>`. */\n\tworktreesBaseDir: string;\n\toptions: WorktreeSyncEngineOptions;\n\tsignal?: AbortSignal;\n\tnow?: () => string;\n\tpid?: number;\n\tsessionId?: string;\n\t/** Injectable fs probe for deterministic tests. Default: `existsSync`. */\n\tfileExists?: (path: string) => boolean;\n\t/** Injectable file reader (conflict-marker scan, rebase progress). Default: `readFileSync`,\n\t * returning undefined on any read error. */\n\treadFile?: (path: string) => string | undefined;\n\t/** Injectable same-host pid liveness for deterministic tests. */\n\tisPidAlive?: (pid: number) => boolean;\n}\n\nexport interface RepoContext {\n\ttopLevel: string;\n\tgitCommonDir: string;\n\tmainBranch: string;\n\tmainSha: string;\n\tpaths: SyncStorePaths;\n\tslug: string;\n\t/** Checkout where the main branch is checked out (the hub); undefined when main is not checked out. */\n\thubPath?: string;\n}\n\nconst GIT_TIMEOUT_MS = 60_000;\nconst GIT_MAX_BUFFER = 1024 * 1024;\nconst LANE_KEY_RE = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;\n\n/** Production exec: `exec.ts`'s bounded `execCommand` (rolling-tail output, timeout, abort). */\nexport function createDefaultWorktreeSyncExec(): WorktreeSyncExec {\n\treturn (command, args, options) =>\n\t\texecCommand(command, args, options.cwd, {\n\t\t\ttimeout: options.timeout,\n\t\t\tsignal: options.signal,\n\t\t\tmaxBuffer: options.maxBuffer,\n\t\t\tenv: options.env,\n\t\t});\n}\n\nfunction runGit(deps: WorktreeSyncEngineDeps, cwd: string, args: string[]): Promise<ExecResult> {\n\treturn deps.exec(\"git\", args, { cwd, timeout: GIT_TIMEOUT_MS, signal: deps.signal, maxBuffer: GIT_MAX_BUFFER });\n}\n\nfunction nowIso(deps: WorktreeSyncEngineDeps): string {\n\treturn (deps.now ?? (() => new Date().toISOString()))();\n}\n\nfunction fileExists(deps: WorktreeSyncEngineDeps, path: string): boolean {\n\treturn (deps.fileExists ?? existsSync)(path);\n}\n\nfunction gitError(message: string, result: ExecResult): WorktreeSyncRefusal<\"git_error\"> {\n\treturn { code: \"git_error\", message, gitStderr: (result.stderr || result.stdout).trim().slice(0, 4000) };\n}\n\nexport function laneBranch(laneKey: string): string {\n\treturn `${LANE_BRANCH_PREFIX}${laneKey}`;\n}\n\nexport interface WorktreeListEntry {\n\tpath: string;\n\theadSha?: string;\n\t/** Full ref (`refs/heads/x`) when a branch is checked out; undefined for detached/bare. */\n\tbranchRef?: string;\n}\n\n/** Parse `git worktree list --porcelain` blocks. */\nexport function parseWorktreeList(output: string): WorktreeListEntry[] {\n\tconst entries: WorktreeListEntry[] = [];\n\tlet current: WorktreeListEntry | undefined;\n\tfor (const line of output.split(/\\r?\\n/)) {\n\t\tif (line.startsWith(\"worktree \")) {\n\t\t\tif (current) entries.push(current);\n\t\t\tcurrent = { path: line.slice(\"worktree \".length) };\n\t\t} else if (line.startsWith(\"HEAD \") && current) {\n\t\t\tcurrent.headSha = line.slice(\"HEAD \".length);\n\t\t} else if (line.startsWith(\"branch \") && current) {\n\t\t\tcurrent.branchRef = line.slice(\"branch \".length);\n\t\t} else if (line.trim() === \"\" && current) {\n\t\t\tentries.push(current);\n\t\t\tcurrent = undefined;\n\t\t}\n\t}\n\tif (current) entries.push(current);\n\treturn entries;\n}\n\nasync function revParseBranch(deps: WorktreeSyncEngineDeps, cwd: string, branch: string): Promise<string | undefined> {\n\tconst result = await runGit(deps, cwd, [\"rev-parse\", \"--verify\", \"--quiet\", `refs/heads/${branch}`]);\n\tif (result.code !== 0) return undefined;\n\tconst sha = result.stdout.trim();\n\treturn sha || undefined;\n}\n\nexport async function resolveRepoContext(\n\tdeps: WorktreeSyncEngineDeps,\n): Promise<RepoContext | WorktreeSyncRefusal<\"not_a_git_repo\" | \"default_branch_unresolved\" | \"git_error\">> {\n\tconst roots = await runGit(deps, deps.cwd, [\n\t\t\"rev-parse\",\n\t\t\"--path-format=absolute\",\n\t\t\"--show-toplevel\",\n\t\t\"--git-common-dir\",\n\t]);\n\tif (roots.code !== 0) {\n\t\treturn {\n\t\t\tcode: \"not_a_git_repo\",\n\t\t\tmessage: `worktree-sync requires a git repository; ${deps.cwd} is not inside one`,\n\t\t\tgitStderr: roots.stderr.trim().slice(0, 1000),\n\t\t};\n\t}\n\tconst [topLevel, gitCommonDir] = roots.stdout\n\t\t.split(/\\r?\\n/)\n\t\t.map((line) => line.trim())\n\t\t.filter(Boolean);\n\tif (!topLevel || !gitCommonDir) {\n\t\treturn gitError(\"git rev-parse returned no toplevel/common-dir\", roots);\n\t}\n\n\t// D13: explicit resolution order -- override, `main`, `master`. Never guess further.\n\tconst candidates = deps.options.mainBranchOverride ? [deps.options.mainBranchOverride] : [\"main\", \"master\"];\n\tlet mainBranch: string | undefined;\n\tlet mainSha: string | undefined;\n\tfor (const candidate of candidates) {\n\t\tconst sha = await revParseBranch(deps, topLevel, candidate);\n\t\tif (sha) {\n\t\t\tmainBranch = candidate;\n\t\t\tmainSha = sha;\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (!mainBranch || !mainSha) {\n\t\treturn {\n\t\t\tcode: \"default_branch_unresolved\",\n\t\t\tmessage: deps.options.mainBranchOverride\n\t\t\t\t? `configured main branch '${deps.options.mainBranchOverride}' does not exist locally`\n\t\t\t\t: \"no local 'main' or 'master' branch; set the worktree-sync main branch explicitly\",\n\t\t};\n\t}\n\n\tconst worktrees = await runGit(deps, topLevel, [\"worktree\", \"list\", \"--porcelain\"]);\n\tif (worktrees.code !== 0) return gitError(\"git worktree list failed\", worktrees);\n\tconst hub = parseWorktreeList(worktrees.stdout).find((entry) => entry.branchRef === `refs/heads/${mainBranch}`);\n\n\treturn {\n\t\ttopLevel,\n\t\tgitCommonDir,\n\t\tmainBranch,\n\t\tmainSha,\n\t\tpaths: syncStorePaths(gitCommonDir),\n\t\tslug: repoSlug(topLevel, gitCommonDir),\n\t\thubPath: hub?.path,\n\t};\n}\n\n/**\n * Live git facts for one lane. `fresh` is THE freshness definition of the whole subsystem\n * (G3/G9): current main is an ancestor of the lane tip. Everything is re-derived; nothing is\n * read back from a cache that could disagree with git.\n */\nexport async function deriveLaneFacts(\n\tdeps: WorktreeSyncEngineDeps,\n\tctx: RepoContext,\n\tlane: LaneRegistration,\n): Promise<LaneFacts> {\n\tconst branchSha = await revParseBranch(deps, ctx.topLevel, lane.branch);\n\n\tlet fresh = false;\n\tlet aheadOfMain = 0;\n\tlet behindMain = 0;\n\tif (branchSha) {\n\t\tconst ancestry = await runGit(deps, ctx.topLevel, [\"merge-base\", \"--is-ancestor\", ctx.mainSha, branchSha]);\n\t\tfresh = ancestry.code === 0;\n\t\tconst counts = await runGit(deps, ctx.topLevel, [\n\t\t\t\"rev-list\",\n\t\t\t\"--left-right\",\n\t\t\t\"--count\",\n\t\t\t`${ctx.mainBranch}...${lane.branch}`,\n\t\t]);\n\t\tif (counts.code === 0) {\n\t\t\tconst [left, right] = counts.stdout.trim().split(/\\s+/);\n\t\t\tbehindMain = Number.parseInt(left ?? \"0\", 10) || 0;\n\t\t\taheadOfMain = Number.parseInt(right ?? \"0\", 10) || 0;\n\t\t}\n\t}\n\n\tlet worktreePresent = fileExists(deps, lane.worktreePath);\n\tlet dirty = false;\n\tlet rebaseInProgress = false;\n\tif (worktreePresent) {\n\t\tconst status = await runGit(deps, lane.worktreePath, [\"status\", \"--porcelain\"]);\n\t\tif (status.code === 0) {\n\t\t\tdirty = status.stdout.trim().length > 0;\n\t\t\trebaseInProgress = await isRebaseActive(deps, lane.worktreePath);\n\t\t} else {\n\t\t\t// The directory exists but is not a usable worktree (e.g. pruned metadata): not present.\n\t\t\tworktreePresent = false;\n\t\t}\n\t}\n\n\tconst isAlive =\n\t\tdeps.isPidAlive ??\n\t\t((pid: number) => defaultIsPidAlive({ pid, hostname: osHostname(), token: \"status\", acquiredAt: \"\" }));\n\n\treturn {\n\t\tlaneKey: lane.laneKey,\n\t\tbranch: lane.branch,\n\t\tworktreePath: lane.worktreePath,\n\t\tregistrationStatus: lane.status,\n\t\tbranchSha,\n\t\tfresh,\n\t\tdirty,\n\t\trebaseInProgress,\n\t\taheadOfMain,\n\t\tbehindMain,\n\t\tworktreePresent,\n\t\t...(lane.ownerPid !== undefined ? { ownerAlive: isAlive(lane.ownerPid) } : {}),\n\t};\n}\n\n/** One-time repo git config (D7): shared rerere + zdiff3 conflict hunks -- the deterministic\n * conflict-resolution substrate for every lane (the rr-cache lives in the common dir, so one\n * resolution replays identically in all worktrees). Idempotent; only actual changes are audited. */\nexport async function ensureRepoGitConfig(deps: WorktreeSyncEngineDeps, ctx: RepoContext): Promise<void> {\n\tconst wanted: Array<[string, string]> = [\n\t\t[\"rerere.enabled\", \"true\"],\n\t\t[\"rerere.autoUpdate\", \"true\"],\n\t\t[\"merge.conflictStyle\", \"zdiff3\"],\n\t];\n\tconst changed: string[] = [];\n\tfor (const [key, value] of wanted) {\n\t\tconst current = await runGit(deps, ctx.topLevel, [\"config\", \"--get\", key]);\n\t\tif (current.code === 0 && current.stdout.trim() === value) continue;\n\t\tconst set = await runGit(deps, ctx.topLevel, [\"config\", key, value]);\n\t\tif (set.code === 0) changed.push(`${key}=${value}`);\n\t}\n\tif (changed.length > 0) {\n\t\tawait appendAuditEvent(ctx.paths, { event: \"config_set\", changed }, nowIso(deps));\n\t}\n}\n\nfunction sanitizeScope(scope: string): string {\n\tconst cleaned = scope\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9-]+/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\")\n\t\t.slice(0, 32);\n\treturn cleaned || \"adhoc\";\n}\n\nexport interface CreateLaneArgs {\n\tlaneKey?: string;\n\tgoalId?: string;\n\trequirementId?: string;\n}\n\nexport async function createLane(deps: WorktreeSyncEngineDeps, args: CreateLaneArgs = {}): Promise<CreateLaneResult> {\n\tconst ctx = await resolveRepoContext(deps);\n\tif (\"code\" in ctx) return ctx;\n\n\treturn withFileLock(ctx.paths.lifecycleLockFile, async () => {\n\t\tif (args.laneKey !== undefined && !LANE_KEY_RE.test(args.laneKey)) {\n\t\t\treturn {\n\t\t\t\tcode: \"invalid_lane_key\",\n\t\t\t\tmessage: `laneKey '${args.laneKey}' is invalid: lowercase alphanumerics and inner dashes, max 63 chars`,\n\t\t\t};\n\t\t}\n\n\t\tconst lanes = await listLanes(ctx.paths);\n\t\tconst activeCount = lanes.filter((lane) => lane.status === \"active\").length;\n\t\tif (activeCount >= deps.options.maxLanes) {\n\t\t\treturn {\n\t\t\t\tcode: \"max_lanes_reached\",\n\t\t\t\tmessage: `active lane limit reached (${activeCount}/${deps.options.maxLanes}); release a lane first`,\n\t\t\t};\n\t\t}\n\n\t\tconst taken = new Set(lanes.filter((lane) => lane.status !== \"released\").map((lane) => lane.laneKey));\n\t\tconst isFree = async (candidate: string): Promise<boolean> => {\n\t\t\tif (taken.has(candidate)) return false;\n\t\t\tif (await revParseBranch(deps, ctx.topLevel, laneBranch(candidate))) return false;\n\t\t\tif (fileExists(deps, join(deps.worktreesBaseDir, ctx.slug, candidate))) return false;\n\t\t\treturn true;\n\t\t};\n\n\t\tlet laneKey: string;\n\t\tif (args.laneKey !== undefined) {\n\t\t\tif (!(await isFree(args.laneKey))) {\n\t\t\t\treturn {\n\t\t\t\t\tcode: \"lane_exists\",\n\t\t\t\t\tmessage: `lane '${args.laneKey}' already exists (registration, branch, or checkout)`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tlaneKey = args.laneKey;\n\t\t} else {\n\t\t\t// Deterministic allocation: lowest free `<scope>-<n>` (scope = goalId or \"adhoc\").\n\t\t\tconst scope = sanitizeScope(args.goalId ?? \"adhoc\");\n\t\t\tlet n = 1;\n\t\t\twhile (!(await isFree(`${scope}-${n}`))) n++;\n\t\t\tlaneKey = `${scope}-${n}`;\n\t\t}\n\n\t\tawait ensureRepoGitConfig(deps, ctx);\n\n\t\tconst branch = laneBranch(laneKey);\n\t\tconst worktreePath = join(deps.worktreesBaseDir, ctx.slug, laneKey);\n\t\tconst add = await runGit(deps, ctx.topLevel, [\"worktree\", \"add\", \"-b\", branch, worktreePath, ctx.mainBranch]);\n\t\tif (add.code !== 0) return gitError(`git worktree add failed for lane '${laneKey}'`, add);\n\n\t\tconst at = nowIso(deps);\n\t\tconst lane: LaneRegistration = {\n\t\t\tlaneKey,\n\t\t\tbranch,\n\t\t\tworktreePath,\n\t\t\tstatus: \"active\",\n\t\t\tcreatedAt: at,\n\t\t\tupdatedAt: at,\n\t\t\t...(args.goalId !== undefined ? { goalId: args.goalId } : {}),\n\t\t\t...(args.requirementId !== undefined ? { requirementId: args.requirementId } : {}),\n\t\t\townerPid: deps.pid ?? process.pid,\n\t\t\t...(deps.sessionId !== undefined ? { ownerSessionId: deps.sessionId } : {}),\n\t\t};\n\t\tawait writeLane(ctx.paths, lane);\n\t\tawait appendAuditEvent(ctx.paths, { event: \"lane_created\", laneKey, branch, baseSha: ctx.mainSha }, at);\n\t\treturn { code: \"ok\", lane };\n\t});\n}\n\n/**\n * Does `lane` have a DIFFERENT, still-alive session owning it? Same same-host `isAlive` pattern\n * used elsewhere (`deps.isPidAlive`, else {@link defaultIsPidAlive} against this host). A lane\n * with no recorded owner, owned by THIS session, or whose owner is dead never conflicts --\n * `reconcile` already clears dead owners, but a race can still observe one here, and a dead owner\n * must never block land/release (D6, per R1: land/release ONLY -- sync/continue/abort_sync stay\n * ungated at the engine; worker cross-lane containment for those lives at the tool layer, D3).\n */\nfunction ownerConflicts(deps: WorktreeSyncEngineDeps, lane: LaneRegistration): boolean {\n\tif (lane.ownerSessionId == null || lane.ownerSessionId === deps.sessionId) return false;\n\tif (lane.ownerPid === undefined) return false;\n\tconst isAlive =\n\t\tdeps.isPidAlive ??\n\t\t((pid: number) => defaultIsPidAlive({ pid, hostname: osHostname(), token: \"status\", acquiredAt: \"\" }));\n\treturn isAlive(lane.ownerPid);\n}\n\nexport interface BindLaneWorkerArgs {\n\tlaneKey: string;\n\tlaneId: string;\n}\n\nexport async function bindLaneWorker(\n\tdeps: WorktreeSyncEngineDeps,\n\targs: BindLaneWorkerArgs,\n): Promise<BindLaneWorkerResult> {\n\tconst ctx = await resolveRepoContext(deps);\n\tif (\"code\" in ctx) return { code: \"store_error\", message: ctx.message };\n\treturn withFileLock(ctx.paths.lifecycleLockFile, async () => {\n\t\tconst lane = await readLane(ctx.paths, args.laneKey);\n\t\tif (!lane) return { code: \"lane_not_found\", message: `lane '${args.laneKey}' is not registered` };\n\t\tif (lane.status !== \"active\")\n\t\t\treturn { code: \"lane_not_active\", message: `lane '${args.laneKey}' is ${lane.status}` };\n\t\tif (lane.boundLaneId === args.laneId)\n\t\t\treturn { code: \"already_bound\", laneKey: args.laneKey, laneId: args.laneId };\n\t\tif (lane.boundLaneId) {\n\t\t\treturn { code: \"binding_conflict\", laneKey: args.laneKey, boundLaneId: lane.boundLaneId };\n\t\t}\n\t\tconst updated = { ...lane, boundLaneId: args.laneId, updatedAt: nowIso(deps) };\n\t\ttry {\n\t\t\tawait writeLane(ctx.paths, updated);\n\t\t\tawait appendAuditEvent(\n\t\t\t\tctx.paths,\n\t\t\t\t{ event: \"lane_worker_bound\", laneKey: args.laneKey, laneId: args.laneId },\n\t\t\t\tnowIso(deps),\n\t\t\t);\n\t\t} catch (error) {\n\t\t\treturn { code: \"store_error\", message: `lane binding persistence failed: ${String(error)}` };\n\t\t}\n\t\treturn { code: \"bound\", laneKey: args.laneKey, laneId: args.laneId };\n\t});\n}\n\nexport interface ReleaseLaneArgs {\n\tlaneKey: string;\n\t/** Required as exactly \"yes-discard-lane\" to release a lane with unlanded commits or dirty files (G11). */\n\tconfirm?: string;\n}\n\nexport async function releaseLane(deps: WorktreeSyncEngineDeps, args: ReleaseLaneArgs): Promise<ReleaseLaneResult> {\n\tconst ctx = await resolveRepoContext(deps);\n\tif (\"code\" in ctx) return ctx;\n\n\treturn withFileLock(ctx.paths.lifecycleLockFile, async () => {\n\t\tconst lane = await readLane(ctx.paths, args.laneKey);\n\t\tif (!lane) return { code: \"lane_not_found\", message: `no registered lane '${args.laneKey}'` };\n\t\tif (lane.status === \"released\") return { code: \"released\", laneKey: lane.laneKey };\n\t\tif (ownerConflicts(deps, lane)) {\n\t\t\treturn {\n\t\t\t\tcode: \"lane_owner_conflict\",\n\t\t\t\tmessage: `lane '${lane.laneKey}' is owned by another live session (pid ${lane.ownerPid}); only its owner may release it`,\n\t\t\t};\n\t\t}\n\n\t\tconst facts = await deriveLaneFacts(deps, ctx, lane);\n\t\tlet landed = true;\n\t\tif (facts.branchSha) {\n\t\t\tconst ancestry = await runGit(deps, ctx.topLevel, [\n\t\t\t\t\"merge-base\",\n\t\t\t\t\"--is-ancestor\",\n\t\t\t\tfacts.branchSha,\n\t\t\t\tctx.mainSha,\n\t\t\t]);\n\t\t\tlanded = ancestry.code === 0;\n\t\t}\n\t\tconst unlandedWork = (facts.branchSha !== undefined && !landed) || facts.dirty;\n\t\tconst discardConfirmed = args.confirm === \"yes-discard-lane\";\n\t\tif (unlandedWork && !discardConfirmed) {\n\t\t\treturn {\n\t\t\t\tcode: \"lane_unlanded_work\",\n\t\t\t\tmessage:\n\t\t\t\t\t`lane '${lane.laneKey}' has ${facts.dirty ? \"uncommitted changes\" : \"\"}` +\n\t\t\t\t\t`${facts.dirty && !landed ? \" and \" : \"\"}${!landed ? `${facts.aheadOfMain} unlanded commit(s)` : \"\"}; ` +\n\t\t\t\t\t`land it first, or pass confirm:\"yes-discard-lane\" to discard`,\n\t\t\t};\n\t\t}\n\n\t\tif (facts.worktreePresent) {\n\t\t\tconst removeArgs = [\"worktree\", \"remove\", ...(unlandedWork ? [\"--force\"] : []), lane.worktreePath];\n\t\t\tconst remove = await runGit(deps, ctx.topLevel, removeArgs);\n\t\t\tif (remove.code !== 0) return gitError(`git worktree remove failed for lane '${lane.laneKey}'`, remove);\n\t\t}\n\t\tif (facts.branchSha) {\n\t\t\tconst del = await runGit(deps, ctx.topLevel, [\"branch\", unlandedWork ? \"-D\" : \"-d\", lane.branch]);\n\t\t\tif (del.code !== 0) return gitError(`git branch delete failed for lane '${lane.laneKey}'`, del);\n\t\t}\n\t\tawait runGit(deps, ctx.topLevel, [\"worktree\", \"prune\"]);\n\n\t\tconst at = nowIso(deps);\n\t\tawait writeLane(ctx.paths, { ...lane, status: \"released\", updatedAt: at });\n\t\tawait appendAuditEvent(\n\t\t\tctx.paths,\n\t\t\t{ event: \"lane_released\", laneKey: lane.laneKey, ...(unlandedWork ? { discarded: true } : {}) },\n\t\t\tat,\n\t\t);\n\t\treturn { code: \"released\", laneKey: lane.laneKey };\n\t});\n}\n\n/** Lane worktrees git knows about that the registry does not (yet) track: a valid `pi/wt/<key>`\n * branch, key not already registered, checkout still present. One derivation shared by the\n * write-free no-op guard below and the re-registration pass, rather than two copies of the same\n * filter. */\nfunction findUnregisteredLaneWorktrees(\n\tdeps: WorktreeSyncEngineDeps,\n\tworktrees: WorktreeListEntry[],\n\tregistered: Set<string>,\n): Array<{ laneKey: string; path: string }> {\n\tconst found: Array<{ laneKey: string; path: string }> = [];\n\tfor (const entry of worktrees) {\n\t\tconst ref = entry.branchRef;\n\t\tif (!ref?.startsWith(`refs/heads/${LANE_BRANCH_PREFIX}`)) continue;\n\t\tconst laneKey = ref.slice(`refs/heads/${LANE_BRANCH_PREFIX}`.length);\n\t\tif (registered.has(laneKey) || !LANE_KEY_RE.test(laneKey)) continue;\n\t\tif (!fileExists(deps, entry.path)) continue;\n\t\tfound.push({ laneKey, path: entry.path });\n\t}\n\treturn found;\n}\n\nasync function reconcileLandingTransaction(\n\tdeps: WorktreeSyncEngineDeps,\n\tctx: RepoContext,\n\ttransaction: LandingTransaction,\n): Promise<WorktreeSyncRefusal<\"git_error\"> | undefined> {\n\tconst currentMainSha = await revParseBranch(deps, ctx.topLevel, ctx.mainBranch);\n\tif (currentMainSha === transaction.priorMainSha) {\n\t\tawait clearLandingTransaction(ctx.paths);\n\t\treturn undefined;\n\t}\n\tif (currentMainSha !== transaction.testedTipSha) {\n\t\treturn {\n\t\t\tcode: \"git_error\",\n\t\t\tmessage: `landing transaction is ambiguous: main is ${currentMainSha?.slice(0, 12) ?? \"missing\"}, expected prior ${transaction.priorMainSha.slice(0, 12)} or tested ${transaction.testedTipSha.slice(0, 12)}`,\n\t\t};\n\t}\n\n\tconst previous = await readEpoch(ctx.paths);\n\tlet epoch = previous?.epoch ?? 0;\n\tconst at = nowIso(deps);\n\tif (previous?.mainSha !== transaction.testedTipSha) {\n\t\tepoch++;\n\t\tawait writeEpoch(ctx.paths, {\n\t\t\tepoch,\n\t\t\tmainSha: transaction.testedTipSha,\n\t\t\tpreviousMainSha: transaction.priorMainSha,\n\t\t\tlandedLaneKey: transaction.laneKey,\n\t\t\tlandedAt: at,\n\t\t\tchangedPaths: transaction.changedPaths,\n\t\t\tchangedPathsTruncated: transaction.changedPathsTruncated,\n\t\t});\n\t\ttransaction = { ...transaction, stage: \"epoch_written\" };\n\t\tawait writeLandingTransaction(ctx.paths, transaction);\n\t}\n\tif (transaction.stage !== \"audit_logged\") {\n\t\tawait appendAuditEvent(\n\t\t\tctx.paths,\n\t\t\t{\n\t\t\t\tevent: \"epoch_reconciled\",\n\t\t\t\tepoch,\n\t\t\t\tlaneKey: transaction.laneKey,\n\t\t\t\tmainSha: transaction.testedTipSha,\n\t\t\t\tgate: transaction.gate,\n\t\t\t},\n\t\t\tat,\n\t\t);\n\t\tawait writeLandingTransaction(ctx.paths, { ...transaction, stage: \"audit_logged\" });\n\t}\n\tawait clearLandingTransaction(ctx.paths);\n\treturn undefined;\n}\n\n/**\n * Startup/repair pass (mirrors the tmux session reconcile): diff the registry against git\n * reality, mark orphans (never delete -- G11), re-register lane worktrees git still knows that\n * the registry lost (a deleted store is fully rebuildable), self-heal orphan registrations whose\n * worktree+branch actually exist, clear dead owners, and release a provably-stale lock.\n */\nexport async function reconcile(deps: WorktreeSyncEngineDeps): Promise<ReconcileResult> {\n\tconst ctx = await resolveRepoContext(deps);\n\tif (\"code\" in ctx) return ctx;\n\n\tconst landingTransaction = await readLandingTransaction(ctx.paths);\n\tif (landingTransaction) {\n\t\tconst recoveryLock = await acquireIntegrationLock(\n\t\t\tctx.paths,\n\t\t\t{ pid: deps.pid ?? process.pid, hostname: osHostname(), sessionId: deps.sessionId, laneKey: \"reconcile\" },\n\t\t\t{ now: deps.now },\n\t\t);\n\t\tif (!recoveryLock.acquired) {\n\t\t\treturn { code: \"git_error\", message: \"landing transaction recovery is blocked by an active integration lock\" };\n\t\t}\n\t\ttry {\n\t\t\tconst recovery = await reconcileLandingTransaction(deps, ctx, landingTransaction);\n\t\t\tif (recovery) return recovery;\n\t\t} finally {\n\t\t\tawait releaseIntegrationLock(ctx.paths, recoveryLock.token, { now: deps.now });\n\t\t}\n\t}\n\n\tconst worktreesResult = await runGit(deps, ctx.topLevel, [\"worktree\", \"list\", \"--porcelain\"]);\n\tif (worktreesResult.code !== 0) return gitError(\"git worktree list failed\", worktreesResult);\n\tconst worktrees = parseWorktreeList(worktreesResult.stdout);\n\n\tconst lanes = await listLanes(ctx.paths);\n\tconst registered = new Set(lanes.map((lane) => lane.laneKey));\n\tconst unregisteredWorktrees = findUnregisteredLaneWorktrees(deps, worktrees, registered);\n\n\t// Write-free fast path: worktree-sync now starts in every session, so a mere session open in a\n\t// git repo must never create `<git-common-dir>/pi-worktree-sync/`. When the store does not exist\n\t// yet and git shows nothing to recover, there is genuinely nothing to reconcile -- one early\n\t// determination, then skip every write below (writeLane/appendAuditEvent/releaseIntegrationLock)\n\t// rather than guarding each call individually. Once the store exists, or findings occur, behavior\n\t// is unchanged below (including the reconcile_summary audit append).\n\tif (!fileExists(deps, ctx.paths.root) && unregisteredWorktrees.length === 0) {\n\t\treturn {\n\t\t\tcode: \"reconciled\",\n\t\t\torphanedLaneKeys: [],\n\t\t\treRegisteredLaneKeys: [],\n\t\t\townerClearedLaneKeys: [],\n\t\t\tstaleLockReleased: false,\n\t\t};\n\t}\n\n\tconst isAlive =\n\t\tdeps.isPidAlive ??\n\t\t((pid: number) => defaultIsPidAlive({ pid, hostname: osHostname(), token: \"status\", acquiredAt: \"\" }));\n\tconst at = nowIso(deps);\n\n\tconst orphanedLaneKeys: string[] = [];\n\tconst reRegisteredLaneKeys: string[] = [];\n\tconst ownerClearedLaneKeys: string[] = [];\n\n\tfor (const lane of lanes) {\n\t\tif (lane.status === \"released\") continue;\n\t\tlet next = lane;\n\n\t\tconst branchSha = await revParseBranch(deps, ctx.topLevel, lane.branch);\n\t\tconst present = branchSha !== undefined && fileExists(deps, lane.worktreePath);\n\t\tif (lane.status === \"active\" && !present) {\n\t\t\tnext = { ...next, status: \"orphaned\", updatedAt: at };\n\t\t\torphanedLaneKeys.push(lane.laneKey);\n\t\t\tawait appendAuditEvent(ctx.paths, { event: \"lane_orphaned\", laneKey: lane.laneKey }, at);\n\t\t} else if (lane.status === \"orphaned\" && present) {\n\t\t\t// Self-heal: the checkout and branch are back (or never really left) -- active again.\n\t\t\tnext = { ...next, status: \"active\", updatedAt: at };\n\t\t\treRegisteredLaneKeys.push(lane.laneKey);\n\t\t\tawait appendAuditEvent(ctx.paths, { event: \"lane_reregistered\", laneKey: lane.laneKey }, at);\n\t\t}\n\n\t\tif (next.ownerPid !== undefined && !isAlive(next.ownerPid)) {\n\t\t\tconst { ownerPid: _pid, ownerSessionId: _session, ...rest } = next;\n\t\t\tnext = { ...rest, updatedAt: at };\n\t\t\townerClearedLaneKeys.push(lane.laneKey);\n\t\t}\n\n\t\tif (next !== lane) await writeLane(ctx.paths, next);\n\t}\n\n\t// Lane worktrees git knows but the registry does not: rebuild identity from git facts.\n\tfor (const { laneKey, path } of unregisteredWorktrees) {\n\t\tawait writeLane(ctx.paths, {\n\t\t\tlaneKey,\n\t\t\tbranch: `${LANE_BRANCH_PREFIX}${laneKey}`,\n\t\t\tworktreePath: path,\n\t\t\tstatus: \"active\",\n\t\t\tcreatedAt: at,\n\t\t\tupdatedAt: at,\n\t\t});\n\t\treRegisteredLaneKeys.push(laneKey);\n\t\tawait appendAuditEvent(ctx.paths, { event: \"lane_reregistered\", laneKey }, at);\n\t}\n\n\t// Provably-stale integration lock: dead same-host owner (never a foreign or live one).\n\tlet staleLockReleased = false;\n\tconst holder = await readLockHolder(ctx.paths);\n\tif (holder && holder.hostname === osHostname() && !isAlive(holder.pid) && holder.token) {\n\t\tstaleLockReleased = await releaseIntegrationLock(ctx.paths, holder.token, { now: deps.now });\n\t}\n\n\tawait appendAuditEvent(\n\t\tctx.paths,\n\t\t{\n\t\t\tevent: \"reconcile_summary\",\n\t\t\torphaned: orphanedLaneKeys,\n\t\t\treRegistered: reRegisteredLaneKeys,\n\t\t\townersCleared: ownerClearedLaneKeys,\n\t\t\tstaleLockReleased,\n\t\t},\n\t\tat,\n\t);\n\treturn { code: \"reconciled\", orphanedLaneKeys, reRegisteredLaneKeys, ownerClearedLaneKeys, staleLockReleased };\n}\n\n/** Rebase env for every rebase-driving call: never let git open an editor mid-automation. */\nfunction rebaseEnv(): NodeJS.ProcessEnv {\n\treturn { ...process.env, GIT_EDITOR: \"true\", GIT_SEQUENCE_EDITOR: \"true\" };\n}\n\nfunction runGitEnv(deps: WorktreeSyncEngineDeps, cwd: string, args: string[]): Promise<ExecResult> {\n\treturn deps.exec(\"git\", args, {\n\t\tcwd,\n\t\ttimeout: GIT_TIMEOUT_MS,\n\t\tsignal: deps.signal,\n\t\tmaxBuffer: GIT_MAX_BUFFER,\n\t\tenv: rebaseEnv(),\n\t});\n}\n\nfunction readFileMaybe(deps: WorktreeSyncEngineDeps, path: string): string | undefined {\n\tif (deps.readFile) return deps.readFile(path);\n\ttry {\n\t\treturn readFileSync(path, \"utf-8\");\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\n/** A rebase is in progress iff the worktree's rebase-merge or rebase-apply state dir exists. */\nasync function isRebaseActive(deps: WorktreeSyncEngineDeps, worktreePath: string): Promise<boolean> {\n\tconst gitPaths = await runGit(deps, worktreePath, [\n\t\t\"rev-parse\",\n\t\t\"--path-format=absolute\",\n\t\t\"--git-path\",\n\t\t\"rebase-merge\",\n\t\t\"--git-path\",\n\t\t\"rebase-apply\",\n\t]);\n\tif (gitPaths.code !== 0) return false;\n\treturn gitPaths.stdout\n\t\t.split(/\\r?\\n/)\n\t\t.map((line) => line.trim())\n\t\t.filter(Boolean)\n\t\t.some((path) => fileExists(deps, path));\n}\n\n/** Paths with local modifications (`status --porcelain`), rename targets included. Capped. */\nasync function dirtyPaths(deps: WorktreeSyncEngineDeps, worktreePath: string): Promise<string[]> {\n\tconst status = await runGit(deps, worktreePath, [\"status\", \"--porcelain\"]);\n\tif (status.code !== 0) return [];\n\treturn status.stdout\n\t\t.split(/\\r?\\n/)\n\t\t.filter((line) => line.length > 3)\n\t\t.map((line) => {\n\t\t\tconst path = line.slice(3);\n\t\t\tconst renameArrow = path.indexOf(\" -> \");\n\t\t\treturn renameArrow >= 0 ? path.slice(renameArrow + 4) : path;\n\t\t})\n\t\t.slice(0, 100);\n}\n\nasync function unmergedFiles(deps: WorktreeSyncEngineDeps, worktreePath: string): Promise<string[]> {\n\tconst diff = await runGit(deps, worktreePath, [\"diff\", \"--name-only\", \"--diff-filter=U\"]);\n\tif (diff.code !== 0) return [];\n\treturn diff.stdout\n\t\t.split(/\\r?\\n/)\n\t\t.map((line) => line.trim())\n\t\t.filter(Boolean);\n}\n\n/** Conflict kind per path from `git ls-files -u` index stages (1=base, 2=ours, 3=theirs). */\nasync function unmergedKinds(\n\tdeps: WorktreeSyncEngineDeps,\n\tworktreePath: string,\n): Promise<Map<string, ConflictWorklistFile[\"kind\"]>> {\n\tconst lsFiles = await runGit(deps, worktreePath, [\"ls-files\", \"-u\"]);\n\tconst stagesByPath = new Map<string, Set<string>>();\n\tif (lsFiles.code === 0) {\n\t\tfor (const line of lsFiles.stdout.split(/\\r?\\n/)) {\n\t\t\tconst match = line.match(/^\\d+ [0-9a-f]+ ([123])\\t(.+)$/);\n\t\t\tif (!match?.[1] || !match[2]) continue;\n\t\t\tconst stages = stagesByPath.get(match[2]) ?? new Set<string>();\n\t\t\tstages.add(match[1]);\n\t\t\tstagesByPath.set(match[2], stages);\n\t\t}\n\t}\n\tconst kinds = new Map<string, ConflictWorklistFile[\"kind\"]>();\n\tfor (const [path, stages] of stagesByPath) {\n\t\tconst has = (stage: string) => stages.has(stage);\n\t\tif (has(\"1\") && has(\"2\") && has(\"3\")) kinds.set(path, \"both_modified\");\n\t\telse if (!has(\"1\") && has(\"2\") && has(\"3\")) kinds.set(path, \"both_added\");\n\t\telse if (has(\"1\") && !has(\"2\") && has(\"3\")) kinds.set(path, \"deleted_by_us\");\n\t\telse if (has(\"1\") && has(\"2\") && !has(\"3\")) kinds.set(path, \"deleted_by_them\");\n\t\telse kinds.set(path, \"unknown\");\n\t}\n\treturn kinds;\n}\n\n/** Rebase progress (\"<done>/<total>\") plus the commit the rebase stopped at, from the rebase\n * state files (merge backend: msgnum/end/stopped-sha; apply backend: next/last). */\nasync function rebaseProgress(\n\tdeps: WorktreeSyncEngineDeps,\n\tworktreePath: string,\n): Promise<{ step: string; stoppedAtCommit?: { sha: string; subject: string } }> {\n\tconst gitPaths = await runGit(deps, worktreePath, [\n\t\t\"rev-parse\",\n\t\t\"--path-format=absolute\",\n\t\t\"--git-path\",\n\t\t\"rebase-merge\",\n\t\t\"--git-path\",\n\t\t\"rebase-apply\",\n\t]);\n\tlet step = \"?\";\n\tlet stoppedSha: string | undefined;\n\tif (gitPaths.code === 0) {\n\t\tconst [mergeDir, applyDir] = gitPaths.stdout\n\t\t\t.split(/\\r?\\n/)\n\t\t\t.map((line) => line.trim())\n\t\t\t.filter(Boolean);\n\t\tconst readCounter = (dir: string | undefined, doneName: string, totalName: string): string | undefined => {\n\t\t\tif (!dir) return undefined;\n\t\t\tconst done = readFileMaybe(deps, join(dir, doneName))?.trim();\n\t\t\tconst total = readFileMaybe(deps, join(dir, totalName))?.trim();\n\t\t\treturn done && total ? `${done}/${total}` : undefined;\n\t\t};\n\t\tstep = readCounter(mergeDir, \"msgnum\", \"end\") ?? readCounter(applyDir, \"next\", \"last\") ?? \"?\";\n\t\tstoppedSha = mergeDir ? readFileMaybe(deps, join(mergeDir, \"stopped-sha\"))?.trim() : undefined;\n\t}\n\tif (!stoppedSha) return { step };\n\tconst subject = await runGit(deps, worktreePath, [\"log\", \"-1\", \"--format=%s\", stoppedSha]);\n\treturn {\n\t\tstep,\n\t\tstoppedAtCommit: { sha: stoppedSha, subject: subject.code === 0 ? subject.stdout.trim() : \"\" },\n\t};\n}\n\n/**\n * Build the structured conflict worklist (G9's input): the agent edits exactly these files, then\n * calls `continue` -- staging, marker verification, and rebase continuation are harness work.\n * Files rerere auto-resolved never appear here (they are staged, not unmerged) -- the mechanical\n * drive loop below continues past fully-replayed stops without involving the agent at all, so\n * `resolvedByRerere` marks nothing today and is reserved for partial-replay surfacing.\n */\nasync function buildWorklist(\n\tdeps: WorktreeSyncEngineDeps,\n\tworktreePath: string,\n\tunmerged: string[],\n): Promise<ConflictWorklist> {\n\tconst kinds = await unmergedKinds(deps, worktreePath);\n\tconst progress = await rebaseProgress(deps, worktreePath);\n\treturn {\n\t\tstep: progress.step,\n\t\t...(progress.stoppedAtCommit ? { stoppedAtCommit: progress.stoppedAtCommit } : {}),\n\t\tfiles: unmerged.map((path) => ({\n\t\t\tpath,\n\t\t\tkind: kinds.get(path) ?? \"unknown\",\n\t\t\tresolvedByRerere: false,\n\t\t})),\n\t};\n}\n\nconst CONFLICT_MARKER_RE = /^(?:<{7}|={7}|>{7}|\\|{7})/m;\n\n/**\n * Mechanically drive an in-progress rebase forward: finish it, stop at the next REAL conflict\n * (returning its worklist), auto-continue stops that rerere fully replayed, and skip steps that\n * provably reduced to nothing (their changes already landed). Bounded; never guesses -- an\n * unrecognized stop state surfaces as git_error with the evidence.\n */\nasync function driveRebase(\n\tdeps: WorktreeSyncEngineDeps,\n\tctx: RepoContext,\n\tlane: LaneRegistration,\n): Promise<\n\t| { code: \"sync_clean\"; laneKey: string; autoContinued: number }\n\t| { code: \"sync_conflicts\"; laneKey: string; worklist: ConflictWorklist }\n\t| WorktreeSyncRefusal<\"git_error\">\n> {\n\tconst worktreePath = lane.worktreePath;\n\tlet autoContinued = 0;\n\tfor (let iteration = 0; iteration <= 1000; iteration++) {\n\t\tif (!(await isRebaseActive(deps, worktreePath))) {\n\t\t\tawait appendAuditEvent(\n\t\t\t\tctx.paths,\n\t\t\t\t{ event: \"sync_completed\", laneKey: lane.laneKey, autoContinued },\n\t\t\t\tnowIso(deps),\n\t\t\t);\n\t\t\treturn { code: \"sync_clean\", laneKey: lane.laneKey, autoContinued };\n\t\t}\n\t\tconst unmerged = await unmergedFiles(deps, worktreePath);\n\t\tif (unmerged.length > 0) {\n\t\t\tconst worklist = await buildWorklist(deps, worktreePath, unmerged);\n\t\t\tawait appendAuditEvent(\n\t\t\t\tctx.paths,\n\t\t\t\t{ event: \"sync_conflicts\", laneKey: lane.laneKey, step: worklist.step, files: worklist.files.length },\n\t\t\t\tnowIso(deps),\n\t\t\t);\n\t\t\treturn { code: \"sync_conflicts\", laneKey: lane.laneKey, worklist };\n\t\t}\n\t\t// Stopped with nothing unmerged: rerere fully replayed the resolution (auto-staged via\n\t\t// rerere.autoUpdate) or the step reduced to nothing. Continue mechanically.\n\t\tconst cont = await runGitEnv(deps, worktreePath, [\"rebase\", \"--continue\"]);\n\t\tautoContinued++;\n\t\tif (cont.code === 0) continue;\n\t\tif ((await unmergedFiles(deps, worktreePath)).length > 0) continue;\n\t\tif (!(await isRebaseActive(deps, worktreePath))) continue;\n\t\tconst staged = await runGit(deps, worktreePath, [\"diff\", \"--cached\", \"--quiet\"]);\n\t\tconst unstaged = await runGit(deps, worktreePath, [\"diff\", \"--quiet\"]);\n\t\tif (staged.code === 0 && unstaged.code === 0) {\n\t\t\t// Provably-empty step: its changes are already on main. Skipping is the one correct move.\n\t\t\tconst skip = await runGitEnv(deps, worktreePath, [\"rebase\", \"--skip\"]);\n\t\t\tif (skip.code !== 0 && (await isRebaseActive(deps, worktreePath))) {\n\t\t\t\treturn gitError(\"git rebase --skip failed on a provably-empty step\", skip);\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\treturn gitError(\"git rebase --continue failed in an unrecognized state\", cont);\n\t}\n\treturn {\n\t\tcode: \"git_error\",\n\t\tmessage: \"rebase drive exceeded 1000 mechanical steps; aborting the drive (rebase left in progress)\",\n\t};\n}\n\nexport interface SyncLaneArgs {\n\tlaneKey: string;\n}\n\n/**\n * Rebase current main into the lane branch, locally (the awareness half of \"perfect sync\"; the\n * land gate is the enforcement half). Pins the main sha it derived so a concurrent land cannot\n * change this sync's meaning mid-flight (D-pinned-sha). Conflicts leave the rebase in progress\n * and return a structured worklist; `continueSync` verifies and drives on.\n */\nexport async function syncLane(deps: WorktreeSyncEngineDeps, args: SyncLaneArgs): Promise<SyncLaneResult> {\n\tconst ctx = await resolveRepoContext(deps);\n\tif (\"code\" in ctx) return ctx;\n\treturn withFileLock(ctx.paths.lifecycleLockFile, async () => {\n\t\tconst lane = await readLane(ctx.paths, args.laneKey);\n\t\tif (!lane || lane.status === \"released\") {\n\t\t\treturn { code: \"lane_not_found\", message: `no active lane '${args.laneKey}'` };\n\t\t}\n\t\tconst facts = await deriveLaneFacts(deps, ctx, lane);\n\t\tif (!facts.worktreePresent) {\n\t\t\treturn {\n\t\t\t\tcode: \"worktree_missing\",\n\t\t\t\tmessage: `lane '${lane.laneKey}' checkout missing at ${lane.worktreePath}`,\n\t\t\t};\n\t\t}\n\t\tif (facts.rebaseInProgress) {\n\t\t\treturn {\n\t\t\t\tcode: \"rebase_in_progress\",\n\t\t\t\tmessage: `lane '${lane.laneKey}' has a rebase in progress; resolve and call continue, or abort_sync`,\n\t\t\t};\n\t\t}\n\t\tif (facts.fresh) {\n\t\t\treturn { code: \"sync_clean\", laneKey: lane.laneKey, alreadyFresh: true, autoContinued: 0 };\n\t\t}\n\t\tif (facts.dirty) {\n\t\t\treturn {\n\t\t\t\tcode: \"lane_dirty\",\n\t\t\t\tmessage: `lane '${lane.laneKey}' has uncommitted changes; commit them on the lane branch, then sync`,\n\t\t\t\tpaths: await dirtyPaths(deps, lane.worktreePath),\n\t\t\t};\n\t\t}\n\n\t\tawait appendAuditEvent(\n\t\t\tctx.paths,\n\t\t\t{ event: \"sync_started\", laneKey: lane.laneKey, ontoSha: ctx.mainSha },\n\t\t\tnowIso(deps),\n\t\t);\n\t\tconst rebase = await runGitEnv(deps, lane.worktreePath, [\"rebase\", ctx.mainSha]);\n\t\tif (rebase.code === 0) {\n\t\t\tawait appendAuditEvent(\n\t\t\t\tctx.paths,\n\t\t\t\t{ event: \"sync_completed\", laneKey: lane.laneKey, autoContinued: 0 },\n\t\t\t\tnowIso(deps),\n\t\t\t);\n\t\t\treturn { code: \"sync_clean\", laneKey: lane.laneKey, alreadyFresh: false, autoContinued: 0 };\n\t\t}\n\t\tif (!(await isRebaseActive(deps, lane.worktreePath))) {\n\t\t\treturn gitError(`git rebase failed to start for lane '${lane.laneKey}'`, rebase);\n\t\t}\n\t\tconst driven = await driveRebase(deps, ctx, lane);\n\t\tif (driven.code === \"sync_clean\") return { ...driven, alreadyFresh: false };\n\t\treturn driven;\n\t});\n}\n\nexport interface ContinueSyncArgs {\n\tlaneKey: string;\n}\n\n/**\n * G9: verify the agent's conflict resolution mechanically (zero conflict markers by byte-scan --\n * the agent never self-certifies), stage it, and drive the rebase on. More conflicts return the\n * next worklist; completion returns sync_clean.\n */\nexport async function continueSync(deps: WorktreeSyncEngineDeps, args: ContinueSyncArgs): Promise<ContinueSyncResult> {\n\tconst ctx = await resolveRepoContext(deps);\n\tif (\"code\" in ctx) return ctx;\n\treturn withFileLock(ctx.paths.lifecycleLockFile, async () => {\n\t\tconst lane = await readLane(ctx.paths, args.laneKey);\n\t\tif (!lane || lane.status === \"released\") {\n\t\t\treturn { code: \"lane_not_found\", message: `no active lane '${args.laneKey}'` };\n\t\t}\n\t\tif (!fileExists(deps, lane.worktreePath)) {\n\t\t\treturn {\n\t\t\t\tcode: \"worktree_missing\",\n\t\t\t\tmessage: `lane '${lane.laneKey}' checkout missing at ${lane.worktreePath}`,\n\t\t\t};\n\t\t}\n\t\tif (!(await isRebaseActive(deps, lane.worktreePath))) {\n\t\t\treturn {\n\t\t\t\tcode: \"no_rebase_in_progress\",\n\t\t\t\tmessage: `lane '${lane.laneKey}' has no rebase in progress; use sync`,\n\t\t\t};\n\t\t}\n\n\t\tconst unmerged = await unmergedFiles(deps, lane.worktreePath);\n\t\tconst withMarkers = unmerged.filter((path) => {\n\t\t\tconst content = readFileMaybe(deps, join(lane.worktreePath, path));\n\t\t\treturn content !== undefined && CONFLICT_MARKER_RE.test(content);\n\t\t});\n\t\tif (withMarkers.length > 0) {\n\t\t\treturn {\n\t\t\t\tcode: \"conflict_markers_present\",\n\t\t\t\tmessage: `${withMarkers.length} file(s) still contain conflict markers; resolve them fully, then continue`,\n\t\t\t\tpaths: withMarkers,\n\t\t\t};\n\t\t}\n\t\tif (unmerged.length > 0) {\n\t\t\tconst add = await runGit(deps, lane.worktreePath, [\"add\", \"-A\"]);\n\t\t\tif (add.code !== 0) return gitError(\"git add -A failed while staging conflict resolutions\", add);\n\t\t}\n\t\tconst cont = await runGitEnv(deps, lane.worktreePath, [\"rebase\", \"--continue\"]);\n\t\tif (cont.code === 0 && !(await isRebaseActive(deps, lane.worktreePath))) {\n\t\t\tawait appendAuditEvent(\n\t\t\t\tctx.paths,\n\t\t\t\t{ event: \"sync_completed\", laneKey: lane.laneKey, autoContinued: 0 },\n\t\t\t\tnowIso(deps),\n\t\t\t);\n\t\t\treturn { code: \"sync_clean\", laneKey: lane.laneKey, autoContinued: 0 };\n\t\t}\n\t\tconst result = await driveRebase(deps, ctx, lane);\n\t\treturn result;\n\t});\n}\n\nexport interface AbortSyncArgs {\n\tlaneKey: string;\n}\n\n/** Abort an in-progress sync rebase: the lane returns to its pre-sync tip -- still stale, and\n * honestly reported as such by status. */\nexport async function abortSync(deps: WorktreeSyncEngineDeps, args: AbortSyncArgs): Promise<AbortSyncResult> {\n\tconst ctx = await resolveRepoContext(deps);\n\tif (\"code\" in ctx) return ctx;\n\treturn withFileLock(ctx.paths.lifecycleLockFile, async () => {\n\t\tconst lane = await readLane(ctx.paths, args.laneKey);\n\t\tif (!lane || lane.status === \"released\") {\n\t\t\treturn { code: \"lane_not_found\", message: `no active lane '${args.laneKey}'` };\n\t\t}\n\t\tif (!(await isRebaseActive(deps, lane.worktreePath))) {\n\t\t\treturn { code: \"no_rebase_in_progress\", message: `lane '${lane.laneKey}' has no rebase in progress` };\n\t\t}\n\t\tconst abort = await runGitEnv(deps, lane.worktreePath, [\"rebase\", \"--abort\"]);\n\t\tif (abort.code !== 0) return gitError(\"git rebase --abort failed\", abort);\n\t\tawait appendAuditEvent(ctx.paths, { event: \"sync_aborted\", laneKey: lane.laneKey }, nowIso(deps));\n\t\treturn { code: \"ok\", laneKey: lane.laneKey };\n\t});\n}\n\nexport interface LandLaneArgs {\n\tlaneKey: string;\n\t/** \"on\" runs gateCommand (G4); \"off\" is the owner-level opt-out, recorded per land event. */\n\tgate: \"on\" | \"off\";\n\tgateCommand?: string;\n\tgateTimeoutMs?: number;\n}\n\nconst DEFAULT_GATE_TIMEOUT_MS = 900_000;\n\n/**\n * The land gate -- the ONLY door to main (G1-G7). Serialized under the integration lock; every\n * precondition is re-derived INSIDE the lock (the compare-and-swap that makes the whole system\n * race-free: even if every notification failed, a stale lane cannot land). Main only ever moves\n * by ff-only merge of an already-rebased lane branch; a successful land bumps the epoch and\n * broadcasts in the same critical section.\n */\nexport async function landLane(deps: WorktreeSyncEngineDeps, args: LandLaneArgs): Promise<LandResult> {\n\tconst ctx = await resolveRepoContext(deps);\n\tif (\"code\" in ctx) return ctx;\n\treturn withFileLock(ctx.paths.lifecycleLockFile, async () => {\n\t\tconst lane = await readLane(ctx.paths, args.laneKey);\n\t\tif (!lane || lane.status === \"released\") {\n\t\t\treturn { code: \"lane_not_found\", message: `no active lane '${args.laneKey}'` };\n\t\t}\n\t\tif (ownerConflicts(deps, lane)) {\n\t\t\treturn {\n\t\t\t\tcode: \"lane_owner_conflict\",\n\t\t\t\tmessage: `lane '${lane.laneKey}' is owned by another live session (pid ${lane.ownerPid}); only its owner may land it`,\n\t\t\t};\n\t\t}\n\t\tif (args.gate === \"on\" && !args.gateCommand?.trim()) {\n\t\t\treturn {\n\t\t\t\tcode: \"gate_command_unset\",\n\t\t\t\tmessage:\n\t\t\t\t\t'no gate command configured; set worktreeSync.gateCommand (or worktreeSync.gate: \"off\" as an owner-level opt-out)',\n\t\t\t};\n\t\t}\n\n\t\tconst acquisition = await acquireIntegrationLock(\n\t\t\tctx.paths,\n\t\t\t{\n\t\t\t\tpid: deps.pid ?? process.pid,\n\t\t\t\thostname: osHostname(),\n\t\t\t\t...(deps.sessionId !== undefined ? { sessionId: deps.sessionId } : {}),\n\t\t\t\tlaneKey: lane.laneKey,\n\t\t\t},\n\t\t\t{\n\t\t\t\tnow: deps.now,\n\t\t\t\t...(deps.isPidAlive\n\t\t\t\t\t? { isPidAlive: (owner) => (deps.isPidAlive as (pid: number) => boolean)(owner.pid) }\n\t\t\t\t\t: {}),\n\t\t\t},\n\t\t);\n\t\tif (!acquisition.acquired) {\n\t\t\treturn {\n\t\t\t\tcode: \"lock_busy\",\n\t\t\t\tmessage: acquisition.holder\n\t\t\t\t\t? `integration lock held by pid ${acquisition.holder.pid}${acquisition.holder.laneKey ? ` (lane '${acquisition.holder.laneKey}')` : \"\"}; retry after it lands`\n\t\t\t\t\t: \"integration lock held; retry shortly\",\n\t\t\t\t...(acquisition.holder ? { holder: acquisition.holder } : {}),\n\t\t\t};\n\t\t}\n\n\t\ttry {\n\t\t\t// Everything below happens INSIDE the lock: re-derive, never trust pre-lock derivations.\n\t\t\tconst mainShaNow = await revParseBranch(deps, ctx.topLevel, ctx.mainBranch);\n\t\t\tif (!mainShaNow) {\n\t\t\t\treturn { code: \"default_branch_unresolved\", message: `main branch '${ctx.mainBranch}' vanished mid-land` };\n\t\t\t}\n\t\t\tif (!fileExists(deps, lane.worktreePath)) {\n\t\t\t\treturn {\n\t\t\t\t\tcode: \"worktree_missing\",\n\t\t\t\t\tmessage: `lane '${lane.laneKey}' checkout missing at ${lane.worktreePath}`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (await isRebaseActive(deps, lane.worktreePath)) {\n\t\t\t\treturn {\n\t\t\t\t\tcode: \"rebase_in_progress\",\n\t\t\t\t\tmessage: `lane '${lane.laneKey}' has a rebase in progress; finish (continue) or abort_sync before landing`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst laneDirty = await dirtyPaths(deps, lane.worktreePath);\n\t\t\tif (laneDirty.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tcode: \"lane_dirty\",\n\t\t\t\t\tmessage: `lane '${lane.laneKey}' has uncommitted changes; commit everything on the lane branch first (G2)`,\n\t\t\t\t\tpaths: laneDirty,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst tipSha = await revParseBranch(deps, ctx.topLevel, lane.branch);\n\t\t\tif (!tipSha) return { code: \"git_error\", message: `lane branch '${lane.branch}' has no commits/ref` };\n\t\t\tif (tipSha === mainShaNow) {\n\t\t\t\t// A no-op land would bump the epoch for nothing (notification churn for every lane).\n\t\t\t\treturn {\n\t\t\t\t\tcode: \"nothing_to_land\",\n\t\t\t\t\tmessage: `lane '${lane.laneKey}' has no commits beyond main; nothing to land`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst ancestry = await runGit(deps, ctx.topLevel, [\"merge-base\", \"--is-ancestor\", mainShaNow, tipSha]);\n\t\t\tif (ancestry.code !== 0) {\n\t\t\t\treturn {\n\t\t\t\t\tcode: \"stale_lane\",\n\t\t\t\t\tmessage: `lane '${lane.laneKey}' does not contain current main (${mainShaNow.slice(0, 12)}); sync first (G3)`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (!ctx.hubPath) {\n\t\t\t\treturn {\n\t\t\t\t\tcode: \"hub_missing\",\n\t\t\t\t\tmessage: `main branch '${ctx.mainBranch}' is not checked out in any worktree; landing needs the hub checkout (G5)`,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst changedResult = await runGit(deps, ctx.topLevel, [\"diff\", \"--name-only\", `${mainShaNow}..${tipSha}`]);\n\t\t\tif (changedResult.code !== 0)\n\t\t\t\treturn gitError(\"git diff --name-only failed while computing the land set\", changedResult);\n\t\t\tconst changed = changedResult.stdout\n\t\t\t\t.split(/\\r?\\n/)\n\t\t\t\t.map((line) => line.trim())\n\t\t\t\t.filter(Boolean);\n\n\t\t\t// G6, overlap-based: an ff merge only touches the land's changed files, and git itself\n\t\t\t// refuses to clobber local modifications -- so the deterministic pre-check refuses exactly\n\t\t\t// when hub-dirty paths intersect the incoming change set (not on unrelated hub dirt).\n\t\t\tconst hubDirty = await dirtyPaths(deps, ctx.hubPath);\n\t\t\tconst changedSet = new Set(changed);\n\t\t\tconst endangered = hubDirty.filter((path) => changedSet.has(path));\n\t\t\tif (endangered.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\tcode: \"hub_dirty\",\n\t\t\t\t\tmessage: `hub checkout has local modifications to ${endangered.length} file(s) this land would update; commit/stash them first (G6)`,\n\t\t\t\t\tpaths: endangered.slice(0, 50),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (args.gate === \"on\") {\n\t\t\t\tconst gateCommand = (args.gateCommand ?? \"\").trim();\n\t\t\t\tconst shell = process.platform === \"win32\" ? \"cmd\" : \"sh\";\n\t\t\t\tconst shellFlag = process.platform === \"win32\" ? \"/c\" : \"-c\";\n\t\t\t\tconst gateRun = await deps.exec(shell, [shellFlag, gateCommand], {\n\t\t\t\t\tcwd: lane.worktreePath,\n\t\t\t\t\ttimeout: args.gateTimeoutMs ?? DEFAULT_GATE_TIMEOUT_MS,\n\t\t\t\t\tsignal: deps.signal,\n\t\t\t\t\tmaxBuffer: GIT_MAX_BUFFER,\n\t\t\t\t});\n\t\t\t\tif (gateRun.code !== 0) {\n\t\t\t\t\tconst tail = `${gateRun.stdout}\\n${gateRun.stderr}`.trim().slice(-4000);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcode: \"gate_failed\",\n\t\t\t\t\t\tmessage: `gate command failed (exit ${gateRun.code}) at lane tip ${tipSha.slice(0, 12)} (G4)`,\n\t\t\t\t\t\tgitStderr: tail,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\t// The gate is an external process. Re-read the ref after it exits: a worker\n\t\t\t\t// may have committed while the gate was running, and the branch name is\n\t\t\t\t// mutable. Never merge a tip that was not the one actually tested.\n\t\t\t\tconst postGateTip = await revParseBranch(deps, ctx.topLevel, lane.branch);\n\t\t\t\tif (postGateTip !== tipSha) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcode: \"lane_changed_during_gate\",\n\t\t\t\t\t\tmessage: `lane '${lane.laneKey}' changed during the gate (tested ${tipSha.slice(0, 12)}, current ${postGateTip?.slice(0, 12) ?? \"missing\"}); rerun land`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst landingTransaction: LandingTransaction = {\n\t\t\t\tlaneKey: lane.laneKey,\n\t\t\t\tpriorMainSha: mainShaNow,\n\t\t\t\ttestedTipSha: tipSha,\n\t\t\t\tchangedPaths: changed.slice(0, EPOCH_CHANGED_PATHS_CAP),\n\t\t\t\tchangedPathsTruncated: changed.length > EPOCH_CHANGED_PATHS_CAP,\n\t\t\t\tlockToken: acquisition.token,\n\t\t\t\tgate: args.gate === \"on\" ? \"passed\" : \"off\",\n\t\t\t\tstage: \"ready_to_merge\",\n\t\t\t};\n\t\t\tawait writeLandingTransaction(ctx.paths, landingTransaction);\n\t\t\t// Move the named main ref with a compare-and-swap instead of `git merge` in whichever\n\t\t\t// branch happens to be checked out in the hub. A concurrent branch switch cannot redirect\n\t\t\t// this land to another branch, and a changed main ref makes update-ref fail without mutation.\n\t\t\tconst update = await runGit(deps, ctx.topLevel, [\n\t\t\t\t\"update-ref\",\n\t\t\t\t`refs/heads/${ctx.mainBranch}`,\n\t\t\t\ttipSha,\n\t\t\t\tmainShaNow,\n\t\t\t]);\n\t\t\tif (update.code !== 0) {\n\t\t\t\treturn gitError(`main ref changed or could not advance for lane '${lane.laneKey}' (G5)`, update);\n\t\t\t}\n\t\t\tconst landedSha = await revParseBranch(deps, ctx.topLevel, ctx.mainBranch);\n\t\t\tif (landedSha !== tipSha) {\n\t\t\t\treturn {\n\t\t\t\t\tcode: \"git_error\",\n\t\t\t\t\tmessage: `main resolved to ${landedSha?.slice(0, 12) ?? \"missing\"} after the guarded ref update; expected gated tip ${tipSha.slice(0, 12)}`,\n\t\t\t\t};\n\t\t\t}\n\t\t\t// `update-ref` deliberately leaves a checked-out worktree untouched. Refresh only when\n\t\t\t// the hub is still on main, preserving unrelated local changes with reset --merge.\n\t\t\tconst checkedOut = await runGit(deps, ctx.hubPath, [\"symbolic-ref\", \"--short\", \"HEAD\"]);\n\t\t\tif (checkedOut.code !== 0 || checkedOut.stdout.trim() !== ctx.mainBranch) {\n\t\t\t\treturn {\n\t\t\t\t\tcode: \"git_error\",\n\t\t\t\t\tmessage: `main advanced safely, but hub checkout is no longer '${ctx.mainBranch}'; refusing to refresh another branch`,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst refresh = await runGit(deps, ctx.hubPath, [\"reset\", \"--merge\", tipSha]);\n\t\t\tif (refresh.code !== 0)\n\t\t\t\treturn gitError(`could not refresh hub checkout after landing '${lane.laneKey}'`, refresh);\n\n\t\t\tawait writeLandingTransaction(ctx.paths, { ...landingTransaction, stage: \"main_moved\" });\n\t\t\tconst previous = await readEpoch(ctx.paths);\n\t\t\tconst epochNumber = (previous?.epoch ?? 0) + 1;\n\t\t\tconst at = nowIso(deps);\n\t\t\tawait writeEpoch(ctx.paths, {\n\t\t\t\tepoch: epochNumber,\n\t\t\t\tmainSha: tipSha,\n\t\t\t\tpreviousMainSha: mainShaNow,\n\t\t\t\tlandedLaneKey: lane.laneKey,\n\t\t\t\tlandedAt: at,\n\t\t\t\tchangedPaths: changed.slice(0, EPOCH_CHANGED_PATHS_CAP),\n\t\t\t\tchangedPathsTruncated: changed.length > EPOCH_CHANGED_PATHS_CAP,\n\t\t\t});\n\t\t\tawait writeLandingTransaction(ctx.paths, { ...landingTransaction, stage: \"epoch_written\" });\n\t\t\tawait appendAuditEvent(\n\t\t\t\tctx.paths,\n\t\t\t\t{\n\t\t\t\t\tevent: \"epoch_advanced\",\n\t\t\t\t\tepoch: epochNumber,\n\t\t\t\t\tlaneKey: lane.laneKey,\n\t\t\t\t\tmainSha: tipSha,\n\t\t\t\t\tpreviousMainSha: mainShaNow,\n\t\t\t\t\tchangedFiles: changed.length,\n\t\t\t\t\tgate: args.gate === \"on\" ? \"passed\" : \"off\",\n\t\t\t\t},\n\t\t\t\tat,\n\t\t\t);\n\t\t\tawait writeLandingTransaction(ctx.paths, { ...landingTransaction, stage: \"audit_logged\" });\n\t\t\tawait clearLandingTransaction(ctx.paths);\n\t\t\treturn {\n\t\t\t\tcode: \"ok\",\n\t\t\t\tlaneKey: lane.laneKey,\n\t\t\t\tepoch: epochNumber,\n\t\t\t\tmainSha: tipSha,\n\t\t\t\tgate: args.gate === \"on\" ? \"passed\" : \"off\",\n\t\t\t};\n\t\t} finally {\n\t\t\tawait releaseIntegrationLock(ctx.paths, acquisition.token, { now: deps.now });\n\t\t}\n\t});\n}\n\nexport interface SyncStatusArgs {\n\tpolicy: WorktreeSyncPolicy;\n}\n\n/**\n * The deterministic full picture (the tool's `status` action): epoch, hub, lock, and per-lane\n * live facts with the policy derivation (stale / syncRequired / overlap). The `advice` line is\n * assembled from codes -- never model-generated -- so every agent reads the same situation the\n * same way.\n */\nexport async function buildSyncStatus(deps: WorktreeSyncEngineDeps, args: SyncStatusArgs): Promise<SyncStatusResult> {\n\tconst ctx = await resolveRepoContext(deps);\n\tif (\"code\" in ctx) return ctx;\n\n\tconst epochRecord = await readEpoch(ctx.paths);\n\tconst epochNumber = epochRecord?.epoch ?? 0;\n\tconst changedSet = new Set(epochRecord?.changedPaths ?? []);\n\tconst changedTruncated = epochRecord?.changedPathsTruncated === true;\n\n\tconst holder = await readLockHolder(ctx.paths);\n\tconst isAlive =\n\t\tdeps.isPidAlive ??\n\t\t((pid: number) => defaultIsPidAlive({ pid, hostname: osHostname(), token: \"status\", acquiredAt: \"\" }));\n\n\tlet hub: { path: string; clean: boolean } | undefined;\n\tif (ctx.hubPath) {\n\t\thub = { path: ctx.hubPath, clean: (await dirtyPaths(deps, ctx.hubPath)).length === 0 };\n\t}\n\n\tconst lanes: LaneStatusEntry[] = [];\n\tfor (const lane of await listLanes(ctx.paths)) {\n\t\tif (lane.status === \"released\") continue;\n\t\tconst facts = await deriveLaneFacts(deps, ctx, lane);\n\t\tlet laneChanged: string[] = [];\n\t\tif (facts.branchSha) {\n\t\t\tconst diff = await runGit(deps, ctx.topLevel, [\"diff\", \"--name-only\", `${ctx.mainBranch}...${lane.branch}`]);\n\t\t\tif (diff.code === 0) {\n\t\t\t\tlaneChanged = diff.stdout\n\t\t\t\t\t.split(/\\r?\\n/)\n\t\t\t\t\t.map((line) => line.trim())\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.slice(0, EPOCH_CHANGED_PATHS_CAP);\n\t\t\t}\n\t\t}\n\t\tconst overlap = changedTruncated ? laneChanged : laneChanged.filter((path) => changedSet.has(path));\n\t\tconst stale = !facts.fresh;\n\t\tconst syncRequired =\n\t\t\tstale &&\n\t\t\tfacts.registrationStatus === \"active\" &&\n\t\t\t(args.policy === \"on_land_mandatory\" || (args.policy === \"overlap_mandatory\" && overlap.length > 0));\n\t\tlanes.push({\n\t\t\t...facts,\n\t\t\t...(lane.goalId !== undefined ? { goalId: lane.goalId } : {}),\n\t\t\t...(lane.requirementId !== undefined ? { requirementId: lane.requirementId } : {}),\n\t\t\t...(lane.boundLaneId !== undefined ? { boundLaneId: lane.boundLaneId } : {}),\n\t\t\tstale,\n\t\t\tsyncRequired,\n\t\t\toverlapWithLastLand: overlap.slice(0, 50),\n\t\t});\n\t}\n\n\tconst inRebase = lanes.filter((lane) => lane.rebaseInProgress).map((lane) => lane.laneKey);\n\tconst mustSync = lanes.filter((lane) => lane.syncRequired && !lane.rebaseInProgress).map((lane) => lane.laneKey);\n\tlet advice: string | undefined;\n\tif (inRebase.length > 0) {\n\t\tadvice = `lane(s) ${inRebase.join(\", \")} have a rebase in progress: resolve conflicts and call continue (or abort_sync)`;\n\t} else if (mustSync.length > 0) {\n\t\tadvice = `lane(s) ${mustSync.join(\", \")} must rebase main (epoch ${epochNumber}${epochRecord?.landedLaneKey ? ` landed by ${epochRecord.landedLaneKey}` : \"\"}): call sync`;\n\t} else if (holder) {\n\t\tadvice = `integration lock held by pid ${holder.pid}${holder.laneKey ? ` (lane '${holder.laneKey}')` : \"\"}`;\n\t} else if (lanes.length > 0) {\n\t\tadvice = \"all lanes fresh\";\n\t}\n\n\treturn {\n\t\tcode: \"ok\",\n\t\tmainBranch: ctx.mainBranch,\n\t\tmainSha: ctx.mainSha,\n\t\tepoch: epochNumber,\n\t\t...(hub ? { hub } : {}),\n\t\tlock: {\n\t\t\theld: holder !== undefined,\n\t\t\t...(holder ? { holder, holderAlive: isAlive(holder.pid) } : {}),\n\t\t},\n\t\tlanes,\n\t\t...(advice ? { advice } : {}),\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"git-engine.d.ts","sourceRoot":"","sources":["../../../src/core/worktree-sync/git-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,EAAE,KAAK,UAAU,EAAe,MAAM,YAAY,CAAC;AAE1D,OAAO,EACN,KAAK,eAAe,EACpB,KAAK,oBAAoB,EAGzB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EAIrB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,gBAAgB,EAErB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EAYN,KAAK,cAAc,EAKnB,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,gBAAgB,GAAG,CAC9B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,KACzG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEzB,MAAM,WAAW,yBAAyB;IACzC,6FAA6F;IAC7F,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACtC,IAAI,EAAE,gBAAgB,CAAC;IACvB,sFAAsF;IACtF,GAAG,EAAE,MAAM,CAAC;IACZ,8GAA8G;IAC9G,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,yBAAyB,CAAC;IACnC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC;gDAC4C;IAC5C,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAChD,iEAAiE;IACjE,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,WAAW;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,cAAc,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,uGAAuG;IACvG,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAMD,gGAAgG;AAChG,wBAAgB,6BAA6B,IAAI,gBAAgB,CAQhE;AAkBD,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,MAAM,WAAW,iBAAiB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2FAA2F;IAC3F,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,oDAAoD;AACpD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAkBrE;AASD,wBAAsB,kBAAkB,CACvC,IAAI,EAAE,sBAAsB,GAC1B,OAAO,CAAC,WAAW,GAAG,mBAAmB,CAAC,gBAAgB,GAAG,2BAA2B,GAAG,WAAW,CAAC,CAAC,CAwD1G;AA4BD;;;;GAIG;AACH,wBAAsB,eAAe,CACpC,IAAI,EAAE,sBAAsB,EAC5B,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,gBAAgB,GACpB,OAAO,CAAC,SAAS,CAAC,CAsDpB;AAED;;oGAEoG;AACpG,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,sBAAsB,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBvG;AAWD,MAAM,WAAW,cAAc;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,sBAAsB,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAsEnH;AAmBD,MAAM,WAAW,kBAAkB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,cAAc,CACnC,IAAI,EAAE,sBAAsB,EAC5B,IAAI,EAAE,kBAAkB,GACtB,OAAO,CAAC,oBAAoB,CAAC,CA0B/B;AAED,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,2GAA2G;IAC3G,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAuDjH;AA2ED;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC,CAkHtF;AA8ND,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CA+CxG;AAED,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA2CpH;AAED,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,MAAM,CAAC;CAChB;AAED;0CAC0C;AAC1C,wBAAsB,SAAS,CAAC,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC,CAU3G;AAED,MAAM,WAAW,YAAY;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,6FAA6F;IAC7F,IAAI,EAAE,IAAI,GAAG,KAAK,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAID;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,CAiOpG;AAED,MAAM,WAAW,cAAc;IAC9B,MAAM,EAAE,kBAAkB,CAAC;CAC3B;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA6EnH"}
|
|
@@ -133,6 +133,21 @@ export async function resolveRepoContext(deps) {
|
|
|
133
133
|
hubPath: hub?.path,
|
|
134
134
|
};
|
|
135
135
|
}
|
|
136
|
+
async function withRepoLifecycleLock(deps, operation) {
|
|
137
|
+
const ctx = await resolveRepoContext(deps);
|
|
138
|
+
if ("code" in ctx)
|
|
139
|
+
return ctx;
|
|
140
|
+
return withFileLock(ctx.paths.lifecycleLockFile, () => operation(ctx));
|
|
141
|
+
}
|
|
142
|
+
async function withActiveLaneLifecycleLock(deps, laneKey, operation) {
|
|
143
|
+
return withRepoLifecycleLock(deps, async (ctx) => {
|
|
144
|
+
const lane = await readLane(ctx.paths, laneKey);
|
|
145
|
+
if (!lane || lane.status === "released") {
|
|
146
|
+
return { code: "lane_not_found", message: `no active lane '${laneKey}'` };
|
|
147
|
+
}
|
|
148
|
+
return operation(ctx, lane);
|
|
149
|
+
});
|
|
150
|
+
}
|
|
136
151
|
/**
|
|
137
152
|
* Live git facts for one lane. `fresh` is THE freshness definition of the whole subsystem
|
|
138
153
|
* (G3/G9): current main is an ancestor of the lane tip. Everything is re-derived; nothing is
|
|
@@ -334,10 +349,7 @@ export async function bindLaneWorker(deps, args) {
|
|
|
334
349
|
});
|
|
335
350
|
}
|
|
336
351
|
export async function releaseLane(deps, args) {
|
|
337
|
-
|
|
338
|
-
if ("code" in ctx)
|
|
339
|
-
return ctx;
|
|
340
|
-
return withFileLock(ctx.paths.lifecycleLockFile, async () => {
|
|
352
|
+
return withRepoLifecycleLock(deps, async (ctx) => {
|
|
341
353
|
const lane = await readLane(ctx.paths, args.laneKey);
|
|
342
354
|
if (!lane)
|
|
343
355
|
return { code: "lane_not_found", message: `no registered lane '${args.laneKey}'` };
|
|
@@ -761,14 +773,7 @@ async function driveRebase(deps, ctx, lane) {
|
|
|
761
773
|
* and return a structured worklist; `continueSync` verifies and drives on.
|
|
762
774
|
*/
|
|
763
775
|
export async function syncLane(deps, args) {
|
|
764
|
-
|
|
765
|
-
if ("code" in ctx)
|
|
766
|
-
return ctx;
|
|
767
|
-
return withFileLock(ctx.paths.lifecycleLockFile, async () => {
|
|
768
|
-
const lane = await readLane(ctx.paths, args.laneKey);
|
|
769
|
-
if (!lane || lane.status === "released") {
|
|
770
|
-
return { code: "lane_not_found", message: `no active lane '${args.laneKey}'` };
|
|
771
|
-
}
|
|
776
|
+
return withActiveLaneLifecycleLock(deps, args.laneKey, async (ctx, lane) => {
|
|
772
777
|
const facts = await deriveLaneFacts(deps, ctx, lane);
|
|
773
778
|
if (!facts.worktreePresent) {
|
|
774
779
|
return {
|
|
@@ -813,14 +818,7 @@ export async function syncLane(deps, args) {
|
|
|
813
818
|
* next worklist; completion returns sync_clean.
|
|
814
819
|
*/
|
|
815
820
|
export async function continueSync(deps, args) {
|
|
816
|
-
|
|
817
|
-
if ("code" in ctx)
|
|
818
|
-
return ctx;
|
|
819
|
-
return withFileLock(ctx.paths.lifecycleLockFile, async () => {
|
|
820
|
-
const lane = await readLane(ctx.paths, args.laneKey);
|
|
821
|
-
if (!lane || lane.status === "released") {
|
|
822
|
-
return { code: "lane_not_found", message: `no active lane '${args.laneKey}'` };
|
|
823
|
-
}
|
|
821
|
+
return withActiveLaneLifecycleLock(deps, args.laneKey, async (ctx, lane) => {
|
|
824
822
|
if (!fileExists(deps, lane.worktreePath)) {
|
|
825
823
|
return {
|
|
826
824
|
code: "worktree_missing",
|
|
@@ -862,14 +860,7 @@ export async function continueSync(deps, args) {
|
|
|
862
860
|
/** Abort an in-progress sync rebase: the lane returns to its pre-sync tip -- still stale, and
|
|
863
861
|
* honestly reported as such by status. */
|
|
864
862
|
export async function abortSync(deps, args) {
|
|
865
|
-
|
|
866
|
-
if ("code" in ctx)
|
|
867
|
-
return ctx;
|
|
868
|
-
return withFileLock(ctx.paths.lifecycleLockFile, async () => {
|
|
869
|
-
const lane = await readLane(ctx.paths, args.laneKey);
|
|
870
|
-
if (!lane || lane.status === "released") {
|
|
871
|
-
return { code: "lane_not_found", message: `no active lane '${args.laneKey}'` };
|
|
872
|
-
}
|
|
863
|
+
return withActiveLaneLifecycleLock(deps, args.laneKey, async (ctx, lane) => {
|
|
873
864
|
if (!(await isRebaseActive(deps, lane.worktreePath))) {
|
|
874
865
|
return { code: "no_rebase_in_progress", message: `lane '${lane.laneKey}' has no rebase in progress` };
|
|
875
866
|
}
|
|
@@ -889,14 +880,7 @@ const DEFAULT_GATE_TIMEOUT_MS = 900_000;
|
|
|
889
880
|
* broadcasts in the same critical section.
|
|
890
881
|
*/
|
|
891
882
|
export async function landLane(deps, args) {
|
|
892
|
-
|
|
893
|
-
if ("code" in ctx)
|
|
894
|
-
return ctx;
|
|
895
|
-
return withFileLock(ctx.paths.lifecycleLockFile, async () => {
|
|
896
|
-
const lane = await readLane(ctx.paths, args.laneKey);
|
|
897
|
-
if (!lane || lane.status === "released") {
|
|
898
|
-
return { code: "lane_not_found", message: `no active lane '${args.laneKey}'` };
|
|
899
|
-
}
|
|
883
|
+
return withActiveLaneLifecycleLock(deps, args.laneKey, async (ctx, lane) => {
|
|
900
884
|
if (ownerConflicts(deps, lane)) {
|
|
901
885
|
return {
|
|
902
886
|
code: "lane_owner_conflict",
|