@sema-agent/core 7.55.0 → 7.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1054 -0
- package/LICENSE +1 -1
- package/dist/agents/cascade.js +1 -1
- package/dist/agents/cc-peer-directory.js +1 -0
- package/dist/agents/child-model-seat.d.ts +0 -11
- package/dist/agents/child-model-seat.js +0 -3
- package/dist/agents/list-agents-tool.d.ts +3 -1
- package/dist/agents/list-agents-tool.js +7 -7
- package/dist/agents/org-delivery-gate.js +3 -4
- package/dist/agents/peer-directory.d.ts +22 -4
- package/dist/agents/peer-directory.js +24 -2
- package/dist/agents/peer-held-queue.d.ts +69 -49
- package/dist/agents/peer-held-queue.js +255 -106
- package/dist/agents/peer-session-drain.js +65 -45
- package/dist/agents/repair-loop.js +2 -2
- package/dist/agents/send-message-tool.js +7 -6
- package/dist/agents/subagent.d.ts +6 -4
- package/dist/agents/subagent.js +72 -68
- package/dist/agents/tool-filter.d.ts +7 -5
- package/dist/agents/tool-filter.js +12 -9
- package/dist/agents/verify.d.ts +3 -2
- package/dist/agents/verify.js +3 -3
- package/dist/brain/anthropic.js +45 -80
- package/dist/brain/media-degrade.d.ts +18 -7
- package/dist/brain/media-degrade.js +13 -2
- package/dist/brain/model-capability.d.ts +37 -0
- package/dist/brain/model-capability.js +34 -0
- package/dist/brain/model-presets.d.ts +2 -8
- package/dist/brain/model-presets.js +1 -6
- package/dist/brain/open-responses.js +23 -34
- package/dist/brain/openai.js +25 -96
- package/dist/brain/provider-dialect.d.ts +3 -2
- package/dist/brain/provider-dialect.js +2 -2
- package/dist/brain/reasoning-request.d.ts +96 -0
- package/dist/brain/reasoning-request.js +174 -0
- package/dist/brain/reasoning.d.ts +11 -11
- package/dist/brain/reasoning.js +4 -3
- package/dist/brain/request-params.d.ts +13 -4
- package/dist/brain/request-params.js +21 -5
- package/dist/brain/status-sink.d.ts +20 -0
- package/dist/brain/status-sink.js +7 -0
- package/dist/brain/stream-engine.d.ts +9 -0
- package/dist/brain/stream-engine.js +24 -10
- package/dist/brain/stream-shared.d.ts +5 -4
- package/dist/brain/stream-shared.js +4 -4
- package/dist/core/a2a.d.ts +2 -1
- package/dist/core/a2a.js +19 -13
- package/dist/core/agent-definition.d.ts +10 -0
- package/dist/core/allow-entry.d.ts +23 -23
- package/dist/core/allow-entry.js +42 -46
- package/dist/core/allow-rule-shadow.d.ts +3 -3
- package/dist/core/approval-object.d.ts +21 -5
- package/dist/core/approval-object.js +44 -17
- package/dist/core/ask-origin.d.ts +66 -20
- package/dist/core/ask-origin.js +63 -23
- package/dist/core/ask-question.d.ts +51 -8
- package/dist/core/ask-question.js +3 -4
- package/dist/core/ask-unresolvable-notice.d.ts +8 -3
- package/dist/core/ask-unresolvable-notice.js +16 -2
- package/dist/core/auto-compaction.d.ts +71 -6
- package/dist/core/auto-compaction.js +42 -26
- package/dist/core/background-agent-store.d.ts +6 -2
- package/dist/core/background-agent-store.js +1 -1
- package/dist/core/checkpoint-generation.d.ts +53 -0
- package/dist/core/checkpoint-generation.js +35 -0
- package/dist/core/checkpoint-queries.d.ts +180 -0
- package/dist/core/checkpoint-queries.js +272 -0
- package/dist/core/checkpoint-requirements.d.ts +19 -1
- package/dist/core/checkpoint-requirements.js +6 -0
- package/dist/core/checkpoint-store.d.ts +105 -53
- package/dist/core/checkpoint-store.js +43 -20
- package/dist/core/cross-boundary-taint.d.ts +6 -5
- package/dist/core/cross-boundary-taint.js +5 -5
- package/dist/core/decision-receipt.d.ts +37 -3
- package/dist/core/decision-receipt.js +17 -17
- package/dist/core/delegation-not-started.d.ts +6 -0
- package/dist/core/delegation-not-started.js +17 -0
- package/dist/core/engine-attestation.d.ts +93 -0
- package/dist/core/engine-attestation.js +70 -0
- package/dist/core/engine-capabilities.d.ts +4 -1
- package/dist/core/engine-capabilities.js +1 -1
- package/dist/core/engine-notice.d.ts +32 -12
- package/dist/core/engine-notice.js +6 -0
- package/dist/core/file-history-store.d.ts +104 -22
- package/dist/core/file-history-store.js +37 -19
- package/dist/core/gate-fold.d.ts +1 -1
- package/dist/core/gate-fold.js +22 -10
- package/dist/core/gate-lanes.js +73 -65
- package/dist/core/gate-outcome.d.ts +26 -5
- package/dist/core/gate-outcome.js +26 -0
- package/dist/core/governance-codes.d.ts +5 -1
- package/dist/core/governance-codes.js +6 -0
- package/dist/core/hooks.d.ts +19 -18
- package/dist/core/hooks.js +3 -1
- package/dist/core/host-floor.d.ts +128 -0
- package/dist/core/host-floor.js +206 -0
- package/dist/core/host-target.d.ts +38 -3
- package/dist/core/host-target.js +38 -5
- package/dist/core/mailbox-store.d.ts +62 -1
- package/dist/core/mailbox-store.js +59 -0
- package/dist/core/mcp-name-judge.d.ts +46 -0
- package/dist/core/mcp-name-judge.js +61 -0
- package/dist/core/mcp-probe.d.ts +1 -1
- package/dist/core/mcp-probe.js +2 -5
- package/dist/core/mcp.d.ts +5 -1
- package/dist/core/mcp.js +70 -64
- package/dist/core/memory-engine/consolidation-driver.js +4 -3
- package/dist/core/memory-engine/delegation-settlement.js +15 -24
- package/dist/core/memory-engine/distiller.js +26 -17
- package/dist/core/memory-engine/engine.js +4 -4
- package/dist/core/memory-engine/layout.d.ts +60 -8
- package/dist/core/memory-engine/layout.js +70 -8
- package/dist/core/model-seat.d.ts +10 -3
- package/dist/core/mods/classic-events.d.ts +67 -0
- package/dist/core/mods/classic-events.js +1 -0
- package/dist/core/mods/dollar.d.ts +13 -0
- package/dist/core/mods/extension-call.d.ts +31 -0
- package/dist/core/mods/extension-call.js +43 -0
- package/dist/core/mods/kernel/dispatch.d.ts +20 -3
- package/dist/core/mods/kernel/dispatch.js +140 -69
- package/dist/core/mods/kernel/events.d.ts +47 -11
- package/dist/core/mods/kernel/events.js +66 -42
- package/dist/core/mods/kernel/index.d.ts +4 -4
- package/dist/core/mods/kernel/index.js +2 -2
- package/dist/core/mods/kernel/receive.d.ts +39 -5
- package/dist/core/mods/kernel/receive.js +290 -17
- package/dist/core/mods/kernel/registration.d.ts +33 -2
- package/dist/core/mods/kernel/registration.js +6 -7
- package/dist/core/mods/kernel/site-rules.d.ts +44 -16
- package/dist/core/mods/kernel/site-rules.js +24 -42
- package/dist/core/mods/spec-seats.d.ts +69 -0
- package/dist/core/mods/spec-seats.js +114 -0
- package/dist/core/mods/stations.d.ts +28 -8
- package/dist/core/mods/stations.js +29 -13
- package/dist/core/mods/tool-call.d.ts +79 -0
- package/dist/core/mods/tool-call.js +152 -0
- package/dist/core/namespaced-rule-name.d.ts +32 -38
- package/dist/core/namespaced-rule-name.js +29 -36
- package/dist/core/parent-spec-seat.d.ts +6 -1
- package/dist/core/parent-spec-seat.js +2 -0
- package/dist/core/park-selfcheck.js +3 -0
- package/dist/core/permission-rule-consent.d.ts +24 -3
- package/dist/core/permission-rule-consent.js +136 -41
- package/dist/core/permission-rule-model.d.ts +57 -5
- package/dist/core/permission-rule-model.js +90 -31
- package/dist/core/permission-rule-org.d.ts +6 -2
- package/dist/core/permission-rule-org.js +8 -4
- package/dist/core/permission-rule-provider.d.ts +5 -2
- package/dist/core/permission-rule-provider.js +41 -11
- package/dist/core/permission-rule-store.d.ts +3 -2
- package/dist/core/permission-rule-store.js +11 -2
- package/dist/core/permission-rule-sync.js +3 -2
- package/dist/core/permission-rule-syntax.d.ts +5 -4
- package/dist/core/permission-rule-syntax.js +2 -2
- package/dist/core/permission-rules.d.ts +4 -4
- package/dist/core/permission-rules.js +11 -20
- package/dist/core/persisted-rule-arms.d.ts +2 -2
- package/dist/core/persisted-rule-arms.js +10 -12
- package/dist/core/principal-name.d.ts +20 -0
- package/dist/core/principal-name.js +22 -0
- package/dist/core/prompt-section-seat.js +4 -6
- package/dist/core/protocol-http-auth.d.ts +40 -5
- package/dist/core/protocol-http-auth.js +168 -4
- package/dist/core/protocol-naming.d.ts +20 -0
- package/dist/core/protocol-naming.js +20 -3
- package/dist/core/read-only-shell.d.ts +20 -5
- package/dist/core/read-only-shell.js +29 -14
- package/dist/core/remote-env.d.ts +37 -1
- package/dist/core/remote-env.js +11 -0
- package/dist/core/resume-startup-cause.d.ts +24 -2
- package/dist/core/resume-startup-cause.js +20 -1
- package/dist/core/retired-keys.d.ts +16 -0
- package/dist/core/retired-keys.js +16 -4
- package/dist/core/rewrite-rejudge.d.ts +60 -0
- package/dist/core/rewrite-rejudge.js +36 -0
- package/dist/core/roles.d.ts +28 -1
- package/dist/core/roles.js +81 -26
- package/dist/core/rule-lane-reads.d.ts +20 -15
- package/dist/core/rule-lane-reads.js +45 -17
- package/dist/core/rule-owner.d.ts +3 -3
- package/dist/core/rule-owner.js +3 -2
- package/dist/core/runner/announce-once-ledger.d.ts +14 -0
- package/dist/core/runner/announce-once-ledger.js +5 -0
- package/dist/core/runner/assemble-result.d.ts +1 -0
- package/dist/core/runner/assemble-result.js +1 -1
- package/dist/core/runner/call-hook-stations.d.ts +3 -2
- package/dist/core/runner/caller-roster.d.ts +16 -4
- package/dist/core/runner/caller-roster.js +33 -6
- package/dist/core/runner/capability-withheld-seat.d.ts +5 -0
- package/dist/core/runner/capability-withheld-seat.js +24 -0
- package/dist/core/runner/classifier-ladder.d.ts +7 -9
- package/dist/core/runner/classifier-ladder.js +3 -3
- package/dist/core/runner/compact-session.d.ts +10 -0
- package/dist/core/runner/compact-session.js +202 -0
- package/dist/core/runner/compaction-call-options.d.ts +2 -2
- package/dist/core/runner/compaction-seams.d.ts +21 -1
- package/dist/core/runner/compaction-seams.js +11 -8
- package/dist/core/runner/construction-doors.js +3 -0
- package/dist/core/runner/contracts.d.ts +50 -40
- package/dist/core/runner/cross-boundary-lane.d.ts +17 -13
- package/dist/core/runner/cross-boundary-lane.js +40 -27
- package/dist/core/runner/denial-limit-arms.d.ts +2 -2
- package/dist/core/runner/denial-limit-arms.js +1 -1
- package/dist/core/runner/derived-route-fallback.d.ts +13 -0
- package/dist/core/runner/derived-route-fallback.js +6 -0
- package/dist/core/runner/env-capability-census.d.ts +3 -2
- package/dist/core/runner/env-capability-census.js +9 -3
- package/dist/core/runner/file-history-request.d.ts +18 -0
- package/dist/core/runner/file-history-request.js +21 -13
- package/dist/core/runner/file-history-restore.d.ts +45 -0
- package/dist/core/runner/file-history-restore.js +46 -0
- package/dist/core/runner/gate-exit.d.ts +3 -3
- package/dist/core/runner/gate-exit.js +4 -3
- package/dist/core/runner/image.d.ts +7 -17
- package/dist/core/runner/image.js +9 -60
- package/dist/core/runner/permission-rule-lanes.d.ts +11 -11
- package/dist/core/runner/permission-rule-lanes.js +39 -17
- package/dist/core/runner/person-path-rows.d.ts +12 -9
- package/dist/core/runner/person-path-rows.js +18 -7
- package/dist/core/runner/prepare-acquire-reconcile.d.ts +3 -0
- package/dist/core/runner/prepare-acquire-reconcile.js +2 -1
- package/dist/core/runner/prepare-ask-lane.d.ts +2 -2
- package/dist/core/runner/prepare-ask-lane.js +5 -2
- package/dist/core/runner/prepare-caps-and-workflow.d.ts +4 -6
- package/dist/core/runner/prepare-caps-and-workflow.js +4 -3
- package/dist/core/runner/prepare-config-doors.d.ts +35 -38
- package/dist/core/runner/prepare-config-doors.js +46 -28
- package/dist/core/runner/prepare-defer-classify.d.ts +4 -3
- package/dist/core/runner/prepare-defer-classify.js +7 -8
- package/dist/core/runner/prepare-file-history.d.ts +48 -8
- package/dist/core/runner/prepare-file-history.js +7 -39
- package/dist/core/runner/prepare-gate-stations.d.ts +1 -1
- package/dist/core/runner/prepare-gate-stations.js +10 -1
- package/dist/core/runner/prepare-hands-readface.d.ts +5 -9
- package/dist/core/runner/prepare-hands-readface.js +17 -14
- package/dist/core/runner/prepare-inherited-gate.d.ts +6 -3
- package/dist/core/runner/prepare-inherited-gate.js +5 -3
- package/dist/core/runner/prepare-memory-engine-session.js +1 -1
- package/dist/core/runner/prepare-park-ask.d.ts +2 -0
- package/dist/core/runner/prepare-park-ask.js +7 -7
- package/dist/core/runner/prepare-policy-chain.d.ts +6 -3
- package/dist/core/runner/prepare-policy-chain.js +67 -76
- package/dist/core/runner/prepare-prompt-assembly.d.ts +5 -7
- package/dist/core/runner/prepare-prompt-assembly.js +10 -8
- package/dist/core/runner/prepare-prompt-inputs.d.ts +11 -9
- package/dist/core/runner/prepare-prompt-inputs.js +3 -5
- package/dist/core/runner/prepare-protocol-tools.d.ts +2 -0
- package/dist/core/runner/prepare-protocol-tools.js +3 -3
- package/dist/core/runner/prepare-safety-scan.d.ts +1 -1
- package/dist/core/runner/prepare-safety-scan.js +0 -17
- package/dist/core/runner/prepare-suspend-saga.d.ts +2 -0
- package/dist/core/runner/prepare-suspend-saga.js +5 -6
- package/dist/core/runner/prepare-task.d.ts +5 -2
- package/dist/core/runner/prepare-task.js +48 -43
- package/dist/core/runner/prepare-tool-disclosure-mount.d.ts +20 -4
- package/dist/core/runner/prepare-tool-disclosure-mount.js +33 -23
- package/dist/core/runner/prepare-turn-wiring.d.ts +0 -4
- package/dist/core/runner/prepare-turn-wiring.js +2 -7
- package/dist/core/runner/prepare-wiring-manifest.d.ts +6 -2
- package/dist/core/runner/prepare-wiring-manifest.js +3 -3
- package/dist/core/runner/resume-admission.js +1 -1
- package/dist/core/runner/resume-apply.js +11 -12
- package/dist/core/runner/resume-checkpoint-screen.js +3 -0
- package/dist/core/runner/resume-claim.d.ts +4 -2
- package/dist/core/runner/resume-claim.js +15 -8
- package/dist/core/runner/retired-runner-deps.js +1 -0
- package/dist/core/runner/rewind-files.d.ts +12 -0
- package/dist/core/runner/rewind-files.js +90 -0
- package/dist/core/runner/run-attachment-seats.js +2 -1
- package/dist/core/runner/run-brain-sinks.d.ts +4 -1
- package/dist/core/runner/run-brain-sinks.js +4 -2
- package/dist/core/runner/run-harness-handlers.js +12 -4
- package/dist/core/runner/run-leg.d.ts +1 -1
- package/dist/core/runner/run-leg.js +40 -39
- package/dist/core/runner/run-notification-lane.d.ts +2 -0
- package/dist/core/runner/run-notification-lane.js +2 -2
- package/dist/core/runner/run-recovery-lanes.js +3 -4
- package/dist/core/runner/run-settle-and-teardown.js +7 -12
- package/dist/core/runner/run-terminal-adoption.js +3 -4
- package/dist/core/runner/run-turn-boundary.js +4 -15
- package/dist/core/runner/runtask.d.ts +10 -0
- package/dist/core/runner/runtask.js +35 -42
- package/dist/core/runner/send-message-continuation.js +1 -1
- package/dist/core/runner/session-read-file-states.d.ts +15 -0
- package/dist/core/runner/session-read-file-states.js +28 -0
- package/dist/core/runner/session-rule-policy.js +4 -3
- package/dist/core/runner/session-verb-doors.d.ts +28 -0
- package/dist/core/runner/session-verb-doors.js +48 -0
- package/dist/core/runner/session-write-ledger.d.ts +30 -0
- package/dist/core/runner/session-write-ledger.js +101 -0
- package/dist/core/runner/shell-env-withheld.d.ts +33 -0
- package/dist/core/runner/shell-env-withheld.js +51 -0
- package/dist/core/runner/skills-seat.js +6 -2
- package/dist/core/runner/stream-settle-backstop.js +12 -15
- package/dist/core/runner/sub-agent-deny-lists.d.ts +25 -3
- package/dist/core/runner/sub-agent-deny-lists.js +25 -17
- package/dist/core/runner/synthetic-tools.d.ts +6 -0
- package/dist/core/runner/synthetic-tools.js +4 -1
- package/dist/core/runner/teardown-bounded.d.ts +1 -0
- package/dist/core/runner/teardown-bounded.js +1 -0
- package/dist/core/runner/tool-disclosure.d.ts +10 -12
- package/dist/core/runner/tool-disclosure.js +1 -3
- package/dist/core/runner/tool-end-body.d.ts +1 -1
- package/dist/core/runner/tool-end-body.js +10 -9
- package/dist/core/runner/tool-not-executed.d.ts +5 -0
- package/dist/core/runner/tool-not-executed.js +11 -0
- package/dist/core/runner/tool-occurrence.d.ts +8 -0
- package/dist/core/runner/tool-occurrence.js +7 -0
- package/dist/core/runner/turn-attachments.d.ts +33 -15
- package/dist/core/runner/turn-attachments.js +62 -37
- package/dist/core/runner-deps.d.ts +7 -7
- package/dist/core/safety-axis-vocab.d.ts +6 -4
- package/dist/core/safety-axis-vocab.js +6 -5
- package/dist/core/safety-merge-corpus.js +11 -3
- package/dist/core/secret-env.d.ts +30 -3
- package/dist/core/secret-env.js +47 -8
- package/dist/core/select-model.js +3 -3
- package/dist/core/session-policy-store.d.ts +32 -15
- package/dist/core/session-policy-store.js +156 -36
- package/dist/core/session-store.d.ts +29 -10
- package/dist/core/session-store.js +51 -19
- package/dist/core/session.d.ts +82 -16
- package/dist/core/session.js +53 -0
- package/dist/core/shell-read-silence.d.ts +11 -12
- package/dist/core/shell-read-silence.js +9 -5
- package/dist/core/shell-run-candidates.js +3 -1
- package/dist/core/shell-wrapper-projection.d.ts +1 -1
- package/dist/core/shell-wrapper-projection.js +1 -1
- package/dist/core/shell-wrapper-table.d.ts +14 -7
- package/dist/core/shell-wrapper-table.js +5 -4
- package/dist/core/side-query.js +10 -1
- package/dist/core/skill-grant.d.ts +7 -2
- package/dist/core/skill-grant.js +5 -0
- package/dist/core/skills-directory.js +6 -2
- package/dist/core/store-contracts/background-agent-store-contract.js +1 -0
- package/dist/core/store-contracts/checkpoint-store-contract.d.ts +11 -1
- package/dist/core/store-contracts/checkpoint-store-contract.js +141 -2
- package/dist/core/store-contracts/file-history-store-contract.js +40 -1
- package/dist/core/store-contracts/mailbox-store-contract.js +49 -1
- package/dist/core/store-contracts/peer-directory-contract.d.ts +7 -2
- package/dist/core/store-contracts/peer-directory-contract.js +14 -2
- package/dist/core/store-contracts/session-repo-contract.js +51 -0
- package/dist/core/store-contracts/session-store-contract.d.ts +2 -1
- package/dist/core/store-contracts/session-store-contract.js +150 -14
- package/dist/core/stub-env.d.ts +2 -0
- package/dist/core/stub-env.js +1 -0
- package/dist/core/synthetic-read-verdict.js +3 -3
- package/dist/core/task-event.d.ts +32 -4
- package/dist/core/task-notification.d.ts +16 -12
- package/dist/core/task-registry-agent.d.ts +8 -4
- package/dist/core/task-registry-agent.js +14 -8
- package/dist/core/task-registry-shared.d.ts +35 -6
- package/dist/core/task-registry-shared.js +11 -0
- package/dist/core/task-registry.d.ts +10 -1
- package/dist/core/task-registry.js +12 -2
- package/dist/core/task-result.d.ts +18 -0
- package/dist/core/task-spec.d.ts +18 -13
- package/dist/core/tighten-task-spec.js +2 -1
- package/dist/core/tool-catalog-entries.d.ts +23 -0
- package/dist/core/tool-catalog-entries.js +14 -2
- package/dist/core/tool-check-reading.d.ts +11 -0
- package/dist/core/tool-check-reading.js +11 -6
- package/dist/core/tool-model-gate.d.ts +2 -2
- package/dist/core/tool-name-aliases.d.ts +48 -18
- package/dist/core/tool-name-aliases.js +36 -19
- package/dist/core/tool-name-readings.d.ts +6 -32
- package/dist/core/tool-name-readings.js +2 -9
- package/dist/core/tool-policy.d.ts +78 -204
- package/dist/core/tool-policy.js +152 -204
- package/dist/core/tool-result-store.js +3 -0
- package/dist/core/tool-roster.d.ts +14 -19
- package/dist/core/tool-roster.js +11 -44
- package/dist/core/tool-spec-members.js +7 -2
- package/dist/core/tool-spec.d.ts +19 -11
- package/dist/core/tools.js +49 -9
- package/dist/core/trace.d.ts +6 -3
- package/dist/core/trace.js +2 -1
- package/dist/core/types.d.ts +1 -1
- package/dist/core/untrusted-egress.d.ts +20 -0
- package/dist/core/untrusted-egress.js +77 -3
- package/dist/core/user-attachment.d.ts +8 -1
- package/dist/core/user-attachment.js +64 -4
- package/dist/core/wiring-manifest.d.ts +9 -0
- package/dist/core/wiring-manifest.js +1 -0
- package/dist/core/workflow-journal-store.js +1 -1
- package/dist/engine/compaction/compaction.js +3 -2
- package/dist/engine/execution-env/node-execution-env.d.ts +7 -3
- package/dist/engine/execution-env/node-execution-env.js +11 -2
- package/dist/engine/harness/agent-harness.d.ts +32 -6
- package/dist/engine/harness/agent-harness.js +65 -9
- package/dist/engine/harness/types.d.ts +29 -2
- package/dist/engine/llm/types.d.ts +28 -11
- package/dist/engine/loop/agent-loop.d.ts +23 -4
- package/dist/engine/loop/agent-loop.js +42 -30
- package/dist/engine/loop/types.d.ts +16 -6
- package/dist/engine/session/memory-repo.d.ts +9 -2
- package/dist/engine/session/memory-repo.js +11 -1
- package/dist/engine/session/repo-utils.d.ts +6 -5
- package/dist/engine/session/repo-utils.js +14 -6
- package/dist/index.d.ts +34 -17
- package/dist/index.js +22 -11
- package/dist/internal/harness-types.d.ts +1 -1
- package/dist/internal/harness.d.ts +2 -1
- package/dist/internal/harness.js +1 -0
- package/dist/internal/llm.d.ts +1 -1
- package/dist/orchestration/run-workflow-tool.d.ts +6 -4
- package/dist/orchestration/run-workflow-tool.js +5 -3
- package/dist/orchestration/workflow.d.ts +3 -0
- package/dist/orchestration/workflow.js +36 -18
- package/dist/primitives/credential-ref.d.ts +89 -0
- package/dist/primitives/credential-ref.js +125 -0
- package/dist/primitives/index.d.ts +2 -0
- package/dist/primitives/index.js +1 -0
- package/dist/prompt-assembly/artifact.d.ts +2 -2
- package/dist/prompt-assembly/artifact.js +5 -3
- package/dist/prompt-assembly/assemble.d.ts +3 -2
- package/dist/prompt-assembly/assemble.js +1 -1
- package/dist/prompt-assembly/catalog/schema.d.ts +43 -12
- package/dist/prompt-assembly/catalog/schema.js +34 -2
- package/dist/prompt-assembly/catalog/sections.js +0 -1
- package/dist/prompt-assembly/composer.d.ts +3 -1
- package/dist/prompt-assembly/composer.js +1 -1
- package/dist/prompt-assembly/event-registry.js +1 -0
- package/dist/prompt-assembly/overlay.js +3 -3
- package/dist/prompt-assembly/renderers.d.ts +1 -1
- package/dist/prompt-assembly/renderers.js +0 -3
- package/dist/prompt-assembly/role-base.d.ts +15 -0
- package/dist/prompt-assembly/role-base.js +9 -0
- package/dist/prompt-assembly/select.d.ts +39 -14
- package/dist/prompt-assembly/select.js +47 -16
- package/dist/prompt-assembly/sugar.d.ts +17 -11
- package/dist/prompt-assembly/sugar.js +8 -3
- package/dist/prompt-assembly/tool-catalog.d.ts +37 -3
- package/dist/prompt-assembly/tool-catalog.js +114 -4
- package/dist/prompt-assembly/turn-snapshot.d.ts +4 -10
- package/dist/prompt-assembly/turn-snapshot.js +0 -3
- package/dist/prompt-assembly/types.d.ts +0 -7
- package/dist/scenarios/full-body.d.ts +11 -11
- package/dist/scenarios/full-body.js +4 -3
- package/dist/shell/lex.js +10 -1
- package/dist/stores/file/adoption/adopt.js +4 -3
- package/dist/stores/file/adoption/marker.js +3 -2
- package/dist/stores/file/checkpoint-store.d.ts +21 -4
- package/dist/stores/file/checkpoint-store.js +38 -7
- package/dist/stores/file/file-history-store.js +18 -11
- package/dist/stores/file/index.js +2 -1
- package/dist/stores/file/mailbox-store.d.ts +2 -1
- package/dist/stores/file/mailbox-store.js +26 -1
- package/dist/stores/file/permission-rule-adopt.js +4 -3
- package/dist/stores/file/permission-rule-store.js +11 -5
- package/dist/stores/file/session-store.d.ts +29 -6
- package/dist/stores/file/session-store.js +42 -50
- package/dist/tools/artifact/artifact-tool.js +3 -2
- package/dist/tools/fs/bash-program-position.d.ts +19 -2
- package/dist/tools/fs/bash-program-position.js +56 -9
- package/dist/tools/fs/bash-readonly-classifier.d.ts +15 -19
- package/dist/tools/fs/bash-readonly-classifier.js +5 -10
- package/dist/tools/fs/fs-bash.js +15 -8
- package/dist/tools/fs/fs-glob.d.ts +86 -0
- package/dist/tools/fs/fs-glob.js +226 -0
- package/dist/tools/fs/fs-read.js +14 -14
- package/dist/tools/fs/fs-search-tools.js +7 -7
- package/dist/tools/fs/pattern-kill-guard.d.ts +23 -0
- package/dist/tools/fs/pattern-kill-guard.js +429 -0
- package/dist/tools/fs/pdf.d.ts +9 -6
- package/dist/tools/fs/pdf.js +3 -3
- package/dist/tools/fs/program-read-model.d.ts +57 -7
- package/dist/tools/fs/program-read-model.js +11 -1
- package/dist/tools/fs/program-read-model.rows.js +78 -21
- package/dist/tools/fs/read-deny-home.js +3 -2
- package/dist/tools/fs/removal-targets.d.ts +17 -7
- package/dist/tools/fs/removal-targets.js +47 -20
- package/dist/tools/fs/search.d.ts +10 -0
- package/dist/tools/fs/search.js +20 -26
- package/dist/tools/fs/shell-read-argv.js +89 -12
- package/dist/tools/fs/shell-read-bindings.d.ts +31 -0
- package/dist/tools/fs/shell-read-bindings.js +41 -0
- package/dist/tools/fs/shell-read-check.d.ts +10 -0
- package/dist/tools/fs/shell-read-check.js +13 -20
- package/dist/tools/fs/shell-read-environment.d.ts +5 -1
- package/dist/tools/fs/shell-read-environment.js +3 -2
- package/dist/tools/fs/shell-read-establish.d.ts +15 -0
- package/dist/tools/fs/shell-read-establish.js +19 -20
- package/dist/tools/fs/shell-read-identity.d.ts +12 -9
- package/dist/tools/fs/shell-read-identity.js +9 -4
- package/dist/tools/fs/shell-read-plan.js +24 -16
- package/dist/tools/fs/shell-read-start.d.ts +6 -1
- package/dist/tools/fs/shell-read-write-targets.d.ts +5 -1
- package/dist/tools/fs/shell-read-write-targets.js +2 -3
- package/dist/tools/fs/shell-reentry-text.d.ts +9 -0
- package/dist/tools/fs/shell-reentry-text.js +40 -2
- package/dist/tools/todo.js +63 -63
- package/dist/tools/web.d.ts +19 -14
- package/dist/tools/web.js +46 -61
- package/package.json +1 -1
- package/test/export-surface.snapshot.json +221 -7
- package/wire-changes/core-stores-sql@7.57.0.json +29 -0
- package/wire-changes/core@7.56.0.json +3891 -0
- package/wire-changes/core@7.57.0.json +1487 -0
- package/wire-changes/mods-kernel@7.56.0.json +303 -0
- package/wire-changes/mods-kernel@7.57.0.json +29 -0
- package/wire-changes/primitives@7.57.0.json +245 -0
|
@@ -11,14 +11,31 @@ declare function joinUnder(root: string, rel: string): string;
|
|
|
11
11
|
declare function parentDirOf(absPath: string): string | undefined;
|
|
12
12
|
/** The re-join verdict of {@link resolveTrackKey}: an absolute path to operate on, or a NAMED
|
|
13
13
|
* refusal (the fail-closed arm — a recorded key that would escape `root` is never coerced into
|
|
14
|
-
* something writable). A-082 idx5: named so the fence can be part of the public surface. */
|
|
14
|
+
* something writable) carrying the restore ledger's class for it. A-082 idx5: named so the fence can be part of the public surface. */
|
|
15
15
|
export type FileHistoryTrackKeyResolution = {
|
|
16
16
|
ok: true;
|
|
17
17
|
abs: string;
|
|
18
18
|
} | {
|
|
19
19
|
ok: false;
|
|
20
20
|
reason: string;
|
|
21
|
+
class: "key_unresolvable";
|
|
21
22
|
};
|
|
23
|
+
/**
|
|
24
|
+
* Why a restore declined a file it could reach — the `class` of every {@link FileHistoryRestoreResult.refused}
|
|
25
|
+
* row, named by the arm that decided the refusal (the shared env half and key resolver below, or a backend's
|
|
26
|
+
* own base-unavailable arm) and copied by the backend, never re-derived from the reason text:
|
|
27
|
+
* · `link_safety` — the object at the path is not the regular file the record describes (a symlink, a
|
|
28
|
+
* directory or other kind), its parent chain no longer resolves to the recorded identity, or a guarded
|
|
29
|
+
* write found the path changed under it;
|
|
30
|
+
* · `base_unavailable` — the first touch recorded that the path's pre-edit bytes could not be read (DV-14),
|
|
31
|
+
* so there is no pristine version to write;
|
|
32
|
+
* · `key_unresolvable` — the recorded key cannot be re-joined against this root (it would escape it, or it
|
|
33
|
+
* came from another path family and is absolute or ambiguous here).
|
|
34
|
+
* Damage to the store's own records (a missing version record, a missing or corrupt blob) is not a refusal
|
|
35
|
+
* in any backend: it is a `failed` row.
|
|
36
|
+
*/
|
|
37
|
+
export declare const FILE_HISTORY_REFUSAL_CLASSES: readonly ["link_safety", "base_unavailable", "key_unresolvable"];
|
|
38
|
+
export type FileHistoryRefusalClass = (typeof FILE_HISTORY_REFUSAL_CLASSES)[number];
|
|
22
39
|
/** The path family a track key was MINTED under — the half a bare key string cannot carry. */
|
|
23
40
|
export type FileHistoryKeyFamily = "posix" | "win";
|
|
24
41
|
/**
|
|
@@ -83,19 +100,27 @@ export declare const FILE_HISTORY_ERROR_CODES: readonly ["track_failed", "snapsh
|
|
|
83
100
|
export interface FileHistoryError {
|
|
84
101
|
/** `not_found` = no boundary for that (scope, entryId) — an absence, never a fault (a boundary that is there
|
|
85
102
|
* but cannot be read is the verb's `*_failed` with the fault); `aborted` = the signal fired (or the
|
|
86
|
-
* fencing discarded a timed-out attempt); `conflict` = a
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
103
|
+
* fencing discarded a timed-out attempt); `conflict` = a HISTORY-PRESERVATION law refused the call:
|
|
104
|
+
* doing it would discard or overwrite history that is not the caller's — `adoptScope` / `importHistory`
|
|
105
|
+
* onto a target that holds history of its own (the non-destructive-target law), or `annulTrack` of a
|
|
106
|
+
* record that is no longer just the caller's own mint (a boundary froze it, it grew past its first
|
|
107
|
+
* version, another edit was served it, or the proof read found the file moved or the base-unavailable
|
|
108
|
+
* marker standing). It is never a fault, and it is never "could not judge": a verb that cannot JUDGE its
|
|
109
|
+
* law (an unreadable graph, a listing that fails, a proof read that cannot re-read the path) answers its
|
|
110
|
+
* own `*_failed` (or `aborted`) with the fault. A caller reads `conflict` as "the law answered; the history
|
|
111
|
+
* stands" — the engine's fork-carry seat says nothing on it because the only verb that seat calls is
|
|
112
|
+
* `adoptScope`, whose `conflict` is the target law alone, so an adoption that failed for any OTHER
|
|
113
|
+
* reason (a corrupt source graph, a blob it cannot reach, a consumed-id ledger it cannot carry, a target
|
|
114
|
+
* whose history cannot be judged) must NOT wear this
|
|
92
115
|
* code or the failure disappears into that silence — those are `adopt_failed`, which the
|
|
93
116
|
* ADOPTION FAMILY shares: `importHistory` publishes under the same target law and answers the
|
|
94
|
-
* same code for the same non-conflict failures
|
|
95
|
-
* read
|
|
96
|
-
*
|
|
97
|
-
* answers
|
|
98
|
-
*
|
|
117
|
+
* same code for the same non-conflict failures — a source that cannot supply a referenced blob (it is
|
|
118
|
+
* absent, its read throws, or its bytes do not hash to their address), a target whose history cannot
|
|
119
|
+
* be judged, a fault in staging or publishing a good graph (the disk refusing it) — and `exportHistory`
|
|
120
|
+
* answers it for a history it cannot read whole. `unsupported_format` is the import DOOR's refusal and
|
|
121
|
+
* nothing else: a foreign-epoch or wrong-version envelope, or an envelope whose content the closed sets
|
|
122
|
+
* (or the backend's own record-naming rules) cannot hold, refused before any blob is fetched; the rest
|
|
123
|
+
* name the verb that failed. */
|
|
99
124
|
code: (typeof FILE_HISTORY_ERROR_CODES)[number];
|
|
100
125
|
message: string;
|
|
101
126
|
/** The backend's judgment of a FAULT — it could not do what it was asked — as a {@link GovernanceRetryClass}
|
|
@@ -172,10 +197,12 @@ export type FileHistoryRestoreResult = {
|
|
|
172
197
|
filesChanged: string[];
|
|
173
198
|
/** Track keys already equal to the target (untouched — content-hash proven, never mtime). */
|
|
174
199
|
identicalSkipped: string[];
|
|
175
|
-
/** Per-file security/consistency refusals (skipped, counted, never failing the whole restore)
|
|
200
|
+
/** Per-file security/consistency refusals (skipped, counted, never failing the whole restore); `class` is
|
|
201
|
+
* the closed reading of why ({@link FileHistoryRefusalClass}), `reason` the sentence for a person. */
|
|
176
202
|
refused: Array<{
|
|
177
203
|
path: string;
|
|
178
204
|
reason: string;
|
|
205
|
+
class: FileHistoryRefusalClass;
|
|
179
206
|
}>;
|
|
180
207
|
/** Per-file operational failures (env write/remove errors, aborts after k writes). */
|
|
181
208
|
failed: Array<{
|
|
@@ -192,6 +219,34 @@ export interface FileHistoryDiffStats {
|
|
|
192
219
|
insertions: number;
|
|
193
220
|
deletions: number;
|
|
194
221
|
}
|
|
222
|
+
/** `Runner.rewindFiles`' request — the out-of-run code-only rewind (the reference's `rewind_files` control request). */
|
|
223
|
+
export interface RewindFilesRequest {
|
|
224
|
+
/** The session whose history is converged. It must exist. */
|
|
225
|
+
sessionId: string;
|
|
226
|
+
/** The boundary key: the entry id of a turn's FIRST user entry — the id space `TaskSpec.rewindFilesTo`
|
|
227
|
+
* addresses ("the files as they were when that turn began"). An entry with no boundary of its own refuses. */
|
|
228
|
+
to: string;
|
|
229
|
+
/** Preview only: the working tree is not written (a fork whose history was never carried may have its carry
|
|
230
|
+
* completed — the same carry the session's next run performs). */
|
|
231
|
+
dryRun?: boolean;
|
|
232
|
+
/** Caller cancel for the restore. */
|
|
233
|
+
signal?: AbortSignal;
|
|
234
|
+
}
|
|
235
|
+
/** `Runner.rewindFiles`' answer. A refusal is a thrown `Error` carrying a `code`. */
|
|
236
|
+
export type RewindFilesResult =
|
|
237
|
+
/** `preview: null` = no preview for this request (the backend implements no `diffStats`, or answered none);
|
|
238
|
+
* an empty `filesChanged` with zero counts = a real "nothing would change". */
|
|
239
|
+
{
|
|
240
|
+
dryRun: true;
|
|
241
|
+
preview: FileHistoryDiffStats | null;
|
|
242
|
+
}
|
|
243
|
+
/** The store's ledger as it answered: `complete`, or `partial` with every refused / failed file on it. */
|
|
244
|
+
| {
|
|
245
|
+
dryRun: false;
|
|
246
|
+
restore: FileHistoryRestoreResult & {
|
|
247
|
+
outcome: "complete" | "partial";
|
|
248
|
+
};
|
|
249
|
+
};
|
|
195
250
|
/** The line-diff bound (see {@link countRestoreLineDiff}): a pair whose edit distance exceeds this
|
|
196
251
|
* is counted as a whole-file replacement. Public so a preview UI can state what it is showing. */
|
|
197
252
|
export declare const FILE_HISTORY_DIFF_LINE_BUDGET = 2000;
|
|
@@ -277,8 +332,9 @@ export declare function fileHistoryExportDigest(data: FileHistoryExport): string
|
|
|
277
332
|
* The import DOOR's structural judgment, shared by every backend (a second implementation is a second
|
|
278
333
|
* opinion about what is safe to accept): the envelope must carry THIS format version and every row
|
|
279
334
|
* must be shaped and self-described from the closed sets — `unsupported_format` otherwise, never a
|
|
280
|
-
* coercion
|
|
281
|
-
* nothing and changes nothing
|
|
335
|
+
* coercion and never a throw (a payload that cannot be read is refused in the same word). Backends call
|
|
336
|
+
* this BEFORE fetching a single blob, so a foreign-epoch payload costs nothing and changes nothing, and
|
|
337
|
+
* `unsupported_format` is a word only this door (and a backend's own record-naming rule) says.
|
|
282
338
|
*/
|
|
283
339
|
export declare function validateFileHistoryExport(data: FileHistoryExport): FileHistoryResult;
|
|
284
340
|
/**
|
|
@@ -345,7 +401,9 @@ export interface FileHistoryStore {
|
|
|
345
401
|
* still matches what the mint recorded (bytes still absent for an existed-not mint, still the same
|
|
346
402
|
* hash for a captured one). A file that changed keeps its record, because the alternative is
|
|
347
403
|
* deleting the only baseline of a file the agent really did modify — damage rewind could no longer
|
|
348
|
-
* reach, which is strictly worse than a stale record.
|
|
404
|
+
* reach, which is strictly worse than a stale record. Every refusal above is the history-preservation
|
|
405
|
+
* law (`conflict`, see {@link FileHistoryError.code}); a proof read that cannot re-read the path at all
|
|
406
|
+
* judged nothing, and keeps the record with `track_failed` (`aborted` when the signal fired) instead.
|
|
349
407
|
*/
|
|
350
408
|
annulTrack(scope: string, absPath: string, root: string, verify?: {
|
|
351
409
|
env: ExecutionEnv;
|
|
@@ -513,7 +571,10 @@ export interface FileHistoryStore {
|
|
|
513
571
|
* re-publish). A non-empty target with any other content ⇒ typed `conflict` refusal — atomic
|
|
514
572
|
* visibility prevents half-graphs, this law prevents publishing the WRONG complete graph over
|
|
515
573
|
* locally-grown history. A target whose history cannot be judged ⇒ `adopt_failed`, before any blob is
|
|
516
|
-
* fetched; a source that cannot supply a referenced blob
|
|
574
|
+
* fetched; a source that cannot supply a referenced blob — absent, its read throws, or bytes that fail
|
|
575
|
+
* their content address — ⇒ `adopt_failed`, and so is a fault in staging or publishing the graph.
|
|
576
|
+
* `unsupported_format` is the door's refusal alone ({@link validateFileHistoryExport}, before any blob
|
|
577
|
+
* is fetched). `exportHistory` answers a
|
|
517
578
|
* {@link FileHistoryExportResult}: the whole graph, `null` for nothing to export, or `adopt_failed` with the
|
|
518
579
|
* fault for a history it cannot read whole (an unreadable tracked set, boundaries that cannot be judged) —
|
|
519
580
|
* never a partial graph, and never a `null` that hides a fault.
|
|
@@ -600,13 +661,30 @@ export declare function captureFileBackupViaEnv(env: ExecutionEnv, absPath: stri
|
|
|
600
661
|
* refusal state that stops a later touch from minting already-modified bytes as pristine — erasing
|
|
601
662
|
* it on an ambiguous failure re-opens exactly the DV-14 hole it exists to close. It stays
|
|
602
663
|
* retractable through the `"proven"` path, which needs no evidence read at all.
|
|
664
|
+
*
|
|
665
|
+
* THREE verdicts, because a backend answers them three ways: `unchanged` retracts; `kept` is the
|
|
666
|
+
* history-preservation law keeping the record (`conflict`); `unjudged` is a read that never happened —
|
|
667
|
+
* the path could not be re-read, or the signal fired — so nothing was judged and the record stays with
|
|
668
|
+
* the verb's own failure (`track_failed`, or `aborted` when `aborted` is true), never with the law's word.
|
|
603
669
|
*/
|
|
604
|
-
export
|
|
605
|
-
|
|
670
|
+
export type FileHistoryMintProof = {
|
|
671
|
+
verdict: "unchanged";
|
|
606
672
|
} | {
|
|
607
|
-
|
|
673
|
+
verdict: "kept";
|
|
608
674
|
reason: string;
|
|
609
|
-
}
|
|
675
|
+
} | {
|
|
676
|
+
verdict: "unjudged";
|
|
677
|
+
reason: string;
|
|
678
|
+
aborted: boolean;
|
|
679
|
+
};
|
|
680
|
+
export declare function worldStillMatchesMint(env: ExecutionEnv, absPath: string, root: string, baseAvailable: boolean, mintedBlobHash: string | null, signal?: AbortSignal): Promise<FileHistoryMintProof>;
|
|
681
|
+
/** A backend's ONE mapping of a proof that did not say `unchanged` onto the annul verb's failure — the two
|
|
682
|
+
* bundled backends call it, and an out-of-tree backend reuses it with the proof read itself. */
|
|
683
|
+
export declare function annulProofFailure(proof: Exclude<FileHistoryMintProof, {
|
|
684
|
+
verdict: "unchanged";
|
|
685
|
+
}>, absPath: string): FileHistoryResult & {
|
|
686
|
+
ok: false;
|
|
687
|
+
};
|
|
610
688
|
/**
|
|
611
689
|
* DV-13's metadata rule applied to the MODE axis (design/381 slice 3), and it is a rule about
|
|
612
690
|
* EVIDENCE rather than about equality: metadata may prove two states DIFFERENT, never the same. Two
|
|
@@ -649,9 +727,13 @@ export type FileRestoreApplyOutcome =
|
|
|
649
727
|
} | {
|
|
650
728
|
outcome: "identical";
|
|
651
729
|
modeNotPreserved?: true;
|
|
652
|
-
}
|
|
730
|
+
}
|
|
731
|
+
/** Every refusal this half decides is about the object at the path (its kind, its parent chain, a guarded
|
|
732
|
+
* write's precondition), so its class is `link_safety`; a backend copies it into the ledger row. */
|
|
733
|
+
| {
|
|
653
734
|
outcome: "refused";
|
|
654
735
|
reason: string;
|
|
736
|
+
class: "link_safety";
|
|
655
737
|
} | {
|
|
656
738
|
outcome: "failed";
|
|
657
739
|
reason: string;
|
|
@@ -32,6 +32,7 @@ function parentDirOf(absPath) {
|
|
|
32
32
|
const parent = cut.slice(0, i);
|
|
33
33
|
return win ? parent.replace(/\//g, "\\") : parent;
|
|
34
34
|
}
|
|
35
|
+
export const FILE_HISTORY_REFUSAL_CLASSES = Object.freeze(["link_safety", "base_unavailable", "key_unresolvable"]);
|
|
35
36
|
export function trackKeyFamilyOf(root) {
|
|
36
37
|
return isWinFormPath(root) ? "win" : "posix";
|
|
37
38
|
}
|
|
@@ -53,17 +54,17 @@ export function resolveTrackKey(root, key, minted) {
|
|
|
53
54
|
const win = isWinFormPath(root);
|
|
54
55
|
if (minted !== undefined && minted.family !== trackKeyFamilyOf(root)) {
|
|
55
56
|
if (minted.kind === "absolute") {
|
|
56
|
-
return { ok: false, reason: `foreign-family absolute key cannot be restored here (recorded under a ${minted.family} root, this root is ${trackKeyFamilyOf(root)}): ${key}
|
|
57
|
+
return { ok: false, reason: `foreign-family absolute key cannot be restored here (recorded under a ${minted.family} root, this root is ${trackKeyFamilyOf(root)}): ${key}`, class: "key_unresolvable" };
|
|
57
58
|
}
|
|
58
59
|
if (isUnsafeRelPathLike(normSlash(key)) || key.includes("\\")) {
|
|
59
|
-
return { ok: false, reason: `foreign-family key is ambiguous across path families (recorded under a ${minted.family} root, this root is ${trackKeyFamilyOf(root)}): ${key}
|
|
60
|
+
return { ok: false, reason: `foreign-family key is ambiguous across path families (recorded under a ${minted.family} root, this root is ${trackKeyFamilyOf(root)}): ${key}`, class: "key_unresolvable" };
|
|
60
61
|
}
|
|
61
62
|
}
|
|
62
63
|
const keyN = win ? normSlash(key) : key;
|
|
63
64
|
if (isAbsoluteForFamily(pathFamilyOf({ root }), keyN) || (win && /^[A-Za-z]:/.test(keyN)))
|
|
64
65
|
return { ok: true, abs: key };
|
|
65
66
|
if (win ? isUnsafeRelPathLike(keyN) : keyN.split("/").includes(".."))
|
|
66
|
-
return { ok: false, reason: `unsafe recorded key escapes root: ${key}
|
|
67
|
+
return { ok: false, reason: `unsafe recorded key escapes root: ${key}`, class: "key_unresolvable" };
|
|
67
68
|
return { ok: true, abs: joinUnder(root, keyN) };
|
|
68
69
|
}
|
|
69
70
|
export const FILE_HISTORY_ERROR_CODES = Object.freeze(["track_failed", "snapshot_failed", "restore_failed", "adopt_failed", "not_found", "aborted", "unsupported_format", "conflict"]);
|
|
@@ -157,6 +158,14 @@ export function fileHistoryExportDigest(data) {
|
|
|
157
158
|
return createHash("sha256").update(JSON.stringify(canonical)).digest("hex");
|
|
158
159
|
}
|
|
159
160
|
export function validateFileHistoryExport(data) {
|
|
161
|
+
try {
|
|
162
|
+
return judgeFileHistoryEnvelope(data);
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
return { ok: false, error: { code: "unsupported_format", message: `file-history import payload cannot be read: ${thrownText(err)}` } };
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function judgeFileHistoryEnvelope(data) {
|
|
160
169
|
const bad = (message) => ({ ok: false, error: { code: "unsupported_format", message } });
|
|
161
170
|
if (data === null || typeof data !== "object")
|
|
162
171
|
return bad("file-history import payload is not an envelope");
|
|
@@ -181,6 +190,8 @@ export function validateFileHistoryExport(data) {
|
|
|
181
190
|
if (typeof t.baseAvailable !== "boolean" || !Array.isArray(t.versions))
|
|
182
191
|
return bad(`tracked row ${t.relOrAbsPath} is missing its base-availability state or version chain`);
|
|
183
192
|
for (const v of t.versions) {
|
|
193
|
+
void v?.backupTime;
|
|
194
|
+
void v?.parentIdent;
|
|
184
195
|
if (typeof v?.version !== "number" || !Number.isInteger(v.version) || v.version < 1)
|
|
185
196
|
return bad(`tracked row ${t.relOrAbsPath} carries a non-integer version number`);
|
|
186
197
|
if (v.blobHash !== null && (typeof v.blobHash !== "string" || !/^[0-9a-f]{64}$/.test(v.blobHash)))
|
|
@@ -272,18 +283,24 @@ export async function captureFileBackupViaEnv(env, absPath, root, signal) {
|
|
|
272
283
|
}
|
|
273
284
|
export async function worldStillMatchesMint(env, absPath, root, baseAvailable, mintedBlobHash, signal) {
|
|
274
285
|
if (!baseAvailable) {
|
|
275
|
-
return {
|
|
286
|
+
return { verdict: "kept", reason: "the first touch recorded a base-UNAVAILABLE marker, whose whole purpose is to refuse a fake pristine later — an ambiguous failure may not erase it" };
|
|
276
287
|
}
|
|
277
288
|
const cap = await captureFileBackupViaEnv(env, absPath, root, signal);
|
|
278
289
|
if (cap.state === "absent") {
|
|
279
|
-
return mintedBlobHash === null ? {
|
|
290
|
+
return mintedBlobHash === null ? { verdict: "unchanged" } : { verdict: "kept", reason: "the file recorded at the first touch is gone now" };
|
|
280
291
|
}
|
|
281
292
|
if (cap.state === "file") {
|
|
282
293
|
if (mintedBlobHash === null)
|
|
283
|
-
return {
|
|
284
|
-
return cap.hash === mintedBlobHash ? {
|
|
294
|
+
return { verdict: "kept", reason: "the path was recorded as NOT EXISTING at the first touch but holds bytes now" };
|
|
295
|
+
return cap.hash === mintedBlobHash ? { verdict: "unchanged" } : { verdict: "kept", reason: "the file's bytes differ from the ones recorded at the first touch" };
|
|
285
296
|
}
|
|
286
|
-
return {
|
|
297
|
+
return { verdict: "unjudged", reason: `the path could not be re-read to prove it is unchanged (${cap.state === "aborted" ? "aborted" : cap.cause})`, aborted: cap.state === "aborted" };
|
|
298
|
+
}
|
|
299
|
+
export function annulProofFailure(proof, absPath) {
|
|
300
|
+
if (proof.verdict === "kept") {
|
|
301
|
+
return { ok: false, error: { code: "conflict", message: `first-touch record for ${absPath} is NOT retractable: ${proof.reason} — the write this retraction compensates for may have changed the file, and deleting the only baseline of a modified file is worse than keeping a stale record` } };
|
|
302
|
+
}
|
|
303
|
+
return { ok: false, error: { code: proof.aborted ? "aborted" : "track_failed", message: `first-touch record for ${absPath} was left in place: ${proof.reason}, so whether the write this retraction compensates for changed the file was not judged` } };
|
|
287
304
|
}
|
|
288
305
|
export function modeProvenDifferent(recorded, current) {
|
|
289
306
|
return recorded !== undefined && current !== undefined && recorded !== current;
|
|
@@ -317,7 +334,7 @@ export async function applyFileRestoreViaEnv(env, absPath, target, opts) {
|
|
|
317
334
|
}
|
|
318
335
|
const w = await writeRestoredBytes(env, absPath, target.bytes, signal);
|
|
319
336
|
if (!w.ok)
|
|
320
|
-
return { outcome: w.
|
|
337
|
+
return w.refused ? { outcome: "refused", reason: `write: ${w.code}`, class: "link_safety" } : { outcome: "failed", reason: `write: ${w.code}` };
|
|
321
338
|
const modeAfter = await applyRecordedMode(env, absPath, opts, undefined);
|
|
322
339
|
return { outcome: "applied", ...(modeAfter === "unpreserved" || modeAfter === "applied_unpreserved" ? { modeNotPreserved: true } : {}) };
|
|
323
340
|
}
|
|
@@ -330,6 +347,7 @@ async function restorePreflight(env, absPath, opts) {
|
|
|
330
347
|
reason: info.value.kind === "symlink"
|
|
331
348
|
? "restore target is a SYMLINK — the recorded bytes belong to the file that was edited, not to whatever the link now points at"
|
|
332
349
|
: `restore target is a ${info.value.kind}, not a regular file — the recorded bytes are not this object's`,
|
|
350
|
+
class: "link_safety",
|
|
333
351
|
},
|
|
334
352
|
};
|
|
335
353
|
}
|
|
@@ -345,6 +363,7 @@ async function restorePreflight(env, absPath, opts) {
|
|
|
345
363
|
refused: {
|
|
346
364
|
outcome: "refused",
|
|
347
365
|
reason: `restore target's parent chain changed identity since it was recorded (recorded ${JSON.stringify(opts.parentIdent)}, now ${JSON.stringify(now)}) — writing here could land outside the task root`,
|
|
366
|
+
class: "link_safety",
|
|
348
367
|
},
|
|
349
368
|
};
|
|
350
369
|
}
|
|
@@ -542,9 +561,8 @@ export class InMemoryFileHistoryStore {
|
|
|
542
561
|
if (before !== undefined)
|
|
543
562
|
return { ok: false, error: { code: "conflict", message: before } };
|
|
544
563
|
const proof = verify === undefined ? undefined : await worldStillMatchesMint(verify.env, absPath, root, t.baseAvailable, t.versions[0]?.blobHash ?? null, verify.signal);
|
|
545
|
-
if (proof !== undefined &&
|
|
546
|
-
return
|
|
547
|
-
}
|
|
564
|
+
if (proof !== undefined && proof.verdict !== "unchanged")
|
|
565
|
+
return annulProofFailure(proof, absPath);
|
|
548
566
|
const after = ineligible();
|
|
549
567
|
if (after !== undefined)
|
|
550
568
|
return { ok: false, error: { code: "conflict", message: after } };
|
|
@@ -655,7 +673,7 @@ export class InMemoryFileHistoryStore {
|
|
|
655
673
|
let targetVersion = boundary.get(key);
|
|
656
674
|
if (targetVersion === undefined) {
|
|
657
675
|
if (!t.baseAvailable) {
|
|
658
|
-
ledger.refused.push({ path: key, reason: "base_unavailable" });
|
|
676
|
+
ledger.refused.push({ path: key, reason: "base_unavailable", class: "base_unavailable" });
|
|
659
677
|
continue;
|
|
660
678
|
}
|
|
661
679
|
targetVersion = 1;
|
|
@@ -667,7 +685,7 @@ export class InMemoryFileHistoryStore {
|
|
|
667
685
|
}
|
|
668
686
|
const resolved = resolveTrackKey(root, key, t.keyDesc);
|
|
669
687
|
if (!resolved.ok) {
|
|
670
|
-
ledger.refused.push({ path: key, reason: resolved.reason });
|
|
688
|
+
ledger.refused.push({ path: key, reason: resolved.reason, class: resolved.class });
|
|
671
689
|
continue;
|
|
672
690
|
}
|
|
673
691
|
let target;
|
|
@@ -698,7 +716,7 @@ export class InMemoryFileHistoryStore {
|
|
|
698
716
|
else if (applied.outcome === "identical")
|
|
699
717
|
ledger.identicalSkipped.push(key);
|
|
700
718
|
else if (applied.outcome === "refused")
|
|
701
|
-
ledger.refused.push({ path: key, reason: applied.reason });
|
|
719
|
+
ledger.refused.push({ path: key, reason: applied.reason, class: applied.class });
|
|
702
720
|
else
|
|
703
721
|
ledger.failed.push({ path: key, reason: applied.reason });
|
|
704
722
|
if ((applied.outcome === "applied" || applied.outcome === "identical") && applied.modeNotPreserved === true)
|
|
@@ -866,7 +884,7 @@ export class InMemoryFileHistoryStore {
|
|
|
866
884
|
}
|
|
867
885
|
}
|
|
868
886
|
catch (err) {
|
|
869
|
-
return { ok: false, error: { code: "
|
|
887
|
+
return { ok: false, error: { code: "adopt_failed", message: `importHistory failed: ${thrownText(err)}`, ...caughtFault(err) } };
|
|
870
888
|
}
|
|
871
889
|
}
|
|
872
890
|
async importStaged(scope, data, srcGetBlob, needed) {
|
|
@@ -880,12 +898,12 @@ export class InMemoryFileHistoryStore {
|
|
|
880
898
|
bytes = await srcGetBlob(hash);
|
|
881
899
|
}
|
|
882
900
|
catch (err) {
|
|
883
|
-
return { ok: false, error: { code: "
|
|
901
|
+
return { ok: false, error: { code: "adopt_failed", message: `source blob ${hash} fetch failed: ${thrownText(err)}`, ...caughtFault(err) } };
|
|
884
902
|
}
|
|
885
903
|
if (bytes === undefined)
|
|
886
904
|
return { ok: false, error: { code: "adopt_failed", message: `source blob ${hash} is missing — the envelope's graph cannot be completed, so nothing is published` } };
|
|
887
905
|
if (createHash("sha256").update(bytes).digest("hex") !== hash) {
|
|
888
|
-
return { ok: false, error: { code: "
|
|
906
|
+
return { ok: false, error: { code: "adopt_failed", message: `source blob ${hash} fails content-address integrity — refused, nothing published` } };
|
|
889
907
|
}
|
|
890
908
|
staged.set(hash, bytes);
|
|
891
909
|
}
|
|
@@ -912,7 +930,7 @@ export class InMemoryFileHistoryStore {
|
|
|
912
930
|
return { ok: true };
|
|
913
931
|
}
|
|
914
932
|
catch (err) {
|
|
915
|
-
return { ok: false, error: { code: "
|
|
933
|
+
return { ok: false, error: { code: "adopt_failed", message: `importHistory failed: ${thrownText(err)}`, ...caughtFault(err) } };
|
|
916
934
|
}
|
|
917
935
|
}
|
|
918
936
|
}
|
package/dist/core/gate-fold.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type GatePass } from "./runner/gate-exit.js";
|
|
2
2
|
import type { ToolGateResult } from "./hooks.js";
|
|
3
3
|
/**
|
|
4
4
|
* Run the fold over the pass: adjudicate, fold the hook-ask, tighten. Writes `req` (re-minted over the FINAL
|
package/dist/core/gate-fold.js
CHANGED
|
@@ -2,6 +2,8 @@ import { inlineUntrusted } from "./untrusted-text.js";
|
|
|
2
2
|
import { markTightenMessage } from "./safety-axis-vocab.js";
|
|
3
3
|
import { PROBE_REASON_MAX, normalizeProbeCause } from "./checkpoint-store.js";
|
|
4
4
|
import { normalizeReadRootCandidate } from "./read-root-candidate.js";
|
|
5
|
+
import { engineFailClosedExit, hookDenyExit } from "./runner/gate-exit.js";
|
|
6
|
+
import { readRejudge, screenRewrite } from "./rewrite-rejudge.js";
|
|
5
7
|
import { traceHookCrash } from "./gate-crash-trace.js";
|
|
6
8
|
import { writeProtectionMandated, writeProtectionTightenDecision } from "./write-protect.js";
|
|
7
9
|
import { createGateDeadline, awaitWriteProtectionJudgment, gateWaitFailureOf, withGateTimeout } from "./gate-bounded-await.js";
|
|
@@ -26,7 +28,7 @@ export async function runGateFold(pass) {
|
|
|
26
28
|
catch (error) {
|
|
27
29
|
unread = { error };
|
|
28
30
|
}
|
|
29
|
-
pass.decision = unread !== undefined ? failedJudgmentDeny(unread.error, callSignal ?? input.abortSignal, (e) => traceHookCrash(input, e, notifier), "the call's target reading", { toolName, toolCallId }) : adjudicate ? refuseOutOfContractDecision(await (callSignal !== undefined ? adjudicate(pass.req, callSignal) : adjudicate(pass.req))) : { action: "allow" };
|
|
31
|
+
pass.decision = unread !== undefined ? failedJudgmentDeny(unread.error, callSignal ?? input.abortSignal, (e) => traceHookCrash(input, e, notifier), "the call's target reading", { toolName, toolCallId }) : adjudicate ? refuseOutOfContractDecision(await (callSignal !== undefined ? adjudicate(pass.req, callSignal) : adjudicate(pass.req)), { call: pass.req }) : { action: "allow" };
|
|
30
32
|
{
|
|
31
33
|
const read = ledger.fromDecision(pass.decision);
|
|
32
34
|
pass.decision = read.decision;
|
|
@@ -38,6 +40,18 @@ export async function runGateFold(pass) {
|
|
|
38
40
|
if (attributed !== undefined)
|
|
39
41
|
pass.classifierRound = attributed;
|
|
40
42
|
}
|
|
43
|
+
const rewritten = pass.screening !== undefined && pass.decision.action !== "deny" ? readRejudge(pass.req, pass.currentInput, pass.decision) : undefined;
|
|
44
|
+
if (pass.screening !== undefined && rewritten?.kind === "rewritten") {
|
|
45
|
+
const second = await screenRewrite(pass.screening, pass.req, rewritten.form, `the rewritten call to "${toolName}"`);
|
|
46
|
+
if (second.kind === "refused") {
|
|
47
|
+
pass.currentInput = rewritten.form;
|
|
48
|
+
return second.by === "hook" ? hookDenyExit(pass, second.reason) : await engineFailClosedExit(pass, second.reason);
|
|
49
|
+
}
|
|
50
|
+
if (second.answer?.additionalContext)
|
|
51
|
+
pass.preToolContext.push(second.answer.additionalContext);
|
|
52
|
+
pass.hookAsk = second.answer?.action === "ask" ? second.answer : undefined;
|
|
53
|
+
pass.hookAllowedBy = second.answer?.action === "allow" ? (second.answeredBy !== undefined ? [second.answeredBy] : []) : undefined;
|
|
54
|
+
}
|
|
41
55
|
if ((pass.decision.action === "allow" || pass.decision.action === "ask") && pass.decision.updatedInput !== undefined) {
|
|
42
56
|
pass.policyRewrite = argsAsTheToolReads(pass.req, pass.decision.updatedInput);
|
|
43
57
|
}
|
|
@@ -124,7 +138,7 @@ export async function runGateFold(pass) {
|
|
|
124
138
|
if (tighten) {
|
|
125
139
|
pass.decision = {
|
|
126
140
|
action: "ask",
|
|
127
|
-
message: markTightenMessage(toolName, "irreversible"),
|
|
141
|
+
message: markTightenMessage(toolName, input.irreversibility === "always" ? "irreversible" : "unproven"),
|
|
128
142
|
decisionReason: "safety",
|
|
129
143
|
...(probeReason !== undefined ? { probeReason } : {}),
|
|
130
144
|
...(probeCause !== undefined ? { probeCause } : {}),
|
|
@@ -219,19 +233,18 @@ function applyShellReadVerdict(pass, answer, toolName, shellGated) {
|
|
|
219
233
|
pass.shellReadDetails = verdict.details;
|
|
220
234
|
if (pass.decision.action !== "allow") {
|
|
221
235
|
if (pass.decision.action === "ask")
|
|
222
|
-
pass.decision =
|
|
236
|
+
pass.decision = silencedBy(withProbeMandate(pass.decision, account), verdict, pass.req);
|
|
223
237
|
return;
|
|
224
238
|
}
|
|
225
239
|
const candidate = normalizeReadRootCandidate(verdict.readRootCandidate);
|
|
226
|
-
pass.decision = {
|
|
240
|
+
pass.decision = silencedBy({
|
|
227
241
|
action: "ask",
|
|
228
242
|
message: shellReadAskMessage(toolName, verdict),
|
|
229
243
|
decisionReason: "safety",
|
|
230
244
|
probeMandated: true,
|
|
231
|
-
...silencedBy(verdict, {}),
|
|
232
245
|
...(account !== undefined ? { probeReason: account } : {}),
|
|
233
246
|
...(candidate !== undefined ? { probeReadRootCandidate: candidate } : {}),
|
|
234
|
-
};
|
|
247
|
+
}, verdict, pass.req);
|
|
235
248
|
if (candidate !== undefined)
|
|
236
249
|
pass.shellReadOffer = true;
|
|
237
250
|
pass.tightenedBy = shellGated ? "shell_gate" : "safety";
|
|
@@ -242,17 +255,16 @@ function applyShellReadVerdict(pass, answer, toolName, shellGated) {
|
|
|
242
255
|
if (verdict.details !== undefined)
|
|
243
256
|
pass.shellReadDetails = verdict.details;
|
|
244
257
|
if (pass.decision.action === "ask")
|
|
245
|
-
pass.decision =
|
|
258
|
+
pass.decision = silencedBy(pass.decision, verdict, pass.req);
|
|
246
259
|
if (pass.decision.action === "allow") {
|
|
247
260
|
const candidate = normalizeReadRootCandidate(verdict.readRootCandidate);
|
|
248
|
-
pass.decision = {
|
|
261
|
+
pass.decision = silencedBy({
|
|
249
262
|
action: "ask",
|
|
250
263
|
message: shellReadAskMessage(toolName, verdict),
|
|
251
264
|
decisionReason: "safety",
|
|
252
|
-
...silencedBy(verdict, {}),
|
|
253
265
|
...(account !== undefined ? { probeReason: account } : {}),
|
|
254
266
|
...(candidate !== undefined ? { probeReadRootCandidate: candidate } : {}),
|
|
255
|
-
};
|
|
267
|
+
}, verdict, pass.req);
|
|
256
268
|
if (candidate !== undefined)
|
|
257
269
|
pass.shellReadOffer = true;
|
|
258
270
|
pass.tightenedBy = shellGated ? "shell_gate" : "safety";
|