@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/roles.js
CHANGED
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
import { selectModel } from "./select-model.js";
|
|
2
|
+
import { namesRoleBase } from "../prompt-assembly/role-base.js";
|
|
3
|
+
import { readPromptRole } from "../prompt-assembly/select.js";
|
|
2
4
|
import { MODEL_ROLES } from "./types.js";
|
|
3
5
|
export { MODEL_ROLES } from "./types.js";
|
|
4
6
|
function catalogModel(ref, models) {
|
|
5
7
|
const m = models != null && (typeof models === "object" || typeof models === "function") && Object.hasOwn(models, ref) ? models[ref] : undefined;
|
|
6
8
|
return m || undefined;
|
|
7
9
|
}
|
|
8
|
-
function modelBindingRefusal(
|
|
10
|
+
function modelBindingRefusal(field, reason, message) {
|
|
9
11
|
const e = new Error(message);
|
|
10
12
|
e.code = "config.unknown_role";
|
|
11
|
-
e.detail = { field
|
|
13
|
+
e.detail = { field, reason };
|
|
12
14
|
return e;
|
|
13
15
|
}
|
|
16
|
+
function isBindingObject(value) {
|
|
17
|
+
return (typeof value === "object" && value !== null) || typeof value === "function";
|
|
18
|
+
}
|
|
14
19
|
function bindingShown(value) {
|
|
15
20
|
if (typeof value === "string")
|
|
16
21
|
return JSON.stringify(value.length > 80 ? `${value.slice(0, 80)}…` : value);
|
|
@@ -19,15 +24,27 @@ function bindingShown(value) {
|
|
|
19
24
|
function unknownModelRefRefusal(ref, seat) {
|
|
20
25
|
return modelBindingRefusal(seat, "unknown_model_ref", `Unknown model ref ${bindingShown(ref)} in ${seat}. Provide it in RunnerDeps.models or pass a Model object.`);
|
|
21
26
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
27
|
+
function modelOfBinding(value, models, seat, binds) {
|
|
28
|
+
assertModelBindingShape(value, seat, binds);
|
|
29
|
+
if (typeof value === "string") {
|
|
30
|
+
const held = catalogModel(value, models);
|
|
31
|
+
if (held === undefined)
|
|
32
|
+
throw unknownModelRefRefusal(value, seat);
|
|
33
|
+
return held;
|
|
25
34
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
function assertModelBindingShape(value, seat, binds) {
|
|
38
|
+
if (typeof value === "string")
|
|
39
|
+
return;
|
|
40
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
41
|
+
throw modelBindingRefusal(seat, "not_a_model_ref", `${seat} is ${bindingShown(value)}, not a model reference — ${binds}.`);
|
|
29
42
|
}
|
|
30
|
-
|
|
43
|
+
}
|
|
44
|
+
const ROLE_BINDS = "a role binds a catalog model name or a Model object";
|
|
45
|
+
const roleModelSeat = (named, seat) => (typeof named === "string" ? seat : `${seat}.model`);
|
|
46
|
+
export function resolveModel(ref, models, seat = "model") {
|
|
47
|
+
return modelOfBinding(ref, models, seat, "a model is named by a catalog model name or a Model object");
|
|
31
48
|
}
|
|
32
49
|
export const DEFAULT_TIER_ORDER = ["ultra", "max", "pro", "flash", "lite"];
|
|
33
50
|
export const CC_MODEL_TIER_ALIASES = {
|
|
@@ -53,17 +70,7 @@ export function expandTiers(models, tiers) {
|
|
|
53
70
|
const b = Object.hasOwn(tiers, name) ? tiers[name] : undefined;
|
|
54
71
|
if (b === undefined)
|
|
55
72
|
return undefined;
|
|
56
|
-
|
|
57
|
-
if (typeof b === "string") {
|
|
58
|
-
const held = catalogModel(b, models);
|
|
59
|
-
if (held === undefined)
|
|
60
|
-
throw unknownModelRefRefusal(b, seat);
|
|
61
|
-
return held;
|
|
62
|
-
}
|
|
63
|
-
if (typeof b !== "object" || b === null || Array.isArray(b)) {
|
|
64
|
-
throw modelBindingRefusal(seat, "not_a_model_ref", `${seat} is ${bindingShown(b)}, not a model reference — a tier binds a catalog model name or a Model object.`);
|
|
65
|
-
}
|
|
66
|
-
return b;
|
|
73
|
+
return modelOfBinding(b, models, `tiers.${name}`, "a tier binds a catalog model name or a Model object");
|
|
67
74
|
};
|
|
68
75
|
const ownKey = (k) => models !== undefined && Object.hasOwn(models, k) && Boolean(models[k]);
|
|
69
76
|
const landing = (t, self) => {
|
|
@@ -162,27 +169,27 @@ const FALLBACK = {
|
|
|
162
169
|
consolidate: ["summarize"],
|
|
163
170
|
};
|
|
164
171
|
function specParts(s, seat = "a role seat") {
|
|
165
|
-
if (s
|
|
172
|
+
if (s === undefined) {
|
|
166
173
|
return {};
|
|
167
174
|
}
|
|
168
175
|
if (typeof s === "string") {
|
|
169
176
|
return { model: s };
|
|
170
177
|
}
|
|
171
|
-
if (
|
|
178
|
+
if (!isBindingObject(s)) {
|
|
172
179
|
throw modelBindingRefusal(seat, "not_a_model_ref", `${seat} is ${bindingShown(s)}, not a model reference — a role binds a catalog model name, a Model object or a { model, select, thinking, systemPrompt } record.`);
|
|
173
180
|
}
|
|
174
181
|
if ("id" in s && "api" in s) {
|
|
175
182
|
return { model: s };
|
|
176
183
|
}
|
|
177
184
|
const cfg = s;
|
|
178
|
-
return { model: cfg.model, select: cfg.select, thinking: cfg.thinking, systemPrompt: cfg.systemPrompt };
|
|
185
|
+
return { model: cfg.model, select: cfg.select, thinking: cfg.thinking, promptRole: readPromptRole(`${seat}.promptRole`, cfg.promptRole), systemPrompt: cfg.systemPrompt };
|
|
179
186
|
}
|
|
180
187
|
export function roleSpecNamesModel(spec) {
|
|
181
188
|
const parts = specParts(spec);
|
|
182
189
|
return parts.model !== undefined || parts.select !== undefined;
|
|
183
190
|
}
|
|
184
191
|
function toConfig(s) {
|
|
185
|
-
if (s
|
|
192
|
+
if (s === undefined) {
|
|
186
193
|
return undefined;
|
|
187
194
|
}
|
|
188
195
|
if (typeof s === "string" || ("id" in s && "api" in s)) {
|
|
@@ -198,26 +205,34 @@ function mergeRoleSpec(base, over) {
|
|
|
198
205
|
if (!b)
|
|
199
206
|
return over;
|
|
200
207
|
const overHasSource = o.model !== undefined || o.select !== undefined;
|
|
208
|
+
const roleBase = namesRoleBase(o) ? o : b;
|
|
201
209
|
return {
|
|
202
210
|
model: overHasSource ? o.model : b.model,
|
|
203
211
|
select: overHasSource ? o.select : b.select,
|
|
204
212
|
thinking: o.thinking ?? b.thinking,
|
|
205
|
-
|
|
213
|
+
promptRole: roleBase.promptRole,
|
|
214
|
+
systemPrompt: roleBase.systemPrompt,
|
|
206
215
|
};
|
|
207
216
|
}
|
|
208
|
-
function assertKnownRole(word,
|
|
217
|
+
function assertKnownRole(word, field, ofKey = false) {
|
|
209
218
|
if (typeof word === "string" && MODEL_ROLES.includes(word))
|
|
210
219
|
return;
|
|
211
220
|
const shown = typeof word === "string" ? JSON.stringify(word).slice(0, 80) : `<${word === null ? "null" : typeof word}>`;
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
221
|
+
throw modelBindingRefusal(field, "unknown_role_word", `${ofKey ? `${field} key` : field} names the model role ${shown}, which is not one of ${MODEL_ROLES.join(" / ")} — a word outside the vocabulary binds nothing and resolves nothing; bind the model on one of these roles, or name it on TaskSpec.model`);
|
|
222
|
+
}
|
|
223
|
+
export function screenRoleMap(roles, field) {
|
|
224
|
+
for (const key of Object.keys(roles ?? {}))
|
|
225
|
+
assertKnownRole(key, field, true);
|
|
226
|
+
for (const [key, value] of Object.entries(roles ?? {})) {
|
|
227
|
+
const seat = `roles.${key}`;
|
|
228
|
+
const named = specParts(value, seat).model;
|
|
229
|
+
if (named !== undefined)
|
|
230
|
+
assertModelBindingShape(named, roleModelSeat(named, seat), ROLE_BINDS);
|
|
231
|
+
}
|
|
215
232
|
}
|
|
216
233
|
function mergeRoles(base, over) {
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
for (const key of Object.keys(over ?? {}))
|
|
220
|
-
assertKnownRole(key, "TaskSpec.roles key");
|
|
234
|
+
screenRoleMap(base, "RunnerDeps.roles");
|
|
235
|
+
screenRoleMap(over, "TaskSpec.roles");
|
|
221
236
|
const out = { ...base };
|
|
222
237
|
for (const role of Object.keys(over ?? {})) {
|
|
223
238
|
out[role] = mergeRoleSpec(base?.[role], over?.[role]);
|
|
@@ -225,8 +240,8 @@ function mergeRoles(base, over) {
|
|
|
225
240
|
return out;
|
|
226
241
|
}
|
|
227
242
|
function partsModel(parts, models, seat = "a role seat") {
|
|
228
|
-
if (parts.model) {
|
|
229
|
-
return
|
|
243
|
+
if (parts.model !== undefined) {
|
|
244
|
+
return modelOfBinding(parts.model, models, roleModelSeat(parts.model, seat), ROLE_BINDS);
|
|
230
245
|
}
|
|
231
246
|
if (parts.select) {
|
|
232
247
|
const needs = parts.select.needs;
|
|
@@ -238,27 +253,35 @@ function partsModel(parts, models, seat = "a role seat") {
|
|
|
238
253
|
}
|
|
239
254
|
return undefined;
|
|
240
255
|
}
|
|
241
|
-
|
|
242
|
-
const start = spec.modelRole
|
|
256
|
+
function chainHead(spec, deps) {
|
|
257
|
+
const start = spec.modelRole === undefined ? "default" : spec.modelRole;
|
|
243
258
|
assertKnownRole(start, "modelRole");
|
|
244
|
-
|
|
245
|
-
|
|
259
|
+
const merged = mergeRoles(deps.roles, spec.roles);
|
|
260
|
+
return { start, merged, startParts: specParts(merged[start], `roles.${start}`) };
|
|
261
|
+
}
|
|
262
|
+
export function presetRoleBaseOf(spec, deps) {
|
|
263
|
+
const { promptRole, systemPrompt } = chainHead(spec, deps).startParts;
|
|
264
|
+
return namesRoleBase({ promptRole, systemPrompt }) ? { ...(promptRole !== undefined ? { promptRole } : {}), ...(systemPrompt !== undefined ? { systemPrompt } : {}) } : undefined;
|
|
265
|
+
}
|
|
266
|
+
export function resolveTaskModel(spec, deps) {
|
|
267
|
+
const { start, merged, startParts } = chainHead(spec, deps);
|
|
268
|
+
if (spec.model !== undefined) {
|
|
246
269
|
return {
|
|
247
|
-
model: resolveModel(spec.model, deps.models),
|
|
270
|
+
model: resolveModel(spec.model, deps.models, "TaskSpec.model"),
|
|
248
271
|
modelRef: spec.model,
|
|
249
272
|
thinking: spec.thinking ?? startParts.thinking,
|
|
273
|
+
promptRole: startParts.promptRole,
|
|
250
274
|
systemPrompt: startParts.systemPrompt,
|
|
251
275
|
};
|
|
252
276
|
}
|
|
253
|
-
const
|
|
254
|
-
const startSystemPrompt = specParts(merged[start], `roles.${start}`).systemPrompt;
|
|
277
|
+
const { promptRole: startPromptRole, systemPrompt: startSystemPrompt } = startParts;
|
|
255
278
|
for (const role of [start, ...FALLBACK[start]]) {
|
|
256
279
|
const parts = specParts(merged[role], `roles.${role}`);
|
|
257
280
|
const fromParts = partsModel(parts, deps.models, `roles.${role}`);
|
|
258
281
|
const model = fromParts ?? roleTierModel(role, deps.models);
|
|
259
282
|
if (model) {
|
|
260
283
|
const modelRef = fromParts !== undefined ? (parts.model ?? model) : (ROLE_TIER_DEFAULTS[role] ?? model);
|
|
261
|
-
return { model, modelRef, thinking: spec.thinking ?? parts.thinking, systemPrompt: startSystemPrompt };
|
|
284
|
+
return { model, modelRef, thinking: spec.thinking ?? parts.thinking, promptRole: startPromptRole, systemPrompt: startSystemPrompt };
|
|
262
285
|
}
|
|
263
286
|
}
|
|
264
287
|
throw new Error(`No model for role "${start}": set TaskSpec.model, or configure RunnerDeps.roles / TaskSpec.roles["${start}"] (or a "default" role). A "select" RoleSpec also fails here if no catalog model matches.`);
|
|
@@ -267,15 +290,5 @@ export function roleModelIfSet(role, spec, deps) {
|
|
|
267
290
|
const merged = mergeRoles(deps.roles, spec.roles);
|
|
268
291
|
const seat = `roles.${role}`;
|
|
269
292
|
const parts = specParts(merged[role], seat);
|
|
270
|
-
const named = parts.model;
|
|
271
|
-
if (named) {
|
|
272
|
-
if (typeof named === "string") {
|
|
273
|
-
if (catalogModel(named, deps.models) === undefined)
|
|
274
|
-
throw unknownModelRefRefusal(named, seat);
|
|
275
|
-
}
|
|
276
|
-
else if (typeof named !== "object" || Array.isArray(named)) {
|
|
277
|
-
throw modelBindingRefusal(seat, "not_a_model_ref", `${seat}.model is ${bindingShown(named)}, not a model reference — a role binds a catalog model name or a Model object.`);
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
293
|
return partsModel(parts, deps.models, seat) ?? roleTierModel(role, deps.models);
|
|
281
294
|
}
|
|
@@ -34,16 +34,20 @@ export declare function normalizeOrgGateVerdict(answer: unknown, unreadable: str
|
|
|
34
34
|
/**
|
|
35
35
|
* Normalize the accepted {@link ToolGateInput.persistedRules} answers into one reading.
|
|
36
36
|
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
37
|
+
* Four readings, and the lane's own words pick them. `{}` = the lane SAID no rule speaks: the `undefined` answer
|
|
38
|
+
* (the store was read and holds nothing for this call) or a coverage answer (design/375 §5.2②, whose decision
|
|
39
|
+
* meaning is "no rule"). `{ hit }` = a match: a `behavior` of the closed set and a NON-EMPTY `rules` whose members each
|
|
40
|
+
* carry a text (design/375). `{ unreadable: true }` = the lane said it could not read its source (the store form).
|
|
41
|
+
* `{ unreadable: true, reason }` = the lane could not read the call against its rows (its own call form), OR the lane
|
|
42
|
+
* answered something this seam cannot read — `null`, a string or number, an object that is none of the shapes above, a
|
|
43
|
+
* `behavior` outside the closed set or absent, `rules` absent / not an array / empty, a member that is not a record or
|
|
44
|
+
* whose `rule` is not a string, a carrier that is not a plain object. The last arm is the one that matters: an answer the
|
|
45
|
+
* lane gave and nobody can read may be a DENY or an ASK row that did not survive the seam, and reading it as "no rule"
|
|
46
|
+
* would let the person's standing "never run this" fail silently — so it is read as the unreadable word (a
|
|
47
|
+
* real-approval ask no mode releases; headless, a refusal), the same word the org lane's unreadable answer takes.
|
|
48
|
+
* All-or-nothing across the set for the same reason: a set with one unreadable member is a different (smaller) claim than
|
|
49
|
+
* the lane made, and a decision must not stand on a claim nobody made. Per-member DOTS stay individually optional
|
|
50
|
+
* (identity lost ⇒ `"not_reported"`, exactly the single-rule contract).
|
|
47
51
|
*
|
|
48
52
|
* The hit's dots are COPIED, not aliased. The array travels onto an ask that may sit in front of a
|
|
49
53
|
* person for a long time; a lane that retains and mutates its own array would otherwise change what the
|
|
@@ -68,11 +72,12 @@ export declare function readOrgRuleLane(org: {
|
|
|
68
72
|
}, req: ToolCallRequest, signal: AbortSignal | undefined, timeoutMs?: number): Promise<OrgGateVerdict>;
|
|
69
73
|
/**
|
|
70
74
|
* The persisted-rule lane's one read for one call — every consumer's (the live gate, the synthetic-Read
|
|
71
|
-
* judge), normalized once. A lane that throws
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
* closed in the arms the same way, as the call form. Absent lane
|
|
75
|
+
* judge), normalized once. A lane that throws or hangs past the dependency timeout is a lane that could not answer: a row
|
|
76
|
+
* nobody could read may forbid the call, so for the DECISION it fails closed (`applyPersistedTightening` reads `{ unreadable }`
|
|
77
|
+
* without a reason as the store form: a real-approval ask), and for the RECORD it is `"unavailable"`. A lane that ANSWERS
|
|
78
|
+
* something this seam cannot read, and a call the lane could not read against the rows, are `unreadable` with a `reason`
|
|
79
|
+
* (the normalizer's words, naming the field): they fail closed in the arms the same way, as the call form. Absent lane,
|
|
80
|
+
* or the lane's own `undefined` ⇒ the clean negative.
|
|
76
81
|
*/
|
|
77
82
|
export declare function readPersistedRuleLane(lane: {
|
|
78
83
|
adjudicate: (req: ToolCallRequest) => PersistedRuleAnswer | Promise<PersistedRuleAnswer>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { describeThrown } from "./tool-policy.js";
|
|
2
2
|
import { ORG_ADJUDICATION_TIMEOUT_MS, settleOrgVerdictWithin } from "./permission-rule-org.js";
|
|
3
|
-
import { isRuleBehavior } from "./permission-rule-model.js";
|
|
3
|
+
import { isRuleBehavior, RULE_BEHAVIORS } from "./permission-rule-model.js";
|
|
4
4
|
function isPlainOwnRecord(x) {
|
|
5
5
|
try {
|
|
6
6
|
if (x === null || typeof x !== "object" || Array.isArray(x))
|
|
@@ -21,6 +21,15 @@ function ownDataValue(obj, key) {
|
|
|
21
21
|
return undefined;
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
|
+
function bearsOwn(obj, key) {
|
|
25
|
+
try {
|
|
26
|
+
const d = Object.getOwnPropertyDescriptor(obj, key);
|
|
27
|
+
return d !== undefined && (!("value" in d) || d.value !== undefined);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
24
33
|
export function normalizeOrgGateVerdict(answer, unreadable) {
|
|
25
34
|
const clean = (v) => Object.assign(Object.create(null), v);
|
|
26
35
|
const readable = (x) => {
|
|
@@ -94,16 +103,24 @@ function copiedUsableDots(dots) {
|
|
|
94
103
|
const usable = copied?.every((d) => typeof d.actor === "string" && typeof d.counter === "number" && Number.isFinite(d.counter)) === true && copied.length > 0;
|
|
95
104
|
return usable ? { dots: copied } : {};
|
|
96
105
|
}
|
|
106
|
+
function unreadableAnswer(where) {
|
|
107
|
+
return { unreadable: true, reason: `the host's persisted-rule lane, persistedRules.adjudicate, answered what this gate cannot read: ${where}` };
|
|
108
|
+
}
|
|
97
109
|
export function normalizePersistedRuleHit(hit) {
|
|
98
|
-
if (
|
|
110
|
+
if (hit === undefined)
|
|
99
111
|
return {};
|
|
112
|
+
if (!isPlainOwnRecord(hit))
|
|
113
|
+
return unreadableAnswer(hit === null ? "the answer is `null` — a lane with no rule for the call answers `undefined`" : "the answer is not a plain object");
|
|
100
114
|
if (ownDataValue(hit, "unreadable") === true) {
|
|
101
115
|
const reason = ownDataValue(hit, "reason");
|
|
102
116
|
return typeof reason === "string" ? { unreadable: true, reason } : { unreadable: true };
|
|
103
117
|
}
|
|
104
118
|
const rulesRaw = ownDataValue(hit, "rules");
|
|
105
|
-
|
|
119
|
+
const behavior = ownDataValue(hit, "behavior");
|
|
120
|
+
if (!bearsOwn(hit, "rules") && !bearsOwn(hit, "behavior") && !bearsOwn(hit, "unreadable")) {
|
|
106
121
|
const coverageRaw = ownDataValue(hit, "segmentCoverage");
|
|
122
|
+
if (coverageRaw === undefined)
|
|
123
|
+
return unreadableAnswer("it names no `behavior`, no `rules`, no `unreadable` report and no `segmentCoverage` table");
|
|
107
124
|
let rows;
|
|
108
125
|
try {
|
|
109
126
|
if (Array.isArray(coverageRaw)) {
|
|
@@ -120,27 +137,38 @@ export function normalizePersistedRuleHit(hit) {
|
|
|
120
137
|
}
|
|
121
138
|
return rows !== undefined && rows.length > 0 ? { coverage: rows.map((r) => ({ segment: r.segment, covered: r.covered })) } : {};
|
|
122
139
|
}
|
|
123
|
-
|
|
140
|
+
if (!isRuleBehavior(behavior))
|
|
141
|
+
return unreadableAnswer(`\`behavior\` is not one of ${RULE_BEHAVIORS.join(" / ")}`);
|
|
142
|
+
const members = [];
|
|
143
|
+
let problem;
|
|
124
144
|
try {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
145
|
+
const count = Array.isArray(rulesRaw) ? rulesRaw.length : undefined;
|
|
146
|
+
if (!Array.isArray(rulesRaw))
|
|
147
|
+
problem = rulesRaw === undefined ? "`rules` is absent or not an own data property" : "`rules` is not an array";
|
|
148
|
+
else if (count === 0)
|
|
149
|
+
problem = "`rules` is empty — a hit names at least one rule";
|
|
150
|
+
else if (typeof count !== "number" || !Number.isSafeInteger(count) || count < 0)
|
|
151
|
+
problem = "`rules` has no readable length";
|
|
152
|
+
else {
|
|
153
|
+
for (let i = 0; i < count && problem === undefined; i++) {
|
|
128
154
|
const m = rulesRaw[i];
|
|
129
|
-
|
|
155
|
+
if (!isPlainOwnRecord(m))
|
|
156
|
+
problem = `\`rules[${i}]\` is not a plain object`;
|
|
157
|
+
else {
|
|
158
|
+
const rule = ownDataValue(m, "rule");
|
|
159
|
+
if (typeof rule !== "string")
|
|
160
|
+
problem = `\`rules[${i}].rule\` is not a string`;
|
|
161
|
+
else
|
|
162
|
+
members.push({ rule, dots: ownDataValue(m, "dots") });
|
|
163
|
+
}
|
|
130
164
|
}
|
|
131
|
-
members = walked;
|
|
132
165
|
}
|
|
133
166
|
}
|
|
134
167
|
catch {
|
|
135
|
-
|
|
168
|
+
problem = "`rules` could not be read (a throwing element or a revoked proxy)";
|
|
136
169
|
}
|
|
137
|
-
if (
|
|
138
|
-
return
|
|
139
|
-
if (!members.every((m) => typeof m.rule === "string"))
|
|
140
|
-
return {};
|
|
141
|
-
const behavior = ownDataValue(hit, "behavior");
|
|
142
|
-
if (!isRuleBehavior(behavior))
|
|
143
|
-
return {};
|
|
170
|
+
if (problem !== undefined)
|
|
171
|
+
return unreadableAnswer(problem);
|
|
144
172
|
const denial = behavior === "deny" ? copiedDenial(ownDataValue(hit, "denial"), members.map((m) => m.rule)) : undefined;
|
|
145
173
|
return { hit: { behavior, rules: members.map((m) => ({ rule: m.rule, ...copiedUsableDots(m.dots) })), ...(denial !== undefined ? { denial } : {}) } };
|
|
146
174
|
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The read-back judge of a stored rule-offer list: the {@link RuleOffer} array core mints beside an approval
|
|
3
|
+
* (`AskRequest.ruleOffers`, a parked row's `pendingAction.ruleOffers`). Core mints the shape, so its reading lives
|
|
4
|
+
* here; a backend or a surface that reads the list back calls {@link readRuleOffers} instead of keeping a schema of
|
|
5
|
+
* its own. Display caps (how many offers, members or detail rows a surface shows) stay with the surface.
|
|
6
|
+
*/
|
|
7
|
+
import { type RuleOffer } from "./permission-rule-model.js";
|
|
8
|
+
/**
|
|
9
|
+
* Why a stored rule-offer value, or one element of it, is not read:
|
|
10
|
+
* · `not_an_array` — the value itself (present, and not a list): no element is read;
|
|
11
|
+
* · `unknown_word` — a closed-set member holds a word this engine does not know: the offer `kind`, a batch member's
|
|
12
|
+
* `kind`, a `match` (a newer minter, or another writer);
|
|
13
|
+
* · `malformed` — not an object, a member missing or of the wrong type, a batch with no members, an uncovered count
|
|
14
|
+
* that is not a non-negative safe integer.
|
|
15
|
+
* The first defect in reading order names the element's problem.
|
|
16
|
+
*/
|
|
17
|
+
export declare const RULE_OFFER_SHAPE_PROBLEMS: readonly ["not_an_array", "unknown_word", "malformed"];
|
|
18
|
+
export type RuleOfferShapeProblem = (typeof RULE_OFFER_SHAPE_PROBLEMS)[number];
|
|
19
|
+
/** One element read. `index` is its position in the stored list — the selection key a card and its redemption keep. */
|
|
20
|
+
export interface RuleOfferRead {
|
|
21
|
+
readonly index: number;
|
|
22
|
+
/** A fresh object holding only the members the type declares (additive members the minter wrote are not copied). */
|
|
23
|
+
readonly offer: RuleOffer;
|
|
24
|
+
/** Present when the batch's `uncoveredDetail` seat was not one well-formed row per counted segment and was left out
|
|
25
|
+
* (the count is the truth source and an absent seat claims nothing); the caller owes that loss a disclosure. */
|
|
26
|
+
readonly uncoveredDetailDropped?: true;
|
|
27
|
+
/** Present when at least one batch member was read through the kind-less stored form (no `kind`, the four command
|
|
28
|
+
* text members). A backend counts these to know whether its rows still carry the form that retirement line
|
|
29
|
+
* RL-2164-kindless-batch-member waits on. */
|
|
30
|
+
readonly kindlessForm?: true;
|
|
31
|
+
}
|
|
32
|
+
/** One element not read, and why. The rest of the list is read regardless. */
|
|
33
|
+
export interface RuleOfferDropped {
|
|
34
|
+
readonly index: number;
|
|
35
|
+
readonly problem: Exclude<RuleOfferShapeProblem, "not_an_array">;
|
|
36
|
+
}
|
|
37
|
+
/** {@link readRuleOffers}' answer. */
|
|
38
|
+
export type RuleOffersReading = {
|
|
39
|
+
readonly offers: readonly RuleOfferRead[];
|
|
40
|
+
readonly dropped: readonly RuleOfferDropped[];
|
|
41
|
+
} | {
|
|
42
|
+
readonly problem: "not_an_array";
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Read a stored rule-offer list. `undefined` (the member absent) reads as no offers; any other non-list is
|
|
46
|
+
* `not_an_array`. Each element is judged alone and keeps its original index: an element that is not an offer this
|
|
47
|
+
* engine reads is dropped WHOLE (a batch with one unreadable member is dropped, never shortened — a conjunction one
|
|
48
|
+
* member short would render "yes to N" as "yes to N−1") and its siblings stand. Every member is read once.
|
|
49
|
+
* The input domain is a decoded JSON value or a list core minted: a value carrying accessors or a Proxy is outside it,
|
|
50
|
+
* and such a value may be refused as malformed or may throw while it is read. A record is a plain one
|
|
51
|
+
* ({@link isPlainRecord}, the reading the risk-descriptor axes take too).
|
|
52
|
+
*/
|
|
53
|
+
export declare function readRuleOffers(raw: unknown): RuleOffersReading;
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { PERSISTED_RULE_MATCHES, RULE_OFFER_BATCH_MEMBER_KINDS, RULE_OFFER_KINDS, UNCOVERED_SEGMENT_REASONS, } from "./permission-rule-model.js";
|
|
2
|
+
import { isPlainRecord } from "./checkpoint-store.js";
|
|
3
|
+
export const RULE_OFFER_SHAPE_PROBLEMS = Object.freeze(["not_an_array", "unknown_word", "malformed"]);
|
|
4
|
+
const MALFORMED = Object.freeze({ problem: "malformed" });
|
|
5
|
+
const UNKNOWN_WORD = Object.freeze({ problem: "unknown_word" });
|
|
6
|
+
export function readRuleOffers(raw) {
|
|
7
|
+
if (raw === undefined)
|
|
8
|
+
return { offers: [], dropped: [] };
|
|
9
|
+
if (!Array.isArray(raw))
|
|
10
|
+
return { problem: "not_an_array" };
|
|
11
|
+
const offers = [];
|
|
12
|
+
const dropped = [];
|
|
13
|
+
const length = raw.length;
|
|
14
|
+
for (let index = 0; index < length; index++) {
|
|
15
|
+
const verdict = readOfferElement(raw[index]);
|
|
16
|
+
if ("problem" in verdict)
|
|
17
|
+
dropped.push({ index, problem: verdict.problem });
|
|
18
|
+
else
|
|
19
|
+
offers.push({ index, ...verdict });
|
|
20
|
+
}
|
|
21
|
+
return { offers, dropped };
|
|
22
|
+
}
|
|
23
|
+
function wordOf(value, words) {
|
|
24
|
+
if (typeof value !== "string")
|
|
25
|
+
return MALFORMED;
|
|
26
|
+
return words.some((w) => w === value) ? value : UNKNOWN_WORD;
|
|
27
|
+
}
|
|
28
|
+
function readOfferElement(value) {
|
|
29
|
+
if (!isPlainRecord(value))
|
|
30
|
+
return MALFORMED;
|
|
31
|
+
const kind = wordOf(value.kind, RULE_OFFER_KINDS);
|
|
32
|
+
if (typeof kind !== "string")
|
|
33
|
+
return kind;
|
|
34
|
+
switch (kind) {
|
|
35
|
+
case "single": {
|
|
36
|
+
const rule = value.rule;
|
|
37
|
+
const match = wordOf(value.match, PERSISTED_RULE_MATCHES);
|
|
38
|
+
const command = value.command;
|
|
39
|
+
if (typeof rule !== "string")
|
|
40
|
+
return MALFORMED;
|
|
41
|
+
if (typeof match !== "string")
|
|
42
|
+
return match;
|
|
43
|
+
if (typeof command !== "string")
|
|
44
|
+
return MALFORMED;
|
|
45
|
+
return { offer: { kind: "single", rule, match, command } };
|
|
46
|
+
}
|
|
47
|
+
case "batch":
|
|
48
|
+
return readBatch(value);
|
|
49
|
+
default: {
|
|
50
|
+
const unhandled = kind;
|
|
51
|
+
return unhandled;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function readBatch(value) {
|
|
56
|
+
const rules = value.rules;
|
|
57
|
+
const count = value.uncoveredSegments;
|
|
58
|
+
const detail = value.uncoveredDetail;
|
|
59
|
+
if (!Array.isArray(rules))
|
|
60
|
+
return MALFORMED;
|
|
61
|
+
const length = rules.length;
|
|
62
|
+
if (length === 0)
|
|
63
|
+
return MALFORMED;
|
|
64
|
+
const members = [];
|
|
65
|
+
let kindless = false;
|
|
66
|
+
for (let i = 0; i < length; i++) {
|
|
67
|
+
const verdict = readBatchMember(rules[i]);
|
|
68
|
+
if ("problem" in verdict)
|
|
69
|
+
return verdict;
|
|
70
|
+
members.push(verdict.member);
|
|
71
|
+
if (verdict.kindlessForm === true)
|
|
72
|
+
kindless = true;
|
|
73
|
+
}
|
|
74
|
+
if (typeof count !== "number" || !Number.isSafeInteger(count) || count < 0)
|
|
75
|
+
return MALFORMED;
|
|
76
|
+
const offer = { kind: "batch", rules: members, uncoveredSegments: count };
|
|
77
|
+
const marks = kindless ? { kindlessForm: true } : {};
|
|
78
|
+
if (detail === undefined)
|
|
79
|
+
return { offer, ...marks };
|
|
80
|
+
const rows = detailRowsOf(detail, count);
|
|
81
|
+
return rows !== undefined ? { offer: { ...offer, uncoveredDetail: rows }, ...marks } : { offer, uncoveredDetailDropped: true, ...marks };
|
|
82
|
+
}
|
|
83
|
+
function readBatchMember(value) {
|
|
84
|
+
if (!isPlainRecord(value))
|
|
85
|
+
return MALFORMED;
|
|
86
|
+
if (!("kind" in value))
|
|
87
|
+
return readKindlessBatchMember(value);
|
|
88
|
+
const kind = wordOf(value.kind, RULE_OFFER_BATCH_MEMBER_KINDS);
|
|
89
|
+
if (typeof kind !== "string")
|
|
90
|
+
return kind;
|
|
91
|
+
switch (kind) {
|
|
92
|
+
case "command":
|
|
93
|
+
return commandMember(value.rule, value.match, value.command, value.segment);
|
|
94
|
+
case "directoryRead": {
|
|
95
|
+
const rule = value.rule;
|
|
96
|
+
const directory = value.directory;
|
|
97
|
+
const segment = value.segment;
|
|
98
|
+
if (typeof rule !== "string" || typeof directory !== "string" || typeof segment !== "string")
|
|
99
|
+
return MALFORMED;
|
|
100
|
+
return { member: { kind: "directoryRead", rule, directory, segment } };
|
|
101
|
+
}
|
|
102
|
+
default: {
|
|
103
|
+
const unhandled = kind;
|
|
104
|
+
return unhandled;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function readKindlessBatchMember(value) {
|
|
109
|
+
const rule = value.rule;
|
|
110
|
+
const match = value.match;
|
|
111
|
+
const command = value.command;
|
|
112
|
+
const segment = value.segment;
|
|
113
|
+
if (typeof rule !== "string" || typeof match !== "string" || typeof command !== "string" || typeof segment !== "string")
|
|
114
|
+
return MALFORMED;
|
|
115
|
+
const verdict = commandMember(rule, match, command, segment);
|
|
116
|
+
return "problem" in verdict ? verdict : { ...verdict, kindlessForm: true };
|
|
117
|
+
}
|
|
118
|
+
function commandMember(rule, rawMatch, command, segment) {
|
|
119
|
+
if (typeof rule !== "string")
|
|
120
|
+
return MALFORMED;
|
|
121
|
+
const match = wordOf(rawMatch, PERSISTED_RULE_MATCHES);
|
|
122
|
+
if (typeof match !== "string")
|
|
123
|
+
return match;
|
|
124
|
+
if (typeof command !== "string" || typeof segment !== "string")
|
|
125
|
+
return MALFORMED;
|
|
126
|
+
return { member: { kind: "command", rule, match, command, segment } };
|
|
127
|
+
}
|
|
128
|
+
function detailRowsOf(detail, count) {
|
|
129
|
+
if (!Array.isArray(detail))
|
|
130
|
+
return undefined;
|
|
131
|
+
const length = detail.length;
|
|
132
|
+
if (length !== count)
|
|
133
|
+
return undefined;
|
|
134
|
+
const rows = [];
|
|
135
|
+
for (let i = 0; i < length; i++) {
|
|
136
|
+
const row = detail[i];
|
|
137
|
+
if (!isPlainRecord(row))
|
|
138
|
+
return undefined;
|
|
139
|
+
const segment = row.segment;
|
|
140
|
+
const reason = wordOf(row.reason, UNCOVERED_SEGMENT_REASONS);
|
|
141
|
+
if (typeof segment !== "string" || typeof reason !== "string")
|
|
142
|
+
return undefined;
|
|
143
|
+
rows.push({ segment, reason });
|
|
144
|
+
}
|
|
145
|
+
return rows;
|
|
146
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Who a permission-rule bucket belongs to: the owner type, its discriminant words, the one reading of an owner from a
|
|
3
|
+
* value the engine did not just build, and the one equality between two owners.
|
|
4
|
+
*
|
|
5
|
+
* The faces that read an owner out of data — the two adoption markers read back from disk, the two adoption entries'
|
|
6
|
+
* source, a stored approval record's identity and the consent entries' `owner` option — read it through
|
|
7
|
+
* {@link readRuleOwner}, so the source an adoption entry writes into its marker is one that marker's reader reads back.
|
|
8
|
+
* Its run-time imports are the two import-free judges — the record judge and the principal-name judge — because the root
|
|
9
|
+
* adoption marker reader, which every file store loads, depends on this module and is kept free of the rule store's own imports.
|
|
10
|
+
*/
|
|
11
|
+
import type { AssertAllKeysHandled } from "./ask-origin.js";
|
|
12
|
+
/**
|
|
13
|
+
* Who a rule bucket belongs to, as a STRUCTURAL position.
|
|
14
|
+
*
|
|
15
|
+
* Identity absence is spelled as a distinct union member, never as a sentinel string flowing through
|
|
16
|
+
* `forPrincipal` — every consumer of a principal string is an identity surface, and a made-up name on an
|
|
17
|
+
* identity surface is indistinguishable from a real one downstream. Cloud sync and cloud tickets accept
|
|
18
|
+
* ONLY the `principal` kind: syncing is an authenticated act, and a local-owner bucket has no cloud home
|
|
19
|
+
* until it is adopted (`adoptFilePermissionRuleStore`).
|
|
20
|
+
*/
|
|
21
|
+
export type RuleOwner = {
|
|
22
|
+
kind: "principal";
|
|
23
|
+
principal: string;
|
|
24
|
+
} | {
|
|
25
|
+
kind: "local-owner";
|
|
26
|
+
};
|
|
27
|
+
/** The owner discriminants as a value: the `kind` words of {@link RuleOwner}, both directions fenced at compile time
|
|
28
|
+
* ({@link RuleOwnerKindsCoverEveryArm} / {@link RuleOwnerArmsCoverEveryKind}). */
|
|
29
|
+
export declare const RULE_OWNER_KINDS: readonly ["principal", "local-owner"];
|
|
30
|
+
/** Compile fence: an arm whose `kind` is not in {@link RULE_OWNER_KINDS} turns the argument into that word. */
|
|
31
|
+
export type RuleOwnerKindsCoverEveryArm = AssertAllKeysHandled<Exclude<RuleOwner["kind"], (typeof RULE_OWNER_KINDS)[number]>>;
|
|
32
|
+
/** Compile fence, the other direction: a word in {@link RULE_OWNER_KINDS} that no arm carries. */
|
|
33
|
+
export type RuleOwnerArmsCoverEveryKind = AssertAllKeysHandled<Exclude<(typeof RULE_OWNER_KINDS)[number], RuleOwner["kind"]>>;
|
|
34
|
+
/** Do two owners name the same bucket? */
|
|
35
|
+
export declare function sameRuleOwner(a: RuleOwner, b: RuleOwner): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Read an owner from a value the engine did not just build, or `undefined` when it is not one: not a plain record (an
|
|
38
|
+
* object whose prototype is `Object.prototype` or none, so no member comes from a prototype it was given), a `kind`
|
|
39
|
+
* outside {@link RULE_OWNER_KINDS}, or a `principal` arm whose name is not a principal name ({@link principalNameOf}: an
|
|
40
|
+
* identity-less bucket is the `local-owner` kind, never a blank name). Fail-closed: a caller treats `undefined` as
|
|
41
|
+
* "owns nothing" or refuses — never as either arm. The answer is a fresh object holding only the members the type
|
|
42
|
+
* declares; `kind` and `principal` are each read once.
|
|
43
|
+
*/
|
|
44
|
+
export declare function readRuleOwner(raw: unknown): RuleOwner | undefined;
|
|
45
|
+
/** An owner as an operator's sentence names it: `principal "<name>"`, or `the local owner`. */
|
|
46
|
+
export declare function ruleOwnerText(owner: RuleOwner): string;
|