@sema-agent/core 7.55.0 → 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 +513 -0
- package/dist/agents/cascade.js +1 -1
- package/dist/agents/cc-peer-directory.js +1 -0
- package/dist/agents/child-model-seat.d.ts +0 -11
- package/dist/agents/child-model-seat.js +0 -3
- package/dist/agents/list-agents-tool.d.ts +3 -1
- package/dist/agents/list-agents-tool.js +7 -7
- package/dist/agents/peer-directory.d.ts +22 -4
- package/dist/agents/peer-directory.js +24 -2
- package/dist/agents/peer-session-drain.js +2 -2
- package/dist/agents/repair-loop.js +2 -2
- package/dist/agents/send-message-tool.js +4 -4
- package/dist/agents/subagent.d.ts +6 -4
- package/dist/agents/subagent.js +64 -60
- package/dist/agents/tool-filter.d.ts +7 -5
- package/dist/agents/tool-filter.js +12 -9
- package/dist/agents/verify.d.ts +3 -2
- package/dist/agents/verify.js +3 -3
- package/dist/brain/anthropic.js +30 -73
- package/dist/brain/media-degrade.d.ts +18 -7
- package/dist/brain/media-degrade.js +13 -2
- package/dist/brain/model-capability.d.ts +37 -0
- package/dist/brain/model-capability.js +34 -0
- package/dist/brain/model-presets.d.ts +2 -8
- package/dist/brain/model-presets.js +1 -6
- package/dist/brain/open-responses.js +13 -26
- package/dist/brain/openai.js +14 -87
- package/dist/brain/reasoning-request.d.ts +96 -0
- package/dist/brain/reasoning-request.js +174 -0
- package/dist/brain/reasoning.d.ts +11 -11
- package/dist/brain/reasoning.js +4 -3
- package/dist/brain/request-params.d.ts +7 -4
- package/dist/brain/request-params.js +7 -4
- package/dist/brain/status-sink.d.ts +20 -0
- package/dist/brain/status-sink.js +7 -0
- package/dist/core/a2a.d.ts +2 -1
- package/dist/core/a2a.js +19 -13
- package/dist/core/agent-definition.d.ts +10 -0
- package/dist/core/allow-entry.d.ts +20 -13
- package/dist/core/allow-entry.js +26 -22
- package/dist/core/allow-rule-shadow.d.ts +3 -3
- package/dist/core/ask-origin.d.ts +64 -18
- package/dist/core/ask-origin.js +63 -23
- package/dist/core/ask-question.d.ts +51 -8
- package/dist/core/ask-question.js +3 -4
- package/dist/core/ask-unresolvable-notice.d.ts +8 -3
- package/dist/core/ask-unresolvable-notice.js +16 -2
- package/dist/core/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 +13 -1
- package/dist/core/checkpoint-requirements.js +4 -0
- package/dist/core/checkpoint-store.d.ts +88 -24
- package/dist/core/checkpoint-store.js +24 -9
- package/dist/core/cross-boundary-taint.d.ts +6 -5
- package/dist/core/cross-boundary-taint.js +1 -3
- package/dist/core/decision-receipt.d.ts +37 -3
- package/dist/core/decision-receipt.js +17 -17
- package/dist/core/delegation-not-started.d.ts +6 -0
- package/dist/core/delegation-not-started.js +17 -0
- package/dist/core/engine-attestation.d.ts +93 -0
- package/dist/core/engine-attestation.js +70 -0
- package/dist/core/engine-capabilities.d.ts +4 -1
- package/dist/core/engine-capabilities.js +1 -1
- package/dist/core/engine-notice.d.ts +30 -11
- package/dist/core/file-history-store.d.ts +90 -14
- package/dist/core/file-history-store.js +23 -15
- package/dist/core/gate-fold.d.ts +1 -1
- package/dist/core/gate-fold.js +22 -10
- package/dist/core/gate-lanes.js +73 -64
- package/dist/core/gate-outcome.d.ts +26 -5
- package/dist/core/gate-outcome.js +26 -0
- package/dist/core/governance-codes.d.ts +5 -1
- package/dist/core/governance-codes.js +6 -0
- package/dist/core/hooks.d.ts +17 -16
- package/dist/core/hooks.js +3 -1
- package/dist/core/host-floor.d.ts +128 -0
- package/dist/core/host-floor.js +206 -0
- package/dist/core/host-target.d.ts +38 -3
- package/dist/core/host-target.js +38 -5
- package/dist/core/mcp.d.ts +5 -1
- package/dist/core/mcp.js +67 -41
- package/dist/core/memory-engine/delegation-settlement.js +15 -24
- 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/model-seat.d.ts +10 -3
- package/dist/core/mods/classic-events.d.ts +67 -0
- package/dist/core/mods/classic-events.js +1 -0
- package/dist/core/mods/dollar.d.ts +13 -0
- package/dist/core/mods/extension-call.d.ts +31 -0
- package/dist/core/mods/extension-call.js +43 -0
- package/dist/core/mods/kernel/dispatch.d.ts +20 -3
- package/dist/core/mods/kernel/dispatch.js +140 -69
- package/dist/core/mods/kernel/events.d.ts +47 -11
- package/dist/core/mods/kernel/events.js +66 -42
- package/dist/core/mods/kernel/index.d.ts +4 -4
- package/dist/core/mods/kernel/index.js +2 -2
- package/dist/core/mods/kernel/receive.d.ts +39 -5
- package/dist/core/mods/kernel/receive.js +290 -17
- package/dist/core/mods/kernel/registration.d.ts +33 -2
- package/dist/core/mods/kernel/registration.js +6 -7
- package/dist/core/mods/kernel/site-rules.d.ts +44 -16
- package/dist/core/mods/kernel/site-rules.js +24 -42
- package/dist/core/mods/spec-seats.d.ts +69 -0
- package/dist/core/mods/spec-seats.js +114 -0
- package/dist/core/mods/stations.d.ts +28 -8
- package/dist/core/mods/stations.js +29 -13
- package/dist/core/mods/tool-call.d.ts +79 -0
- package/dist/core/mods/tool-call.js +152 -0
- package/dist/core/namespaced-rule-name.d.ts +32 -38
- package/dist/core/namespaced-rule-name.js +29 -36
- package/dist/core/parent-spec-seat.d.ts +6 -1
- package/dist/core/parent-spec-seat.js +2 -0
- package/dist/core/park-selfcheck.js +1 -0
- package/dist/core/permission-rule-consent.d.ts +19 -0
- package/dist/core/permission-rule-consent.js +116 -26
- package/dist/core/permission-rule-model.d.ts +14 -3
- package/dist/core/permission-rule-model.js +39 -24
- 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 +5 -2
- package/dist/core/permission-rule-provider.js +41 -11
- package/dist/core/permission-rule-store.d.ts +3 -2
- package/dist/core/permission-rule-store.js +11 -2
- package/dist/core/permission-rule-sync.js +3 -2
- package/dist/core/permission-rule-syntax.d.ts +5 -4
- package/dist/core/permission-rule-syntax.js +2 -2
- package/dist/core/permission-rules.d.ts +4 -4
- package/dist/core/permission-rules.js +11 -20
- package/dist/core/persisted-rule-arms.d.ts +2 -2
- package/dist/core/persisted-rule-arms.js +10 -12
- package/dist/core/principal-name.d.ts +20 -0
- package/dist/core/principal-name.js +22 -0
- package/dist/core/prompt-section-seat.js +4 -6
- package/dist/core/protocol-http-auth.d.ts +26 -5
- package/dist/core/protocol-http-auth.js +137 -4
- package/dist/core/retired-keys.d.ts +16 -0
- package/dist/core/retired-keys.js +16 -4
- package/dist/core/rewrite-rejudge.d.ts +60 -0
- package/dist/core/rewrite-rejudge.js +36 -0
- package/dist/core/roles.d.ts +28 -1
- package/dist/core/roles.js +31 -19
- package/dist/core/rule-lane-reads.d.ts +20 -15
- package/dist/core/rule-lane-reads.js +45 -17
- package/dist/core/rule-owner.d.ts +3 -3
- package/dist/core/rule-owner.js +3 -2
- package/dist/core/runner/announce-once-ledger.d.ts +14 -0
- package/dist/core/runner/announce-once-ledger.js +5 -0
- package/dist/core/runner/assemble-result.d.ts +1 -0
- package/dist/core/runner/assemble-result.js +1 -1
- package/dist/core/runner/call-hook-stations.d.ts +3 -2
- package/dist/core/runner/caller-roster.d.ts +16 -4
- package/dist/core/runner/caller-roster.js +33 -6
- package/dist/core/runner/capability-withheld-seat.d.ts +5 -0
- package/dist/core/runner/capability-withheld-seat.js +24 -0
- package/dist/core/runner/classifier-ladder.d.ts +7 -9
- package/dist/core/runner/classifier-ladder.js +3 -3
- package/dist/core/runner/construction-doors.js +3 -0
- package/dist/core/runner/contracts.d.ts +28 -25
- package/dist/core/runner/cross-boundary-lane.d.ts +17 -13
- package/dist/core/runner/cross-boundary-lane.js +40 -27
- package/dist/core/runner/denial-limit-arms.d.ts +2 -2
- package/dist/core/runner/denial-limit-arms.js +1 -1
- package/dist/core/runner/file-history-request.d.ts +18 -0
- package/dist/core/runner/file-history-request.js +21 -13
- package/dist/core/runner/file-history-restore.d.ts +45 -0
- package/dist/core/runner/file-history-restore.js +46 -0
- package/dist/core/runner/gate-exit.d.ts +3 -3
- package/dist/core/runner/gate-exit.js +4 -3
- package/dist/core/runner/image.d.ts +7 -17
- package/dist/core/runner/image.js +9 -60
- package/dist/core/runner/permission-rule-lanes.d.ts +4 -4
- package/dist/core/runner/permission-rule-lanes.js +26 -10
- package/dist/core/runner/person-path-rows.d.ts +12 -9
- package/dist/core/runner/person-path-rows.js +18 -7
- package/dist/core/runner/prepare-ask-lane.d.ts +2 -2
- package/dist/core/runner/prepare-ask-lane.js +5 -2
- package/dist/core/runner/prepare-caps-and-workflow.d.ts +4 -6
- package/dist/core/runner/prepare-caps-and-workflow.js +4 -3
- package/dist/core/runner/prepare-config-doors.d.ts +29 -38
- package/dist/core/runner/prepare-config-doors.js +42 -25
- package/dist/core/runner/prepare-defer-classify.d.ts +4 -3
- package/dist/core/runner/prepare-defer-classify.js +7 -8
- package/dist/core/runner/prepare-file-history.d.ts +48 -8
- package/dist/core/runner/prepare-file-history.js +7 -39
- package/dist/core/runner/prepare-gate-stations.d.ts +1 -1
- package/dist/core/runner/prepare-gate-stations.js +10 -1
- package/dist/core/runner/prepare-hands-readface.d.ts +2 -8
- package/dist/core/runner/prepare-hands-readface.js +15 -14
- package/dist/core/runner/prepare-inherited-gate.d.ts +6 -3
- package/dist/core/runner/prepare-inherited-gate.js +5 -3
- package/dist/core/runner/prepare-memory-engine-session.js +1 -1
- package/dist/core/runner/prepare-park-ask.js +5 -5
- package/dist/core/runner/prepare-policy-chain.d.ts +6 -3
- package/dist/core/runner/prepare-policy-chain.js +65 -72
- package/dist/core/runner/prepare-prompt-assembly.d.ts +5 -7
- package/dist/core/runner/prepare-prompt-assembly.js +10 -8
- package/dist/core/runner/prepare-prompt-inputs.d.ts +11 -9
- package/dist/core/runner/prepare-prompt-inputs.js +3 -5
- package/dist/core/runner/prepare-protocol-tools.d.ts +2 -0
- package/dist/core/runner/prepare-protocol-tools.js +3 -3
- package/dist/core/runner/prepare-safety-scan.d.ts +1 -1
- package/dist/core/runner/prepare-safety-scan.js +0 -17
- package/dist/core/runner/prepare-suspend-saga.d.ts +2 -0
- package/dist/core/runner/prepare-suspend-saga.js +5 -6
- package/dist/core/runner/prepare-task.d.ts +1 -1
- package/dist/core/runner/prepare-task.js +29 -20
- package/dist/core/runner/prepare-tool-disclosure-mount.d.ts +7 -4
- package/dist/core/runner/prepare-tool-disclosure-mount.js +20 -16
- package/dist/core/runner/prepare-turn-wiring.d.ts +0 -4
- package/dist/core/runner/prepare-turn-wiring.js +2 -7
- package/dist/core/runner/prepare-wiring-manifest.d.ts +6 -2
- package/dist/core/runner/prepare-wiring-manifest.js +3 -3
- package/dist/core/runner/resume-admission.js +1 -1
- package/dist/core/runner/resume-apply.js +11 -12
- package/dist/core/runner/resume-checkpoint-screen.js +3 -0
- package/dist/core/runner/resume-claim.d.ts +4 -2
- package/dist/core/runner/resume-claim.js +15 -8
- package/dist/core/runner/retired-runner-deps.js +1 -0
- package/dist/core/runner/rewind-files.d.ts +15 -0
- package/dist/core/runner/rewind-files.js +132 -0
- package/dist/core/runner/run-attachment-seats.js +2 -1
- package/dist/core/runner/run-brain-sinks.d.ts +4 -1
- package/dist/core/runner/run-brain-sinks.js +4 -2
- package/dist/core/runner/run-harness-handlers.js +12 -4
- package/dist/core/runner/run-leg.d.ts +1 -1
- package/dist/core/runner/run-leg.js +30 -18
- package/dist/core/runner/run-settle-and-teardown.js +2 -1
- package/dist/core/runner/run-turn-boundary.js +1 -10
- 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.js +4 -3
- package/dist/core/runner/shell-env-withheld.d.ts +33 -0
- package/dist/core/runner/shell-env-withheld.js +51 -0
- package/dist/core/runner/skills-seat.js +6 -2
- package/dist/core/runner/stream-settle-backstop.js +1 -1
- package/dist/core/runner/sub-agent-deny-lists.js +4 -7
- package/dist/core/runner/synthetic-tools.d.ts +6 -0
- package/dist/core/runner/synthetic-tools.js +4 -1
- package/dist/core/runner/tool-disclosure.d.ts +10 -12
- package/dist/core/runner/tool-disclosure.js +1 -3
- package/dist/core/runner/tool-end-body.d.ts +1 -1
- package/dist/core/runner/tool-end-body.js +10 -9
- package/dist/core/runner/tool-not-executed.d.ts +5 -0
- package/dist/core/runner/tool-not-executed.js +11 -0
- package/dist/core/runner/tool-occurrence.d.ts +8 -0
- package/dist/core/runner/tool-occurrence.js +7 -0
- package/dist/core/runner/turn-attachments.d.ts +33 -15
- package/dist/core/runner/turn-attachments.js +62 -37
- package/dist/core/runner-deps.d.ts +5 -5
- package/dist/core/safety-axis-vocab.d.ts +6 -4
- package/dist/core/safety-axis-vocab.js +6 -5
- package/dist/core/safety-merge-corpus.js +11 -3
- package/dist/core/secret-env.d.ts +26 -3
- package/dist/core/secret-env.js +44 -8
- package/dist/core/select-model.js +3 -3
- package/dist/core/session-policy-store.d.ts +27 -15
- package/dist/core/session-policy-store.js +156 -36
- package/dist/core/session-store.d.ts +29 -10
- package/dist/core/session-store.js +51 -19
- package/dist/core/session.d.ts +82 -16
- package/dist/core/session.js +53 -0
- package/dist/core/shell-read-silence.d.ts +11 -12
- package/dist/core/shell-read-silence.js +9 -5
- package/dist/core/shell-run-candidates.js +3 -1
- package/dist/core/shell-wrapper-projection.js +1 -1
- package/dist/core/shell-wrapper-table.d.ts +14 -7
- package/dist/core/shell-wrapper-table.js +5 -4
- package/dist/core/side-query.js +10 -1
- package/dist/core/skill-grant.d.ts +7 -2
- package/dist/core/skill-grant.js +5 -0
- package/dist/core/skills-directory.js +6 -2
- package/dist/core/store-contracts/checkpoint-store-contract.d.ts +11 -1
- package/dist/core/store-contracts/checkpoint-store-contract.js +140 -2
- package/dist/core/store-contracts/file-history-store-contract.js +31 -1
- package/dist/core/store-contracts/peer-directory-contract.d.ts +7 -2
- package/dist/core/store-contracts/peer-directory-contract.js +14 -2
- package/dist/core/store-contracts/session-repo-contract.js +51 -0
- package/dist/core/store-contracts/session-store-contract.d.ts +2 -1
- package/dist/core/store-contracts/session-store-contract.js +150 -14
- package/dist/core/stub-env.d.ts +2 -0
- package/dist/core/stub-env.js +1 -0
- package/dist/core/synthetic-read-verdict.js +3 -3
- package/dist/core/task-event.d.ts +32 -4
- package/dist/core/task-notification.d.ts +16 -12
- package/dist/core/task-registry.d.ts +9 -0
- package/dist/core/task-registry.js +11 -1
- package/dist/core/task-result.d.ts +18 -0
- package/dist/core/task-spec.d.ts +18 -13
- package/dist/core/tighten-task-spec.js +2 -1
- package/dist/core/tool-catalog-entries.d.ts +17 -0
- package/dist/core/tool-catalog-entries.js +13 -2
- package/dist/core/tool-check-reading.d.ts +11 -0
- package/dist/core/tool-check-reading.js +11 -6
- package/dist/core/tool-model-gate.d.ts +2 -2
- package/dist/core/tool-name-aliases.d.ts +16 -16
- package/dist/core/tool-name-aliases.js +13 -19
- package/dist/core/tool-name-readings.d.ts +5 -35
- package/dist/core/tool-name-readings.js +1 -9
- package/dist/core/tool-policy.d.ts +68 -198
- package/dist/core/tool-policy.js +149 -198
- package/dist/core/tool-result-store.js +3 -0
- package/dist/core/tool-roster.d.ts +14 -19
- package/dist/core/tool-roster.js +11 -44
- package/dist/core/tool-spec-members.js +7 -2
- package/dist/core/tool-spec.d.ts +19 -11
- package/dist/core/tools.js +49 -9
- package/dist/core/trace.d.ts +2 -2
- package/dist/core/types.d.ts +1 -1
- package/dist/core/user-attachment.d.ts +8 -1
- package/dist/core/user-attachment.js +64 -4
- package/dist/core/wiring-manifest.d.ts +9 -0
- package/dist/core/wiring-manifest.js +1 -0
- package/dist/core/workflow-journal-store.js +1 -1
- package/dist/engine/compaction/compaction.js +3 -2
- package/dist/engine/execution-env/node-execution-env.d.ts +7 -3
- package/dist/engine/execution-env/node-execution-env.js +11 -2
- package/dist/engine/harness/agent-harness.d.ts +25 -1
- package/dist/engine/harness/agent-harness.js +54 -7
- package/dist/engine/harness/types.d.ts +29 -2
- package/dist/engine/llm/types.d.ts +28 -11
- package/dist/engine/loop/agent-loop.d.ts +22 -0
- package/dist/engine/loop/agent-loop.js +16 -26
- package/dist/engine/loop/types.d.ts +16 -6
- package/dist/engine/session/memory-repo.d.ts +9 -2
- package/dist/engine/session/memory-repo.js +11 -1
- package/dist/engine/session/repo-utils.d.ts +6 -5
- package/dist/engine/session/repo-utils.js +14 -6
- package/dist/index.d.ts +22 -10
- package/dist/index.js +15 -7
- package/dist/internal/harness-types.d.ts +1 -1
- package/dist/internal/llm.d.ts +1 -1
- package/dist/orchestration/run-workflow-tool.d.ts +6 -4
- package/dist/orchestration/run-workflow-tool.js +5 -3
- package/dist/orchestration/workflow.d.ts +3 -0
- package/dist/orchestration/workflow.js +36 -18
- package/dist/prompt-assembly/artifact.d.ts +2 -2
- package/dist/prompt-assembly/artifact.js +5 -3
- package/dist/prompt-assembly/assemble.d.ts +3 -2
- package/dist/prompt-assembly/assemble.js +1 -1
- package/dist/prompt-assembly/catalog/schema.d.ts +43 -12
- package/dist/prompt-assembly/catalog/schema.js +34 -2
- package/dist/prompt-assembly/catalog/sections.js +0 -1
- package/dist/prompt-assembly/composer.d.ts +3 -1
- package/dist/prompt-assembly/composer.js +1 -1
- package/dist/prompt-assembly/event-registry.js +1 -0
- package/dist/prompt-assembly/overlay.js +3 -3
- package/dist/prompt-assembly/renderers.d.ts +1 -1
- package/dist/prompt-assembly/renderers.js +0 -3
- package/dist/prompt-assembly/role-base.d.ts +15 -0
- package/dist/prompt-assembly/role-base.js +9 -0
- package/dist/prompt-assembly/select.d.ts +39 -14
- package/dist/prompt-assembly/select.js +47 -16
- package/dist/prompt-assembly/sugar.d.ts +17 -11
- package/dist/prompt-assembly/sugar.js +8 -3
- package/dist/prompt-assembly/tool-catalog.d.ts +37 -3
- package/dist/prompt-assembly/tool-catalog.js +114 -4
- package/dist/prompt-assembly/turn-snapshot.d.ts +4 -10
- package/dist/prompt-assembly/turn-snapshot.js +0 -3
- package/dist/prompt-assembly/types.d.ts +0 -7
- package/dist/scenarios/full-body.d.ts +11 -11
- package/dist/scenarios/full-body.js +4 -3
- package/dist/shell/lex.js +10 -1
- package/dist/stores/file/adoption/adopt.js +4 -3
- package/dist/stores/file/adoption/marker.js +3 -2
- package/dist/stores/file/checkpoint-store.d.ts +21 -0
- package/dist/stores/file/checkpoint-store.js +38 -6
- package/dist/stores/file/file-history-store.js +6 -7
- package/dist/stores/file/index.js +2 -1
- package/dist/stores/file/permission-rule-adopt.js +4 -3
- package/dist/stores/file/permission-rule-store.js +11 -5
- package/dist/stores/file/session-store.d.ts +29 -6
- package/dist/stores/file/session-store.js +42 -50
- package/dist/tools/artifact/artifact-tool.js +3 -2
- package/dist/tools/fs/bash-program-position.d.ts +19 -2
- package/dist/tools/fs/bash-program-position.js +56 -9
- package/dist/tools/fs/fs-bash.js +5 -5
- package/dist/tools/fs/fs-glob.d.ts +86 -0
- package/dist/tools/fs/fs-glob.js +226 -0
- package/dist/tools/fs/fs-read.js +14 -14
- package/dist/tools/fs/fs-search-tools.js +7 -7
- package/dist/tools/fs/pattern-kill-guard.d.ts +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/removal-targets.d.ts +17 -7
- package/dist/tools/fs/removal-targets.js +47 -20
- package/dist/tools/fs/search.d.ts +10 -0
- package/dist/tools/fs/search.js +20 -26
- package/dist/tools/fs/shell-read-argv.js +89 -12
- package/dist/tools/fs/shell-read-bindings.d.ts +31 -0
- package/dist/tools/fs/shell-read-bindings.js +41 -0
- package/dist/tools/fs/shell-read-check.js +6 -19
- 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-plan.js +24 -16
- package/dist/tools/fs/shell-read-start.d.ts +6 -1
- package/dist/tools/fs/shell-read-write-targets.d.ts +5 -1
- package/dist/tools/fs/shell-read-write-targets.js +2 -3
- package/dist/tools/fs/shell-reentry-text.d.ts +9 -0
- package/dist/tools/fs/shell-reentry-text.js +40 -2
- package/dist/tools/todo.js +63 -63
- package/dist/tools/web.d.ts +19 -14
- package/dist/tools/web.js +38 -55
- package/package.json +1 -1
- package/test/export-surface.snapshot.json +143 -5
- package/wire-changes/core@7.56.0.json +3891 -0
- package/wire-changes/mods-kernel@7.56.0.json +303 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { APPROVAL_REMEDY_KINDS, readApprovalRemedy } from "./ask-origin.js";
|
|
1
2
|
export const ASK_UNRESOLVABLE_CAUSES = Object.freeze(["approver_unavailable", "no_approver_wired", "mandate_unreconstructible"]);
|
|
2
3
|
Object.freeze(ASK_UNRESOLVABLE_CAUSES);
|
|
3
4
|
const ASK_UNRESOLVABLE_CAUSE_SET = new Set(ASK_UNRESOLVABLE_CAUSES);
|
|
@@ -18,7 +19,7 @@ export function askUnresolvableRemedySeat(cause) {
|
|
|
18
19
|
return CAUSE_REMEDY_SEAT[cause];
|
|
19
20
|
}
|
|
20
21
|
export function askUnresolvableNotice(facts) {
|
|
21
|
-
const { sessionId, toolName, toolCallId, cause, parkLaneExisted, remedy } = facts;
|
|
22
|
+
const { sessionId, toolName, toolCallId, cause, parkLaneExisted, remedy, remedies } = facts;
|
|
22
23
|
if (typeof sessionId !== "string" || sessionId.length === 0) {
|
|
23
24
|
throw new TypeError("delegation.ask_unresolvable: sessionId is required — a user-audience notice with no session routes nowhere");
|
|
24
25
|
}
|
|
@@ -31,12 +32,25 @@ export function askUnresolvableNotice(facts) {
|
|
|
31
32
|
if (!isAskUnresolvableCause(cause)) {
|
|
32
33
|
throw new TypeError(`delegation.ask_unresolvable: cause ${JSON.stringify(cause)} is not one of ${ASK_UNRESOLVABLE_CAUSES.join("/")}`);
|
|
33
34
|
}
|
|
35
|
+
let remedyList;
|
|
36
|
+
if (remedies !== undefined) {
|
|
37
|
+
if (typeof remedy !== "string" || remedy.length === 0 || !Array.isArray(remedies) || remedies.length === 0) {
|
|
38
|
+
throw new TypeError("delegation.ask_unresolvable: remedies are a non-empty list of ways out riding beside the remedy sentence they restate");
|
|
39
|
+
}
|
|
40
|
+
remedyList = [];
|
|
41
|
+
for (let i = 0; i < remedies.length; i++) {
|
|
42
|
+
const read = Object.hasOwn(remedies, i) ? readApprovalRemedy(remedies[i]) : undefined;
|
|
43
|
+
if (read === undefined)
|
|
44
|
+
throw new TypeError(`delegation.ask_unresolvable: remedies[${i}] is not one way out of the closed set (${APPROVAL_REMEDY_KINDS.join("/")}) with exactly its own fields`);
|
|
45
|
+
remedyList.push(read);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
34
48
|
const park = parkLaneExisted ? "the durable approval park did not take it" : "no durable approval park is armed for this run";
|
|
35
49
|
return {
|
|
36
50
|
code: "delegation.ask_unresolvable",
|
|
37
51
|
message: `approval for "${toolName}" could not be resolved: ${CAUSE_CLAUSE[cause]} and ${park} — ` +
|
|
38
52
|
`the call was denied fail-closed and did not run. ${typeof remedy === "string" && remedy.length > 0 ? `To let it run: ${remedy}. ` : ""}To let such approvals wait for a person, run with a checkpoint store and a ` +
|
|
39
53
|
`durable approval opt-in (or a live approver reachable for delegated children).`,
|
|
40
|
-
detail: { sessionId, toolName, toolCallId, cause, parkLaneExisted: parkLaneExisted === true, ...(typeof remedy === "string" && remedy.length > 0 ? { remedy } : {}) },
|
|
54
|
+
detail: { sessionId, toolName, toolCallId, cause, parkLaneExisted: parkLaneExisted === true, ...(typeof remedy === "string" && remedy.length > 0 ? { remedy } : {}), ...(remedyList !== undefined ? { remedies: remedyList } : {}) },
|
|
41
55
|
};
|
|
42
56
|
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A checkpoint row's generation and the judges of a resolve's expectation over it (the generation, the claim holder). Every
|
|
3
|
+
* backend, the resume's claim and a host that compares two reads of one row read the generation here, so "an absent `rev`
|
|
4
|
+
* reads as 0" is written once.
|
|
5
|
+
* A leaf: it types against `checkpoint-store.ts` (type only), so the store module can call it without a load-order cycle.
|
|
6
|
+
*/
|
|
7
|
+
import type { Checkpoint, CheckpointStore, ResolveExpectation } from "./checkpoint-store.js";
|
|
8
|
+
/**
|
|
9
|
+
* THE generation of a checkpoint row: its monotonic {@link Checkpoint.rev}, where an absent `rev` (a row
|
|
10
|
+
* minted before the field existed, never mutated) reads as `0`. This is the one place that rule is
|
|
11
|
+
* written — the CAS predicate under it, the loss answer, both backends' resolve / reopen bump, and the
|
|
12
|
+
* resume's expectation all read the generation through it, and so should a backend or a host that
|
|
13
|
+
* compares two reads of one row (`checkpointRevOf(again) === checkpointRevOf(row)` ⇒ no resolve / reopen
|
|
14
|
+
* landed between them).
|
|
15
|
+
*/
|
|
16
|
+
export declare function checkpointRevOf(cp: Pick<Checkpoint, "rev">): number;
|
|
17
|
+
/**
|
|
18
|
+
* REF-A4 — THE optimistic-concurrency half of `resolve`'s CAS predicate (design/80 D-1), shared by every
|
|
19
|
+
* backend. The caller validated its reopen-by-reason guard against a `get()` snapshot; if a concurrent
|
|
20
|
+
* resolve/reopen cycle moved the monotonic `rev` in the get→resolve window, that validation is stale ⇒
|
|
21
|
+
* lose the CAS (fail-closed), forcing a re-get + re-validate. Keyed on `rev`, NOT on `reopenReason` — a
|
|
22
|
+
* 2-valued enum can ABA back to a prior value while the winner changed (round-2 BLOCKER fix). An absent
|
|
23
|
+
* expectation opts out of the guard entirely.
|
|
24
|
+
*/
|
|
25
|
+
export declare function checkpointOccMatches(cp: Checkpoint, expect?: ResolveExpectation): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* The deployment's judge of a claim holder, handed to an in-tree store (`holderIsCurrent`): `true` while the grant `holder` names is
|
|
28
|
+
* the current one, `false` once it is not. Exactly `true` is current; any answer that is not a boolean — a promise from an async judge
|
|
29
|
+
* included — is refused loudly ({@link checkpointHolderMatches}), never read by its truthiness and never as a lost grant.
|
|
30
|
+
* SYNCHRONOUS — the store calls it inside its atomic step, right before the commit, so the judgement and the flip
|
|
31
|
+
* are one step with respect to code in THIS process. That closes the race only when the deployment's claim transfers happen in this
|
|
32
|
+
* process and synchronously (an in-process claim table); a claim another process can transfer needs a store whose CAS and the claim
|
|
33
|
+
* table share one transaction (a SQL backend's WHERE).
|
|
34
|
+
*/
|
|
35
|
+
export type HolderJudge = (holder: string) => boolean;
|
|
36
|
+
/**
|
|
37
|
+
* THE holder half of the same predicate ({@link ResolveExpectation.holder}), shared by every backend that judges holders through a
|
|
38
|
+
* function: no holder ⇒ nothing to judge; a holder ⇒ the store's judge answers whether that grant is still the current one. A store
|
|
39
|
+
* with no judge loses a holder-bearing CAS — it never ignores a precondition it was handed. Called inside the store's atomic step,
|
|
40
|
+
* right before the commit; a judge that throws makes the CAS throw with the row untouched. The judge's answer is current only when it
|
|
41
|
+
* is exactly `true`; an answer that is not a boolean throws `config.invalid_checkpoint_store` (the row untouched): a wiring error is
|
|
42
|
+
* named as one, not passed as a grant (by truthiness) nor reported as a superseded holder (by refusal).
|
|
43
|
+
*/
|
|
44
|
+
export declare function checkpointHolderMatches(expect: ResolveExpectation | undefined, holderIsCurrent: HolderJudge | undefined): boolean;
|
|
45
|
+
/** `RunInternals.holder` when present: a non-empty string (the deployment's credential for one claim grant). A provided value that
|
|
46
|
+
* is empty or not a string names no grant and is refused at the door (`config.invalid_argument`), never carried into a CAS where a
|
|
47
|
+
* judge would read it as a grant that lost. The value itself is never printed — only its kind. */
|
|
48
|
+
export declare function assertHolderValue(holder: unknown): void;
|
|
49
|
+
/** The store-seat refusal of a claim holder the seat's store cannot judge: a run handed {@link ResolveExpectation.holder} (through
|
|
50
|
+
* `RunInternals.holder`) whose store does not declare `fence = { holder: true }`. The store seat's door and code
|
|
51
|
+
* (`config.invalid_checkpoint_store`, as for a store without the execution declaration); no store (a disarmed run) has nothing to
|
|
52
|
+
* judge. The holder's value is never named. */
|
|
53
|
+
export declare function assertCheckpointStoreJudgesHolder(seat: "TaskSpec.checkpointStore" | "RunnerDeps.checkpointStore", store: CheckpointStore | undefined, holder: string | undefined): void;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export function checkpointRevOf(cp) {
|
|
2
|
+
return cp.rev ?? 0;
|
|
3
|
+
}
|
|
4
|
+
export function checkpointOccMatches(cp, expect) {
|
|
5
|
+
return expect === undefined || checkpointRevOf(cp) === expect.rev;
|
|
6
|
+
}
|
|
7
|
+
export function checkpointHolderMatches(expect, holderIsCurrent) {
|
|
8
|
+
if (expect?.holder === undefined)
|
|
9
|
+
return true;
|
|
10
|
+
if (holderIsCurrent === undefined)
|
|
11
|
+
return false;
|
|
12
|
+
const answer = holderIsCurrent(expect.holder);
|
|
13
|
+
if (typeof answer !== "boolean") {
|
|
14
|
+
const kind = answer === null ? "null" : typeof answer === "object" ? "an object (an async judge answers a promise)" : `a ${typeof answer}`;
|
|
15
|
+
const e = new Error(`the checkpoint store's \`holderIsCurrent\` judge must answer \`true\` or \`false\` synchronously (it answered ${kind}) — any other answer is a wiring error, not a judgement; the resolve did not run and the row is untouched. Make the judge a synchronous read of the claim table.`);
|
|
16
|
+
e.code = "config.invalid_checkpoint_store";
|
|
17
|
+
throw e;
|
|
18
|
+
}
|
|
19
|
+
return answer === true;
|
|
20
|
+
}
|
|
21
|
+
export function assertHolderValue(holder) {
|
|
22
|
+
if (holder === undefined || (typeof holder === "string" && holder !== ""))
|
|
23
|
+
return;
|
|
24
|
+
const kind = holder === "" ? "an empty string" : holder === null ? "null" : `a ${typeof holder}`;
|
|
25
|
+
const e = new Error(`RunInternals.holder must be a non-empty string when present (got ${kind}) — it is the deployment's credential for the claim grant the run acts under; omit it for a run that acts under none.`);
|
|
26
|
+
e.code = "config.invalid_argument";
|
|
27
|
+
throw e;
|
|
28
|
+
}
|
|
29
|
+
export function assertCheckpointStoreJudgesHolder(seat, store, holder) {
|
|
30
|
+
if (holder === undefined || store === undefined || store.fence?.holder === true)
|
|
31
|
+
return;
|
|
32
|
+
const e = new Error(`${seat}: the run carries a claim holder, but the wired CheckpointStore does not declare \`fence = { holder: true }\` — a store that does not judge the holder in its resolve would ignore it, and the fence would hold nothing. Wire a store that judges holders (the in-tree stores take \`holderIsCurrent\`) or stop passing one.`);
|
|
33
|
+
e.code = "config.invalid_checkpoint_store";
|
|
34
|
+
throw e;
|
|
35
|
+
}
|
|
@@ -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
|
};
|
|
@@ -323,6 +326,9 @@ export declare const PENDING_ACTION_REQUIREMENTS: {
|
|
|
323
326
|
readonly names: {
|
|
324
327
|
readonly word: "call_names";
|
|
325
328
|
};
|
|
329
|
+
readonly engineMounted: {
|
|
330
|
+
readonly word: "mount_site";
|
|
331
|
+
};
|
|
326
332
|
readonly targets: {
|
|
327
333
|
readonly word: "approval_targets";
|
|
328
334
|
};
|
|
@@ -485,6 +491,9 @@ export declare const CHECKPOINT_REQUIREMENTS: {
|
|
|
485
491
|
readonly skillGrants: {
|
|
486
492
|
readonly word: "skill_grants";
|
|
487
493
|
};
|
|
494
|
+
readonly skillScopes: {
|
|
495
|
+
readonly word: "skill_scopes";
|
|
496
|
+
};
|
|
488
497
|
readonly reminderMark: {
|
|
489
498
|
readonly digest: "decision-read";
|
|
490
499
|
};
|
|
@@ -829,6 +838,9 @@ export declare const CHECKPOINT_REQUIREMENTS: {
|
|
|
829
838
|
readonly names: {
|
|
830
839
|
readonly word: "call_names";
|
|
831
840
|
};
|
|
841
|
+
readonly engineMounted: {
|
|
842
|
+
readonly word: "mount_site";
|
|
843
|
+
};
|
|
832
844
|
readonly targets: {
|
|
833
845
|
readonly word: "approval_targets";
|
|
834
846
|
};
|