@sema-agent/core 7.54.1 → 7.56.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 +950 -0
- package/dist/agents/agent-transcript-tool.js +2 -1
- package/dist/agents/builtin-agents.d.ts +12 -14
- package/dist/agents/cascade.js +1 -1
- package/dist/agents/cc-peer-directory.d.ts +36 -0
- package/dist/agents/cc-peer-directory.js +139 -0
- package/dist/agents/cc-peer-wire.d.ts +105 -0
- package/dist/agents/cc-peer-wire.js +98 -0
- package/dist/agents/cc-uds-peer-channel.d.ts +40 -0
- package/dist/agents/cc-uds-peer-channel.js +457 -0
- package/dist/agents/child-model-seat.d.ts +0 -11
- package/dist/agents/child-model-seat.js +0 -3
- package/dist/agents/cross-session-envelope.d.ts +4 -1
- package/dist/agents/cross-session-envelope.js +8 -1
- package/dist/agents/cross-session-judge.d.ts +2 -2
- package/dist/agents/list-agents-tool.d.ts +3 -1
- package/dist/agents/list-agents-tool.js +9 -8
- package/dist/agents/observer.d.ts +4 -5
- package/dist/agents/observer.js +2 -1
- package/dist/agents/peer-admission.d.ts +6 -0
- package/dist/agents/peer-admission.js +4 -1
- package/dist/agents/peer-directory.d.ts +65 -13
- package/dist/agents/peer-directory.js +90 -25
- package/dist/agents/peer-notices.d.ts +1 -1
- package/dist/agents/peer-session-drain.d.ts +3 -1
- package/dist/agents/peer-session-drain.js +3 -2
- package/dist/agents/read-inbox-tool.js +2 -1
- package/dist/agents/repair-loop.js +2 -2
- package/dist/agents/retain-ledger.d.ts +1 -1
- package/dist/agents/roster-store.d.ts +1 -1
- package/dist/agents/send-message-tool.d.ts +10 -0
- package/dist/agents/send-message-tool.js +37 -8
- package/dist/agents/subagent.d.ts +39 -82
- package/dist/agents/subagent.js +109 -106
- package/dist/agents/tool-filter.d.ts +31 -46
- package/dist/agents/tool-filter.js +13 -33
- package/dist/agents/verify.d.ts +6 -5
- package/dist/agents/verify.js +3 -3
- package/dist/brain/anthropic.js +43 -81
- package/dist/brain/errors.d.ts +15 -0
- package/dist/brain/errors.js +10 -0
- 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 +6 -12
- package/dist/brain/model-presets.js +1 -6
- package/dist/brain/open-responses.js +27 -35
- package/dist/brain/openai.js +30 -98
- package/dist/brain/provider-dialect.d.ts +39 -3
- package/dist/brain/provider-dialect.js +28 -0
- package/dist/brain/reasoning-request.d.ts +96 -0
- package/dist/brain/reasoning-request.js +174 -0
- package/dist/brain/reasoning.d.ts +12 -12
- package/dist/brain/reasoning.js +4 -3
- package/dist/brain/request-params.d.ts +62 -9
- package/dist/brain/request-params.js +42 -7
- package/dist/brain/retry.d.ts +1 -1
- package/dist/brain/route-adjudicator.d.ts +15 -0
- package/dist/brain/route-adjudicator.js +15 -0
- package/dist/brain/status-sink.d.ts +20 -0
- package/dist/brain/status-sink.js +7 -0
- package/dist/brain/stream-engine.js +6 -5
- package/dist/brain/stream-shared.d.ts +1 -1
- package/dist/core/a2a.d.ts +2 -1
- package/dist/core/a2a.js +19 -13
- package/dist/core/advisor-verdict.d.ts +120 -0
- package/dist/core/advisor-verdict.js +92 -0
- package/dist/core/agent-definition.d.ts +17 -8
- package/dist/core/allow-entry.d.ts +69 -36
- package/dist/core/allow-entry.js +81 -52
- package/dist/core/allow-rule-shadow.d.ts +10 -3
- package/dist/core/approval-object.d.ts +2 -1
- package/dist/core/approval-object.js +6 -6
- package/dist/core/ask-origin.d.ts +127 -29
- package/dist/core/ask-origin.js +87 -25
- package/dist/core/ask-question.d.ts +51 -8
- package/dist/core/ask-question.js +12 -7
- 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 +11 -8
- package/dist/core/auto-compaction.js +4 -2
- package/dist/core/auto-mode-arming.d.ts +2 -2
- package/dist/core/auto-mode-defaults.d.ts +8 -8
- package/dist/core/auto-mode-prompt-assets.d.ts +3 -3
- package/dist/core/auto-mode-prompt.d.ts +1 -1
- package/dist/core/auto-mode.d.ts +17 -9
- package/dist/core/auto-mode.js +9 -6
- package/dist/core/background-agent-store.d.ts +3 -3
- package/dist/core/canonical-json.d.ts +1 -1
- package/dist/core/canonical-json.js +2 -2
- 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 -4
- package/dist/core/checkpoint-requirements.js +8 -14
- package/dist/core/checkpoint-store.d.ts +165 -72
- package/dist/core/checkpoint-store.js +79 -82
- package/dist/core/child-clamp-seats.d.ts +6 -0
- package/dist/core/child-clamp-seats.js +3 -16
- package/dist/core/compliance.d.ts +2 -2
- package/dist/core/context-edit.d.ts +6 -7
- package/dist/core/cross-boundary-taint.d.ts +11 -4
- package/dist/core/cross-boundary-taint.js +3 -3
- package/dist/core/decision-receipt.d.ts +37 -3
- package/dist/core/decision-receipt.js +19 -19
- package/dist/core/delegation-not-started.d.ts +6 -0
- package/dist/core/delegation-not-started.js +17 -0
- package/dist/core/effective-path-target.d.ts +1 -1
- 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 +45 -12
- package/dist/core/exec-output-tail.d.ts +1 -1
- package/dist/core/file-history-retention.d.ts +1 -1
- package/dist/core/file-history-store.d.ts +147 -21
- package/dist/core/file-history-store.js +58 -32
- package/dist/core/gate-fold.d.ts +1 -1
- package/dist/core/gate-fold.js +24 -11
- package/dist/core/gate-lanes.js +81 -68
- package/dist/core/gate-outcome.d.ts +40 -6
- package/dist/core/gate-outcome.js +56 -0
- package/dist/core/governance-codes.d.ts +17 -3
- package/dist/core/governance-codes.js +16 -0
- package/dist/core/hands-band.d.ts +1 -1
- package/dist/core/hooks.d.ts +21 -20
- 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 +84 -0
- package/dist/core/host-target.js +92 -0
- package/dist/core/image-downsample.d.ts +1 -1
- package/dist/core/lsp-diagnostics.d.ts +4 -4
- package/dist/core/lsp.d.ts +3 -3
- package/dist/core/mailbox-store.d.ts +4 -0
- package/dist/core/mcp-connection-pool.d.ts +18 -2
- package/dist/core/mcp-connection-pool.js +53 -6
- package/dist/core/mcp-failure.d.ts +23 -4
- package/dist/core/mcp-failure.js +26 -11
- package/dist/core/mcp-listing-drift.d.ts +10 -0
- package/dist/core/mcp-listing-drift.js +6 -0
- package/dist/core/mcp-server-link.d.ts +173 -0
- package/dist/core/mcp-server-link.js +127 -0
- package/dist/core/mcp-server-spec.d.ts +4 -2
- package/dist/core/mcp-session-end.d.ts +26 -0
- package/dist/core/mcp-session-end.js +29 -0
- package/dist/core/mcp-startup-request.d.ts +17 -0
- package/dist/core/mcp-startup-request.js +17 -0
- package/dist/core/mcp.d.ts +17 -13
- package/dist/core/mcp.js +240 -189
- package/dist/core/media-byte-cap.d.ts +1 -1
- package/dist/core/memory-engine/delegation-settlement.js +15 -24
- package/dist/core/memory-engine/engine.d.ts +9 -9
- 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 +65 -6
- package/dist/core/memory-engine/provenance-wording.d.ts +1 -1
- package/dist/core/memory-engine/tools.js +4 -1
- package/dist/core/mode-policy.d.ts +1 -1
- 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 +44 -24
- package/dist/core/namespaced-rule-name.js +50 -43
- package/dist/core/output-style.d.ts +1 -1
- package/dist/core/param-rule-reach.d.ts +15 -0
- package/dist/core/param-rule-reach.js +30 -0
- package/dist/core/parent-spec-seat.d.ts +13 -1
- package/dist/core/parent-spec-seat.js +6 -0
- package/dist/core/park-selfcheck.js +1 -0
- package/dist/core/pause-registry.d.ts +16 -5
- package/dist/core/pause-registry.js +6 -2
- package/dist/core/peer-channel.d.ts +70 -0
- package/dist/core/peer-channel.js +1 -0
- package/dist/core/permission-rule-consent.d.ts +30 -5
- package/dist/core/permission-rule-consent.js +147 -50
- package/dist/core/permission-rule-model.d.ts +245 -65
- package/dist/core/permission-rule-model.js +421 -107
- package/dist/core/permission-rule-org.d.ts +6 -2
- package/dist/core/permission-rule-org.js +7 -3
- package/dist/core/permission-rule-provider.d.ts +6 -2
- package/dist/core/permission-rule-provider.js +41 -11
- package/dist/core/permission-rule-store.d.ts +22 -26
- package/dist/core/permission-rule-store.js +12 -6
- package/dist/core/permission-rule-sync.d.ts +11 -2
- package/dist/core/permission-rule-sync.js +11 -3
- 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 +53 -15
- package/dist/core/permission-rules.js +125 -100
- package/dist/core/persisted-rule-arms.d.ts +6 -4
- package/dist/core/persisted-rule-arms.js +10 -12
- package/dist/core/present-plan-tool.js +3 -1
- 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 +26 -5
- package/dist/core/protocol-http-auth.js +137 -4
- package/dist/core/protocol-naming.d.ts +2 -2
- package/dist/core/read-only-shell-table.d.ts +1 -1
- package/dist/core/read-only-shell.d.ts +1 -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 +34 -3
- package/dist/core/roles.js +66 -53
- package/dist/core/rule-lane-reads.d.ts +20 -15
- package/dist/core/rule-lane-reads.js +45 -17
- package/dist/core/rule-offer-read.d.ts +53 -0
- package/dist/core/rule-offer-read.js +146 -0
- package/dist/core/rule-owner.d.ts +46 -0
- package/dist/core/rule-owner.js +29 -0
- package/dist/core/runner/advisor-instructions.d.ts +70 -0
- package/dist/core/runner/advisor-instructions.js +61 -0
- package/dist/core/runner/advisor-tool.d.ts +33 -0
- package/dist/core/runner/advisor-tool.js +112 -0
- package/dist/core/runner/announce-once-ledger.d.ts +18 -26
- package/dist/core/runner/announce-once-ledger.js +19 -46
- package/dist/core/runner/approval-feedback.js +6 -3
- package/dist/core/runner/assemble-result.d.ts +2 -1
- 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 +21 -2
- package/dist/core/runner/caller-roster.js +38 -0
- 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 +33 -13
- package/dist/core/runner/classifier-ladder.js +15 -14
- package/dist/core/runner/compaction-restate.d.ts +10 -6
- package/dist/core/runner/compaction-restate.js +9 -3
- package/dist/core/runner/construction-doors.js +3 -0
- package/dist/core/runner/contracts.d.ts +40 -33
- package/dist/core/runner/conversation-segment.d.ts +28 -0
- package/dist/core/runner/conversation-segment.js +42 -0
- package/dist/core/runner/cross-boundary-lane.d.ts +21 -16
- package/dist/core/runner/cross-boundary-lane.js +58 -34
- package/dist/core/runner/decide-continuation.d.ts +7 -4
- package/dist/core/runner/decide-continuation.js +2 -2
- package/dist/core/runner/denial-limit-arms.d.ts +4 -4
- package/dist/core/runner/denial-limit-arms.js +1 -1
- package/dist/core/runner/derived-route-fallback.d.ts +24 -24
- package/dist/core/runner/derived-route-fallback.js +9 -7
- 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 +9 -3
- package/dist/core/runner/gate-exit.js +11 -5
- package/dist/core/runner/image.d.ts +7 -17
- package/dist/core/runner/image.js +9 -60
- package/dist/core/runner/initial-run-state.js +1 -1
- package/dist/core/runner/permission-rule-lanes.d.ts +6 -6
- package/dist/core/runner/permission-rule-lanes.js +38 -15
- package/dist/core/runner/person-path-rows.d.ts +12 -9
- package/dist/core/runner/person-path-rows.js +19 -8
- package/dist/core/runner/prepare-advisor.d.ts +63 -0
- package/dist/core/runner/prepare-advisor.js +77 -0
- 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 +5 -4
- package/dist/core/runner/prepare-config-doors.d.ts +31 -38
- package/dist/core/runner/prepare-config-doors.js +57 -34
- 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-delegation-surface.d.ts +2 -2
- package/dist/core/runner/prepare-delegation-surface.js +1 -1
- package/dist/core/runner/prepare-file-history.d.ts +48 -8
- package/dist/core/runner/prepare-file-history.js +41 -73
- package/dist/core/runner/prepare-gate-stations.d.ts +2 -5
- package/dist/core/runner/prepare-gate-stations.js +12 -8
- package/dist/core/runner/prepare-hands-readface.d.ts +2 -8
- package/dist/core/runner/prepare-hands-readface.js +15 -14
- package/dist/core/runner/prepare-inherited-gate.d.ts +11 -7
- package/dist/core/runner/prepare-inherited-gate.js +8 -6
- package/dist/core/runner/prepare-memory-engine-session.js +1 -1
- package/dist/core/runner/prepare-park-ask.js +12 -12
- package/dist/core/runner/prepare-policy-chain.d.ts +7 -4
- package/dist/core/runner/prepare-policy-chain.js +68 -81
- package/dist/core/runner/prepare-project-context.d.ts +5 -2
- package/dist/core/runner/prepare-project-context.js +6 -3
- 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 +4 -6
- package/dist/core/runner/prepare-protocol-tools.d.ts +4 -2
- package/dist/core/runner/prepare-protocol-tools.js +5 -4
- package/dist/core/runner/prepare-safety-scan.d.ts +9 -12
- package/dist/core/runner/prepare-safety-scan.js +8 -23
- 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 +1 -1
- package/dist/core/runner/prepare-task.js +41 -35
- package/dist/core/runner/prepare-tool-disclosure-mount.d.ts +7 -4
- package/dist/core/runner/prepare-tool-disclosure-mount.js +24 -18
- 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 +11 -4
- 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/resume-policy-outcome.js +1 -1
- package/dist/core/runner/retired-runner-deps.js +2 -1
- package/dist/core/runner/rewind-files.d.ts +15 -0
- package/dist/core/runner/rewind-files.js +132 -0
- package/dist/core/runner/run-attachment-seats.js +2 -2
- 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-compaction-machinery.d.ts +1 -1
- package/dist/core/runner/run-compaction-machinery.js +2 -12
- package/dist/core/runner/run-git-lane.d.ts +1 -0
- package/dist/core/runner/run-harness-handlers.js +14 -7
- package/dist/core/runner/run-leg.d.ts +1 -1
- package/dist/core/runner/run-leg.js +43 -18
- package/dist/core/runner/run-settle-and-teardown.js +3 -2
- package/dist/core/runner/run-telemetry-and-budget-seats.js +1 -1
- package/dist/core/runner/run-turn-boundary.d.ts +1 -0
- package/dist/core/runner/run-turn-boundary.js +15 -22
- package/dist/core/runner/runtask.d.ts +3 -0
- package/dist/core/runner/runtask.js +8 -9
- 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.d.ts +22 -21
- package/dist/core/runner/session-rule-policy.js +17 -31
- 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/side-call-account.d.ts +32 -8
- package/dist/core/runner/side-call-account.js +23 -1
- package/dist/core/runner/skills-seat.js +6 -2
- package/dist/core/runner/stream-settle-backstop.js +1 -1
- package/dist/core/runner/strict-output-schema.d.ts +1 -1
- package/dist/core/runner/sub-agent-deny-lists.js +4 -6
- package/dist/core/runner/synthetic-tools.d.ts +16 -13
- package/dist/core/runner/synthetic-tools.js +8 -3
- package/dist/core/runner/tool-disclosure.d.ts +10 -12
- package/dist/core/runner/tool-disclosure.js +3 -4
- 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-face-overlay.d.ts +2 -1
- package/dist/core/runner/tool-face-overlay.js +17 -1
- 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/tool-progress-lane.d.ts +2 -2
- package/dist/core/runner/tool-turn-repair-seat.d.ts +3 -2
- package/dist/core/runner/turn-attachments.d.ts +91 -80
- package/dist/core/runner/turn-attachments.js +62 -37
- package/dist/core/runner-deps.d.ts +42 -42
- package/dist/core/runtime-caps.d.ts +4 -4
- 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 +26 -2
- package/dist/core/same-plain-value.d.ts +40 -0
- package/dist/core/same-plain-value.js +49 -0
- package/dist/core/scheduler.d.ts +1 -1
- package/dist/core/secret-env.d.ts +26 -3
- package/dist/core/secret-env.js +44 -8
- package/dist/core/select-model.js +3 -3
- package/dist/core/sensitive-path-policy.d.ts +1 -1
- package/dist/core/sensitive-path-policy.js +1 -1
- package/dist/core/session-policy-store.d.ts +102 -35
- package/dist/core/session-policy-store.js +210 -48
- package/dist/core/session-reconcile.d.ts +2 -2
- package/dist/core/session-store.d.ts +106 -37
- package/dist/core/session-store.js +165 -91
- package/dist/core/session.d.ts +101 -57
- package/dist/core/session.js +53 -0
- package/dist/core/shared-memory/tools.js +3 -1
- package/dist/core/shared-memory/types.d.ts +1 -1
- 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.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.d.ts +10 -0
- package/dist/core/side-query.js +15 -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/checkpoint-store-contract.d.ts +11 -1
- package/dist/core/store-contracts/checkpoint-store-contract.js +168 -3
- package/dist/core/store-contracts/file-history-store-contract.js +74 -4
- 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-policy-store-contract.d.ts +7 -0
- package/dist/core/store-contracts/session-policy-store-contract.js +130 -0
- package/dist/core/store-contracts/session-repo-contract.js +176 -0
- package/dist/core/store-contracts/session-store-contract.d.ts +6 -8
- package/dist/core/store-contracts/session-store-contract.js +361 -51
- package/dist/core/store-contracts/workflow-journal-store-contract.js +26 -1
- package/dist/core/stub-env.d.ts +2 -0
- package/dist/core/stub-env.js +1 -0
- package/dist/core/surrogate-safe-slice.d.ts +3 -3
- package/dist/core/synthetic-read-verdict.js +3 -3
- package/dist/core/task-event.d.ts +42 -8
- package/dist/core/task-notification.d.ts +19 -15
- package/dist/core/task-registry-agent.d.ts +4 -4
- package/dist/core/task-registry-shared.d.ts +4 -4
- package/dist/core/task-registry-shared.js +1 -0
- package/dist/core/task-registry.d.ts +13 -4
- package/dist/core/task-registry.js +14 -2
- package/dist/core/task-result.d.ts +21 -3
- package/dist/core/task-spec.d.ts +69 -64
- package/dist/core/task-stream.d.ts +6 -6
- package/dist/core/task-tool-shape.d.ts +4 -4
- package/dist/core/tighten-task-spec.d.ts +1 -1
- package/dist/core/tighten-task-spec.js +2 -1
- package/dist/core/tool-catalog-entries.d.ts +36 -2
- package/dist/core/tool-catalog-entries.js +69 -43
- package/dist/core/tool-check-reading.d.ts +11 -0
- package/dist/core/tool-check-reading.js +11 -6
- package/dist/core/tool-conformance.js +1 -0
- package/dist/core/tool-errors.d.ts +2 -2
- package/dist/core/tool-face-reader.js +5 -3
- package/dist/core/tool-face.d.ts +21 -2
- package/dist/core/tool-face.js +1 -1
- package/dist/core/tool-model-gate.d.ts +5 -5
- package/dist/core/tool-name-aliases.d.ts +29 -8
- package/dist/core/tool-name-aliases.js +22 -4
- package/dist/core/tool-name-readings.d.ts +10 -43
- package/dist/core/tool-name-readings.js +2 -11
- package/dist/core/tool-policy.d.ts +85 -196
- package/dist/core/tool-policy.js +150 -175
- package/dist/core/tool-registry.d.ts +14 -7
- package/dist/core/tool-registry.js +17 -7
- package/dist/core/tool-result-store.js +5 -1
- package/dist/core/tool-roster.d.ts +57 -33
- package/dist/core/tool-roster.js +56 -68
- package/dist/core/tool-spec-members.js +8 -3
- package/dist/core/tool-spec.d.ts +53 -31
- package/dist/core/tools.js +51 -10
- package/dist/core/trace.d.ts +6 -2
- package/dist/core/types.d.ts +1 -1
- package/dist/core/untrusted-egress.d.ts +1 -1
- package/dist/core/untrusted-text.d.ts +1 -1
- package/dist/core/user-attachment.d.ts +8 -1
- package/dist/core/user-attachment.js +64 -4
- package/dist/core/warm-resume.d.ts +1 -1
- package/dist/core/wiring-manifest.d.ts +58 -0
- package/dist/core/wiring-manifest.js +14 -5
- package/dist/core/workflow-journal-store.d.ts +62 -0
- package/dist/core/workflow-journal-store.js +78 -2
- package/dist/core/workflow-run-store.d.ts +6 -0
- package/dist/core/workflow-run-store.js +2 -0
- package/dist/engine/compaction/compaction.d.ts +9 -9
- package/dist/engine/compaction/compaction.js +3 -2
- package/dist/engine/execution-env/node-execution-env.d.ts +26 -8
- package/dist/engine/execution-env/node-execution-env.js +54 -24
- package/dist/engine/harness/agent-harness.d.ts +39 -9
- package/dist/engine/harness/agent-harness.js +87 -33
- package/dist/engine/harness/types.d.ts +58 -9
- package/dist/engine/harness/types.js +12 -1
- package/dist/engine/llm/types.d.ts +36 -19
- package/dist/engine/llm/validation.d.ts +4 -1
- package/dist/engine/llm/validation.js +13 -1
- package/dist/engine/loop/agent-loop.d.ts +23 -1
- package/dist/engine/loop/agent-loop.js +26 -34
- package/dist/engine/loop/types.d.ts +31 -19
- package/dist/engine/lsp/node-lsp-manager.d.ts +2 -2
- package/dist/engine/session/memory-repo.d.ts +18 -12
- package/dist/engine/session/memory-repo.js +24 -9
- package/dist/engine/session/parent-chain-guard.d.ts +3 -2
- package/dist/engine/session/parent-chain-guard.js +1 -1
- package/dist/engine/session/repo-utils.d.ts +32 -3
- package/dist/engine/session/repo-utils.js +50 -5
- package/dist/index.d.ts +47 -23
- package/dist/index.js +35 -17
- package/dist/internal/harness-types.d.ts +1 -1
- package/dist/internal/harness.d.ts +3 -3
- package/dist/internal/harness.js +2 -2
- package/dist/internal/llm.d.ts +2 -2
- package/dist/internal/llm.js +1 -1
- package/dist/orchestration/goal.js +2 -2
- package/dist/orchestration/run-workflow-tool.d.ts +8 -6
- package/dist/orchestration/run-workflow-tool.js +10 -6
- package/dist/orchestration/workflow-size-guideline.d.ts +4 -4
- package/dist/orchestration/workflow-types.d.ts +18 -0
- package/dist/orchestration/workflow-types.js +6 -0
- package/dist/orchestration/workflow.d.ts +5 -13
- package/dist/orchestration/workflow.js +57 -49
- 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 +2 -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 +39 -2
- package/dist/prompt-assembly/tool-catalog.js +117 -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/prompts/default.d.ts +14 -14
- package/dist/scenarios/full-body.d.ts +15 -15
- package/dist/scenarios/full-body.js +4 -3
- package/dist/shell/lex.js +10 -1
- package/dist/stores/file/adoption/adopt.d.ts +4 -3
- package/dist/stores/file/adoption/adopt.js +27 -33
- package/dist/stores/file/adoption/marker.d.ts +6 -13
- package/dist/stores/file/adoption/marker.js +9 -17
- package/dist/stores/file/checkpoint-store.d.ts +24 -0
- package/dist/stores/file/checkpoint-store.js +45 -7
- package/dist/stores/file/file-history-store.d.ts +20 -19
- package/dist/stores/file/file-history-store.js +157 -141
- package/dist/stores/file/fs-atomic.d.ts +15 -0
- package/dist/stores/file/fs-atomic.js +89 -14
- package/dist/stores/file/index.d.ts +1 -1
- package/dist/stores/file/index.js +2 -1
- package/dist/stores/file/mailbox-store.d.ts +3 -0
- package/dist/stores/file/mailbox-store.js +3 -1
- package/dist/stores/file/permission-rule-adopt.d.ts +1 -1
- package/dist/stores/file/permission-rule-adopt.js +18 -18
- package/dist/stores/file/permission-rule-store.d.ts +18 -2
- package/dist/stores/file/permission-rule-store.js +31 -18
- package/dist/stores/file/session-policy-store.d.ts +3 -3
- package/dist/stores/file/session-store.d.ts +54 -16
- package/dist/stores/file/session-store.js +114 -85
- package/dist/stores/file/workflow-journal-store.d.ts +10 -4
- package/dist/stores/file/workflow-journal-store.js +28 -13
- package/dist/tools/artifact/artifact-text.d.ts +1 -1
- package/dist/tools/artifact/artifact-tool.js +5 -3
- 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 +3 -3
- package/dist/tools/fs/fs-bash.d.ts +2 -2
- package/dist/tools/fs/fs-bash.js +8 -6
- 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/fs-shared.d.ts +8 -8
- package/dist/tools/fs/gh-rate-limit.d.ts +1 -1
- package/dist/tools/fs/notebook.d.ts +2 -2
- package/dist/tools/fs/pattern-kill-guard.d.ts +22 -0
- package/dist/tools/fs/pattern-kill-guard.js +397 -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/read-deny.d.ts +29 -7
- package/dist/tools/fs/read-deny.js +63 -22
- package/dist/tools/fs/removal-targets.d.ts +18 -8
- package/dist/tools/fs/removal-targets.js +47 -20
- package/dist/tools/fs/safety.d.ts +9 -9
- package/dist/tools/fs/search.d.ts +16 -6
- 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.js +12 -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-judge.d.ts +4 -0
- package/dist/tools/fs/shell-read-judge.js +5 -2
- 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/loop-tick.d.ts +2 -2
- package/dist/tools/scheduler-tools.js +5 -1
- package/dist/tools/task-list.d.ts +7 -7
- package/dist/tools/task-list.js +5 -1
- package/dist/tools/todo.js +65 -64
- package/dist/tools/web.d.ts +20 -15
- package/dist/tools/web.js +55 -69
- package/dist/tools/worktree.d.ts +3 -3
- package/dist/tools/worktree.js +3 -1
- package/package.json +1 -1
- package/test/export-surface.snapshot.json +5894 -5638
- package/wire-changes/core@7.55.0.json +3318 -0
- package/wire-changes/core@7.56.0.json +3891 -0
- package/wire-changes/mods-kernel@7.56.0.json +303 -0
- package/dist/core/store-contracts/session-store-incarnation-contract.d.ts +0 -39
- package/dist/core/store-contracts/session-store-incarnation-contract.js +0 -95
package/dist/core/tool-policy.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
3
|
import { argsReadFrom, carryArgsReadFrom, withArgsReading } from "./effective-path-target.js";
|
|
4
|
+
import { editRewrittenSentence, readRejudge, rewriteChasedSentence } from "./rewrite-rejudge.js";
|
|
4
5
|
import { brandPolicyAskClass } from "./ask-class.js";
|
|
5
6
|
import { decisionAskClassesOf, headlessDenialMessage } from "./ask-origin.js";
|
|
7
|
+
import { attest, attestationOf, isEngineAttestation, mergeAttestation, mintAttestation, withAttestation } from "./engine-attestation.js";
|
|
6
8
|
import { ownReadRootCandidate, readRootGrantSeat } from "./read-root-grant-screen.js";
|
|
7
9
|
import { decidersNote, settledByDecider } from "./gate-outcome.js";
|
|
8
10
|
import { unjudgedAllowRefused } from "./real-approval.js";
|
|
@@ -19,7 +21,9 @@ import { egressText, egressThrownText } from "./untrusted-egress.js";
|
|
|
19
21
|
import { assertNoRetiredKeys, assertNoRetiredToolPolicyKeys, RETIRED_DECISION_MEMBERS, RETIRED_TOOL_POLICY_KEYS } from "./retired-keys.js";
|
|
20
22
|
import { DECISION_MEMBER_ARMS, isEngineRefusal, nestedRecordsOf, receiveContract, receiveNestedRecords, refusedOutOfContract, screenContractValues } from "./decision-receipt.js";
|
|
21
23
|
export { isEngineRefusal } from "./decision-receipt.js";
|
|
22
|
-
import {
|
|
24
|
+
import { isCoveringRuleName, ruleNameCovers } from "./namespaced-rule-name.js";
|
|
25
|
+
import { ruleContentOf } from "./permission-rule-model.js";
|
|
26
|
+
import { grantWildcardRefusalOf } from "./tool-name-aliases.js";
|
|
23
27
|
import { ruleSpellingOf } from "./permission-rule-syntax.js";
|
|
24
28
|
import { protocolOf } from "./protocol-table.js";
|
|
25
29
|
import { anchorSpelling, isAbsoluteForFamily, normalizeAbsPathLexically, pathFamilyOf, writeTargetPath } from "../tools/fs/safety.js";
|
|
@@ -35,75 +39,7 @@ export function exemptRootsSeat(exemptRoots) {
|
|
|
35
39
|
function settledByNobody(kind) {
|
|
36
40
|
return { kind, who: { party: "none" }, when: Date.now() };
|
|
37
41
|
}
|
|
38
|
-
|
|
39
|
-
settlement: "answer",
|
|
40
|
-
origin: "answer",
|
|
41
|
-
classes: "answer",
|
|
42
|
-
inputDigest: "answer",
|
|
43
|
-
classifierCause: "classifierCause",
|
|
44
|
-
classifierRound: "classifierRound",
|
|
45
|
-
unresolvableCause: "unresolvableCause",
|
|
46
|
-
foldedClasses: "foldedClasses",
|
|
47
|
-
pathDenial: "pathDenial",
|
|
48
|
-
bindingRefusal: "bindingRefusal",
|
|
49
|
-
};
|
|
50
|
-
const ATTESTATION_MEMBERS = Object.keys(ATTESTATION_GROUP_OF);
|
|
51
|
-
const groupLead = (g) => ATTESTATION_MEMBERS.find((k) => ATTESTATION_GROUP_OF[k] === g);
|
|
52
|
-
const ENGINE_ATTESTATIONS = new WeakSet();
|
|
53
|
-
function detachedMember(v) {
|
|
54
|
-
if (Array.isArray(v))
|
|
55
|
-
return Object.freeze([...v]);
|
|
56
|
-
if (typeof v !== "object" || v === null)
|
|
57
|
-
return v;
|
|
58
|
-
return Object.freeze(Object.fromEntries(Object.entries(v).map(([k, x]) => [k, typeof x === "object" && x !== null ? Object.freeze(Array.isArray(x) ? [...x] : { ...x }) : x])));
|
|
59
|
-
}
|
|
60
|
-
export function mintAttestation(call, members) {
|
|
61
|
-
const record = { toolCallId: call.toolCallId, toolName: call.toolName };
|
|
62
|
-
for (const k of ATTESTATION_MEMBERS)
|
|
63
|
-
if (members[k] !== undefined)
|
|
64
|
-
record[k] = detachedMember(members[k]);
|
|
65
|
-
const minted = Object.freeze(record);
|
|
66
|
-
ENGINE_ATTESTATIONS.add(minted);
|
|
67
|
-
return minted;
|
|
68
|
-
}
|
|
69
|
-
export function isEngineAttestation(v) {
|
|
70
|
-
return typeof v === "object" && v !== null && ENGINE_ATTESTATIONS.has(v);
|
|
71
|
-
}
|
|
72
|
-
const boundTo = (r, call) => isEngineAttestation(r) && r.toolCallId === call.toolCallId && r.toolName === call.toolName ? r : undefined;
|
|
73
|
-
export function attestationOf(d, call) {
|
|
74
|
-
if (typeof d !== "object" || d === null)
|
|
75
|
-
return undefined;
|
|
76
|
-
return boundTo(Object.getOwnPropertyDescriptor(d, "attestation")?.value, call);
|
|
77
|
-
}
|
|
78
|
-
export function mergeAttestation(call, earlier, later, scope = "all") {
|
|
79
|
-
const a = boundTo(earlier, call);
|
|
80
|
-
const b = boundTo(later, call);
|
|
81
|
-
if (a === undefined)
|
|
82
|
-
return b;
|
|
83
|
-
const members = {};
|
|
84
|
-
if (b !== undefined)
|
|
85
|
-
for (const k of ATTESTATION_MEMBERS)
|
|
86
|
-
if (b[k] !== undefined)
|
|
87
|
-
members[k] = b[k];
|
|
88
|
-
let filled = false;
|
|
89
|
-
for (const g of new Set(Object.values(ATTESTATION_GROUP_OF))) {
|
|
90
|
-
if ((scope === "answer" && g !== "answer") || members[groupLead(g)] !== undefined || a[groupLead(g)] === undefined)
|
|
91
|
-
continue;
|
|
92
|
-
for (const k of ATTESTATION_MEMBERS)
|
|
93
|
-
if (ATTESTATION_GROUP_OF[k] === g && a[k] !== undefined)
|
|
94
|
-
members[k] = a[k];
|
|
95
|
-
filled = true;
|
|
96
|
-
}
|
|
97
|
-
if (!filled)
|
|
98
|
-
return b;
|
|
99
|
-
return mintAttestation(call, members);
|
|
100
|
-
}
|
|
101
|
-
export function attest(d, call, members) {
|
|
102
|
-
return withAttestation(d, mergeAttestation(call, attestationOf(d, call), mintAttestation(call, members)));
|
|
103
|
-
}
|
|
104
|
-
export function withAttestation(d, record) {
|
|
105
|
-
return record === undefined ? d : { ...d, attestation: record };
|
|
106
|
-
}
|
|
42
|
+
export { attest, attestationOf, isEngineAttestation, mergeAttestation, mintAttestation, withAttestation } from "./engine-attestation.js";
|
|
107
43
|
const UNASKED_SEAT_SETTLEMENTS = new Set(["task_aborted", "no_approver"]);
|
|
108
44
|
function seatNeverAsked(settlement) {
|
|
109
45
|
return settlement !== undefined && UNASKED_SEAT_SETTLEMENTS.has(settlement.kind);
|
|
@@ -194,11 +130,11 @@ export function toolPolicyWriteGuardRows(policies) {
|
|
|
194
130
|
return undefined;
|
|
195
131
|
return async (at) => (await Promise.all(sources.map((rowsOf) => rowsOf(at)))).flat();
|
|
196
132
|
}
|
|
197
|
-
export function
|
|
198
|
-
return (entries ?? []).filter(
|
|
133
|
+
export function coveringRuleEntries(entries, behavior) {
|
|
134
|
+
return (entries ?? []).filter((entry) => isCoveringRuleName(entry, behavior));
|
|
199
135
|
}
|
|
200
|
-
export function
|
|
201
|
-
return covering.length > 0 && nameListHolds({ has: (name) => covering.some((e) =>
|
|
136
|
+
export function coveringRuleHit(covering, call) {
|
|
137
|
+
return covering.length > 0 && nameListHolds({ has: (name) => covering.some((e) => ruleNameCovers(e, name)) }, call);
|
|
202
138
|
}
|
|
203
139
|
export function projectionToolNames(c) {
|
|
204
140
|
return c.kind === "shell_command" ? { member: "tools", list: c.tools } : { member: "names", list: c.names };
|
|
@@ -207,13 +143,13 @@ export function checkToolPolicyProjection(projection, req) {
|
|
|
207
143
|
const listed = (list) => heldBy("policy.projectionReplay", { has: (n) => list.includes(n) }, req);
|
|
208
144
|
for (const c of projection.components) {
|
|
209
145
|
if (c.kind === "tool_deny") {
|
|
210
|
-
if (listed(c.names) ||
|
|
146
|
+
if (listed(c.names) || coveringRuleHit(coveringRuleEntries(c.names, "deny"), req)) {
|
|
211
147
|
return { action: "deny", message: `tool "${req.toolName}" is denied by a frozen inherited policy projection` };
|
|
212
148
|
}
|
|
213
149
|
continue;
|
|
214
150
|
}
|
|
215
151
|
if (c.kind === "tool_allowlist") {
|
|
216
|
-
if (!listed(c.names) && !
|
|
152
|
+
if (!listed(c.names) && !coveringRuleHit(coveringRuleEntries(c.names, "allow"), req)) {
|
|
217
153
|
return { action: "deny", message: `tool "${req.toolName}" is not in a frozen inherited policy projection's allowlist` };
|
|
218
154
|
}
|
|
219
155
|
continue;
|
|
@@ -288,6 +224,12 @@ const HOOK_SEAM_UNREAD = new Set(["decisionReason"]);
|
|
|
288
224
|
const HOOK_SEAM_OPTIONAL = new Set(["action"]);
|
|
289
225
|
const HOOK_RECEIPTS = new WeakSet();
|
|
290
226
|
const ENGINE_RECEIPTS = new WeakSet();
|
|
227
|
+
function askOfAnotherCall(d, call) {
|
|
228
|
+
if (call === undefined || d.action !== "ask" || d.attestation === undefined || attestationOf(d, call) !== undefined)
|
|
229
|
+
return undefined;
|
|
230
|
+
return refusedOutOfContract(`a permission decision asks with the engine's record of another call — what the engine found about that call's question is not this call's; ` +
|
|
231
|
+
`a policy answers the call it is asked about (a cached or relayed ask is asked again); denied fail-closed rather than reading the findings as absent`);
|
|
232
|
+
}
|
|
291
233
|
export function refuseOutOfContractDecision(d, opts) {
|
|
292
234
|
const hookSeam = opts?.reasonIsNonInput === true;
|
|
293
235
|
if (hookSeam && (d === null || d === undefined || Object.is(d, false)))
|
|
@@ -296,7 +238,7 @@ export function refuseOutOfContractDecision(d, opts) {
|
|
|
296
238
|
return refusedOutOfContract(`a permission decision's "action" is absent (the decision is ${d === null || d === undefined ? String(d) : `a ${typeof d}`}, not an object) — the closed set is allow/deny/ask; denied fail-closed rather than reading a word outside it as an allow`);
|
|
297
239
|
}
|
|
298
240
|
if ((hookSeam ? HOOK_RECEIPTS : ENGINE_RECEIPTS).has(d) || isEngineRefusal(d))
|
|
299
|
-
return d;
|
|
241
|
+
return askOfAnotherCall(d, opts?.call) ?? d;
|
|
300
242
|
const decision = receiveContract(d, hookSeam ? HOOK_RESULT_MEMBERS : DECISION_MEMBERS, "", RETIRED_DECISION_MEMBERS);
|
|
301
243
|
if (decision.kind === "refused")
|
|
302
244
|
return decision.refused;
|
|
@@ -311,13 +253,9 @@ export function refuseOutOfContractDecision(d, opts) {
|
|
|
311
253
|
: `a permission decision carries an "attestation" the engine did not mint — the member is an engine record (who settled the call, ` +
|
|
312
254
|
`which question it answered); denied fail-closed rather than reading a caller's value as a settlement`);
|
|
313
255
|
}
|
|
314
|
-
const
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
return refusedOutOfContract(`a permission decision carries "foldedAskClasses" that no policy fold of the engine attested on it — the member is ` +
|
|
318
|
-
`engine-written (combinePolicies records the classes of the asks it collapsed); denied fail-closed rather than letting a ` +
|
|
319
|
-
`class no station judged reach the class derivation`);
|
|
320
|
-
}
|
|
256
|
+
const foreign = askOfAnotherCall({ action: contract.action, attestation }, opts?.call);
|
|
257
|
+
if (foreign !== undefined)
|
|
258
|
+
return foreign;
|
|
321
259
|
if (hookSeam && contract.additionalContext !== undefined && typeof contract.additionalContext !== "string") {
|
|
322
260
|
return refusedOutOfContract(`a PreToolUse hook result's "additionalContext" is not a string — the member is the text appended for the model; denied fail-closed rather than rendering a value this layer cannot classify`);
|
|
323
261
|
}
|
|
@@ -375,81 +313,75 @@ export function toolPolicyNameSets(p) {
|
|
|
375
313
|
const sets = p?.nameSets;
|
|
376
314
|
return Array.isArray(sets) ? sets : [];
|
|
377
315
|
}
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
const
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
const
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
const
|
|
388
|
-
if (
|
|
389
|
-
const
|
|
390
|
-
|
|
391
|
-
const malformed = suffix.length === 0 || sep === 0 || (sep > 0 && suffix.length === sep + 2);
|
|
392
|
-
if (malformed) {
|
|
393
|
-
const family = ns.id.toUpperCase();
|
|
394
|
-
const lesson = `a malformed ${family} tool name (empty peer or tool segment) — it can never match any mounted tool. ` +
|
|
395
|
-
`Use \`${ns.prefix}<peer>\` for every tool of a peer, or \`${ns.prefix}<peer>__<tool>\` for one tool.`;
|
|
396
|
-
invalid.push({ entry, list, message: `"${entry}" is ${lesson}`, lesson });
|
|
397
|
-
continue;
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
const spelled = ruleSpellingOf(entry);
|
|
401
|
-
if (spelled === undefined) {
|
|
402
|
-
const lesson = `a spelling no tool name can have — the rule syntax reads no tool name in it, so a name set never names a tool by it. Fix the entry.`;
|
|
316
|
+
function screenToolNameList(entries, list, behavior, invalid) {
|
|
317
|
+
if (entries === undefined)
|
|
318
|
+
return undefined;
|
|
319
|
+
const kept = [];
|
|
320
|
+
const seen = new Set();
|
|
321
|
+
for (const entry of entries) {
|
|
322
|
+
const ns = protocolOf(entry);
|
|
323
|
+
if (ns !== undefined) {
|
|
324
|
+
const suffix = entry.slice(ns.prefix.length);
|
|
325
|
+
const sep = suffix.indexOf("__");
|
|
326
|
+
if (suffix.length === 0 || sep === 0 || (sep > 0 && suffix.length === sep + 2)) {
|
|
327
|
+
const lesson = `a malformed ${ns.id.toUpperCase()} tool name (empty peer or tool segment) — it can never match any mounted tool. ` +
|
|
328
|
+
`Use \`${ns.prefix}<peer>\` for every tool of a peer, or \`${ns.prefix}<peer>__<tool>\` for one tool.`;
|
|
403
329
|
invalid.push({ entry, list, message: `"${entry}" is ${lesson}`, lesson });
|
|
404
330
|
continue;
|
|
405
331
|
}
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
seen.add(spelled.toolName);
|
|
415
|
-
kept.push(spelled.toolName);
|
|
416
|
-
}
|
|
417
|
-
continue;
|
|
418
|
-
}
|
|
332
|
+
}
|
|
333
|
+
const spelled = ruleSpellingOf(entry);
|
|
334
|
+
if (spelled === undefined) {
|
|
335
|
+
const lesson = `a spelling no tool name can have — the rule syntax reads no tool name in it, so a name set never names a tool by it. Fix the entry.`;
|
|
336
|
+
invalid.push({ entry, list, message: `"${entry}" is ${lesson}`, lesson });
|
|
337
|
+
continue;
|
|
338
|
+
}
|
|
339
|
+
if (ruleContentOf(spelled) !== undefined) {
|
|
419
340
|
const lesson = `a rule CONTENT form, not a tool name — a name set matches raw tool names, so this entry ` +
|
|
420
341
|
`can never match any mounted tool (in an allow list it removes the tool entirely). Use the tool NAME here, ` +
|
|
421
342
|
`and route the narrowing through the lane that speaks this grammar: parameter rules via ` +
|
|
422
343
|
`createPermissionRulePolicy, Bash command prefixes via the persisted allow-rule lane.`;
|
|
423
344
|
invalid.push({ entry, list, message: `"${entry}" is ${lesson}`, lesson });
|
|
345
|
+
continue;
|
|
424
346
|
}
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
if ((
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
const group = byLesson.get(i.lesson) ?? [];
|
|
434
|
-
group.push({ entry: i.entry, list: i.list });
|
|
435
|
-
byLesson.set(i.lesson, group);
|
|
436
|
-
}
|
|
437
|
-
const e = new Error(`createAllowDenyPolicy: ${invalid.length} entr${invalid.length === 1 ? "y is" : "ies are"} not tool name(s):\n` +
|
|
438
|
-
[...byLesson.entries()]
|
|
439
|
-
.map(([lesson, group]) => ` Each of the following is ${lesson}\n` + group.map((g) => ` [${g.list}] "${g.entry}"`).join("\n"))
|
|
440
|
-
.join("\n"));
|
|
441
|
-
e.code = "config.invalid_tool_name_set";
|
|
442
|
-
e.issues = invalid;
|
|
443
|
-
throw e;
|
|
347
|
+
const wild = behavior === "allow" ? grantWildcardRefusalOf(spelled.toolName) : undefined;
|
|
348
|
+
if (wild !== undefined) {
|
|
349
|
+
invalid.push({ entry, list, message: `"${entry}": ${wild}`, lesson: wild });
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
if (!seen.has(spelled.toolName)) {
|
|
353
|
+
seen.add(spelled.toolName);
|
|
354
|
+
kept.push(spelled.toolName);
|
|
444
355
|
}
|
|
356
|
+
}
|
|
357
|
+
return kept;
|
|
358
|
+
}
|
|
359
|
+
function toolNameSetRefusal(who, invalid) {
|
|
360
|
+
const byLesson = new Map();
|
|
361
|
+
for (const i of invalid)
|
|
362
|
+
byLesson.set(i.lesson, [...(byLesson.get(i.lesson) ?? []), { entry: i.entry, list: i.list }]);
|
|
363
|
+
const e = new Error(`${who}: ${invalid.length} entr${invalid.length === 1 ? "y is" : "ies are"} not tool name(s):\n` +
|
|
364
|
+
[...byLesson.entries()].map(([lesson, group]) => ` Each of the following is ${lesson}\n` + group.map((g) => ` [${g.list}] "${g.entry}"`).join("\n")).join("\n"));
|
|
365
|
+
e.code = "config.invalid_tool_name_set";
|
|
366
|
+
e.issues = invalid;
|
|
367
|
+
return e;
|
|
368
|
+
}
|
|
369
|
+
export function createAllowDenyPolicy(opts) {
|
|
370
|
+
assertNoRetiredKeys(opts, RETIRED_ALLOW_DENY_POLICY_OPTIONS, "createAllowDenyPolicy");
|
|
371
|
+
const invalid = [];
|
|
372
|
+
const screenedAllow = screenToolNameList(opts.allow, "allow", "allow", invalid);
|
|
373
|
+
const screenedDeny = screenToolNameList(opts.deny, "deny", "deny", invalid);
|
|
374
|
+
if (invalid.length > 0) {
|
|
375
|
+
if ((opts.onInvalidName ?? "throw") === "throw")
|
|
376
|
+
throw toolNameSetRefusal("createAllowDenyPolicy", invalid);
|
|
445
377
|
for (const issue of invalid)
|
|
446
378
|
opts.onInvalidNameIssue?.(issue);
|
|
447
379
|
}
|
|
448
380
|
opts = { ...opts, ...(screenedAllow ? { allow: screenedAllow } : {}), ...(screenedDeny ? { deny: screenedDeny } : {}) };
|
|
449
381
|
const allow = opts.allow ? new Set(opts.allow) : undefined;
|
|
450
382
|
const deny = new Set(opts.deny ?? []);
|
|
451
|
-
const denyCovering =
|
|
452
|
-
const allowCovering =
|
|
383
|
+
const denyCovering = coveringRuleEntries(opts.deny, "deny");
|
|
384
|
+
const allowCovering = coveringRuleEntries(opts.allow, "allow");
|
|
453
385
|
return {
|
|
454
386
|
projection: {
|
|
455
387
|
components: [
|
|
@@ -460,10 +392,10 @@ export function createAllowDenyPolicy(opts) {
|
|
|
460
392
|
},
|
|
461
393
|
nameSets: [{ ...(opts.allow ? { allow: [...opts.allow] } : {}), ...(opts.deny ? { deny: [...opts.deny] } : {}) }],
|
|
462
394
|
check(req) {
|
|
463
|
-
if (nameListHolds(deny, req) ||
|
|
395
|
+
if (nameListHolds(deny, req) || coveringRuleHit(denyCovering, req)) {
|
|
464
396
|
return { action: "deny", message: `tool "${req.toolName}" is denied by policy` };
|
|
465
397
|
}
|
|
466
|
-
if (allow && !nameListHolds(allow, req) && !
|
|
398
|
+
if (allow && !nameListHolds(allow, req) && !coveringRuleHit(allowCovering, req)) {
|
|
467
399
|
return { action: "deny", message: `tool "${req.toolName}" is not in the allowlist` };
|
|
468
400
|
}
|
|
469
401
|
return ALLOW;
|
|
@@ -480,12 +412,21 @@ export function createApprovalPolicy(opts) {
|
|
|
480
412
|
if (opts.approvalTimeoutMs !== undefined && opts.approvalTimeoutMs > 2_147_483_647) {
|
|
481
413
|
throw new Error(`createApprovalPolicy: approvalTimeoutMs must not exceed 2147483647ms (~24.8 days) (got ${opts.approvalTimeoutMs}) — a host timer truncates a larger delay and fires immediately, denying every request at once; omit it to wait indefinitely`);
|
|
482
414
|
}
|
|
415
|
+
const invalid = [];
|
|
416
|
+
const requireApproval = screenToolNameList(opts.requireApproval, "requireApproval", "ask", invalid) ?? [];
|
|
417
|
+
const denied = screenToolNameList(opts.deny, "deny", "deny", invalid);
|
|
418
|
+
const autoAllow = screenToolNameList(opts.autoAllow, "autoAllow", "allow", invalid);
|
|
419
|
+
if (opts.denyByDefault === true)
|
|
420
|
+
screenToolNameList(requireApproval, "requireApproval", "allow", invalid);
|
|
421
|
+
if (invalid.length > 0)
|
|
422
|
+
throw toolNameSetRefusal("createApprovalPolicy", invalid);
|
|
423
|
+
opts = { ...opts, requireApproval, ...(denied !== undefined ? { deny: denied } : {}), ...(autoAllow !== undefined ? { autoAllow } : {}) };
|
|
483
424
|
const need = new Set(opts.requireApproval);
|
|
484
425
|
const deny = new Set(opts.deny ?? []);
|
|
485
426
|
const auto = new Set(opts.autoAllow ?? []);
|
|
486
|
-
const needCovering =
|
|
487
|
-
const denyCovering =
|
|
488
|
-
const autoCovering =
|
|
427
|
+
const needCovering = coveringRuleEntries(opts.requireApproval, "ask");
|
|
428
|
+
const denyCovering = coveringRuleEntries(opts.deny, "deny");
|
|
429
|
+
const autoCovering = coveringRuleEntries(opts.autoAllow, "allow");
|
|
489
430
|
return {
|
|
490
431
|
projection: {
|
|
491
432
|
components: [
|
|
@@ -502,10 +443,10 @@ export function createApprovalPolicy(opts) {
|
|
|
502
443
|
},
|
|
503
444
|
],
|
|
504
445
|
async check(req, signal) {
|
|
505
|
-
if (nameListHolds(deny, req) ||
|
|
446
|
+
if (nameListHolds(deny, req) || coveringRuleHit(denyCovering, req)) {
|
|
506
447
|
return { action: "deny", message: `tool "${req.toolName}" is denied by policy` };
|
|
507
448
|
}
|
|
508
|
-
if (nameListHolds(need, req) ||
|
|
449
|
+
if (nameListHolds(need, req) || coveringRuleHit(needCovering, req)) {
|
|
509
450
|
const attestOver = (inputDigest) => (d, settlement, bindingRefusal) => ({ ...d, attestation: mintAttestation(req, { settlement, origin: "policy", ...(inputDigest !== undefined ? { inputDigest } : {}), ...(bindingRefusal !== undefined ? { bindingRefusal } : {}) }) });
|
|
510
451
|
const unasked = unaskedSeatAnswer(req, signal, { aborted: `approval aborted for "${req.toolName}" (run or turn interrupted)`, unreachable: `approval for "${req.toolName}" was not requested: nobody can be asked about this call` }, "policy");
|
|
511
452
|
if (unasked !== undefined)
|
|
@@ -568,7 +509,7 @@ export function createApprovalPolicy(opts) {
|
|
|
568
509
|
}
|
|
569
510
|
return attest({ action: "deny", message: `approval denied for "${req.toolName}"` }, settledByDecider("person", "refused", undefined));
|
|
570
511
|
}
|
|
571
|
-
if (nameListHolds(auto, req) ||
|
|
512
|
+
if (nameListHolds(auto, req) || coveringRuleHit(autoCovering, req))
|
|
572
513
|
return ALLOW;
|
|
573
514
|
if (opts.denyByDefault) {
|
|
574
515
|
return { action: "deny", message: `tool "${req.toolName}" requires explicit allow` };
|
|
@@ -612,7 +553,6 @@ export function combinePolicies(...policies) {
|
|
|
612
553
|
let asked;
|
|
613
554
|
let current = Object.freeze({ ...req });
|
|
614
555
|
let rewrite;
|
|
615
|
-
let records;
|
|
616
556
|
let ruleAskText;
|
|
617
557
|
let probeMandateSeen = false;
|
|
618
558
|
let mandateSeen = false;
|
|
@@ -620,25 +560,64 @@ export function combinePolicies(...policies) {
|
|
|
620
560
|
let noRulingSeen;
|
|
621
561
|
let authoredBySeen = false;
|
|
622
562
|
const contributors = [];
|
|
623
|
-
const
|
|
563
|
+
const decisions = [];
|
|
564
|
+
const recordsExcept = (at) => decisions.reduce((acc, d, j) => (j !== at && d?.action === "allow" && d.attestation !== undefined ? mergeAttestation(req, acc, d.attestation) : acc), undefined);
|
|
565
|
+
const settleDeny = (d, at) => {
|
|
624
566
|
const out = rewrite !== undefined ? refusalOf(d, current.args) : d;
|
|
567
|
+
const records = recordsExcept(at);
|
|
625
568
|
if (records === undefined)
|
|
626
569
|
return out;
|
|
627
570
|
return { ...out, attestation: mergeAttestation(req, records, d.attestation) };
|
|
628
571
|
};
|
|
629
572
|
let seatDeny;
|
|
630
|
-
|
|
631
|
-
|
|
573
|
+
const denied = (d, at) => {
|
|
574
|
+
decisions[at] = undefined;
|
|
575
|
+
if (!seatNeverAsked(attestationOf(d, current)?.settlement))
|
|
576
|
+
return settleDeny(d, at);
|
|
577
|
+
seatDeny ??= settleDeny(d, at);
|
|
578
|
+
return undefined;
|
|
579
|
+
};
|
|
580
|
+
let emitter = -1;
|
|
581
|
+
let personWrote = false;
|
|
582
|
+
for (const [at, p] of policies.entries()) {
|
|
583
|
+
const d = refuseOutOfContractDecision(await p.check(current, signal), { call: req });
|
|
632
584
|
if (d.action === "deny") {
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
585
|
+
const ended = denied(d, at);
|
|
586
|
+
if (ended !== undefined)
|
|
587
|
+
return ended;
|
|
636
588
|
continue;
|
|
637
589
|
}
|
|
638
|
-
|
|
590
|
+
decisions[at] = d;
|
|
591
|
+
if (readRejudge(current, current.args, d).kind === "rewritten") {
|
|
592
|
+
if (personWrote)
|
|
593
|
+
return settleDeny({ action: "deny", message: `${editRewrittenSentence(req.toolName)}, which a later policy layer wrote over a person's edit — denied fail-closed` }, at);
|
|
639
594
|
current = Object.freeze(await withArgsReading(current, d.updatedInput, signal));
|
|
640
595
|
rewrite = d;
|
|
596
|
+
emitter = at;
|
|
597
|
+
personWrote = attestationOf(d, current)?.settlement?.who.party === "person" && answeredFor(d, req, current.args);
|
|
641
598
|
}
|
|
599
|
+
}
|
|
600
|
+
for (let at = 0; at < emitter; at++) {
|
|
601
|
+
const p = policies[at];
|
|
602
|
+
const d = refuseOutOfContractDecision(await p.check(current, signal), { call: req });
|
|
603
|
+
if (d.action === "deny") {
|
|
604
|
+
const ended = denied(d, at);
|
|
605
|
+
if (ended !== undefined)
|
|
606
|
+
return ended;
|
|
607
|
+
continue;
|
|
608
|
+
}
|
|
609
|
+
if (readRejudge(current, current.args, d).kind === "rewritten")
|
|
610
|
+
return settleDeny({ action: "deny", message: rewriteChasedSentence(req.toolName) }, at);
|
|
611
|
+
const { updatedInput: _sameBytes, ...asIs } = d;
|
|
612
|
+
const first = decisions[at];
|
|
613
|
+
decisions[at] = asIs.action === "allow" && first?.action === "allow" && first.attestation !== undefined ? withAttestation(asIs, mergeAttestation(req, first.attestation, asIs.attestation)) : asIs;
|
|
614
|
+
}
|
|
615
|
+
if (seatDeny !== undefined)
|
|
616
|
+
return seatDeny;
|
|
617
|
+
let records;
|
|
618
|
+
for (const d of decisions) {
|
|
619
|
+
if (d === undefined)
|
|
620
|
+
continue;
|
|
642
621
|
if (d.action === "allow" && d.attestation !== undefined)
|
|
643
622
|
records = mergeAttestation(req, records, d.attestation);
|
|
644
623
|
if (d.action === "ask" && (asked === undefined || (d.requiresRealApproval === true && asked.requiresRealApproval !== true))) {
|
|
@@ -660,8 +639,6 @@ export function combinePolicies(...policies) {
|
|
|
660
639
|
if (d.action === "ask")
|
|
661
640
|
contributors.push(d);
|
|
662
641
|
}
|
|
663
|
-
if (seatDeny !== undefined)
|
|
664
|
-
return seatDeny;
|
|
665
642
|
if (asked) {
|
|
666
643
|
const merged = rewrite?.updatedInput;
|
|
667
644
|
const withRuleAsk = ruleAskText !== undefined && asked.matchedAskRule === undefined ? { ...asked, matchedAskRule: ruleAskText } : asked;
|
|
@@ -670,16 +647,15 @@ export function combinePolicies(...policies) {
|
|
|
670
647
|
const withFallback = fallbackSeen !== undefined && withMandate.denialLimitFallback === undefined ? { ...withMandate, denialLimitFallback: fallbackSeen, requiresRealApproval: true } : withMandate;
|
|
671
648
|
const withNoRuling = noRulingSeen !== undefined && withFallback.classifierNoRuling === undefined ? { ...withFallback, classifierNoRuling: noRulingSeen, requiresRealApproval: true } : withFallback;
|
|
672
649
|
const withAuthor = authoredBySeen && withNoRuling.authoredBy === undefined ? { ...withNoRuling, authoredBy: "deployment" } : withNoRuling;
|
|
673
|
-
const folded = new Set(
|
|
650
|
+
const folded = new Set(attestationOf(asked, req)?.foldedClasses ?? []);
|
|
674
651
|
for (const c of contributors)
|
|
675
652
|
if (c !== asked)
|
|
676
|
-
for (const k of decisionAskClassesOf(c))
|
|
653
|
+
for (const k of decisionAskClassesOf(c, req))
|
|
677
654
|
folded.add(k);
|
|
678
655
|
if (withNoRuling !== withMandate)
|
|
679
|
-
for (const k of decisionAskClassesOf(asked))
|
|
656
|
+
for (const k of decisionAskClassesOf(asked, req))
|
|
680
657
|
folded.add(k);
|
|
681
|
-
const
|
|
682
|
-
const out = merged !== undefined ? { ...withClasses, updatedInput: merged } : withClasses;
|
|
658
|
+
const out = merged !== undefined ? { ...withAuthor, updatedInput: merged } : withAuthor;
|
|
683
659
|
return folded.size > 0 ? attest(out, req, { foldedClasses: [...folded] }) : out;
|
|
684
660
|
}
|
|
685
661
|
const allowed = rewrite ?? ALLOW;
|
|
@@ -756,17 +732,17 @@ export function createUnverifiableDeletePolicy(opts) {
|
|
|
756
732
|
if (typeof command !== "string")
|
|
757
733
|
return ALLOW;
|
|
758
734
|
const removal = removalReadingOf(command, req, opts?.removalSeat, safeRoots);
|
|
759
|
-
return removal === undefined ? ALLOW : removal.judge(signal).then((found) => (found === undefined ? ALLOW : removalAsk(found.guard, found.text)));
|
|
735
|
+
return removal === undefined ? ALLOW : removal.judge(signal).then((found) => (found === undefined ? ALLOW : removalAsk(req, found.guard, found.text)));
|
|
760
736
|
},
|
|
761
737
|
}, "external_authority");
|
|
762
738
|
}
|
|
763
|
-
function removalAsk(guard, text) {
|
|
739
|
+
function removalAsk(req, guard, text) {
|
|
764
740
|
const messages = {
|
|
765
741
|
dangerous_delete: `Dangerous removal: ${text}. No permission mode, allow rule or classifier clears this — only a person confirming this call does.`,
|
|
766
742
|
unverifiable_delete: `Unverifiable recursive delete (fail-closed unless cleared): ${text}. Re-run the delete with the resolved literal path written into the command itself (or assign the variable a literal path in the same command, e.g. \`DIR=/exact/path; rm -rf "$DIR"\`) so the target can be verified.`,
|
|
767
|
-
unverifiable_shell_text: `Unverifiable shell text (fail-closed unless cleared): ${text}
|
|
743
|
+
unverifiable_shell_text: `Unverifiable shell text (fail-closed unless cleared): ${text}.`,
|
|
768
744
|
};
|
|
769
|
-
return { action: "ask", decisionReason: "safety", requiresRealApproval: true,
|
|
745
|
+
return attest({ action: "ask", decisionReason: "safety", requiresRealApproval: true, message: messages[guard] }, req, { guards: [guard] });
|
|
770
746
|
}
|
|
771
747
|
function pathSegments(p) {
|
|
772
748
|
return p.split(/[\\/]/).filter(Boolean);
|
|
@@ -835,16 +811,15 @@ export function createTranscriptIntegrityPolicy(opts) {
|
|
|
835
811
|
}
|
|
836
812
|
return false;
|
|
837
813
|
};
|
|
838
|
-
const askReason = (what) => ({
|
|
814
|
+
const askReason = (req, what) => attest({
|
|
839
815
|
action: "ask",
|
|
840
816
|
decisionReason: "safety",
|
|
841
817
|
requiresRealApproval: true,
|
|
842
|
-
guards: ["transcript_write"],
|
|
843
818
|
message: `Session-transcript write (fail-closed unless cleared): ${what}. Session transcripts (the .jsonl files ` +
|
|
844
819
|
`under the agent data dir's sessions/ directory) are harness-written session state, not agent working ` +
|
|
845
820
|
`files — modifying or deleting them tampers with the run's own audit trail. Reading them (ls/cat/grep ` +
|
|
846
821
|
`as a single simple command) is fine.`,
|
|
847
|
-
});
|
|
822
|
+
}, req, { guards: ["transcript_write"] });
|
|
848
823
|
return brandPolicyAskClass({
|
|
849
824
|
check(req) {
|
|
850
825
|
if (shellToolsListHolds(shellTools, req)) {
|
|
@@ -858,7 +833,7 @@ export function createTranscriptIntegrityPolicy(opts) {
|
|
|
858
833
|
const parsed = parseLeadingCommandName(command);
|
|
859
834
|
if ("name" in parsed && readAllow.has(parsed.name))
|
|
860
835
|
return ALLOW;
|
|
861
|
-
return askReason("name" in parsed
|
|
836
|
+
return askReason(req, "name" in parsed
|
|
862
837
|
? `\`${parsed.name}\` is not a read-only command${cwdInsideProtected ? " and the shell's working directory is inside the transcript directory" : ""}`
|
|
863
838
|
: cwdInsideProtected
|
|
864
839
|
? "the shell's working directory is inside the transcript directory and this is not a single read-only command (fail-closed)"
|
|
@@ -868,7 +843,7 @@ export function createTranscriptIntegrityPolicy(opts) {
|
|
|
868
843
|
if (writeTarget !== undefined && writeTarget.access !== "read") {
|
|
869
844
|
const p = writeTargetPath(req);
|
|
870
845
|
if (typeof p === "string" && inProtectedDir(p, req.cwd)) {
|
|
871
|
-
return askReason(`"${p}" is inside the session-transcript directory`);
|
|
846
|
+
return askReason(req, `"${p}" is inside the session-transcript directory`);
|
|
872
847
|
}
|
|
873
848
|
}
|
|
874
849
|
return ALLOW;
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*
|
|
11
11
|
* Layer-0 vocabulary: depends on the leaf catalog and the face vocabulary only.
|
|
12
12
|
*/
|
|
13
|
-
import { type ToolCallPathTarget, type ToolCatalogEntry, type ToolFamily, type ToolMountTag, type ToolPathAccess } from "./tool-face.js";
|
|
13
|
+
import { type ToolCallPathTarget, type ToolCatalogEntry, type ToolFamily, type ToolHostTarget, type ToolMountTag, type ToolPathAccess } from "./tool-face.js";
|
|
14
14
|
/** The whole static catalog, one frozen row per definition (design/388 §2.1 `describeToolCatalog()`).
|
|
15
15
|
* Replaces the retired name-keyed exports `HAND_TOOL_EFFECTS` / `DEFAULT_BUDGET_EXEMPT_TOOLS` /
|
|
16
16
|
* `COMPACTABLE_TOOLS`: filter this instead (`e.mountedBy.includes("hands")`, `e.face.budgetExempt`,
|
|
@@ -68,6 +68,8 @@ export declare function rosterCanPersistMemory(tools: ReadonlyArray<PersistenceP
|
|
|
68
68
|
export declare function persistenceCandidateToolNames(): string[];
|
|
69
69
|
/** A-8 — every definition that names a path target at all (read or write): the file-tool glob lane. */
|
|
70
70
|
export declare function pathTargetingToolNames(): ReadonlySet<string>;
|
|
71
|
+
/** Every definition that names a host target (the URL its call reaches): the names a host rule is written for. */
|
|
72
|
+
export declare function hostTargetingToolNames(): ReadonlySet<string>;
|
|
71
73
|
/**
|
|
72
74
|
* The SHELL FACE: every definition whose `command` argument is a shell command line the command grammar judges (today the two
|
|
73
75
|
* `Bash` definitions and `Monitor`). A `Bash(<command>)` rule reaches a call that answers to any of these names; the coarse
|
|
@@ -117,6 +119,7 @@ export interface ToolCallLike {
|
|
|
117
119
|
args: unknown;
|
|
118
120
|
face?: {
|
|
119
121
|
pathTarget?: ToolCallPathTarget;
|
|
122
|
+
hostTarget?: ToolHostTarget;
|
|
120
123
|
names?: readonly string[];
|
|
121
124
|
} | undefined;
|
|
122
125
|
}
|
|
@@ -165,13 +168,17 @@ export declare function isDeclaredWrite(call: ToolCallLike): boolean;
|
|
|
165
168
|
* records nothing (retired spellings in persisted transcripts read the frozen history table at the call site). */
|
|
166
169
|
export declare function fileOpAccessOf(name: string): ToolPathAccess | undefined;
|
|
167
170
|
export declare function pathTargetOf(name: string): ToolCatalogEntry["face"]["pathTarget"];
|
|
171
|
+
/** The host target a wire name's catalog definition declares (the URL slot a host rule of that name is read on), the
|
|
172
|
+
* {@link pathTargetOf} of the host face: the first definition under the name that declares one. */
|
|
173
|
+
export declare function hostTargetOf(name: string): ToolCatalogEntry["face"]["hostTarget"];
|
|
168
174
|
/**
|
|
169
|
-
* The rule vocabulary of a wire name from the STATIC catalog
|
|
170
|
-
* the path target's `param` + aliases; `params` =
|
|
171
|
-
*
|
|
172
|
-
*
|
|
173
|
-
*
|
|
174
|
-
*
|
|
175
|
+
* The rule vocabulary of a wire name from the STATIC catalog, over every definition the name (or an alias) answers to:
|
|
176
|
+
* `primaryParams` = the first definition's declared primaries, else its path target's `param` + aliases; `params` = every
|
|
177
|
+
* definition's declared vocabulary, else its path target's names, primaries included — UNDEFINED when no definition
|
|
178
|
+
* under the name declares one (StructuredOutput: its schema is each task's), whose face then names no parameter at all.
|
|
179
|
+
* A definition whose schema is built inside its factory declares its FULLEST mount's vocabulary; a mounted instance's
|
|
180
|
+
* is the roster's, read off the schema it carries (`ruleFaceOfInstance`). `undefined` as a whole for a name the
|
|
181
|
+
* catalog does not carry.
|
|
175
182
|
*/
|
|
176
183
|
export declare function catalogRuleFaceOf(name: string): {
|
|
177
184
|
primaryParams: string[];
|
|
@@ -55,6 +55,9 @@ export function persistenceCandidateToolNames() {
|
|
|
55
55
|
export function pathTargetingToolNames() {
|
|
56
56
|
return names((e) => e.face.pathTarget !== undefined);
|
|
57
57
|
}
|
|
58
|
+
export function hostTargetingToolNames() {
|
|
59
|
+
return names((e) => e.face.hostTarget !== undefined);
|
|
60
|
+
}
|
|
58
61
|
const onShellFace = (e) => e.face.ruleFace?.grammar === "command";
|
|
59
62
|
export function shellFaceToolNames() {
|
|
60
63
|
return names(onShellFace);
|
|
@@ -125,18 +128,25 @@ export function pathTargetOf(name) {
|
|
|
125
128
|
return e.face.pathTarget;
|
|
126
129
|
return undefined;
|
|
127
130
|
}
|
|
131
|
+
export function hostTargetOf(name) {
|
|
132
|
+
for (const e of TOOL_CATALOG_ENTRIES)
|
|
133
|
+
if (e.name === name && e.face.hostTarget !== undefined)
|
|
134
|
+
return e.face.hostTarget;
|
|
135
|
+
return undefined;
|
|
136
|
+
}
|
|
128
137
|
export function catalogRuleFaceOf(name) {
|
|
138
|
+
let face;
|
|
129
139
|
for (const e of TOOL_CATALOG_ENTRIES) {
|
|
130
|
-
if (e.name !== name)
|
|
140
|
+
if (e.name !== name && !(e.face.aliases ?? []).includes(name))
|
|
131
141
|
continue;
|
|
132
142
|
const pt = e.face.pathTarget;
|
|
133
|
-
const
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
143
|
+
const target = pt !== undefined ? [pt.param, ...(pt.aliases ?? [])] : undefined;
|
|
144
|
+
const primary = e.face.ruleFace?.primaryParams ?? target ?? [];
|
|
145
|
+
const declared = e.face.ruleFace?.params ?? target;
|
|
146
|
+
const params = declared === undefined ? face?.params : [...new Set([...(face?.params ?? []), ...declared, ...primary])];
|
|
147
|
+
face = { primaryParams: face?.primaryParams ?? [...primary], ...(params !== undefined ? { params } : {}) };
|
|
138
148
|
}
|
|
139
|
-
return
|
|
149
|
+
return face;
|
|
140
150
|
}
|
|
141
151
|
export function handBandEffects() {
|
|
142
152
|
const out = new Map();
|