@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
|
@@ -224,6 +224,9 @@ export interface UnreadableOrgRow {
|
|
|
224
224
|
readonly rule: string;
|
|
225
225
|
readonly code: RuleRejectCode;
|
|
226
226
|
readonly detail?: string;
|
|
227
|
+
/** The rule spelling a row that is no rule spelling only because of white space (a tab, a no-break space) is a blank away from — the
|
|
228
|
+
* text to republish it as; the row itself is still read as unreadable (one spelling reader, fail-closed). */
|
|
229
|
+
readonly respelling?: string;
|
|
227
230
|
readonly behavior: "deny" | "ask";
|
|
228
231
|
readonly reach: OrgRowReach;
|
|
229
232
|
}
|
|
@@ -327,8 +330,9 @@ export declare function unenforceableOrgRules(rules: readonly OrgPermissionRule[
|
|
|
327
330
|
rule: string;
|
|
328
331
|
code: RuleRejectCode;
|
|
329
332
|
}>;
|
|
330
|
-
/** The reason an unreadable row's verdict carries — its place in the snapshot, its code, and the repair
|
|
331
|
-
|
|
333
|
+
/** The reason an unreadable row's verdict carries — its place in the snapshot, its code, and the repair: for a row that is no rule
|
|
334
|
+
* spelling only because of white space (a tab, a no-break space), its text and the spelling to republish it as. */
|
|
335
|
+
export declare function unreadableOrgRowReason(row: Pick<UnreadableOrgRow, "index" | "code" | "detail" | "rule" | "respelling">): string;
|
|
332
336
|
/** The ONE clause for an org verdict that carries an `unreadable` reason — a rule the call could not be read against, or
|
|
333
337
|
* a row this layer cannot read — on a refusal and on a question alike. */
|
|
334
338
|
export declare function orgUnreadableClause(reason: string): string;
|
|
@@ -284,12 +284,13 @@ function orgStateCopyOf(state) {
|
|
|
284
284
|
function readOrgRow(row, index) {
|
|
285
285
|
const { rule: text, behavior: said } = orgRowPolicyOf(row);
|
|
286
286
|
const behavior = said === "ask" ? "ask" : "deny";
|
|
287
|
-
const unreadable = (code, detail) => ({
|
|
287
|
+
const unreadable = (code, detail, respelling) => ({
|
|
288
288
|
kind: "unreadable",
|
|
289
289
|
index,
|
|
290
290
|
rule: typeof text === "string" ? text : text === undefined ? "<unreadable>" : escapeForDisclosure(text),
|
|
291
291
|
code,
|
|
292
292
|
...(detail !== undefined ? { detail } : {}),
|
|
293
|
+
...(respelling !== undefined ? { respelling } : {}),
|
|
293
294
|
behavior,
|
|
294
295
|
reach: reachOfRowHead(text, behavior),
|
|
295
296
|
});
|
|
@@ -299,7 +300,7 @@ function readOrgRow(row, index) {
|
|
|
299
300
|
return unreadable("invalid.grammar", said === undefined ? "no behavior" : `behavior "${escapeForDisclosure(said)}" is not deny or ask`);
|
|
300
301
|
const parsed = parseRuleText(text, said);
|
|
301
302
|
if ("reject" in parsed)
|
|
302
|
-
return unreadable(parsed.reject.code);
|
|
303
|
+
return unreadable(parsed.reject.code, undefined, parsed.reject.respelling);
|
|
303
304
|
if (parsed.rule.tool !== COMMAND_RULE_TOOL)
|
|
304
305
|
return unreadable("unsupported.tool");
|
|
305
306
|
return { kind: "read", index, rule: text, behavior: said, parsed: parsed.rule };
|
|
@@ -355,6 +356,9 @@ function readListedOrgRules(rules) {
|
|
|
355
356
|
return reading;
|
|
356
357
|
}
|
|
357
358
|
export function unreadableOrgRowReason(row) {
|
|
359
|
+
if (row.respelling !== undefined) {
|
|
360
|
+
return `row ${row.index} of the organization snapshot, "${escapeForDisclosure(row.rule)}", is not a rule spelling (${row.code}); republish it as "${escapeForDisclosure(row.respelling)}"`;
|
|
361
|
+
}
|
|
358
362
|
return `row ${row.index} of the organization snapshot is not a rule this layer reads (${row.code}${row.detail !== undefined ? `: ${row.detail}` : ""}); republish it in the shell tool's command grammar`;
|
|
359
363
|
}
|
|
360
364
|
export function orgUnreadableClause(reason) {
|
|
@@ -365,7 +369,7 @@ export function describeUnreadableOrgRows(unreadable, revision) {
|
|
|
365
369
|
return undefined;
|
|
366
370
|
const named = unreadable
|
|
367
371
|
.slice(0, DISCLOSED_UNREADABLE_ROWS)
|
|
368
|
-
.map((u) => `row ${u.index} "${escapeForDisclosure(u.rule)}" (${u.code}${u.detail !== undefined ? `: ${u.detail}` : ""})`)
|
|
372
|
+
.map((u) => `row ${u.index} "${escapeForDisclosure(u.rule)}" (${u.code}${u.detail !== undefined ? `: ${u.detail}` : ""}${u.respelling !== undefined ? `; republish it as "${escapeForDisclosure(u.respelling)}"` : ""})`)
|
|
369
373
|
.join(", ");
|
|
370
374
|
const more = unreadable.length - DISCLOSED_UNREADABLE_ROWS;
|
|
371
375
|
return (`the org snapshot${revision !== undefined ? ` (revision ${escapeForDisclosure(revision)})` : ""} is served DEGRADED: ${unreadable.length} row(s) this layer cannot read — ${named}${more > 0 ? ` and ${more} more` : ""}; ` +
|
|
@@ -35,7 +35,8 @@
|
|
|
35
35
|
* store's, the fence stays the partition's.
|
|
36
36
|
*/
|
|
37
37
|
import type { PersistedRule, RuleScope } from "./permission-rule-model.js";
|
|
38
|
-
import { type DurableRulePartitionProvider, type QuarantinedRuleAdd
|
|
38
|
+
import { type DurableRulePartitionProvider, type QuarantinedRuleAdd } from "./permission-rule-store.js";
|
|
39
|
+
import { type RuleOwner } from "./rule-owner.js";
|
|
39
40
|
import { type OrgRulePartitionConfig, type OrgRuleResolution } from "./permission-rule-org.js";
|
|
40
41
|
import type { SessionRulePartition } from "./permission-rule-session.js";
|
|
41
42
|
import type { StoreDurability, StoreFidelity } from "./checkpoint-store.js";
|
|
@@ -145,7 +146,10 @@ export interface PermissionRuleStoreProvider {
|
|
|
145
146
|
* provider: an absent principal resolves to zero personal rules, and a provider that forgot it would hand one person's
|
|
146
147
|
* standing approvals to an anonymous task. The ONE exception is an explicitly declared LOCAL-OWNER deployment, where "no
|
|
147
148
|
* principal" is the typed absence of identity — the machine owner's own bucket (a provider with no such face resolves
|
|
148
|
-
* the anonymous store; {@link createPermissionRuleLanes} refuses that declaration loudly).
|
|
149
|
+
* the anonymous store; {@link createPermissionRuleLanes} refuses that declaration loudly). "No principal" is ABSENCE only —
|
|
150
|
+
* `undefined`, and the empty string the engine has always spelled the same ({@link readPrincipal}). A principal that was provided
|
|
151
|
+
* and is not a name (white space, an invisible or control character) is a bad value and is refused here: read as absence it
|
|
152
|
+
* would be the machine owner's bucket on a local-owner deployment.
|
|
149
153
|
*/
|
|
150
154
|
export declare function ownerStoreOf(provider: PermissionRuleStoreProvider, principal: string | undefined, localOwnerDeclared: boolean): PermissionRuleStore;
|
|
151
155
|
/** What {@link createPermissionRuleStoreProvider} composes. */
|
|
@@ -1,17 +1,39 @@
|
|
|
1
|
-
import { escapeForDisclosure } from "./permission-rule-model.js";
|
|
1
|
+
import { escapeForDisclosure, isRuleBehavior, parseRuleText } from "./permission-rule-model.js";
|
|
2
2
|
import { PERMISSION_RULE_WRITER, errText, isValidDurableScope, normalizePersistedRule, sameRuleIdentity, writerOf, } from "./permission-rule-store.js";
|
|
3
|
+
import { readRuleOwner } from "./rule-owner.js";
|
|
4
|
+
import { readPrincipal } from "./principal-name.js";
|
|
3
5
|
import { UNGOVERNED_ORG_RESOLUTION, compileOrgShadowPredicate, createOrgRulePartition } from "./permission-rule-org.js";
|
|
4
6
|
export function ruleSourceOf(scope) {
|
|
5
7
|
return scope.kind === "global" ? "user" : scope.kind;
|
|
6
8
|
}
|
|
7
9
|
export function ownerStoreOf(provider, principal, localOwnerDeclared) {
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
+
const reading = readPrincipal(principal);
|
|
11
|
+
if (reading.kind === "invalid") {
|
|
12
|
+
throw new Error(`the principal given is not a principal name (got ${reading.fault}) — refusing to resolve a bucket for it; a provided value that names nobody is not "no principal"`);
|
|
13
|
+
}
|
|
14
|
+
if (reading.kind === "name")
|
|
15
|
+
return provider.forPrincipal(reading.name);
|
|
16
|
+
return localOwnerDeclared && provider.forLocalOwner !== undefined ? provider.forLocalOwner() : provider.forPrincipal(undefined);
|
|
10
17
|
}
|
|
11
18
|
function usableSessionId(sessionId) {
|
|
12
19
|
return typeof sessionId === "string" && sessionId !== "" ? sessionId : undefined;
|
|
13
20
|
}
|
|
14
21
|
const EMPTY_DURABLE = { rules: [], tombstones: [], rev: 0 };
|
|
22
|
+
function durableReadOf(settled) {
|
|
23
|
+
if (!settled.ok)
|
|
24
|
+
return settled;
|
|
25
|
+
for (const [kind, rows] of [["rule", settled.v.rules], ["tombstone", settled.v.tombstones]]) {
|
|
26
|
+
const at = rows.findIndex((r) => !isRuleBehavior(r?.behavior));
|
|
27
|
+
if (at < 0)
|
|
28
|
+
continue;
|
|
29
|
+
const row = rows[at];
|
|
30
|
+
return {
|
|
31
|
+
ok: false,
|
|
32
|
+
e: new Error(`the persisted rule partition served a ${kind} row (#${at}, ${escapeForDisclosure(row?.rule)}) whose behavior word ${escapeForDisclosure(row?.behavior)} is outside deny/ask/allow — whether it refuses a call is unknown, so the partition is read as one that could not be read`),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return settled;
|
|
36
|
+
}
|
|
15
37
|
export function createPermissionRuleStoreProvider(cfg) {
|
|
16
38
|
if (cfg === null || typeof cfg !== "object") {
|
|
17
39
|
throw new Error("createPermissionRuleStoreProvider takes a config object naming the partitions to compose");
|
|
@@ -61,7 +83,7 @@ class UnifiedPermissionRuleStore {
|
|
|
61
83
|
const disclosures = [];
|
|
62
84
|
const [orgSettled, durableSettled, sessionRows] = await Promise.all([
|
|
63
85
|
this.org !== undefined ? this.org.resolve() : Promise.resolve({ ...UNGOVERNED_ORG_RESOLUTION, rules: [], disclosures: [] }),
|
|
64
|
-
this.durable !== undefined ? this.durable.list().then((v) => ({ ok: true, v }), (e) => ({ ok: false, e })) : Promise.resolve({ ok: true, v: EMPTY_DURABLE }),
|
|
86
|
+
this.durable !== undefined ? this.durable.list().then((v) => durableReadOf({ ok: true, v }), (e) => ({ ok: false, e })) : Promise.resolve({ ok: true, v: EMPTY_DURABLE }),
|
|
65
87
|
this.readSessionRows(usableSessionId(query?.sessionId), disclosures),
|
|
66
88
|
]);
|
|
67
89
|
const orgResolution = orgSettled;
|
|
@@ -106,7 +128,7 @@ class UnifiedPermissionRuleStore {
|
|
|
106
128
|
const served = structuredClone(await this.session.read(sessionId));
|
|
107
129
|
const rows = served.filter((r) => {
|
|
108
130
|
const scope = r?.scope;
|
|
109
|
-
return scope?.kind === "session" && scope.sessionId === sessionId && !("reject" in normalizePersistedRule(r));
|
|
131
|
+
return scope?.kind === "session" && scope.sessionId === sessionId && (!("reject" in normalizePersistedRule(r)) || ((r.behavior === "deny" || r.behavior === "ask") && "reject" in parseRuleText(r.rule, r.behavior)));
|
|
110
132
|
});
|
|
111
133
|
if (rows.length < served.length) {
|
|
112
134
|
disclosures.push(`the session rule partition served ${served.length - rows.length} row(s) that are not canonical session rows of this session — dropped, not adjudicated`);
|
|
@@ -157,8 +179,17 @@ export async function effectivePermissionRules(opts) {
|
|
|
157
179
|
return await resolveOwnerStore(opts).effective(opts.sessionId !== undefined ? { sessionId: opts.sessionId } : undefined);
|
|
158
180
|
}
|
|
159
181
|
export function resolveOwnerStore(opts) {
|
|
160
|
-
|
|
161
|
-
|
|
182
|
+
const owner = opts.owner === undefined ? undefined : readRuleOwner(opts.owner);
|
|
183
|
+
if (opts.owner !== undefined && owner === undefined) {
|
|
184
|
+
throw new Error("the owner given is neither a principal nor the local owner (a principal owner names a principal name) — refusing to resolve a bucket nobody can name");
|
|
185
|
+
}
|
|
186
|
+
const given = readPrincipal(opts.principal);
|
|
187
|
+
if (given.kind === "invalid") {
|
|
188
|
+
throw new Error(`the principal given is not a principal name (got ${given.fault}) — pass a verified principal, the local owner, or neither; a provided value that names nobody is not "no principal"`);
|
|
189
|
+
}
|
|
190
|
+
const principal = given.kind === "name" ? given.name : undefined;
|
|
191
|
+
if (owner?.kind === "local-owner") {
|
|
192
|
+
if (principal !== undefined) {
|
|
162
193
|
throw new Error("pass either a principal or a local-owner, not both — a bucket has one owner");
|
|
163
194
|
}
|
|
164
195
|
const store = opts.provider.forLocalOwner?.();
|
|
@@ -167,9 +198,8 @@ export function resolveOwnerStore(opts) {
|
|
|
167
198
|
}
|
|
168
199
|
return store;
|
|
169
200
|
}
|
|
170
|
-
if (
|
|
171
|
-
throw new Error(`contradictory identity: principal "${escapeForDisclosure(
|
|
201
|
+
if (owner?.kind === "principal" && principal !== undefined && owner.principal !== principal) {
|
|
202
|
+
throw new Error(`contradictory identity: principal "${escapeForDisclosure(principal)}" and owner principal "${escapeForDisclosure(owner.principal)}" disagree`);
|
|
172
203
|
}
|
|
173
|
-
|
|
174
|
-
return opts.provider.forPrincipal(principal);
|
|
204
|
+
return opts.provider.forPrincipal(owner?.kind === "principal" ? owner.principal : principal);
|
|
175
205
|
}
|
|
@@ -45,7 +45,7 @@ import type { PersistedRule, RuleAdd, RuleDot, RuleScope, RuleTombstone } from "
|
|
|
45
45
|
import { type RuleBehavior } from "./permission-rule-model.js";
|
|
46
46
|
import type { RuleSyncDropReason, RuleQuarantineReason } from "./governance-codes.js";
|
|
47
47
|
import type { StoreDurability, StoreFidelity } from "./checkpoint-store.js";
|
|
48
|
-
import type
|
|
48
|
+
import { type RuleOwner } from "./rule-owner.js";
|
|
49
49
|
/** One store read: the rules as persisted, their tombstones, and the revision they were read at. */
|
|
50
50
|
export interface StoredRules {
|
|
51
51
|
/** Rules with their FULL add sets — tombstoned dots already removed by the backend on read. */
|
|
@@ -56,6 +56,14 @@ export interface StoredRules {
|
|
|
56
56
|
/** Integrity fingerprint the backend computed, when it has one. Corruption detection only. */
|
|
57
57
|
checksum?: string;
|
|
58
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* The code a refusal carries when the rules a face reads — a bucket at rest, a rule-sync state on the wire — are stamped
|
|
61
|
+
* with a rule grammar later than this engine reads: a newer engine wrote them. Every face refuses them whole with it (the
|
|
62
|
+
* read face, a write's read of its base, a sync round's local read and its response), so a caller tells "an engine that
|
|
63
|
+
* reads that grammar reads them" from a damaged store, whose refusal carries no code. The person's rules are then one
|
|
64
|
+
* partition that cannot be read: every call is asked about until a read succeeds.
|
|
65
|
+
*/
|
|
66
|
+
export declare const PERMISSION_RULES_LATER_GRAMMAR_CODE = "permission_rules.later_grammar";
|
|
59
67
|
/**
|
|
60
68
|
* The durable partition's read face: read-only, already anchored to a single owner. Rows carry the two
|
|
61
69
|
* durable scopes only (`global` = the `user` source, `project` = the `project` source); a session row
|
|
@@ -64,6 +72,13 @@ export interface StoredRules {
|
|
|
64
72
|
* A backend that fails to read must not silently report an empty set as if it were an empty store — it
|
|
65
73
|
* throws, and the store's caller turns that into zero rules PLUS a loud disclosure. Both outcomes deny
|
|
66
74
|
* more than they allow; only one of them is honest about why.
|
|
75
|
+
*
|
|
76
|
+
* A backend keeps ONE rule grammar stamp per bucket: every write stamps this engine's grammar
|
|
77
|
+
* (`SESSION_RULES_GRAMMAR`), and every read — of the read face and of a write's base — judges the stamp
|
|
78
|
+
* through `readRuleGrammarStamp` (absent = this engine's grammar, a bucket written before the stamp): a later
|
|
79
|
+
* grammar is a bucket this engine cannot read, refused whole with {@link PERMISSION_RULES_LATER_GRAMMAR_CODE},
|
|
80
|
+
* never read row by row (a row a newer grammar wrote reads as nothing here, and a deny that reads as nothing
|
|
81
|
+
* refuses nothing).
|
|
67
82
|
*/
|
|
68
83
|
export interface DurableRulePartition {
|
|
69
84
|
list(): Promise<StoredRules>;
|
|
@@ -78,31 +93,8 @@ export interface DurableRulePartition {
|
|
|
78
93
|
/** Declared serialization fidelity, same doctrine as the other store families. */
|
|
79
94
|
readonly fidelity?: StoreFidelity;
|
|
80
95
|
}
|
|
81
|
-
/**
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
* Identity absence is spelled as a distinct union member, never as a sentinel string flowing through
|
|
85
|
-
* `forPrincipal` — every consumer of a principal string is an identity surface, and a made-up name on an
|
|
86
|
-
* identity surface is indistinguishable from a real one downstream. Cloud sync and cloud tickets accept
|
|
87
|
-
* ONLY the `principal` kind: syncing is an authenticated act, and a local-owner bucket has no cloud home
|
|
88
|
-
* until it is adopted (`adoptFilePermissionRuleStore`).
|
|
89
|
-
*/
|
|
90
|
-
export type RuleOwner = {
|
|
91
|
-
kind: "principal";
|
|
92
|
-
principal: string;
|
|
93
|
-
} | {
|
|
94
|
-
kind: "local-owner";
|
|
95
|
-
};
|
|
96
|
-
/** The owner discriminants as a value: the `kind` words of {@link RuleOwner}, both directions fenced at compile time
|
|
97
|
-
* ({@link RuleOwnerKindsCoverEveryArm} / {@link RuleOwnerArmsCoverEveryKind}). */
|
|
98
|
-
export declare const RULE_OWNER_KINDS: readonly ["principal", "local-owner"];
|
|
99
|
-
/** Compile fence: an arm whose `kind` is not in {@link RULE_OWNER_KINDS} turns the argument into that word. */
|
|
100
|
-
export type RuleOwnerKindsCoverEveryArm = AssertAllKeysHandled<Exclude<RuleOwner["kind"], (typeof RULE_OWNER_KINDS)[number]>>;
|
|
101
|
-
/** Compile fence, the other direction: a word in {@link RULE_OWNER_KINDS} that no arm carries. */
|
|
102
|
-
export type RuleOwnerArmsCoverEveryKind = AssertAllKeysHandled<Exclude<(typeof RULE_OWNER_KINDS)[number], RuleOwner["kind"]>>;
|
|
103
|
-
/** Do two owners name the same bucket? */
|
|
104
|
-
export declare function sameRuleOwner(a: RuleOwner, b: RuleOwner): boolean;
|
|
105
|
-
/** Resolves one owner's durable partition. `undefined` ⇒ a partition that reports zero rules. This is
|
|
96
|
+
/** Resolves one owner's durable partition. `undefined` — or anything that is not a principal name
|
|
97
|
+
* (`principalNameOf`: the empty and the blank string included) ⇒ a partition that reports zero rules. This is
|
|
106
98
|
* the BACKEND contract (file, in-memory, an out-of-repo SQL twin); the engine never consumes it
|
|
107
99
|
* directly — `createPermissionRuleStoreProvider({ durable })` composes it into the unified store. */
|
|
108
100
|
export interface DurableRulePartitionProvider {
|
|
@@ -497,6 +489,10 @@ export declare function normalizePersistedRule(r: PersistedRule): {
|
|
|
497
489
|
reject: Extract<RuleSyncDropReason, "invalid_rule_text" | "metadata_mismatch">;
|
|
498
490
|
};
|
|
499
491
|
/** The normalization half exposed for the DISCLOSURE layer: which records a join would refuse, and why.
|
|
492
|
+
*
|
|
493
|
+
* It reads a state in THIS engine's grammar: the doors that hand it one — a backend's read of its bucket, the sync
|
|
494
|
+
* client's read of a response — refuse a state stamped later whole first ({@link PERMISSION_RULES_LATER_GRAMMAR_CODE}),
|
|
495
|
+
* so a row it refuses is damage to drop or quarantine, never a newer grammar's rule read as nothing.
|
|
500
496
|
*
|
|
501
497
|
* design/382 §4.3 — this screen carries the SESSION member of the durable face on every JOIN leg
|
|
502
498
|
* (inbound state, local state, both sides of the pure join): a rule or tombstone row carrying a
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { randomBytes } from "node:crypto";
|
|
2
2
|
import { canonicalize } from "./canonical-json.js";
|
|
3
3
|
import { escapeForDisclosure, isRuleBehavior, isRuleLive, parseRuleText } from "./permission-rule-model.js";
|
|
4
|
+
import { readRuleOwner } from "./rule-owner.js";
|
|
4
5
|
import { thrownText } from "./thrown-value.js";
|
|
5
6
|
import { validatePath } from "./effective-path-target.js";
|
|
6
|
-
export const
|
|
7
|
-
export function sameRuleOwner(a, b) {
|
|
8
|
-
return a.kind === "principal" ? b.kind === "principal" && a.principal === b.principal : b.kind === "local-owner";
|
|
9
|
-
}
|
|
7
|
+
export const PERMISSION_RULES_LATER_GRAMMAR_CODE = "permission_rules.later_grammar";
|
|
10
8
|
export function isRuleRevision(rev) {
|
|
11
9
|
return typeof rev === "number" && Number.isSafeInteger(rev) && rev >= 0;
|
|
12
10
|
}
|
|
@@ -513,6 +511,10 @@ async function readRuleLiveness(store, identity) {
|
|
|
513
511
|
}
|
|
514
512
|
}
|
|
515
513
|
const REMOVE_MAX_ATTEMPTS = 8;
|
|
514
|
+
const NO_TARGET_OWNER = "the principal given is neither a principal name (a string with a visible character, no control or separator character, and no format character but a joiner) nor an owner (a principal owner names a principal name; the local owner is { kind: \"local-owner\" })";
|
|
515
|
+
function persistedRuleTargetOwner(target) {
|
|
516
|
+
return readRuleOwner(typeof target === "string" ? { kind: "principal", principal: target } : target);
|
|
517
|
+
}
|
|
516
518
|
export async function removePersistedRule(opts) {
|
|
517
519
|
const behavior = opts.behavior;
|
|
518
520
|
const rule = opts.rule;
|
|
@@ -522,7 +524,9 @@ export async function removePersistedRule(opts) {
|
|
|
522
524
|
return { status: "failed", error: `removePersistedRule: behavior ${escapeForDisclosure(behavior)} is not one of ${["deny", "ask", "allow"].join("/")} — refusing to name a rule identity nothing can carry`, committed: "no" };
|
|
523
525
|
}
|
|
524
526
|
const identity = { behavior, rule, scope };
|
|
525
|
-
const owner =
|
|
527
|
+
const owner = persistedRuleTargetOwner(target);
|
|
528
|
+
if (owner === undefined)
|
|
529
|
+
return { status: "failed", error: `removePersistedRule: ${NO_TARGET_OWNER} — refusing to remove from a bucket nobody can name`, committed: "no" };
|
|
526
530
|
const provider = opts.provider;
|
|
527
531
|
if (scope?.kind === "session") {
|
|
528
532
|
return {
|
|
@@ -689,7 +693,9 @@ export async function addPersistedRule(opts) {
|
|
|
689
693
|
if ("reject" in parsed)
|
|
690
694
|
return { status: "failed", error: `addPersistedRule: ${parsed.reject.code}: ${parsed.reject.message}`, committed: "no" };
|
|
691
695
|
const identity = { behavior, rule: parsed.rule.rule, scope };
|
|
692
|
-
const owner =
|
|
696
|
+
const owner = persistedRuleTargetOwner(target);
|
|
697
|
+
if (owner === undefined)
|
|
698
|
+
return { status: "failed", error: `addPersistedRule: ${NO_TARGET_OWNER} — refusing to write into a bucket nobody can name`, committed: "no" };
|
|
693
699
|
const provider = opts.provider;
|
|
694
700
|
if (owner.kind === "local-owner" && provider.forLocalOwner === undefined) {
|
|
695
701
|
return { status: "failed", error: "this provider has no local-owner bucket (forLocalOwner is not implemented) — a local-owner rule cannot be added through it", committed: "no" };
|
|
@@ -27,7 +27,8 @@
|
|
|
27
27
|
*/
|
|
28
28
|
import type { PersistedRule, RuleBehavior, RuleDot, RuleRejectCode, RuleScope, RuleTombstone } from "./permission-rule-model.js";
|
|
29
29
|
import type { PermissionRuleStoreProvider } from "./permission-rule-provider.js";
|
|
30
|
-
import type { RuleOwner
|
|
30
|
+
import type { RuleOwner } from "./rule-owner.js";
|
|
31
|
+
import type { RuleSyncDrop, RuleSyncFrontier, RuleSyncState } from "./permission-rule-store.js";
|
|
31
32
|
import { type TracerHook } from "./trace.js";
|
|
32
33
|
/** The injected HTTP seam — core never bundles a fetch. The deployment owns base URL, auth, TLS and
|
|
33
34
|
* retries; a non-2xx / network failure should THROW (the round then aborts with zero local effects —
|
|
@@ -43,6 +44,9 @@ export interface RuleSyncRequestBody {
|
|
|
43
44
|
replica: string;
|
|
44
45
|
state: RuleSyncState;
|
|
45
46
|
observedVector?: RuleSyncFrontier;
|
|
47
|
+
/** The rule grammar this engine reads and writes the state's rows in (`SESSION_RULES_GRAMMAR`) — a twin whose grammar is
|
|
48
|
+
* earlier refuses the whole request, as this client refuses a response stamped later. */
|
|
49
|
+
grammar: number;
|
|
46
50
|
}
|
|
47
51
|
/** The wire response (server twin: join its persisted state with the request state, answer the whole
|
|
48
52
|
* merged form). `gcFrontier` is the COLLECTED watermark (§5.1) — absent in v2.0 by protocol. */
|
|
@@ -58,6 +62,10 @@ export interface RuleSyncResponseBody {
|
|
|
58
62
|
dot: RuleDot;
|
|
59
63
|
reason: string;
|
|
60
64
|
}>;
|
|
65
|
+
/** The rule grammar the merged state's rows are written in. A grammar later than this engine's refuses the whole round
|
|
66
|
+
* (`PERMISSION_RULES_LATER_GRAMMAR_CODE`): read in this engine's grammar, a newer grammar's row reads as nothing, and a
|
|
67
|
+
* deny among them would be dropped as damage. Absent: a twin that predates the member, read in this engine's. */
|
|
68
|
+
grammar?: number;
|
|
61
69
|
}
|
|
62
70
|
export interface PermissionRuleSyncResult {
|
|
63
71
|
/** True ⟺ the round landed with zero drops, zero quarantines and zero warnings. */
|
|
@@ -154,7 +162,8 @@ interface ParsedRuleSyncResponse {
|
|
|
154
162
|
}
|
|
155
163
|
/**
|
|
156
164
|
* Parse one wire response. Envelope violations (missing/mistyped principal, echo mismatch, no merged
|
|
157
|
-
* state, an unparseable frontier) THROW — a protocol error aborts
|
|
165
|
+
* state, an unparseable frontier, a grammar stamp this engine cannot read) THROW — a protocol error aborts
|
|
166
|
+
* the round with zero local effects.
|
|
158
167
|
* ENTRY-level violations degrade per §4.3: an unshapeable rule/add is skipped with a warning (it never
|
|
159
168
|
* reaches the local disk); an unshapeable tombstone is surfaced as `undefined` so the caller's
|
|
160
169
|
* tighten-only partitioning withholds the round's adds. Unknown keys never flow anywhere — every field
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { escapeForDisclosure, isRuleBehavior, parseRuleText, RULE_ADD_ORIGINS } from "./permission-rule-model.js";
|
|
2
|
-
import {
|
|
2
|
+
import { principalNameOf } from "./principal-name.js";
|
|
3
|
+
import { PERMISSION_RULES_LATER_GRAMMAR_CODE, applyTombstones, errText, isProjectScopeRoot, joinFrontiers, joinRuleStates, normalizePersistedRule, readRuleWriteOutcome, ruleSyncVector, sameRuleIdentity, screenRuleSyncState, writerOf, } from "./permission-rule-store.js";
|
|
3
4
|
import { emitTrace } from "./trace.js";
|
|
5
|
+
import { SESSION_RULES_GRAMMAR, readRuleGrammarStamp } from "./session-policy-store.js";
|
|
4
6
|
export const PERMISSION_RULE_SYNC_PATH = "/v1/permission-rules/sync";
|
|
5
7
|
export const LOCAL_OWNER_UNSYNCABLE_CODE = "permission_rules.local_owner_unsyncable";
|
|
6
8
|
function refuseLocalOwnerSync() {
|
|
@@ -22,8 +24,8 @@ export async function syncPermissionRules(opts) {
|
|
|
22
24
|
throw new Error(`contradictory identity: principal "${escapeForDisclosure(principal)}" and owner principal "${escapeForDisclosure(owner.principal)}" disagree`);
|
|
23
25
|
}
|
|
24
26
|
}
|
|
25
|
-
if (
|
|
26
|
-
throw new Error("syncPermissionRules requires a verified principal — an unauthenticated deployment has no cloud bucket to sync");
|
|
27
|
+
if (principalNameOf(principal) === undefined) {
|
|
28
|
+
throw new Error("syncPermissionRules requires a verified principal — an unauthenticated deployment has no cloud bucket to sync (a blank name, or one holding a control, separator or invisible format character, is not a principal)");
|
|
27
29
|
}
|
|
28
30
|
const traceClock = opts.now ?? Date.now;
|
|
29
31
|
const disclose = (result) => {
|
|
@@ -64,6 +66,7 @@ export async function syncPermissionRules(opts) {
|
|
|
64
66
|
replica: raw.actor,
|
|
65
67
|
state: { rules: raw.rules, tombstones: raw.tombstones },
|
|
66
68
|
...(raw.observedVector !== undefined ? { observedVector: raw.observedVector } : {}),
|
|
69
|
+
grammar: SESSION_RULES_GRAMMAR,
|
|
67
70
|
};
|
|
68
71
|
const rawResponse = await transport(PERMISSION_RULE_SYNC_PATH, request);
|
|
69
72
|
const response = parseRuleSyncResponse(rawResponse, principal);
|
|
@@ -310,6 +313,11 @@ export function parseRuleSyncResponse(raw, expectedPrincipal) {
|
|
|
310
313
|
if (echoedPrincipal !== expectedPrincipal) {
|
|
311
314
|
throw new Error(`the sync response echoes principal "${escapeForDisclosure(echoedPrincipal)}" but this round synced "${escapeForDisclosure(expectedPrincipal)}" — the transport is wired to the wrong bucket; refusing the whole round`);
|
|
312
315
|
}
|
|
316
|
+
const grammar = readRuleGrammarStamp(r.grammar, SESSION_RULES_GRAMMAR, { rules: "the sync response's rules", held: "rows" });
|
|
317
|
+
if ("got" in grammar) {
|
|
318
|
+
const refusal = new Error(`${grammar.sentence} — refusing the whole round, nothing landed`);
|
|
319
|
+
throw grammar.later === true ? Object.assign(refusal, { code: PERMISSION_RULES_LATER_GRAMMAR_CODE }) : refusal;
|
|
320
|
+
}
|
|
313
321
|
const merged = r.merged;
|
|
314
322
|
const mergedRules = merged?.rules;
|
|
315
323
|
const mergedTombstones = merged?.tombstones;
|
|
@@ -29,10 +29,11 @@ export declare function lastIndexOfUnescaped(s: string, ch: string): number;
|
|
|
29
29
|
*/
|
|
30
30
|
export declare function parsePermissionRule(rule: string): ParsedPermissionRule;
|
|
31
31
|
/**
|
|
32
|
-
* Can a rule name this tool name — is it the rule syntax's name head ({@link RULE_TOOL_NAME})
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
32
|
+
* Can a rule name this tool name — is it the rule syntax's name head ({@link RULE_TOOL_NAME}) with no `*` in it? A `*` makes a
|
|
33
|
+
* spelling a glob over names, not a name: a tool whose name held one would be reached by every rule whose glob matches it and
|
|
34
|
+
* could never be named on its own (the reference's mount spelling holds no `*` either). The mount contract for every name a
|
|
35
|
+
* caller tool answers to (its name and each alias), so each one is a name every list can write; a protocol-minted name
|
|
36
|
+
* (`<ns>__<peer>__<tool>`, segments in `[A-Za-z0-9_-]`) is always one.
|
|
36
37
|
*/
|
|
37
38
|
export declare function isNameableToolName(name: string): boolean;
|
|
38
39
|
/**
|
|
@@ -36,9 +36,9 @@ export function parsePermissionRule(rule) {
|
|
|
36
36
|
return { toolName: name.trim() };
|
|
37
37
|
return { toolName: name.trim(), ruleContent: unescapeRuleContent(content) };
|
|
38
38
|
}
|
|
39
|
-
const RULE_TOOL_NAME = /^
|
|
39
|
+
const RULE_TOOL_NAME = /^[A-Za-z0-9_*](?:[A-Za-z0-9_.:*-]*[A-Za-z0-9_*-])?$/;
|
|
40
40
|
export function isNameableToolName(name) {
|
|
41
|
-
return typeof name === "string" && name
|
|
41
|
+
return typeof name === "string" && !name.includes("*") && RULE_TOOL_NAME.test(name);
|
|
42
42
|
}
|
|
43
43
|
export function ruleSpellingOf(rule) {
|
|
44
44
|
if (rule !== rule.trim())
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* design/127 — **参数级权限规则 DSL**(
|
|
2
|
+
* design/127 — **参数级权限规则 DSL**(追平批 γ)。声明式规则字符串 → {@link ToolPolicy}
|
|
3
3
|
* 编译器:`"Tool"`(裸)/ `"Tool(param:pattern)"`(参数级,`*` 通配全串锚定)。CC ground truth
|
|
4
4
|
* 行号级:解析 `Lh` :55214 · 通配 `ZMr` :55196 · 参数级 matcher `gnn` :595123 · 评估序 `G1e` :595272。
|
|
5
5
|
*
|
|
@@ -46,11 +46,21 @@
|
|
|
46
46
|
*
|
|
47
47
|
* The NAME lane is the same shape for the tools of `NAME_RULE_FACES` (the `Skill` tool): a `Skill(<name>)` / `Skill(<prefix>:*)`
|
|
48
48
|
* deny or ask — the reference's own spelling — compiles through the same validator (the model's name grammar) and is judged on the
|
|
49
|
-
* one string the call names (`nameRuleSubjectOf`) with `
|
|
49
|
+
* one string the call names (`nameRuleSubjectOf`) with `nameRuleReach`, the predicate the persisted rule store uses. The parameter
|
|
50
50
|
* spelling `Skill(skill:<name>)` those tools used to take is retired: refused loudly, its sentence naming the CC form. A KEYED
|
|
51
51
|
* value tool (`Artifact(action:<word>)`) takes the same lane for content keyed by its own parameter (`nameGrammarReads`); its
|
|
52
|
-
* other arguments stay on the generic `param:pattern` lane.
|
|
53
|
-
*
|
|
52
|
+
* other arguments stay on the generic `param:pattern` lane. The delegation tool's `Agent(<subagent_type>)` takes it too, its
|
|
53
|
+
* value and the call's resolved against the agent types the call's face carries (`nameRuleReach`), its other arguments on the
|
|
54
|
+
* generic lane. A call of a closed-set tool that names no value as the tool reads it is refused by the tool's deny or ask rule
|
|
55
|
+
* (`nameValueAbsentReason`, the persisted lane's reading).
|
|
56
|
+
*
|
|
57
|
+
* The HOST lane is the same shape for a tool name the catalog declares a host target for (the URL its call reaches —
|
|
58
|
+
* `WebFetch`'s `url`): a `WebFetch(domain:<host>)` / `WebFetch(domain:*.<domain>)` deny or ask — the reference's own spelling —
|
|
59
|
+
* compiles through the model's domain grammar and is judged on the host the call reaches (`callHostTargetOf`, the protective
|
|
60
|
+
* reading: the call face's slot, the catalog's for the name as the floor) with `domainRuleAdmits`, the reader a person's stored
|
|
61
|
+
* rows and the entry lists use. Every lane is one dispatch over the rule's name and content (`ruleLaneOf`), so the static
|
|
62
|
+
* compile and a leg's roster compile read every rule the same way. A call whose host cannot be read is refused by a host deny
|
|
63
|
+
* rule and is the fail-closed ask under a host ask rule.
|
|
54
64
|
*
|
|
55
65
|
* 🔴 与 CC 的有意差(design/127 r2):
|
|
56
66
|
* - CC 参数级 generic 道无 allow lane(gnn 只有 deny/ask)—— 我们同样,且整个 policy 无 allow 臂。
|
|
@@ -80,8 +90,8 @@ export interface PermissionRuleIssue {
|
|
|
80
90
|
/** A rule the rule syntax reads no rule in (`ruleSpellingOf`) whose name is the reason: blanks around the rule, a
|
|
81
91
|
* character outside a tool name's spelling (a variation selector, a filler, a zero-width space), a blank or an invisible
|
|
82
92
|
* character before the `(`, a leading `-`. Refused — the lenient reading would deny a tool under another spelling, or none.
|
|
83
|
-
*
|
|
84
|
-
*
|
|
93
|
+
* (A `*` in a tool name is no such spelling: a deny or ask rule reads it as a glob over the whole name, `*` alone as every
|
|
94
|
+
* tool.) */
|
|
85
95
|
| "invalid.tool_name" | "invalid.param_split" | "invalid.primary_field" | "invalid.cap_exceeded"
|
|
86
96
|
/** An ALLOW rule (any spelling): a policy fold says deny / ask only — "this does not need asking" is the allow
|
|
87
97
|
* layer's (`TaskSpec.allowedTools`, `RunnerDeps.allowedTools`). One issue per allow rule. */
|
|
@@ -102,6 +112,11 @@ export interface PermissionRuleIssue {
|
|
|
102
112
|
* is an object/array (a rule on it can never match); the tool is unknown to the resolver a leg
|
|
103
113
|
* supplied (absent resolver ⇒ the catalog alone judges and an unknown tool stays permissive). */
|
|
104
114
|
| "unsupported.param_unknown" | "unsupported.param_non_scalar" | "unsupported.tool_unknown"
|
|
115
|
+
/** A deny/ask name rule whose value the fold lands on SEVERAL of the values the leg's mounted tool declares
|
|
116
|
+
* (`Agent(codereview)` on a leg offering `code-review` and `code_review`): which one it names is not determinable, and a rule
|
|
117
|
+
* is never resolved to one of several — refused when the leg's `ruleFaces` carry the values (without them the rule reaches
|
|
118
|
+
* every such value at the gate). */
|
|
119
|
+
| "invalid.name_ambiguous"
|
|
105
120
|
/** A path-form deny/ask whose spelling needs a base this policy DECLARES as something other than an absolute path
|
|
106
121
|
* of its tree's family (`/x` reads `pathBases.root`; a relative pattern `pathBases.cwd`, else `root`; `~/` `home`)
|
|
107
122
|
* — a bad declared value, refused rather than compiled into a rule that reaches nothing. An undeclared base is no
|
|
@@ -117,8 +132,29 @@ export interface PermissionRuleIssue {
|
|
|
117
132
|
/** HRD-PRM-7: a param-level rule naming a parameter the target tool does not carry. Additive member —
|
|
118
133
|
* the lane that used to compile silently and never match (see {@link FILE_TOOL_PARAMS}). */
|
|
119
134
|
| "unsupported.unknown_param";
|
|
135
|
+
/** What a person can do about the rule — never a construction option of the library: those ride on {@link libraryOption}. */
|
|
120
136
|
message: string;
|
|
137
|
+
/**
|
|
138
|
+
* The engine-side library coordinate this refusal relates to — a name a host program or a spec author holds and a person
|
|
139
|
+
* writing rules does not: a construction option of the compile call (a key of {@link PermissionRulePolicyOptions}, a
|
|
140
|
+
* `pathBases` / `caps` entry spelled `pathBases.<word>` / `caps.<key>`), the allow-list seat of a request or of a deployment
|
|
141
|
+
* (`TaskSpec.allowedTools` / `RunnerDeps.allowedTools`), or the MCP server spec's per-tool declaration (`toolAxes`). Present
|
|
142
|
+
* where the engine offers it as the way out of the refusal, or names it as the declaration the refusal rests on (a rule set
|
|
143
|
+
* over its cap, a declared base that is no path, the list that is no list) — not wherever some other value of an option would
|
|
144
|
+
* happen to change the answer (a resolver that declared more parameters would also make a misspelled one compile; that is not
|
|
145
|
+
* a way out). The sentence never names it, so a host that exposes the coordinate renders it and any other host shows the
|
|
146
|
+
* sentence alone. Minted in one place ({@link ruleIssue}).
|
|
147
|
+
*/
|
|
148
|
+
libraryOption?: {
|
|
149
|
+
name: "primaryFieldGeneric" | "defaultAction" | "ruleFaces" | `pathBases.${keyof PathRuleBases}` | `caps.${keyof PermissionRuleCaps}` | "TaskSpec.allowedTools" | "RunnerDeps.allowedTools" | "toolAxes";
|
|
150
|
+
/** The value that opts in, when the way out is one value (`primaryFieldGeneric` ⇒ `"allow-lexical"`); absent when the option
|
|
151
|
+
* takes the host's own choice (a cap's size, a base's path, the answer for calls no rule reaches). */
|
|
152
|
+
value?: string;
|
|
153
|
+
};
|
|
121
154
|
}
|
|
155
|
+
/** THE mint of a {@link PermissionRuleIssue}: every issue the compiler and the allow-list screen report is made here, so the
|
|
156
|
+
* optional {@link PermissionRuleIssue.libraryOption} is written at one place and an absent one is absent, never `undefined`. */
|
|
157
|
+
export declare function ruleIssue(rule: string, code: PermissionRuleIssue["code"], message: string, libraryOption?: PermissionRuleIssue["libraryOption"]): PermissionRuleIssue;
|
|
122
158
|
export interface PermissionRuleCaps {
|
|
123
159
|
maxRules: number;
|
|
124
160
|
maxRuleLength: number;
|
|
@@ -170,23 +206,25 @@ export interface PermissionRulePolicyOptions {
|
|
|
170
206
|
*/
|
|
171
207
|
pathBases?: PathRuleBases;
|
|
172
208
|
}
|
|
173
|
-
import {
|
|
174
|
-
export {
|
|
209
|
+
import { isCoveringRuleName, ruleNameCovers, wildcardMatch } from "./namespaced-rule-name.js";
|
|
210
|
+
export { isCoveringRuleName, ruleNameCovers, wildcardMatch };
|
|
175
211
|
/**
|
|
176
212
|
* design/388 A-6/7/8/9 (D-3): the per-tool RULE FACE — the parameters a `Tool(param:pattern)` rule may name
|
|
177
213
|
* (`params`, the SCALAR top-level keys ∪ the path target's aliases), the ones the generic lexical matcher must
|
|
178
|
-
* not be pointed at (`primaryParams`)
|
|
179
|
-
*
|
|
180
|
-
*
|
|
181
|
-
*
|
|
214
|
+
* not be pointed at (`primaryParams`) and the carried-but-non-scalar keys a rule can never match (`nonScalar`). Resolved
|
|
215
|
+
* through {@link PermissionRulePolicyOptions.ruleFaces} when a leg supplies its roster, else from the static catalog — the
|
|
216
|
+
* three hand-kept tables (`PRIMARY_FIELDS` / `FILE_TOOLS` / `FILE_TOOL_PARAMS`) this replaced are gone. Which lane a rule
|
|
217
|
+
* takes is not the face's to say: it is the rule's name's grammar (`ruleLaneOf`), the same with or without a resolver.
|
|
182
218
|
*/
|
|
183
219
|
export interface RuleFaceView {
|
|
184
220
|
primaryParams: readonly string[];
|
|
185
|
-
/** The full scalar vocabulary
|
|
186
|
-
*
|
|
221
|
+
/** The full scalar vocabulary. A face that states none declares its `primaryParams` only: a rule naming any other
|
|
222
|
+
* parameter is refused (`unsupported.param_unknown`) — a face never leaves a parameter name unjudged. */
|
|
187
223
|
params?: readonly string[];
|
|
188
224
|
nonScalar?: readonly string[];
|
|
189
|
-
|
|
225
|
+
/** The values the mounted tool takes for the argument its name rules are read against (`ToolRuleFace.nameValues`): with them a
|
|
226
|
+
* name rule whose value the fold lands on several of them is refused at compile (`invalid.name_ambiguous`). */
|
|
227
|
+
nameValues?: readonly string[];
|
|
190
228
|
}
|
|
191
229
|
/** The static catalog's answer for a wire name (undefined ⇒ the catalog does not carry it). */
|
|
192
230
|
export declare function catalogRuleFaceView(toolName: string): RuleFaceView | undefined;
|