@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
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { argsAsTheToolReads, withArgsReading } from "../effective-path-target.js";
|
|
2
|
+
import { outletAsk, readRejudge, rewriteChasedSentence, sameBytes } from "../rewrite-rejudge.js";
|
|
2
3
|
import { policyAskClassOf } from "../ask-class.js";
|
|
3
|
-
import { ASK_USER_QUESTION_TOOL_NAME } from "../ask-question.js";
|
|
4
|
+
import { ASK_USER_QUESTION_TOOL_NAME, isEngineQuestionFace } from "../ask-question.js";
|
|
4
5
|
import { classifierUnavailableSeat } from "./classifier-ladder.js";
|
|
5
6
|
import { resolveCheckpointStore } from "../checkpoint-store.js";
|
|
6
7
|
import { chainJudges, inheritedToolChecks, screeningInstallationsOf, standsInFor } from "../mods/stations.js";
|
|
7
|
-
import {
|
|
8
|
+
import { isCoveringRuleName, ruleNameCovers } from "../namespaced-rule-name.js";
|
|
8
9
|
import { isIsolated } from "../remote-env.js";
|
|
9
10
|
import { deliverEngineNotice } from "../engine-notice.js";
|
|
10
11
|
import { earlierGrammarNotice } from "../session-policy-store.js";
|
|
11
12
|
import { attest, attestationOf, checkToolPolicyProjection, combinePolicies, createTranscriptIntegrityPolicy, createUnverifiableDeletePolicy, durableParkOptInDeclared, isLiveApproverSeat, mergeAttestation, refuseOutOfContractDecision, resolveAsk, toolPolicyNameSets, withAttestation, wrapToolPolicy } from "../tool-policy.js";
|
|
12
|
-
import { judgeRuleToolName, mountedToolNames } from "../tool-name-aliases.js";
|
|
13
|
+
import { judgeRuleToolName, mountedToolNames, nearMissSpellingOf } from "../tool-name-aliases.js";
|
|
13
14
|
import { approvalCardMemberOf } from "../tool-roster.js";
|
|
14
15
|
import { NAMESPACED_NAME_SHAPES } from "../protocol-table.js";
|
|
15
16
|
import { emitTrace } from "../trace.js";
|
|
@@ -17,7 +18,7 @@ import { skillGrantBindingMembers } from "../skill-grant.js";
|
|
|
17
18
|
import { SKILL_TOOL_NAME } from "./synthetic-tools.js";
|
|
18
19
|
import { delegationPoolReading } from "./sub-agent-deny-lists.js";
|
|
19
20
|
import { valveLeaves } from "../../agents/tool-filter.js";
|
|
20
|
-
import { autoStrippedRule, cardDisclosureOf,
|
|
21
|
+
import { autoStrippedRule, cardDisclosureOf, rootFacingToolNames } from "../allow-entry.js";
|
|
21
22
|
import { arbitrateByMode, askClassMembersOf, askFaceOf, askMandateMember } from "../ask-origin.js";
|
|
22
23
|
import { createModeGatePolicy, mountedToolDeclaresReadOnly } from "../mode-policy.js";
|
|
23
24
|
const ancestorFacts = (ask) => ({ ...(ask ?? {}), ancestorResolved: true });
|
|
@@ -29,8 +30,9 @@ import { createPermissionRuleLanes, inheritedAskRuleEvidence, createRuleOffersOf
|
|
|
29
30
|
import { createLiveSessionRules, createSessionRulePolicy } from "./session-rule-policy.js";
|
|
30
31
|
import { policyThrowLine, reportPolicyThrow } from "./policy-throw.js";
|
|
31
32
|
import { heldBy, heldValues, seatOf, wireOf } from "../tool-name-readings.js";
|
|
33
|
+
import { hostFloorPolicy } from "../host-floor.js";
|
|
32
34
|
export async function preparePolicyChain(input) {
|
|
33
|
-
const { spec, deps, internals, sessionId, runId, hostTaskId, taskRootFinal, additionalRootsCanonical, executionEnv, lockedPreflight, pathRuleAnchors, headLeads, tools, harnessTools, selector, toolEffects, egressTools, irreversibilityTier, axisExplicitNegatives, shellGatedTools, toolMarkSources, envHandToolNames, handsCwdRef, readDenyMatcher, personRows, questionToolMounted, runtimeCaps, inheritedAncestorRules, ancestorSessionRulesRef, inheritedParentConstraints, seedInheritedGate, skillGrants, skillSpecs, allowedToolTables, frozenOnAsk, hookEnvSource, notifyOwnHookCrash, modBus, ownModChain, autoModeDecider, readFace, permissionMode, scratchpadDir, toolRosterDeltas, stopForDenialLimit, delegation, abortController, now, ownSessionRulesRef } = input;
|
|
35
|
+
const { spec, deps, internals, sessionId, runId, hostTaskId, taskRootFinal, additionalRootsCanonical, executionEnv, lockedPreflight, pathRuleAnchors, headLeads, tools, harnessTools, selector, toolEffects, egressTools, irreversibilityTier, axisExplicitNegatives, shellGatedTools, toolMarkSources, envHandToolNames, handsCwdRef, readDenyMatcher, personRows, questionToolMounted, runtimeCaps, inheritedAncestorRules, ancestorSessionRulesRef, inheritedParentConstraints, seedInheritedGate, skillGrants, skillSpecs, allowedToolTables, frozenOnAsk, hookEnvSource, notifyOwnHookCrash, modBus, ownModChain, autoModeDecider, readFace, permissionMode, scratchpadDir, toolRosterDeltas, stopForDenialLimit, delegation, abortController, now, ownSessionRulesRef, hostFloor } = input;
|
|
34
36
|
const ancestorArbitrations = new Map();
|
|
35
37
|
const arbitrateInherited = (ask, toolCallId, judged) => {
|
|
36
38
|
const verdict = arbitrateByMode(permissionMode.current, judged.classification, { origin: judged.origin, ...askMandateMember(ancestorFacts(judged.ask.action === "ask" ? judged.ask : undefined)) });
|
|
@@ -85,7 +87,7 @@ export async function preparePolicyChain(input) {
|
|
|
85
87
|
}
|
|
86
88
|
if (known.has(n))
|
|
87
89
|
continue;
|
|
88
|
-
if (
|
|
90
|
+
if (isCoveringRuleName(n, kind) && [...known].some((k) => ruleNameCovers(n, k)))
|
|
89
91
|
continue;
|
|
90
92
|
unmatched.add(`"${n}" (${kind})`);
|
|
91
93
|
}
|
|
@@ -102,7 +104,7 @@ export async function preparePolicyChain(input) {
|
|
|
102
104
|
}
|
|
103
105
|
advisedPolicyNames.set(deps, advised);
|
|
104
106
|
try {
|
|
105
|
-
const e = new Error(`toolPolicy name audit: ${[...unmatched].join(", ")} match(es) no tool mounted this run (primary or alias) — the rule cannot fire here. Often a typo or a self-report/wire name skew (e.g. TodoWrite vs the mounted TaskCreate family; "*"
|
|
107
|
+
const e = new Error(`toolPolicy name audit: ${[...unmatched].join(", ")} match(es) no tool mounted this run (primary or alias) — the rule cannot fire here. Often a typo or a self-report/wire name skew (e.g. TodoWrite vs the mounted TaskCreate family; a "*" on a deny or ask list reaches every name its pattern matches). Advisory only: enforcement is unchanged, and a name can be legitimate for another scenario or a per-spawn tool.`);
|
|
106
108
|
e.code = "config.toolpolicy.unmatched_names";
|
|
107
109
|
deps.onError?.(e, { phase: "config", sessionId });
|
|
108
110
|
}
|
|
@@ -159,7 +161,7 @@ export async function preparePolicyChain(input) {
|
|
|
159
161
|
.map((entry) => ({
|
|
160
162
|
check: (creq) => checkToolPolicyProjection(entry, creq) ?? { action: "allow" },
|
|
161
163
|
}));
|
|
162
|
-
const narrowingLayers = [sessionRulePolicy, ...ancestorRulePolicies, ...frozenConstraintLayers].filter((p) => p !== undefined);
|
|
164
|
+
const narrowingLayers = [hostFloor !== undefined ? hostFloorPolicy(hostFloor) : undefined, sessionRulePolicy, ...ancestorRulePolicies, ...frozenConstraintLayers].filter((p) => p !== undefined);
|
|
163
165
|
auditPolicyNames(sessionRulePolicy);
|
|
164
166
|
for (const layer of ancestorRulePolicies)
|
|
165
167
|
auditPolicyNames(layer, true);
|
|
@@ -169,6 +171,16 @@ export async function preparePolicyChain(input) {
|
|
|
169
171
|
const sameInstanceAncestorCount = policy === undefined ? 0 : (inheritedParentConstraints ?? []).reduce((n, pc) => (pc.policy === policy ? n + 1 : n), 0);
|
|
170
172
|
const sharedFirstDecision = new Map();
|
|
171
173
|
const SHARED_FIRST_DECISION_CAP = 256;
|
|
174
|
+
const staleArbitrations = new Map();
|
|
175
|
+
const noteArbitration = (toolCallId, arbitrate, stale) => {
|
|
176
|
+
const rest = (staleArbitrations.get(toolCallId) ?? []).filter((a) => a !== arbitrate);
|
|
177
|
+
if (stale)
|
|
178
|
+
rest.push(arbitrate);
|
|
179
|
+
if (rest.length > 0)
|
|
180
|
+
staleArbitrations.set(toolCallId, rest);
|
|
181
|
+
else
|
|
182
|
+
staleArbitrations.delete(toolCallId);
|
|
183
|
+
};
|
|
172
184
|
const inheritedUnavailableAsks = new Set();
|
|
173
185
|
const INHERITED_UNAVAILABLE_CAP = 256;
|
|
174
186
|
const markInheritedUnavailable = (toolCallId) => {
|
|
@@ -204,8 +216,6 @@ export async function preparePolicyChain(input) {
|
|
|
204
216
|
const missing = [];
|
|
205
217
|
if (store === undefined)
|
|
206
218
|
missing.push("a wired CheckpointStore");
|
|
207
|
-
else if (store.redecision?.reopen !== true)
|
|
208
|
-
missing.push("a CheckpointStore that DECLARES redecision.reopen (declaration, never duck-typing)");
|
|
209
219
|
if (spec.durableApproval === undefined && runtimeCaps?.forceDurableGate !== true)
|
|
210
220
|
missing.push("a durable park (spec.durableApproval, or the forceDurableGate entitlement)");
|
|
211
221
|
if (missing.length === 0)
|
|
@@ -229,7 +239,7 @@ export async function preparePolicyChain(input) {
|
|
|
229
239
|
list.push({ cls, layer });
|
|
230
240
|
foldAskClasses.set(toolCallId, list);
|
|
231
241
|
};
|
|
232
|
-
const isDelegatedQuestion = (creq) =>
|
|
242
|
+
const isDelegatedQuestion = (creq) => isEngineQuestionFace(creq.face);
|
|
233
243
|
const sandboxBoundaryCapable = (call) => heldBy("gate.sandboxBoundary.egress", egressTools, call) || !envHandToolNames.has(wireOf("gate.sandboxBoundary.hand", call));
|
|
234
244
|
const emitSandboxAdmitted = (info) => {
|
|
235
245
|
emitTrace(deps.tracer, () => ({
|
|
@@ -255,8 +265,8 @@ export async function preparePolicyChain(input) {
|
|
|
255
265
|
};
|
|
256
266
|
const callerPolicyLayer = policy !== undefined && sameInstanceAncestorCount > 0
|
|
257
267
|
? wrapToolPolicy(policy, async (creq, csignal) => {
|
|
258
|
-
const decision = refuseOutOfContractDecision(await policy.check(creq, csignal ?? abortController.signal));
|
|
259
|
-
sharedFirstDecision.set(creq.toolCallId, decision);
|
|
268
|
+
const decision = refuseOutOfContractDecision(await policy.check(creq, csignal ?? abortController.signal), { call: creq });
|
|
269
|
+
sharedFirstDecision.set(creq.toolCallId, { decision, judged: creq.args });
|
|
260
270
|
if (sharedFirstDecision.size > SHARED_FIRST_DECISION_CAP) {
|
|
261
271
|
const oldest = sharedFirstDecision.keys().next().value;
|
|
262
272
|
if (oldest !== undefined)
|
|
@@ -297,7 +307,7 @@ export async function preparePolicyChain(input) {
|
|
|
297
307
|
const seat = seatMarksOf(call);
|
|
298
308
|
const face = readFace();
|
|
299
309
|
return {
|
|
300
|
-
...INHERITED_STATION_FACTS,
|
|
310
|
+
...INHERITED_STATION_FACTS, call: { toolCallId: call.toolCallId, toolName: call.toolName },
|
|
301
311
|
mandateMarks: { egress: seat.egress, shellGated: false, ...(seat.tier === "always" && !seat.shellGated ? { irreversibility: "always" } : {}) },
|
|
302
312
|
...(seat.sources.size > 0 ? { toolMarkSources: seat.sources } : {}),
|
|
303
313
|
...(deps.a2a?.isolatePeers === true ? { a2aIsolatePeers: true } : {}),
|
|
@@ -352,7 +362,7 @@ export async function preparePolicyChain(input) {
|
|
|
352
362
|
}
|
|
353
363
|
let re;
|
|
354
364
|
try {
|
|
355
|
-
re = refuseOutOfContractDecision(await pol.check(await withArgsReading(creq, editArgs, csignal ?? abortController.signal), csignal ?? abortController.signal));
|
|
365
|
+
re = refuseOutOfContractDecision(await pol.check(await withArgsReading(creq, editArgs, csignal ?? abortController.signal), csignal ?? abortController.signal), { call: creq });
|
|
356
366
|
}
|
|
357
367
|
catch (err) {
|
|
358
368
|
reportPolicyThrow(notifyOwnHookCrash, "an inherited parent policy's re-check of the approved edit", creq, err, csignal ?? abortController.signal);
|
|
@@ -363,13 +373,16 @@ export async function preparePolicyChain(input) {
|
|
|
363
373
|
}
|
|
364
374
|
if (re.action === "deny")
|
|
365
375
|
return vetoed(re);
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
376
|
+
const read = readRejudge(creq, editArgs, re);
|
|
377
|
+
if (read.kind === "rewritten") {
|
|
378
|
+
editArgs = read.form;
|
|
379
|
+
const { updatedInput: _form, ...verdict } = re;
|
|
380
|
+
re = outletAsk(verdict, creq.toolName, editArgs);
|
|
369
381
|
}
|
|
370
|
-
if (re.
|
|
371
|
-
editArgs
|
|
372
|
-
|
|
382
|
+
else if (re.action === "allow") {
|
|
383
|
+
return onApproval(withAttestation({ action: "allow", updatedInput: editArgs, decisionReason: "mode" }, re.attestation));
|
|
384
|
+
}
|
|
385
|
+
const judged = await judgeInheritedClassifier({ liveMode: () => permissionMode.current, autoMode: read.kind === "rewritten" ? undefined : ancestorAutoMode, ask: re, req: { ...creq, args: editArgs }, signal: csignal ?? abortController.signal, subject: "the approved edit", allowRewrite: editArgs, facts: inheritedStationFacts(creq), unavailableSeat: classifierUnavailableSeat({ station: "ancestor", ...(ancestorDecider?.timeoutMs !== undefined ? { budgetMs: ancestorDecider.timeoutMs } : {}), route: frozenApproverRoute(onAskOf), onNotice: deps.onNotice, sessionId, runId }) });
|
|
373
386
|
if (judged.kind === "allow") {
|
|
374
387
|
return onApproval(judged.result);
|
|
375
388
|
}
|
|
@@ -378,7 +391,10 @@ export async function preparePolicyChain(input) {
|
|
|
378
391
|
const { ask: editAsk } = judged;
|
|
379
392
|
re = editAsk;
|
|
380
393
|
const editArbitrated = arbitrateInherited(re, creq.toolCallId, judged);
|
|
381
|
-
|
|
394
|
+
const outletReleased = read.kind === "rewritten" && editArbitrated?.action === "allow";
|
|
395
|
+
if (outletReleased)
|
|
396
|
+
ancestorArbitrations.delete(creq.toolCallId);
|
|
397
|
+
if (editArbitrated !== undefined && !outletReleased) {
|
|
382
398
|
return onApproval(editArbitrated.action === "allow" ? { action: "allow", updatedInput: editArgs, decisionReason: "mode" } : editArbitrated);
|
|
383
399
|
}
|
|
384
400
|
const { resolved: rr, judged: settled } = await resolveInheritedAsk(judged, (j) => resolveAsk({
|
|
@@ -469,8 +485,14 @@ export async function preparePolicyChain(input) {
|
|
|
469
485
|
? { check: () => ({ action: "allow" }) }
|
|
470
486
|
: policy !== undefined && pc.policy === policy
|
|
471
487
|
? {
|
|
472
|
-
check: async (creq, csignal)
|
|
473
|
-
const
|
|
488
|
+
check: async function arbitrate(creq, csignal) {
|
|
489
|
+
const recorded = sharedFirstDecision.get(creq.toolCallId);
|
|
490
|
+
const first = recorded?.decision;
|
|
491
|
+
const stale = recorded !== undefined && !sameBytes(creq, recorded.decision.updatedInput !== undefined ? recorded.decision.updatedInput : recorded.judged, creq.args);
|
|
492
|
+
if (recorded !== undefined)
|
|
493
|
+
noteArbitration(creq.toolCallId, arbitrate, stale);
|
|
494
|
+
if (stale)
|
|
495
|
+
return { action: "allow" };
|
|
474
496
|
if (first === undefined) {
|
|
475
497
|
return {
|
|
476
498
|
action: "deny",
|
|
@@ -546,7 +568,7 @@ export async function preparePolicyChain(input) {
|
|
|
546
568
|
: wrapToolPolicy(pc.policy, async (creq, csignal) => {
|
|
547
569
|
let decision;
|
|
548
570
|
try {
|
|
549
|
-
decision = refuseOutOfContractDecision(await pc.policy.check(creq, csignal ?? abortController.signal));
|
|
571
|
+
decision = refuseOutOfContractDecision(await pc.policy.check(creq, csignal ?? abortController.signal), { call: creq });
|
|
550
572
|
}
|
|
551
573
|
catch (err) {
|
|
552
574
|
reportPolicyThrow(notifyOwnHookCrash, "an inherited parent policy", creq, err, csignal ?? abortController.signal);
|
|
@@ -575,88 +597,57 @@ export async function preparePolicyChain(input) {
|
|
|
575
597
|
const settled = await settleInstallationAsk(pc, ask, creq, csignal);
|
|
576
598
|
return settled.kind === "settled" ? settled.result : settled.resolved;
|
|
577
599
|
});
|
|
578
|
-
const rewriteCapableLayers = policy !== undefined || parentConstraintWrappers.length > 0;
|
|
579
|
-
const rewriteEmitterIndex = new Map();
|
|
580
600
|
const rewriteCapableChain = [
|
|
581
601
|
...(callerPolicyLayer !== undefined ? [callerPolicyLayer] : []),
|
|
582
602
|
...parentConstraintWrappers,
|
|
583
603
|
];
|
|
584
604
|
const callerSlotOffset = callerPolicyLayer !== undefined ? 1 : 0;
|
|
585
|
-
const sameInstanceAdapterIndices = new Set();
|
|
586
|
-
(inheritedParentConstraints ?? []).forEach((pc, j) => {
|
|
587
|
-
if (policy !== undefined && pc.policy === policy)
|
|
588
|
-
sameInstanceAdapterIndices.add(j + callerSlotOffset);
|
|
589
|
-
});
|
|
590
605
|
const instrumentedChain = rewriteCapableChain.map((layer, idx) => wrapToolPolicy(layer, async (creq, csignal) => {
|
|
591
|
-
const d = refuseOutOfContractDecision(await layer.check(creq, csignal));
|
|
592
|
-
if (d.updatedInput !== undefined)
|
|
593
|
-
rewriteEmitterIndex.set(creq.toolCallId, idx);
|
|
606
|
+
const d = refuseOutOfContractDecision(await layer.check(creq, csignal), { call: creq });
|
|
594
607
|
if (d.action === "ask") {
|
|
595
608
|
recordFoldAskClass(creq.toolCallId, idx < callerSlotOffset ? policyAskClassOf(policy) : "mandate", idx < callerSlotOffset ? "caller_policy" : "ancestor_constraint");
|
|
596
609
|
}
|
|
597
610
|
return d;
|
|
598
611
|
}));
|
|
599
612
|
const modeGateLayer = createModeGatePolicy(permissionMode, { env: executionEnv, rootPath: taskRootFinal, acceptDirs: [taskRootFinal, ...additionalRootsCanonical], roster: toolRosterDeltas, readOnlyDeclared: (name) => mountedToolDeclaresReadOnly(tools, name), ...(scratchpadDir !== undefined ? { exemptDirs: [scratchpadDir] } : {}) });
|
|
600
|
-
const policyLayers = [
|
|
601
|
-
...narrowingLayers,
|
|
602
|
-
...instrumentedChain,
|
|
603
|
-
...(rewriteCapableLayers ? narrowingLayers : []),
|
|
604
|
-
];
|
|
613
|
+
const policyLayers = [...narrowingLayers, ...instrumentedChain, ...(rewriteCapableChain.length > 0 ? narrowingLayers : [])];
|
|
605
614
|
const integrityGuardLayers = [createTranscriptIntegrityPolicy(), createUnverifiableDeletePolicy({ removalSeat: { env: executionEnv, additionalRoots: () => additionalRootsCanonical } })];
|
|
606
|
-
const guardedPolicyLayers =
|
|
607
|
-
? [...integrityGuardLayers, ...policyLayers, modeGateLayer, ...integrityGuardLayers]
|
|
608
|
-
: [...integrityGuardLayers, ...policyLayers, modeGateLayer];
|
|
615
|
+
const guardedPolicyLayers = [...integrityGuardLayers, ...policyLayers, modeGateLayer];
|
|
609
616
|
const foldedPolicy = guardedPolicyLayers.length === 1 ? guardedPolicyLayers[0] : combinePolicies(...guardedPolicyLayers);
|
|
610
|
-
const effectivePolicy = foldedPolicy !== undefined &&
|
|
617
|
+
const effectivePolicy = foldedPolicy !== undefined && sameInstanceAncestorCount > 0
|
|
611
618
|
? wrapToolPolicy(foldedPolicy, async (req, signal) => {
|
|
612
619
|
let decision;
|
|
620
|
+
let stale;
|
|
613
621
|
try {
|
|
614
622
|
decision = await foldedPolicy.check(req, signal);
|
|
615
623
|
}
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
624
|
+
finally {
|
|
625
|
+
stale = staleArbitrations.get(req.toolCallId) ?? [];
|
|
626
|
+
staleArbitrations.delete(req.toolCallId);
|
|
619
627
|
}
|
|
620
|
-
|
|
621
|
-
rewriteEmitterIndex.delete(req.toolCallId);
|
|
622
|
-
if (decision.action === "deny" || decision.updatedInput === undefined)
|
|
628
|
+
if (decision.action === "deny" || stale.length === 0)
|
|
623
629
|
return decision;
|
|
624
|
-
const
|
|
625
|
-
const
|
|
626
|
-
if (emitterIdx !== undefined && emitterIdx > 0) {
|
|
627
|
-
for (let i = emitterIdx + 1; i < rewriteCapableChain.length; i++) {
|
|
628
|
-
if (sameInstanceAdapterIndices.has(i))
|
|
629
|
-
postEmitterSameInstanceAdapters.push(rewriteCapableChain[i]);
|
|
630
|
-
}
|
|
631
|
-
}
|
|
632
|
-
const recheckLayers = [...recheckPrefix, ...postEmitterSameInstanceAdapters];
|
|
633
|
-
const finalReq = await withArgsReading(req, decision.updatedInput, signal);
|
|
630
|
+
const finalReq = decision.updatedInput !== undefined ? await withArgsReading(req, decision.updatedInput, signal) : req;
|
|
631
|
+
const carried = decision.updatedInput !== undefined ? { updatedInput: decision.updatedInput } : {};
|
|
634
632
|
let asked;
|
|
635
633
|
let revalidated;
|
|
636
634
|
try {
|
|
637
|
-
for (const
|
|
638
|
-
const d = refuseOutOfContractDecision(await
|
|
639
|
-
if (d.action === "deny")
|
|
640
|
-
return withAttestation({ ...d,
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
return {
|
|
644
|
-
action: "deny",
|
|
645
|
-
message: "policy required a rewrite during final-form re-check — the arguments that would execute were not accepted as-is (fail-closed; rewrite chains are not iterated to a fixpoint)",
|
|
646
|
-
updatedInput: decision.updatedInput,
|
|
647
|
-
};
|
|
648
|
-
}
|
|
635
|
+
for (const arbitrate of stale) {
|
|
636
|
+
const d = refuseOutOfContractDecision(await arbitrate(finalReq, signal), { call: finalReq });
|
|
637
|
+
if (d.action === "deny")
|
|
638
|
+
return withAttestation({ ...d, ...carried }, mergeAttestation(req, attestationOf(decision, req), attestationOf(d, req), "answer"));
|
|
639
|
+
if (readRejudge(finalReq, finalReq.args, d).kind === "rewritten")
|
|
640
|
+
return { action: "deny", message: rewriteChasedSentence(req.toolName), ...carried };
|
|
649
641
|
if (d.action === "ask" && asked === undefined)
|
|
650
642
|
asked = d;
|
|
651
643
|
revalidated = mergeAttestation(req, revalidated, d.attestation);
|
|
652
644
|
}
|
|
653
645
|
}
|
|
654
646
|
finally {
|
|
655
|
-
|
|
656
|
-
}
|
|
657
|
-
if (asked !== undefined && decision.action === "allow") {
|
|
658
|
-
return { ...asked, updatedInput: decision.updatedInput };
|
|
647
|
+
staleArbitrations.delete(req.toolCallId);
|
|
659
648
|
}
|
|
649
|
+
if (asked !== undefined && decision.action === "allow")
|
|
650
|
+
return { ...asked, ...carried };
|
|
660
651
|
if (decision.action === "allow")
|
|
661
652
|
return withAttestation(decision, mergeAttestation(req, attestationOf(decision, req), revalidated));
|
|
662
653
|
return decision;
|
|
@@ -3,7 +3,7 @@ import type { Model } from "../../internal/llm.js";
|
|
|
3
3
|
import { assemblePrompt, type AssembledPrompt } from "../../prompt-assembly/assemble.js";
|
|
4
4
|
import { type CenterAdoption } from "../../prompt-assembly/artifact.js";
|
|
5
5
|
import { type RunPromptIdentity } from "../../prompt-assembly/epoch.js";
|
|
6
|
-
import type { HostForm, HostRole } from "../../prompt-assembly/catalog/schema.js";
|
|
6
|
+
import type { HostForm, HostRole, PromptTraitName } from "../../prompt-assembly/catalog/schema.js";
|
|
7
7
|
import type { SourcedOverlay } from "../../prompt-assembly/overlay.js";
|
|
8
8
|
import { type EnvironmentFacts } from "../../prompts/default.js";
|
|
9
9
|
import { type LegModBus } from "../mods/stations.js";
|
|
@@ -47,15 +47,13 @@ export interface PreparePromptAssemblyInput {
|
|
|
47
47
|
memoryBlock: string | undefined;
|
|
48
48
|
/** borrowed-readonly — the environment facts; `date` is the assembly's date, the block builder re-renders on a date change. */
|
|
49
49
|
envFacts: EnvironmentFacts;
|
|
50
|
-
/** borrowed-readonly — the
|
|
51
|
-
|
|
52
|
-
/** borrowed-readonly — the fable mitigations switch (a runtime fact of the assembly). */
|
|
53
|
-
fableMitigations: boolean;
|
|
50
|
+
/** borrowed-readonly — the run's effective prompt traits (a selector value of the assembly). */
|
|
51
|
+
promptTraits: ReadonlySet<PromptTraitName>;
|
|
54
52
|
/** borrowed-readonly — the run's ONE tool roster, read only: the assembly receives DETACHED copies, the audit and the
|
|
55
53
|
* manifest read it in place. Never mutated here. */
|
|
56
54
|
tools: readonly AgentTool[];
|
|
57
|
-
/** borrowed-readonly — the task model: `
|
|
58
|
-
model: Pick<Model, "id"
|
|
55
|
+
/** borrowed-readonly — the task model: `id` (the compose event's `model`). */
|
|
56
|
+
model: Pick<Model, "id">;
|
|
59
57
|
/** borrowed-readonly — the acquired session id (every operator line's attribution). */
|
|
60
58
|
sessionId: string;
|
|
61
59
|
/** borrowed-readonly — the once-per-session ledger's operator sink (the collision audit's two lines). */
|
|
@@ -15,19 +15,23 @@ import { protocolOf } from "../protocol-table.js";
|
|
|
15
15
|
import { hasConversationContent } from "../session.js";
|
|
16
16
|
import { PROMPT_HASH_SALT } from "./prompt-hash-salt.js";
|
|
17
17
|
const CATALOG_DIGEST = catalogDigestOf(SEMA_DEFAULT_CATALOG);
|
|
18
|
-
|
|
18
|
+
const TASK_TEXT_DIGEST_SCHEME = "sid-sha256:";
|
|
19
|
+
function taskLayerDigestOf(sessionId, text) {
|
|
20
|
+
return `${TASK_TEXT_DIGEST_SCHEME}${createHash("sha256").update(sessionId).update("\u0000").update(text).digest("hex")}`;
|
|
21
|
+
}
|
|
22
|
+
function taskLayerOf(task, sessionId) {
|
|
19
23
|
return task.map(({ overlay: o, origin }) => ({
|
|
20
24
|
by: origin.by,
|
|
21
25
|
id: o.id,
|
|
22
26
|
op: o.op,
|
|
23
27
|
target: o.target,
|
|
24
|
-
...(o.text !== undefined ? {
|
|
28
|
+
...(o.text !== undefined ? { text: taskLayerDigestOf(sessionId, o.text) } : {}),
|
|
25
29
|
...(o.message !== undefined ? { message: o.message } : {}),
|
|
26
30
|
...(o.when !== undefined ? { when: o.when } : {}),
|
|
27
31
|
}));
|
|
28
32
|
}
|
|
29
33
|
export async function preparePromptAssembly(input) {
|
|
30
|
-
const { session, deps, internals, resume, sugar, host, binding, modBus, featureFlags, mcpInstructionsBlock, memoryBlock, envFacts,
|
|
34
|
+
const { session, deps, internals, resume, sugar, host, binding, modBus, featureFlags, mcpInstructionsBlock, memoryBlock, envFacts, promptTraits, tools, model, sessionId, onceLedger } = input;
|
|
31
35
|
const topLevel = internals?.parentTaskId === undefined && internals?.parentSessionId === undefined && internals?.parentCenterArtifactDigest === undefined;
|
|
32
36
|
const stored = await session.getPromptEpoch();
|
|
33
37
|
let centerAdoption;
|
|
@@ -82,10 +86,8 @@ export async function preparePromptAssembly(input) {
|
|
|
82
86
|
...featureFlags,
|
|
83
87
|
orchestrationEnabled: featureFlags.orchestrationEnabled && tools.some((t) => t.name === "Workflow"),
|
|
84
88
|
orchestrationDeferred: featureFlags.orchestrationDeferred && tools.some((t) => t.name === "Workflow"),
|
|
85
|
-
promptProfile,
|
|
86
|
-
fableMitigations,
|
|
87
89
|
};
|
|
88
|
-
const selectorRecord = selectorRecordOf(selectorsOf(facts, host, binding));
|
|
90
|
+
const selectorRecord = selectorRecordOf(selectorsOf(facts, host, binding, promptTraits));
|
|
89
91
|
const centerOverlays = centerOverlaysOf(centerAdoption);
|
|
90
92
|
const lowerAdds = new Map();
|
|
91
93
|
for (const { overlay } of [...sugar, ...centerOverlays])
|
|
@@ -105,6 +107,7 @@ export async function preparePromptAssembly(input) {
|
|
|
105
107
|
deployOverlays: composed.deploy,
|
|
106
108
|
host,
|
|
107
109
|
...(binding !== undefined ? { binding } : {}),
|
|
110
|
+
traits: promptTraits,
|
|
108
111
|
tools,
|
|
109
112
|
facts,
|
|
110
113
|
...(envFacts.cwd !== undefined ? { workspaceFolder: envFacts.cwd } : {}),
|
|
@@ -112,11 +115,10 @@ export async function preparePromptAssembly(input) {
|
|
|
112
115
|
memoryBlock,
|
|
113
116
|
buildEnvBlock: (date) => buildEnvironmentContext({ ...envFacts, date }) || undefined,
|
|
114
117
|
date: envFacts.date,
|
|
115
|
-
...(model.promptGuidance && model.promptGuidance.length > 0 ? { modelGuidance: model.promptGuidance.join("\n\n") } : {}),
|
|
116
118
|
onWarn: (message, phase) => deps.onError?.(new Error(message), { phase, sessionId }),
|
|
117
119
|
});
|
|
118
120
|
const deployLayer = composed.deploy.length > 0 ? digestOf(composed.deploy.map(({ overlay, origin }) => ({ by: origin.by, overlay }))) : undefined;
|
|
119
|
-
const taskLayer = taskOverlays.length > 0 ? digestOf(taskLayerOf(taskOverlays)) : undefined;
|
|
121
|
+
const taskLayer = taskOverlays.length > 0 ? digestOf(taskLayerOf(taskOverlays, sessionId)) : undefined;
|
|
120
122
|
const bindingLayer = digestOf(selectorRecord);
|
|
121
123
|
const renderers = rendererVector();
|
|
122
124
|
const identityFor = (center) => ({
|
|
@@ -23,7 +23,8 @@ import type { LegModBus } from "../mods/stations.js";
|
|
|
23
23
|
import type { ExecutionEnv, ThinkingLevel } from "../../internal/harness.js";
|
|
24
24
|
import type { Model } from "../../internal/llm.js";
|
|
25
25
|
import { type EnvironmentFacts } from "../../prompts/default.js";
|
|
26
|
-
import type {
|
|
26
|
+
import type { HostRole } from "../../prompt-assembly/catalog/schema.js";
|
|
27
|
+
import { type RequestBodySugar } from "../../prompt-assembly/sugar.js";
|
|
27
28
|
import type { ContainmentFace } from "../../tools/fs/index.js";
|
|
28
29
|
import type { LockedPreflight } from "../locked-config.js";
|
|
29
30
|
import type { MaterializedMcp } from "../mcp.js";
|
|
@@ -65,10 +66,6 @@ export interface PreparePromptInputsInput {
|
|
|
65
66
|
/** borrowed-readonly — the frozen tool face; `defer` (the Workflow short-pointer flag) and `selector` (with the spec's whole-face
|
|
66
67
|
* switch, the valve's reading that decides which servers' instructions are taught). */
|
|
67
68
|
toolFaceSnapshot: Pick<ToolFaceSnapshot, "defer" | "selector">;
|
|
68
|
-
/** borrowed-readonly — the resolved prompt profile (rides the flags to the legacy ctx). */
|
|
69
|
-
promptProfile: "simple" | "classic";
|
|
70
|
-
/** borrowed-readonly — the fable-mitigations profile axis (rides the flags with the profile). */
|
|
71
|
-
fableMitigations: boolean;
|
|
72
69
|
/** borrowed-readonly — trusted internals: `goalMode` (goal flag), `isolation` (worktree flag),
|
|
73
70
|
* `defaultSystemPrompt` (the sugar's third source). `undefined` on a standalone prepare. */
|
|
74
71
|
internals: Pick<RunInternals, "goalMode" | "isolation" | "defaultSystemPrompt"> | undefined;
|
|
@@ -81,8 +78,12 @@ export interface PreparePromptInputsInput {
|
|
|
81
78
|
delegation: {
|
|
82
79
|
readonly isNonForkChild: boolean;
|
|
83
80
|
};
|
|
84
|
-
/** borrowed-readonly — the resolved role; only its `systemPrompt`
|
|
85
|
-
|
|
81
|
+
/** borrowed-readonly — the resolved role; only its role-base statement (`promptRole` / `systemPrompt`) is read (the
|
|
82
|
+
* role-base decision's second source). */
|
|
83
|
+
resolvedRole: Pick<ResolvedRole, "promptRole" | "systemPrompt">;
|
|
84
|
+
/** borrowed-readonly — the task seat's role word as its door judged it (`TaskSpec.promptRole`, `resolveHost`): the
|
|
85
|
+
* role-base decision's first source, beside the spec's own text. */
|
|
86
|
+
taskRole: HostRole | undefined;
|
|
86
87
|
/** borrowed-mutable — the materialized MCP roster; `serverInstructions` (the disposed entries) and `tools` (each server's listing: did it list
|
|
87
88
|
* any tool) are read, and the instructions lane's ledger is stated: the block is what the model is told at the run's start. */
|
|
88
89
|
mcp: Pick<MaterializedMcp, "serverInstructions" | "tools" | "instructionsDelta">;
|
|
@@ -122,8 +123,9 @@ export interface PreparePromptInputsInput {
|
|
|
122
123
|
export interface PreparePromptInputsResult {
|
|
123
124
|
/** owned — the runtime feature flags (see {@link PromptFeatureFlags}). */
|
|
124
125
|
featureFlags: PromptFeatureFlags;
|
|
125
|
-
/** owned — the request-body sugar
|
|
126
|
-
|
|
126
|
+
/** owned — the request-body sugar: its overlays (the task class's first contributions, in application order) and the
|
|
127
|
+
* run's host role, from the one role-base decision. */
|
|
128
|
+
sugar: RequestBodySugar;
|
|
127
129
|
/** owned — the fenced MCP server-instructions block, or undefined when no server declared any. */
|
|
128
130
|
mcpInstructionsBlock: string | undefined;
|
|
129
131
|
/** owned — the environment facts the env tail renders from. Filled here; no later phase writes it
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { formatLocalDate, isValidTimeZone } from "../../prompts/default.js";
|
|
2
|
-
import {
|
|
2
|
+
import { requestBodySugar } from "../../prompt-assembly/sugar.js";
|
|
3
3
|
import { valveLeaves } from "../../agents/tool-filter.js";
|
|
4
4
|
import { instructionsTaught, toldAtStart } from "../mounted-mcp.js";
|
|
5
5
|
import { isIsolated } from "../remote-env.js";
|
|
@@ -9,7 +9,7 @@ import { renderMcpInstructionsEntry } from "./turn-attachments.js";
|
|
|
9
9
|
const ULTRA_REASONING_TIERS = new Set(["xhigh", "max"]);
|
|
10
10
|
import { compactionEnabled } from "../context-settings.js";
|
|
11
11
|
export async function preparePromptInputs(input) {
|
|
12
|
-
const { spec, deps, failClosedReason, lockedPreflight, selfOrchestrationActive, executionEnv, reminderMark, resolvedReadFace, resolvedWriteFace, toolFaceSnapshot,
|
|
12
|
+
const { spec, deps, failClosedReason, lockedPreflight, selfOrchestrationActive, executionEnv, reminderMark, resolvedReadFace, resolvedWriteFace, toolFaceSnapshot, internals, thinking, ownedEnv, delegation, resolvedRole, mcp, model, externalContentTargetActive, resume, handsEnabled, taskRootFinal, additionalRootsCanonical, additionalReadRootsCanonical, sessionId, session, advertisedWritableDirs } = input;
|
|
13
13
|
const promptPolicyEnabled = Boolean(lockedPreflight.toolPolicy);
|
|
14
14
|
const promptHooksEnabled = input.modBus.hasHandlers("classic.PreToolUse") || input.modBus.hasHandlers("classic.PostToolUse");
|
|
15
15
|
if (failClosedReason) {
|
|
@@ -24,15 +24,13 @@ export async function preparePromptInputs(input) {
|
|
|
24
24
|
writeFaceOpen: resolvedWriteFace === "open",
|
|
25
25
|
orchestrationEnabled: selfOrchestrationActive,
|
|
26
26
|
orchestrationDeferred: selfOrchestrationActive && (toolFaceSnapshot.defer?.includes("Workflow") ?? false),
|
|
27
|
-
promptProfile,
|
|
28
|
-
fableMitigations,
|
|
29
27
|
goalEnabled: internals?.goalMode === true,
|
|
30
28
|
awarenessEnabled: thinking !== undefined && ULTRA_REASONING_TIERS.has(thinking),
|
|
31
29
|
worktreeIsolated: internals?.isolation === "worktree" && ownedEnv !== undefined,
|
|
32
30
|
withinTaskCompactionEnabled: compactionEnabled(spec.compaction?.enabled, input.contextOverlay) && (spec.compaction?.withinTask ?? true),
|
|
33
31
|
isSubagent: delegation.isNonForkChild,
|
|
34
32
|
};
|
|
35
|
-
const sugar =
|
|
33
|
+
const sugar = requestBodySugar({ spec, resolvedRole, ...(input.taskRole !== undefined ? { taskRole: input.taskRole } : {}), ...(internals !== undefined ? { internals } : {}) });
|
|
36
34
|
const valveLeft = valveLeaves(spec, toolFaceSnapshot.selector);
|
|
37
35
|
const taught = mcp.serverInstructions.filter((entry) => instructionsTaught(valveLeft, entry.server, input.roster.tools, mcp.tools));
|
|
38
36
|
toldAtStart(mcp.instructionsDelta, new Set(taught.map((entry) => entry.server)));
|
|
@@ -36,6 +36,8 @@ export interface PrepareProtocolToolsInput {
|
|
|
36
36
|
* mount predicate, and whether a real client was acquired) and `a2a` (the declared peers the door judged: the materialize
|
|
37
37
|
* input and whether a handle was acquired) are read. */
|
|
38
38
|
lockedPreflight: Pick<LockedPreflight, "mcp" | "a2a">;
|
|
39
|
+
/** borrowed-readonly — the deployment's host floor as the config doors compiled it: each MCP http dial and every A2A request is judged by it. */
|
|
40
|
+
hostFloor: import("../host-floor.js").HostFloor | undefined;
|
|
39
41
|
/** borrowed-readonly — the REBOUND spec. Read: `principal` (the MCP header / the A2A identity), `tools`
|
|
40
42
|
* (the caller names both reserved-name guards check against), `excludeAllTools` (the valve's whole-face switch: the live roster lane's
|
|
41
43
|
* reading, and the first-dial gate), `signal` (the host's abort, which stops an MCP dial). */
|
|
@@ -14,7 +14,7 @@ import { applyMcpToolFaces } from "./tool-face-overlay.js";
|
|
|
14
14
|
import { sectionDisposerOf } from "../prompt-section-seat.js";
|
|
15
15
|
import { thrownText } from "../thrown-value.js";
|
|
16
16
|
export async function prepareProtocolTools(input) {
|
|
17
|
-
const { lockedPreflight, spec, deps, mcpPool, reminderMark, reminderDisclosureCounts, runId, sessionId, onceLedger, roster, rosterSeat, remoteToolOffload, toolFaceSnapshot, toolEffects, axisExplicitNegatives, irreversibilityTier, irreversibleTools, egressTools, toolMarkSources, abortController, rollback } = input;
|
|
17
|
+
const { lockedPreflight, hostFloor, spec, deps, mcpPool, reminderMark, reminderDisclosureCounts, runId, sessionId, onceLedger, roster, rosterSeat, remoteToolOffload, toolFaceSnapshot, toolEffects, axisExplicitNegatives, irreversibilityTier, irreversibleTools, egressTools, toolMarkSources, abortController, rollback } = input;
|
|
18
18
|
const markedBy = (name, source) => {
|
|
19
19
|
const set = toolMarkSources.get(name);
|
|
20
20
|
if (set !== undefined)
|
|
@@ -30,7 +30,7 @@ export async function prepareProtocolTools(input) {
|
|
|
30
30
|
const leaves = valveLeaves(spec, toolFaceSnapshot.selector);
|
|
31
31
|
const resourcesReached = resourceFacesLeft(leaves);
|
|
32
32
|
const mcp = lockedPreflight.mcp?.length
|
|
33
|
-
? await materializeMcpTools(lockedPreflight.mcp, spec.principal, deps.onElicit, deps.mcpImageResizer, { reminderMark, counts: reminderDisclosureCounts }, mcpRevocationWiring(deps, runId), mcpPool === undefined ? undefined : { pool: mcpPool.pool, ownsPool: mcpPool.owned }, sectionDisposerOf(input.modBus, abortController.signal), (entry) => resourcesReached || serverReached(mintNamespacePrefix(MCP_NAMESPACE, entry.name)), AbortSignal.any([abortController.signal, ...(spec.signal !== undefined ? [spec.signal] : [])]))
|
|
33
|
+
? await materializeMcpTools(lockedPreflight.mcp, spec.principal, deps.onElicit, deps.mcpImageResizer, { reminderMark, counts: reminderDisclosureCounts }, mcpRevocationWiring(deps, runId), mcpPool === undefined ? undefined : { pool: mcpPool.pool, ownsPool: mcpPool.owned }, sectionDisposerOf(input.modBus, abortController.signal), (entry) => resourcesReached || serverReached(mintNamespacePrefix(MCP_NAMESPACE, entry.name)), AbortSignal.any([abortController.signal, ...(spec.signal !== undefined ? [spec.signal] : [])]), hostFloor)
|
|
34
34
|
:
|
|
35
35
|
{ tools: [], toolAxes: [], warnings: [], serverInstructions: [], instructionsDelta: { pendingAdds: [], pendingRemovals: [] }, droppedTools: [], statuses: [], refresh: async () => [], reconnect: async (server) => ({ server, prefix: mintNamespacePrefix(MCP_NAMESPACE, server), outcome: "not_declared", reason: "this task declared no MCP servers", toolCount: 0, added: [], removed: [] }), dispose: async () => { } };
|
|
36
36
|
if (lockedPreflight.mcp?.length)
|
|
@@ -167,7 +167,7 @@ export async function prepareProtocolTools(input) {
|
|
|
167
167
|
foldProtocolAxes(mcp.toolAxes, "MCP");
|
|
168
168
|
const a2aDeclared = lockedPreflight.a2a;
|
|
169
169
|
const a2a = a2aDeclared
|
|
170
|
-
? await materializeA2aTools(a2aDeclared, spec.principal, abortController.signal)
|
|
170
|
+
? await materializeA2aTools(a2aDeclared, spec.principal, abortController.signal, hostFloor)
|
|
171
171
|
: { tools: [], toolAxes: [], warnings: [], statuses: [], refresh: async () => [], dispose: async () => { } };
|
|
172
172
|
if (a2aDeclared)
|
|
173
173
|
rollback.push(function a2aDispose() { return a2a.dispose(); });
|
|
@@ -16,7 +16,7 @@ export interface PrepareSafetyScanInput {
|
|
|
16
16
|
* The six collections are **borrowed-mutable**: the driver and later phases fold into them IN
|
|
17
17
|
* PLACE (identity is part of the contract — closures alias these exact objects). Mutation owners
|
|
18
18
|
* after this phase, in driver order:
|
|
19
|
-
* · the roster builder (`toolEffects`: every mount and unmount
|
|
19
|
+
* · the roster builder (`toolEffects`: every mount and unmount);
|
|
20
20
|
* · the MCP/A2A materialize fold + the runtime refresh seam (protocol-axis tighten registration and a protocol tool's effect;
|
|
21
21
|
* on refresh, `toolEffects.delete` resets a replaced tool's effect record for the fresh fold —
|
|
22
22
|
* the irreversible/egress sets deliberately KEEP their entries, the tighten-only residue);
|
|
@@ -116,9 +116,7 @@ export function prepareSafetyScan(input) {
|
|
|
116
116
|
}
|
|
117
117
|
}
|
|
118
118
|
const candidates = engineCandidatesOf(spec, deps);
|
|
119
|
-
const engineNames = new Set(candidates.map(([n]) => n));
|
|
120
119
|
for (const t of survivors.values()) {
|
|
121
|
-
const tier = tierOf(t);
|
|
122
120
|
for (const alias of t.aliases ?? []) {
|
|
123
121
|
if (alias === t.name || survivors.has(alias))
|
|
124
122
|
continue;
|
|
@@ -128,21 +126,6 @@ export function prepareSafetyScan(input) {
|
|
|
128
126
|
claimedAliases.add(alias);
|
|
129
127
|
if (t.effect)
|
|
130
128
|
declared.set(alias, t.effect);
|
|
131
|
-
if (engineNames.has(alias))
|
|
132
|
-
continue;
|
|
133
|
-
if (tier !== undefined) {
|
|
134
|
-
irreversibilityTier.set(alias, tier);
|
|
135
|
-
if (tier === "always" || tier === "maybe") {
|
|
136
|
-
irreversibleTools.add(alias);
|
|
137
|
-
markedBy(alias, "deployment");
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
if (t.reversibilityProbe)
|
|
141
|
-
reversibilityProbes.set(alias, t.reversibilityProbe);
|
|
142
|
-
if (t.egress) {
|
|
143
|
-
egressTools.add(alias);
|
|
144
|
-
markedBy(alias, "deployment");
|
|
145
|
-
}
|
|
146
129
|
}
|
|
147
130
|
}
|
|
148
131
|
return {
|
|
@@ -114,6 +114,8 @@ export interface PrepareSuspendSagaInput {
|
|
|
114
114
|
writeFaceCheckpointSection: () => SerializedCheckpointState["writeFace"];
|
|
115
115
|
/** borrowed-readonly — the inherited-gate phase's SKILL-GRANT section builder (the row's `skillGrants`). */
|
|
116
116
|
skillGrantCheckpointSection: () => SerializedCheckpointState["skillGrants"];
|
|
117
|
+
/** borrowed-readonly — the leg's skill scopes (the mods admission's record): the row's `skillScopes`, read at the park. */
|
|
118
|
+
skillScopesCheckpointSection: () => SerializedCheckpointState["skillScopes"];
|
|
117
119
|
/** borrowed-readonly — the leg's reminder provenance mark (travels with the row). */
|
|
118
120
|
reminderMark: string;
|
|
119
121
|
/** borrowed-readonly — the hand's live tracked cwd, or undefined; `current` is read at mint time. Not written here. */
|
|
@@ -82,9 +82,10 @@ function stampPlacementRootSessionId(placementRootResolved) {
|
|
|
82
82
|
return placementValueOrAbsent(placementRootResolved);
|
|
83
83
|
}
|
|
84
84
|
export function prepareSuspendSaga(input) {
|
|
85
|
-
const { gateMachineryActive, abortController, harness, checkpointStore, deps, sessionId, hostTaskId, taskScope, liveSpendRef, resume, nestedStats, internals, activeTools, outputRef, readFileStateForCheckpoint, faceCheckpointSection, writeFaceCheckpointSection, skillGrantCheckpointSection, reminderMark, handsCwdRef, handsRoot, handsHome, worktreeSessionRef, undeliveredContinuationRef, inheritedParentConstraints, seedInheritedGate, ancestorRulesNow, inheritedShellGate, permissionMode, inheritedAdmittedOrgScopes, inheritedPathRuleAnchors, inheritedPathRuleInstallations, ownOrgVerdictRef, orgGovernedProvenance, announcedListingsRef, gitStatusRef, hookIdentity, placementRootResolved, checkpointScope, toolCeiling, toolListsJudged, ownToolLists, externalContentTargetActive, crossBoundary, remoteEnvFailures, memoryEngineSession, suspendLoopRef, ownedEnv, incompleteSuspendAdapter } = input;
|
|
85
|
+
const { gateMachineryActive, abortController, harness, checkpointStore, deps, sessionId, hostTaskId, taskScope, liveSpendRef, resume, nestedStats, internals, activeTools, outputRef, readFileStateForCheckpoint, faceCheckpointSection, writeFaceCheckpointSection, skillGrantCheckpointSection, skillScopesCheckpointSection, reminderMark, handsCwdRef, handsRoot, handsHome, worktreeSessionRef, undeliveredContinuationRef, inheritedParentConstraints, seedInheritedGate, ancestorRulesNow, inheritedShellGate, permissionMode, inheritedAdmittedOrgScopes, inheritedPathRuleAnchors, inheritedPathRuleInstallations, ownOrgVerdictRef, orgGovernedProvenance, announcedListingsRef, gitStatusRef, hookIdentity, placementRootResolved, checkpointScope, toolCeiling, toolListsJudged, ownToolLists, externalContentTargetActive, crossBoundary, remoteEnvFailures, memoryEngineSession, suspendLoopRef, ownedEnv, incompleteSuspendAdapter } = input;
|
|
86
86
|
if (!gateMachineryActive)
|
|
87
87
|
return { saga: undefined };
|
|
88
|
+
const taskAccess = { owner: hostTaskId, scope: taskScope, sessionId };
|
|
88
89
|
const inFlightSpendMicroUsd = () => {
|
|
89
90
|
const own = liveSpendRef.get?.().costMicroUsd ?? 0;
|
|
90
91
|
const seededNested = resume?.seed.nestedStats.costMicroUsd;
|
|
@@ -114,6 +115,7 @@ export function prepareSuspendSaga(input) {
|
|
|
114
115
|
readFace: faceCheckpointSection(),
|
|
115
116
|
writeFace: writeFaceCheckpointSection(),
|
|
116
117
|
skillGrants: skillGrantCheckpointSection(),
|
|
118
|
+
skillScopes: skillScopesCheckpointSection(),
|
|
117
119
|
reminderMark,
|
|
118
120
|
repairBundle: repairBundleForCheckpoint(parkedSpendMicroUsd),
|
|
119
121
|
workspaceHandle,
|
|
@@ -122,10 +124,7 @@ export function prepareSuspendSaga(input) {
|
|
|
122
124
|
handsHome,
|
|
123
125
|
activeWorktree: worktreeSessionRef?.current ? { ...worktreeSessionRef.current } : undefined,
|
|
124
126
|
runningBackgroundTasks: (() => {
|
|
125
|
-
const live = defaultTaskRegistry
|
|
126
|
-
.list({ owner: hostTaskId, scope: taskScope, sessionId })
|
|
127
|
-
.filter((t) => t.status === "pending" || t.status === "running")
|
|
128
|
-
.map((t) => ({ id: t.task_id, ...(t.description !== undefined ? { description: t.description } : {}) }));
|
|
127
|
+
const live = defaultTaskRegistry.liveTasks(taskAccess).filter((t) => t.status !== "parked").map((t) => ({ id: t.task_id, ...(t.description !== undefined ? { description: t.description } : {}) }));
|
|
129
128
|
const owed = undeliveredContinuationRef.current.orphanTasks.filter((o) => !live.some((t) => t.id === o.id));
|
|
130
129
|
const all = [...owed, ...live];
|
|
131
130
|
return all.length > 0 ? all : undefined;
|
|
@@ -200,7 +199,7 @@ export function prepareSuspendSaga(input) {
|
|
|
200
199
|
return { tag: "absent" };
|
|
201
200
|
if (memoryEngineSession)
|
|
202
201
|
await memoryEngineSession.harvest("checkpoint");
|
|
203
|
-
const recordUnwritten = await crossBoundary.owe(cp.leafId).then((entryId) => void (entryId !== undefined && (cp = { ...cp, leafId: entryId })), (err) => ({ err }));
|
|
202
|
+
const recordUnwritten = await crossBoundary.owe(cp.leafId, () => defaultTaskRegistry.owedDeliveries(taskAccess)).then((entryId) => void (entryId !== undefined && (cp = { ...cp, leafId: entryId })), (err) => ({ err }));
|
|
204
203
|
if (cutSignal?.aborted) {
|
|
205
204
|
if (remoteEnv !== undefined && remoteHandle?.snapshotId !== undefined) {
|
|
206
205
|
const back = await compensatePausedVM(remoteEnv, remoteHandle.snapshotId);
|