@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
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import type { Checkpoint, CheckpointSummary, CheckpointToken } from "./checkpoint-store.js";
|
|
2
|
+
import { facetOf, type GateKind } from "./pause-registry.js";
|
|
3
|
+
/**
|
|
4
|
+
* The page bounds of the two listing faces: a query without `limit` reads `default` rows, an explicit `limit` is an integer in
|
|
5
|
+
* 1..`max`. A session page holds whole rows (each carries its parked state), an overdue page holds summaries — hence the smaller
|
|
6
|
+
* session bound.
|
|
7
|
+
*/
|
|
8
|
+
export declare const CHECKPOINT_LIST_LIMITS: Readonly<{
|
|
9
|
+
overdue: Readonly<{
|
|
10
|
+
readonly default: 100;
|
|
11
|
+
readonly max: 500;
|
|
12
|
+
}>;
|
|
13
|
+
session: Readonly<{
|
|
14
|
+
readonly default: 100;
|
|
15
|
+
readonly max: 100;
|
|
16
|
+
}>;
|
|
17
|
+
}>;
|
|
18
|
+
/** A row's deadline semantic — {@link facetOf}'s answer for its gate (`A` approval SLA, `B` abandonment TTL, `-` the non-gate park). */
|
|
19
|
+
export type CheckpointFacet = ReturnType<typeof facetOf>;
|
|
20
|
+
type CheckpointRowStatus = Checkpoint["status"];
|
|
21
|
+
/** One page of a listing face: the rows, and the cursor of the next page — present exactly when more rows match after these. */
|
|
22
|
+
export interface CheckpointPage<R, C> {
|
|
23
|
+
readonly rows: readonly R[];
|
|
24
|
+
/** Pass it as the next query's `after`. The store mints it from its own order key; a caller never builds one. */
|
|
25
|
+
readonly next?: C;
|
|
26
|
+
}
|
|
27
|
+
/** The order key of an overdue page: the row's deadline (`-Infinity` for a deadline that is not a finite number), then its token. */
|
|
28
|
+
export interface CheckpointOverdueCursor {
|
|
29
|
+
readonly deadline: number;
|
|
30
|
+
readonly token: CheckpointToken;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* What {@link import("./checkpoint-store.js").CheckpointStore.listOverdue} is asked for: the PENDING rows of every scope whose
|
|
34
|
+
* deadline has passed `cutoff` ({@link checkpointDeadlinePassed}) and whose gate reads as `facet` ({@link facetOf}, the card
|
|
35
|
+
* overrides included — a question parked under an approval gate kind is `B`). Ordered by deadline, then token, ascending.
|
|
36
|
+
* A deployment's sweep reads one facet at a time and disposes each row through the row CAS verbs (`expire`, or a resume that
|
|
37
|
+
* denies): `A` rows are approvals whose deadline denies, `B` and `-` rows are abandoned at theirs.
|
|
38
|
+
*/
|
|
39
|
+
export interface CheckpointOverdueQuery {
|
|
40
|
+
/** Epoch ms, a finite number. */
|
|
41
|
+
cutoff: number;
|
|
42
|
+
facet: CheckpointFacet;
|
|
43
|
+
after?: CheckpointOverdueCursor;
|
|
44
|
+
/** At most this many rows, an integer in 1..{@link CHECKPOINT_LIST_LIMITS}`.overdue.max`; absent = the default. */
|
|
45
|
+
limit?: number;
|
|
46
|
+
}
|
|
47
|
+
/** The order key of a session page: the row's `createdAt` (`-Infinity` for one that is not a finite number), then its token. */
|
|
48
|
+
export interface CheckpointSessionCursor {
|
|
49
|
+
readonly createdAt: number;
|
|
50
|
+
readonly token: CheckpointToken;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* What {@link import("./checkpoint-store.js").CheckpointStore.listBySession} is asked for: the rows of ONE session, of every
|
|
54
|
+
* status unless `status` says one, narrowed by the members present. Ordered by `createdAt`, then token — oldest first unless
|
|
55
|
+
* `order` says `newest`. "The session's pending row of these gate kinds, newest first" is `{ status: "pending", gateKinds,
|
|
56
|
+
* order: "newest", limit: 1 }`; "the rows that parked this tool call" is `{ toolCallId }`; "does the session hold an expired
|
|
57
|
+
* row" is `{ status: "expired", limit: 1 }`.
|
|
58
|
+
*/
|
|
59
|
+
export interface CheckpointSessionQuery {
|
|
60
|
+
/** The session id (non-empty). */
|
|
61
|
+
sessionId: string;
|
|
62
|
+
/** Only the rows filed in this scope. */
|
|
63
|
+
scope?: string;
|
|
64
|
+
/** Only the rows in this status. Absent = every status. */
|
|
65
|
+
status?: CheckpointRowStatus;
|
|
66
|
+
/** Only the rows parked on one of these gate kinds; an empty list matches no row. Absent = every kind. */
|
|
67
|
+
gateKinds?: readonly GateKind[];
|
|
68
|
+
/** Only the rows whose pending action is a `tool_approval` of this tool call (a park with no tool call never matches). */
|
|
69
|
+
toolCallId?: string;
|
|
70
|
+
/** Only the rows created at or after this epoch ms (a finite number). */
|
|
71
|
+
createdSince?: number;
|
|
72
|
+
order?: "oldest" | "newest";
|
|
73
|
+
after?: CheckpointSessionCursor;
|
|
74
|
+
/** At most this many rows, an integer in 1..{@link CHECKPOINT_LIST_LIMITS}`.session.max`; absent = the default. */
|
|
75
|
+
limit?: number;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* One row of a session page. `row` is a readable row (its members match the query and every member the face judged is well
|
|
79
|
+
* formed). `unreadable` is a row of THIS session that matches every filter the store could judge but whose stored shape the face
|
|
80
|
+
* cannot read — a token member other than the key it is filed under, a scope that is not a string, a status outside the three
|
|
81
|
+
* words, a gate with no registered kind, a pending action with no kind, a tool approval with no tool call id, a `createdAt` that
|
|
82
|
+
* is not a finite number, a state that is not an object: it is answered rather than skipped (an unreadable row is not an absent
|
|
83
|
+
* one, and a consumer that takes its token to `get` meets the damage loudly) and rather than failing the page (one damaged row
|
|
84
|
+
* does not hide the readable rows beside it). The store discloses it through its own seat. Its `token` is the key the store
|
|
85
|
+
* files it under.
|
|
86
|
+
*/
|
|
87
|
+
export type CheckpointRowRead = {
|
|
88
|
+
readonly kind: "row";
|
|
89
|
+
readonly checkpoint: Checkpoint;
|
|
90
|
+
} | {
|
|
91
|
+
readonly kind: "unreadable";
|
|
92
|
+
readonly token: CheckpointToken;
|
|
93
|
+
/** The stored scope, or `null` when it is not a string. */
|
|
94
|
+
readonly scope: string | null;
|
|
95
|
+
readonly sessionId: string;
|
|
96
|
+
/** The status as stored (a word outside the three is part of the damage). */
|
|
97
|
+
readonly status: string;
|
|
98
|
+
/** The stored `createdAt`, or `null` when it is not a finite number. */
|
|
99
|
+
readonly createdAt: number | null;
|
|
100
|
+
/** What could not be read, naming the member by its shape (never its value). */
|
|
101
|
+
readonly problem: string;
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* The guard of {@link import("./checkpoint-store.js").CheckpointStore.deleteSessionCheckpoints}: the rows are deleted only when the
|
|
105
|
+
* session's own row exists and is owned by `owner` — compared null-safe (`null` = the anonymous session, and it matches only an
|
|
106
|
+
* anonymous one). No session row, or another owner, deletes nothing and answers `0`. `owner` is a principal name or `null`: a
|
|
107
|
+
* blank string names nobody and is refused.
|
|
108
|
+
*/
|
|
109
|
+
export interface CheckpointDeleteGuard {
|
|
110
|
+
readonly owner: string | null;
|
|
111
|
+
}
|
|
112
|
+
/** {@link readCheckpointOverdueQuery}'s answer: the members as read, the default limit filled in. */
|
|
113
|
+
export interface CheckpointOverdueQueryReading {
|
|
114
|
+
readonly cutoff: number;
|
|
115
|
+
readonly facet: CheckpointFacet;
|
|
116
|
+
readonly after?: CheckpointOverdueCursor;
|
|
117
|
+
readonly limit: number;
|
|
118
|
+
}
|
|
119
|
+
/** {@link readCheckpointSessionQuery}'s answer: the members as read, the default order and limit filled in. */
|
|
120
|
+
export interface CheckpointSessionQueryReading {
|
|
121
|
+
readonly sessionId: string;
|
|
122
|
+
readonly scope?: string;
|
|
123
|
+
readonly status?: CheckpointRowStatus;
|
|
124
|
+
readonly gateKinds?: readonly GateKind[];
|
|
125
|
+
readonly toolCallId?: string;
|
|
126
|
+
readonly createdSince?: number;
|
|
127
|
+
readonly order: "oldest" | "newest";
|
|
128
|
+
readonly after?: CheckpointSessionCursor;
|
|
129
|
+
readonly limit: number;
|
|
130
|
+
}
|
|
131
|
+
/** The one reading of a {@link CheckpointOverdueQuery} for every store that implements `listOverdue`. A bad value is refused,
|
|
132
|
+
* never mapped to a default: `config.invalid_argument`. */
|
|
133
|
+
export declare function readCheckpointOverdueQuery(raw: unknown): CheckpointOverdueQueryReading;
|
|
134
|
+
/** The one reading of a {@link CheckpointSessionQuery} for every store that implements `listBySession`. A bad value is refused,
|
|
135
|
+
* never mapped to a default: `config.invalid_argument`. */
|
|
136
|
+
export declare function readCheckpointSessionQuery(raw: unknown): CheckpointSessionQueryReading;
|
|
137
|
+
/** The guard's one reading (the delete is irreversible, so a guard that is not exactly `{ owner: <a principal name> | null }` is refused). */
|
|
138
|
+
export declare function readCheckpointDeleteGuard(sessionId: unknown, raw: unknown): {
|
|
139
|
+
readonly sessionId: string;
|
|
140
|
+
readonly owner: string | null;
|
|
141
|
+
};
|
|
142
|
+
/** Does the session's head admit the delete: a row exists and its owner equals the guard's, null-safe. */
|
|
143
|
+
export declare function deleteGuardAdmits(head: {
|
|
144
|
+
readonly owner: string | null;
|
|
145
|
+
} | undefined, owner: string | null): boolean;
|
|
146
|
+
/**
|
|
147
|
+
* `deleteSessionCheckpoints` over a store's rows, for both first-party stores: the guard read, the session's rows taken as they stand when
|
|
148
|
+
* the call starts — BEFORE the head read, so a row put while it is awaited (another generation of the id, under another owner) is
|
|
149
|
+
* never one of them — the guard judged on the head, then each taken row handed to `remove`, which deletes it only while it is still
|
|
150
|
+
* that row and answers whether it did. Answers the count.
|
|
151
|
+
*/
|
|
152
|
+
export declare function deleteSessionRowsAtStart(rows: Iterable<readonly [string, Checkpoint]>, sessionId: unknown, guard: unknown, headOf: (sessionId: string) => Promise<{
|
|
153
|
+
readonly owner: string | null;
|
|
154
|
+
} | undefined>, remove: (token: string, row: Checkpoint) => boolean | Promise<boolean>): Promise<number>;
|
|
155
|
+
/**
|
|
156
|
+
* Has a row's deadline passed `cutoff`? A row with no deadline never has; a deadline that is not a finite number always has —
|
|
157
|
+
* a bound nobody can evaluate is not a bound, and leaving it would keep the row pending forever (core sanitizes its own mints,
|
|
158
|
+
* but rows also come from other backends and older engines, and a JSON-held `NaN` reads back as `null`). The two `reap` verbs and
|
|
159
|
+
* {@link selectOverduePage} read this one rule.
|
|
160
|
+
*/
|
|
161
|
+
export declare function checkpointDeadlinePassed(deadline: number | null | undefined, cutoff: number): boolean;
|
|
162
|
+
/**
|
|
163
|
+
* The overdue page over a store's rows (`[key, row]` pairs — the key is the authoritative token): pending ∧
|
|
164
|
+
* {@link checkpointDeadlinePassed} ∧ `facetOf(gate) === facet`, after the cursor, ordered (deadline key, token) ascending, filled up
|
|
165
|
+
* to `limit` with the rows whose summary `project` mints. A candidate whose shape the face cannot read, or whose summary cannot be
|
|
166
|
+
* projected, is left out and disclosed (`disclose` gets one sentence per such row, on every call) and the page fills on from the
|
|
167
|
+
* next candidate; only the rows of the page are projected. `next` is present when a candidate remains after the page's last row
|
|
168
|
+
* (a page after it can come back shorter, even empty, when every remaining candidate is damaged).
|
|
169
|
+
*/
|
|
170
|
+
export declare function selectOverduePage(rows: Iterable<readonly [string, Checkpoint]>, query: CheckpointOverdueQueryReading, project: (cp: Checkpoint) => CheckpointSummary, disclose?: (sentence: string) => void): CheckpointPage<CheckpointSummary, CheckpointOverdueCursor>;
|
|
171
|
+
/**
|
|
172
|
+
* The session page over a store's rows (`[key, row]` pairs — the key is the authoritative token): the session's rows narrowed by
|
|
173
|
+
* the query's members, after the cursor, ordered (createdAt key, token) in the query's order, cut at `limit` before anything is
|
|
174
|
+
* copied (`clone` runs for the page's readable rows only). A filter that reads a damaged member cannot exclude the row, so a row of
|
|
175
|
+
* this session that no readable filter excludes and that carries damage is answered `unreadable` (and disclosed); a row whose
|
|
176
|
+
* session id is not a string is attributable to no session — left out and disclosed. `next` is present exactly when more rows
|
|
177
|
+
* match after the page.
|
|
178
|
+
*/
|
|
179
|
+
export declare function selectSessionPage(rows: Iterable<readonly [string, Checkpoint]>, query: CheckpointSessionQueryReading, clone: (cp: Checkpoint) => Checkpoint, disclose?: (sentence: string) => void): CheckpointPage<CheckpointRowRead, CheckpointSessionCursor>;
|
|
180
|
+
export {};
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { types } from "node:util";
|
|
2
|
+
import { facetOf, isGateKind } from "./pause-registry.js";
|
|
3
|
+
import { receiptRefusal, receiveOwnProperties } from "./own-property-receipt.js";
|
|
4
|
+
import { principalNameOf } from "./principal-name.js";
|
|
5
|
+
export const CHECKPOINT_LIST_LIMITS = Object.freeze({
|
|
6
|
+
overdue: Object.freeze({ default: 100, max: 500 }),
|
|
7
|
+
session: Object.freeze({ default: 100, max: 100 }),
|
|
8
|
+
});
|
|
9
|
+
const FACETS = ["A", "B", "-"];
|
|
10
|
+
const STATUSES = ["pending", "resolved", "expired"];
|
|
11
|
+
const OVERDUE_MEMBERS = ["cutoff", "facet", "after", "limit"];
|
|
12
|
+
const SESSION_MEMBERS = ["sessionId", "scope", "status", "gateKinds", "toolCallId", "createdSince", "order", "after", "limit"];
|
|
13
|
+
function receiveQuery(raw, subject, face, members) {
|
|
14
|
+
if (typeof raw !== "object" || raw === null)
|
|
15
|
+
throw receiptRefusal(`${face}: the query must be an object, got ${raw === null ? "null" : typeof raw}`);
|
|
16
|
+
const got = receiveOwnProperties(raw, { subject, unit: "member", moment: `at ${face}` });
|
|
17
|
+
const own = Object.create(null);
|
|
18
|
+
for (const name of Object.keys(got)) {
|
|
19
|
+
if (!members.includes(name))
|
|
20
|
+
throw receiptRefusal(`${face}: the query carries "${name}", which is not a member of ${subject} — refused rather than answered without the filter it names`);
|
|
21
|
+
own[name] = got[name];
|
|
22
|
+
}
|
|
23
|
+
return own;
|
|
24
|
+
}
|
|
25
|
+
function readGateKinds(raw) {
|
|
26
|
+
const refuse = () => receiptRefusal("CheckpointSessionQuery.gateKinds must be a dense array of registered gate kinds (no hole, no accessor, not a Proxy) when present");
|
|
27
|
+
if (typeof raw !== "object" || raw === null || types.isProxy(raw) || !Array.isArray(raw))
|
|
28
|
+
throw refuse();
|
|
29
|
+
const length = Object.getOwnPropertyDescriptor(raw, "length")?.value;
|
|
30
|
+
if (typeof length !== "number")
|
|
31
|
+
throw refuse();
|
|
32
|
+
const kinds = [];
|
|
33
|
+
for (let i = 0; i < length; i++) {
|
|
34
|
+
const d = Object.getOwnPropertyDescriptor(raw, i);
|
|
35
|
+
if (d === undefined || !("value" in d) || !isGateKind(d.value))
|
|
36
|
+
throw refuse();
|
|
37
|
+
kinds.push(d.value);
|
|
38
|
+
}
|
|
39
|
+
return Object.freeze(kinds);
|
|
40
|
+
}
|
|
41
|
+
function readLimit(raw, subject, bound) {
|
|
42
|
+
if (raw === undefined)
|
|
43
|
+
return bound.default;
|
|
44
|
+
if (typeof raw === "number" && Number.isSafeInteger(raw) && raw >= 1 && raw <= bound.max)
|
|
45
|
+
return raw;
|
|
46
|
+
throw receiptRefusal(`${subject}.limit must be an integer in 1..${bound.max} when present`);
|
|
47
|
+
}
|
|
48
|
+
function readCursor(raw, subject, key, face) {
|
|
49
|
+
const got = receiveQuery(raw, `${subject}.after`, face, [key, "token"]);
|
|
50
|
+
const value = got[key];
|
|
51
|
+
if (typeof value !== "number" || Number.isNaN(value) || value === Infinity)
|
|
52
|
+
throw receiptRefusal(`${subject}.after.${key} must be a finite number or -Infinity (a cursor is the order key of the page before)`);
|
|
53
|
+
if (typeof got.token !== "string")
|
|
54
|
+
throw receiptRefusal(`${subject}.after.token must be a string`);
|
|
55
|
+
return { [key]: value, token: got.token };
|
|
56
|
+
}
|
|
57
|
+
export function readCheckpointOverdueQuery(raw) {
|
|
58
|
+
const face = "CheckpointStore.listOverdue";
|
|
59
|
+
const got = receiveQuery(raw, "CheckpointOverdueQuery", face, OVERDUE_MEMBERS);
|
|
60
|
+
const { cutoff, facet, after } = got;
|
|
61
|
+
if (typeof cutoff !== "number" || !Number.isFinite(cutoff))
|
|
62
|
+
throw receiptRefusal("CheckpointOverdueQuery.cutoff must be a finite number (epoch ms)");
|
|
63
|
+
if (!FACETS.includes(facet))
|
|
64
|
+
throw receiptRefusal(`CheckpointOverdueQuery.facet must be one of ${FACETS.map((f) => JSON.stringify(f)).join(" / ")}`);
|
|
65
|
+
return {
|
|
66
|
+
cutoff,
|
|
67
|
+
facet: facet,
|
|
68
|
+
...(after !== undefined ? { after: readCursor(after, "CheckpointOverdueQuery", "deadline", face) } : {}),
|
|
69
|
+
limit: readLimit(got.limit, "CheckpointOverdueQuery", CHECKPOINT_LIST_LIMITS.overdue),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
export function readCheckpointSessionQuery(raw) {
|
|
73
|
+
const face = "CheckpointStore.listBySession";
|
|
74
|
+
const got = receiveQuery(raw, "CheckpointSessionQuery", face, SESSION_MEMBERS);
|
|
75
|
+
const { sessionId, scope, status, gateKinds, toolCallId, createdSince, order, after } = got;
|
|
76
|
+
if (typeof sessionId !== "string" || sessionId === "")
|
|
77
|
+
throw receiptRefusal("CheckpointSessionQuery.sessionId must be a non-empty string");
|
|
78
|
+
if (scope !== undefined && typeof scope !== "string")
|
|
79
|
+
throw receiptRefusal(`CheckpointSessionQuery.scope must be a string when present, got ${typeof scope}`);
|
|
80
|
+
if (status !== undefined && !STATUSES.includes(status))
|
|
81
|
+
throw receiptRefusal(`CheckpointSessionQuery.status must be one of ${STATUSES.join(" / ")} when present`);
|
|
82
|
+
if (toolCallId !== undefined && typeof toolCallId !== "string")
|
|
83
|
+
throw receiptRefusal(`CheckpointSessionQuery.toolCallId must be a string when present, got ${typeof toolCallId}`);
|
|
84
|
+
if (createdSince !== undefined && (typeof createdSince !== "number" || !Number.isFinite(createdSince)))
|
|
85
|
+
throw receiptRefusal("CheckpointSessionQuery.createdSince must be a finite number when present");
|
|
86
|
+
if (order !== undefined && order !== "oldest" && order !== "newest")
|
|
87
|
+
throw receiptRefusal('CheckpointSessionQuery.order must be "oldest" or "newest" when present');
|
|
88
|
+
const kinds = gateKinds === undefined ? undefined : readGateKinds(gateKinds);
|
|
89
|
+
return {
|
|
90
|
+
sessionId,
|
|
91
|
+
...(scope !== undefined ? { scope } : {}),
|
|
92
|
+
...(status !== undefined ? { status: status } : {}),
|
|
93
|
+
...(kinds !== undefined ? { gateKinds: kinds } : {}),
|
|
94
|
+
...(toolCallId !== undefined ? { toolCallId } : {}),
|
|
95
|
+
...(createdSince !== undefined ? { createdSince } : {}),
|
|
96
|
+
order: order === "newest" ? "newest" : "oldest",
|
|
97
|
+
...(after !== undefined ? { after: readCursor(after, "CheckpointSessionQuery", "createdAt", face) } : {}),
|
|
98
|
+
limit: readLimit(got.limit, "CheckpointSessionQuery", CHECKPOINT_LIST_LIMITS.session),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
export function readCheckpointDeleteGuard(sessionId, raw) {
|
|
102
|
+
const face = "CheckpointStore.deleteSessionCheckpoints";
|
|
103
|
+
if (typeof sessionId !== "string" || sessionId === "")
|
|
104
|
+
throw receiptRefusal(`${face}: the session id must be a non-empty string`);
|
|
105
|
+
const got = receiveQuery(raw, "CheckpointDeleteGuard", face, ["owner"]);
|
|
106
|
+
const owner = got.owner === null ? null : principalNameOf(got.owner);
|
|
107
|
+
if (owner === undefined)
|
|
108
|
+
throw receiptRefusal("CheckpointDeleteGuard.owner must be a principal name (a string with a visible character, no control or separator character, and no format character but a joiner) or null");
|
|
109
|
+
return { sessionId, owner };
|
|
110
|
+
}
|
|
111
|
+
export function deleteGuardAdmits(head, owner) {
|
|
112
|
+
return head !== undefined && head.owner === owner;
|
|
113
|
+
}
|
|
114
|
+
export async function deleteSessionRowsAtStart(rows, sessionId, guard, headOf, remove) {
|
|
115
|
+
const read = readCheckpointDeleteGuard(sessionId, guard);
|
|
116
|
+
const taken = [];
|
|
117
|
+
for (const [token, cp] of rows)
|
|
118
|
+
if (cp.sessionId === read.sessionId)
|
|
119
|
+
taken.push([token, cp]);
|
|
120
|
+
if (!deleteGuardAdmits(await headOf(read.sessionId), read.owner))
|
|
121
|
+
return 0;
|
|
122
|
+
let n = 0;
|
|
123
|
+
for (const [token, cp] of taken)
|
|
124
|
+
if (await remove(token, cp))
|
|
125
|
+
n++;
|
|
126
|
+
return n;
|
|
127
|
+
}
|
|
128
|
+
export function checkpointDeadlinePassed(deadline, cutoff) {
|
|
129
|
+
return deadline !== undefined && (typeof deadline === "number" && Number.isFinite(deadline) ? deadline <= cutoff : true);
|
|
130
|
+
}
|
|
131
|
+
function orderKey(value) {
|
|
132
|
+
return typeof value === "number" && Number.isFinite(value) ? value : -Infinity;
|
|
133
|
+
}
|
|
134
|
+
function membersOf(key, cp) {
|
|
135
|
+
return { key, token: cp.token, sessionId: cp.sessionId, scope: cp.scope, status: cp.status, gate: cp.gate, pendingAction: cp.pendingAction, createdAt: cp.createdAt, deadline: cp.deadline, state: cp.state, checkpointId: cp.checkpointId };
|
|
136
|
+
}
|
|
137
|
+
function memberOf(value, key) {
|
|
138
|
+
return typeof value === "object" && value !== null && key in value ? value[key] : undefined;
|
|
139
|
+
}
|
|
140
|
+
const isStatusWord = (v) => STATUSES.some((s) => s === v);
|
|
141
|
+
const isFiniteNumber = (v) => typeof v === "number" && Number.isFinite(v);
|
|
142
|
+
function listingDamage(m) {
|
|
143
|
+
if (m.token !== m.key)
|
|
144
|
+
return "its token member is not the key the store files it under";
|
|
145
|
+
if (typeof m.scope !== "string")
|
|
146
|
+
return "its scope is not a string";
|
|
147
|
+
if (!isStatusWord(m.status))
|
|
148
|
+
return "its status is not one of pending / resolved / expired";
|
|
149
|
+
if (!isGateKind(memberOf(m.gate, "kind")))
|
|
150
|
+
return "its gate is not an object of a registered gate kind";
|
|
151
|
+
const actionKind = memberOf(m.pendingAction, "kind");
|
|
152
|
+
if (typeof actionKind !== "string")
|
|
153
|
+
return "its pending action is not an object with a kind";
|
|
154
|
+
if (actionKind === "tool_approval" && typeof memberOf(m.pendingAction, "toolCallId") !== "string")
|
|
155
|
+
return "its tool approval carries no tool call id";
|
|
156
|
+
if (!isFiniteNumber(m.createdAt))
|
|
157
|
+
return "its createdAt is not a finite number";
|
|
158
|
+
if (typeof m.state !== "object" || m.state === null)
|
|
159
|
+
return "its state is not an object";
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
function thrownName(e) {
|
|
163
|
+
return e instanceof Error ? e.constructor.name : typeof e;
|
|
164
|
+
}
|
|
165
|
+
function rowName(m) {
|
|
166
|
+
return `checkpoint ${typeof m.checkpointId === "string" ? JSON.stringify(m.checkpointId) : "null"} of session ${typeof m.sessionId === "string" ? JSON.stringify(m.sessionId) : "(unreadable)"}`;
|
|
167
|
+
}
|
|
168
|
+
function afterCursor(key, token, cursor, ascending) {
|
|
169
|
+
if (key !== cursor.key)
|
|
170
|
+
return ascending ? key > cursor.key : key < cursor.key;
|
|
171
|
+
return ascending ? token > cursor.token : token < cursor.token;
|
|
172
|
+
}
|
|
173
|
+
function compareKeys(a, b) {
|
|
174
|
+
if (a.key !== b.key)
|
|
175
|
+
return a.key < b.key ? -1 : 1;
|
|
176
|
+
return a.token < b.token ? -1 : a.token > b.token ? 1 : 0;
|
|
177
|
+
}
|
|
178
|
+
export function selectOverduePage(rows, query, project, disclose) {
|
|
179
|
+
const hits = [];
|
|
180
|
+
for (const [token, cp] of rows) {
|
|
181
|
+
const m = membersOf(token, cp);
|
|
182
|
+
if (m.status !== "pending" || !checkpointDeadlinePassed(m.deadline, query.cutoff))
|
|
183
|
+
continue;
|
|
184
|
+
const damage = typeof m.sessionId !== "string" ? "its sessionId is not a string" : listingDamage(m);
|
|
185
|
+
if (damage !== undefined) {
|
|
186
|
+
disclose?.(`${rowName(m)}: ${damage} — the overdue listing cannot read it, so it leaves it out`);
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
if (facetOf(m.gate) !== query.facet)
|
|
190
|
+
continue;
|
|
191
|
+
const key = orderKey(m.deadline);
|
|
192
|
+
if (query.after !== undefined && !afterCursor(key, token, { key: query.after.deadline, token: query.after.token }, true))
|
|
193
|
+
continue;
|
|
194
|
+
hits.push({ key, token, cp, m });
|
|
195
|
+
}
|
|
196
|
+
hits.sort(compareKeys);
|
|
197
|
+
const out = [];
|
|
198
|
+
let last;
|
|
199
|
+
let i = 0;
|
|
200
|
+
for (; i < hits.length && out.length < query.limit; i++) {
|
|
201
|
+
const hit = hits[i];
|
|
202
|
+
let summary;
|
|
203
|
+
try {
|
|
204
|
+
summary = project(hit.cp);
|
|
205
|
+
}
|
|
206
|
+
catch (e) {
|
|
207
|
+
disclose?.(`${rowName(hit.m)}: its summary could not be projected (${thrownName(e)}) — the overdue listing leaves it out`);
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
out.push(summary);
|
|
211
|
+
last = hit;
|
|
212
|
+
}
|
|
213
|
+
return { rows: out, ...(i < hits.length && last !== undefined ? { next: { deadline: last.key, token: last.token } } : {}) };
|
|
214
|
+
}
|
|
215
|
+
export function selectSessionPage(rows, query, clone, disclose) {
|
|
216
|
+
const ascending = query.order === "oldest";
|
|
217
|
+
const hits = [];
|
|
218
|
+
if (query.gateKinds !== undefined && query.gateKinds.length === 0)
|
|
219
|
+
return { rows: [] };
|
|
220
|
+
for (const [token, cp] of rows) {
|
|
221
|
+
const m = membersOf(token, cp);
|
|
222
|
+
if (typeof m.sessionId !== "string") {
|
|
223
|
+
disclose?.(`${rowName(m)}: its sessionId is not a string — no session listing can attribute it, so it is left out`);
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
if (m.sessionId !== query.sessionId)
|
|
227
|
+
continue;
|
|
228
|
+
if (query.scope !== undefined && typeof m.scope === "string" && m.scope !== query.scope)
|
|
229
|
+
continue;
|
|
230
|
+
if (query.status !== undefined && isStatusWord(m.status) && m.status !== query.status)
|
|
231
|
+
continue;
|
|
232
|
+
const gateKind = memberOf(m.gate, "kind");
|
|
233
|
+
if (query.gateKinds !== undefined && isGateKind(gateKind) && !query.gateKinds.includes(gateKind))
|
|
234
|
+
continue;
|
|
235
|
+
if (query.toolCallId !== undefined) {
|
|
236
|
+
const actionKind = memberOf(m.pendingAction, "kind");
|
|
237
|
+
const callId = memberOf(m.pendingAction, "toolCallId");
|
|
238
|
+
if (typeof actionKind === "string" && actionKind !== "tool_approval")
|
|
239
|
+
continue;
|
|
240
|
+
if (actionKind === "tool_approval" && typeof callId === "string" && callId !== query.toolCallId)
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
if (query.createdSince !== undefined && isFiniteNumber(m.createdAt) && m.createdAt < query.createdSince)
|
|
244
|
+
continue;
|
|
245
|
+
const key = orderKey(m.createdAt);
|
|
246
|
+
if (query.after !== undefined && !afterCursor(key, token, { key: query.after.createdAt, token: query.after.token }, ascending))
|
|
247
|
+
continue;
|
|
248
|
+
hits.push({ key, token, cp, m, damage: listingDamage(m) });
|
|
249
|
+
}
|
|
250
|
+
hits.sort((a, b) => (ascending ? 1 : -1) * compareKeys(a, b));
|
|
251
|
+
const page = hits.slice(0, query.limit);
|
|
252
|
+
const last = page[page.length - 1];
|
|
253
|
+
return {
|
|
254
|
+
rows: page.map((h) => readOut(h, clone, disclose)),
|
|
255
|
+
...(hits.length > query.limit && last !== undefined ? { next: { createdAt: last.key, token: last.token } } : {}),
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
function readOut(hit, clone, disclose) {
|
|
259
|
+
const { token, cp, m, damage } = hit;
|
|
260
|
+
if (damage === undefined)
|
|
261
|
+
return { kind: "row", checkpoint: clone(cp) };
|
|
262
|
+
disclose?.(`${rowName(m)}: ${damage} — listed as unreadable`);
|
|
263
|
+
return {
|
|
264
|
+
kind: "unreadable",
|
|
265
|
+
token: token,
|
|
266
|
+
scope: typeof m.scope === "string" ? m.scope : null,
|
|
267
|
+
sessionId: String(m.sessionId),
|
|
268
|
+
status: typeof m.status === "string" ? m.status : `(${typeof m.status})`,
|
|
269
|
+
createdAt: isFiniteNumber(m.createdAt) ? m.createdAt : null,
|
|
270
|
+
problem: damage,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
@@ -6,7 +6,7 @@ import { type StoreFidelity, type Checkpoint, type CheckpointFeature, type Check
|
|
|
6
6
|
* had carried beside the one its word now names, and the members added after the table, each a capability a reader
|
|
7
7
|
* must have. Downstream reads them for display only (`CheckpointError.detail.requires`).
|
|
8
8
|
*/
|
|
9
|
-
export declare const REQUIREMENT_WORDS: readonly ["resource", "binding", "token", "orgAdmission", "f012", "realApproval", "face", "requirements_digest", "org_admission_inherited", "org_write_grant", "org_governed", "delegation_provenance", "skill_grants", "skill_card_binding", "hands_coordinates", "hands_home", "path_rule_anchors", "path_rule_installations", "permission_mode", "plan_mode_restore", "persisted_rule_mandate", "deployment_authored", "call_names", "write_face", "denial_limit_fallback", "leg_scope", "tool_ceiling", "tool_lists_judged", "own_tool_lists", "approval_targets", "cross_boundary"];
|
|
9
|
+
export declare const REQUIREMENT_WORDS: readonly ["resource", "binding", "token", "orgAdmission", "f012", "realApproval", "face", "requirements_digest", "org_admission_inherited", "org_write_grant", "org_governed", "delegation_provenance", "skill_grants", "skill_card_binding", "hands_coordinates", "hands_home", "path_rule_anchors", "path_rule_installations", "permission_mode", "plan_mode_restore", "persisted_rule_mandate", "deployment_authored", "call_names", "write_face", "denial_limit_fallback", "leg_scope", "tool_ceiling", "tool_lists_judged", "own_tool_lists", "approval_targets", "cross_boundary", "mount_site", "skill_scopes"];
|
|
10
10
|
export type RequirementWord = (typeof REQUIREMENT_WORDS)[number];
|
|
11
11
|
/** Runtime twin of {@link RequirementWord}. */
|
|
12
12
|
export declare function isRequirementWord(word: unknown): word is RequirementWord;
|
|
@@ -124,6 +124,9 @@ export declare const CHECKPOINT_STATE_REQUIREMENTS: {
|
|
|
124
124
|
readonly skillGrants: {
|
|
125
125
|
readonly word: "skill_grants";
|
|
126
126
|
};
|
|
127
|
+
readonly skillScopes: {
|
|
128
|
+
readonly word: "skill_scopes";
|
|
129
|
+
};
|
|
127
130
|
readonly reminderMark: {
|
|
128
131
|
readonly digest: "decision-read";
|
|
129
132
|
};
|
|
@@ -317,9 +320,15 @@ export declare const PENDING_ACTION_REQUIREMENTS: {
|
|
|
317
320
|
readonly pathTarget: {
|
|
318
321
|
readonly digest: "decision-read";
|
|
319
322
|
};
|
|
323
|
+
readonly hostTarget: {
|
|
324
|
+
readonly digest: "decision-read";
|
|
325
|
+
};
|
|
320
326
|
readonly names: {
|
|
321
327
|
readonly word: "call_names";
|
|
322
328
|
};
|
|
329
|
+
readonly engineMounted: {
|
|
330
|
+
readonly word: "mount_site";
|
|
331
|
+
};
|
|
323
332
|
readonly targets: {
|
|
324
333
|
readonly word: "approval_targets";
|
|
325
334
|
};
|
|
@@ -482,6 +491,9 @@ export declare const CHECKPOINT_REQUIREMENTS: {
|
|
|
482
491
|
readonly skillGrants: {
|
|
483
492
|
readonly word: "skill_grants";
|
|
484
493
|
};
|
|
494
|
+
readonly skillScopes: {
|
|
495
|
+
readonly word: "skill_scopes";
|
|
496
|
+
};
|
|
485
497
|
readonly reminderMark: {
|
|
486
498
|
readonly digest: "decision-read";
|
|
487
499
|
};
|
|
@@ -820,9 +832,15 @@ export declare const CHECKPOINT_REQUIREMENTS: {
|
|
|
820
832
|
readonly pathTarget: {
|
|
821
833
|
readonly digest: "decision-read";
|
|
822
834
|
};
|
|
835
|
+
readonly hostTarget: {
|
|
836
|
+
readonly digest: "decision-read";
|
|
837
|
+
};
|
|
823
838
|
readonly names: {
|
|
824
839
|
readonly word: "call_names";
|
|
825
840
|
};
|
|
841
|
+
readonly engineMounted: {
|
|
842
|
+
readonly word: "mount_site";
|
|
843
|
+
};
|
|
826
844
|
readonly targets: {
|
|
827
845
|
readonly word: "approval_targets";
|
|
828
846
|
};
|
|
@@ -873,9 +891,6 @@ export interface UnencodableMember {
|
|
|
873
891
|
readonly path: string;
|
|
874
892
|
readonly kind: "cycle" | "depth" | "function" | "symbol" | "unreadable" | "codec";
|
|
875
893
|
}
|
|
876
|
-
/** Where a value holds something the row digest cannot encode, or `undefined` — the park mint asks this of the
|
|
877
|
-
* arguments before any side effect, so such a call is refused before anything is paused. */
|
|
878
|
-
export declare function unencodableIn(value: unknown, path: string): UnencodableMember | undefined;
|
|
879
894
|
/** The row digest: sha256 (hex) over the binding serializer's canonical form ({@link canonicalize}: type-tagged,
|
|
880
895
|
* sorted keys) of every member a decision reads but the digest itself, keyed by path, each read through
|
|
881
896
|
* {@link digestProjection}. Never a constant: a value it cannot encode throws {@link RowNotEncodable}. */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import { canonicalize, UNCANONICALIZABLE } from "./canonical-json.js";
|
|
2
|
+
import { canonicalize, MAX_DEPTH, UNCANONICALIZABLE } from "./canonical-json.js";
|
|
3
3
|
import { CHECKPOINT_FEATURES, checkpointVersionOf, encodeAtFidelity } from "./checkpoint-store.js";
|
|
4
4
|
export const REQUIREMENT_WORDS = Object.freeze([
|
|
5
5
|
"resource",
|
|
@@ -33,6 +33,8 @@ export const REQUIREMENT_WORDS = Object.freeze([
|
|
|
33
33
|
"own_tool_lists",
|
|
34
34
|
"approval_targets",
|
|
35
35
|
"cross_boundary",
|
|
36
|
+
"mount_site",
|
|
37
|
+
"skill_scopes",
|
|
36
38
|
]);
|
|
37
39
|
export function isRequirementWord(word) {
|
|
38
40
|
return typeof word === "string" && REQUIREMENT_WORDS.includes(word);
|
|
@@ -74,6 +76,7 @@ export const CHECKPOINT_STATE_REQUIREMENTS = {
|
|
|
74
76
|
readFace: { word: "face" },
|
|
75
77
|
writeFace: { word: "write_face" },
|
|
76
78
|
skillGrants: { word: "skill_grants" },
|
|
79
|
+
skillScopes: { word: "skill_scopes" },
|
|
77
80
|
reminderMark: DECISION_READ,
|
|
78
81
|
repairBundle: DECISION_READ,
|
|
79
82
|
workspaceHandle: DECISION_READ,
|
|
@@ -126,7 +129,9 @@ export const PENDING_ACTION_REQUIREMENTS = {
|
|
|
126
129
|
implementationRevision: DECISION_READ,
|
|
127
130
|
family: DECISION_READ,
|
|
128
131
|
pathTarget: DECISION_READ,
|
|
132
|
+
hostTarget: DECISION_READ,
|
|
129
133
|
names: { word: "call_names" },
|
|
134
|
+
engineMounted: { word: "mount_site" },
|
|
130
135
|
targets: { word: "approval_targets" },
|
|
131
136
|
hasBidiControls: SHOWN,
|
|
132
137
|
batchToolCallIds: DECISION_READ,
|
|
@@ -212,7 +217,7 @@ class RowNotEncodable extends Error {
|
|
|
212
217
|
this.at = at;
|
|
213
218
|
}
|
|
214
219
|
}
|
|
215
|
-
const DIGEST_DEPTH_CAP =
|
|
220
|
+
const DIGEST_DEPTH_CAP = MAX_DEPTH + 1;
|
|
216
221
|
function digestProjection(value, path, depth, open) {
|
|
217
222
|
if (typeof value === "function")
|
|
218
223
|
throw new RowNotEncodable({ path, kind: "function" });
|
|
@@ -255,24 +260,13 @@ function digestProjection(value, path, depth, open) {
|
|
|
255
260
|
open.delete(value);
|
|
256
261
|
}
|
|
257
262
|
}
|
|
258
|
-
export function unencodableIn(value, path) {
|
|
259
|
-
try {
|
|
260
|
-
digestProjection(value, path, 1, new Set());
|
|
261
|
-
return undefined;
|
|
262
|
-
}
|
|
263
|
-
catch (e) {
|
|
264
|
-
if (e instanceof RowNotEncodable)
|
|
265
|
-
return e.at;
|
|
266
|
-
throw e;
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
263
|
export function requirementsDigestOf(cp) {
|
|
270
264
|
const held = Object.create(null);
|
|
271
265
|
const open = new Set();
|
|
272
266
|
for (const m of membersOf(cp))
|
|
273
267
|
if (m.path !== "requirementsDigest")
|
|
274
268
|
held[m.path] = digestProjection(m.value, m.path, 1, open);
|
|
275
|
-
const canonical = canonicalize(held);
|
|
269
|
+
const canonical = canonicalize(held, -1);
|
|
276
270
|
if (canonical === UNCANONICALIZABLE)
|
|
277
271
|
throw new RowNotEncodable({ path: "(row)", kind: "unreadable" });
|
|
278
272
|
return createHash("sha256").update(canonical, "utf8").digest("hex");
|