@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,152 @@
|
|
|
1
|
+
import { formatHookFeedback } from "../reminder-mint.js";
|
|
2
|
+
import { toolFace } from "../tool-catalog-entries.js";
|
|
3
|
+
import { declaredDelegationNameOf } from "../delegation-name.js";
|
|
4
|
+
import { describeThrown } from "../tool-policy.js";
|
|
5
|
+
import { extensionWords } from "../untrusted-egress.js";
|
|
6
|
+
import { ENGINE_ORIGIN } from "./kernel/index.js";
|
|
7
|
+
import { isPlainRecord } from "./kernel/receive.js";
|
|
8
|
+
import { NEXT_IN_FLIGHT } from "./kernel/site-rules.js";
|
|
9
|
+
import { classicEventBase, failedHandlerClause, judgedInputOf } from "./stations.js";
|
|
10
|
+
import { runExtensionCall } from "./extension-call.js";
|
|
11
|
+
import { randomUUID } from "node:crypto";
|
|
12
|
+
const FORM = "tool.call takes next(e), { deny: <reason> } or { result } (a string, or a list of text blocks)";
|
|
13
|
+
const denyOf = (a) => isPlainRecord(a) && Object.keys(a).length === 1 && typeof a["deny"] === "string" && a["deny"] !== "" ? a["deny"] : undefined;
|
|
14
|
+
function substituteOf(a) {
|
|
15
|
+
if (!isPlainRecord(a) || Object.keys(a).length !== 1 || !Object.hasOwn(a, "result"))
|
|
16
|
+
return undefined;
|
|
17
|
+
const r = a["result"];
|
|
18
|
+
if (typeof r === "string")
|
|
19
|
+
return [{ type: "text", text: r }];
|
|
20
|
+
if (!Array.isArray(r) || r.length === 0)
|
|
21
|
+
return undefined;
|
|
22
|
+
const out = [];
|
|
23
|
+
for (const b of r) {
|
|
24
|
+
if (!isPlainRecord(b) || b["type"] !== "text" || typeof b["text"] !== "string" || Object.keys(b).some((k) => k !== "type" && k !== "text"))
|
|
25
|
+
return undefined;
|
|
26
|
+
out.push({ type: "text", text: b["text"] });
|
|
27
|
+
}
|
|
28
|
+
return out;
|
|
29
|
+
}
|
|
30
|
+
function viewOf(result) {
|
|
31
|
+
let blocks = [];
|
|
32
|
+
try {
|
|
33
|
+
const content = result.content;
|
|
34
|
+
blocks = (Array.isArray(content) ? content : []).map((b) => Object.freeze(Object.fromEntries(Object.entries(typeof b === "object" && b !== null ? b : {}).filter(([, v]) => v === null || typeof v === "string" || typeof v === "number" || typeof v === "boolean"))));
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
blocks = [];
|
|
38
|
+
}
|
|
39
|
+
return Object.freeze({ result: Object.freeze({ content: Object.freeze([...blocks]), isError: result.isError === true }) });
|
|
40
|
+
}
|
|
41
|
+
function letGoUnasked(occurrences, toolCallId) {
|
|
42
|
+
const latest = occurrences.get(toolCallId)?.gateRounds.at(-1);
|
|
43
|
+
if (latest === undefined || latest.disposition.kind !== "allowed" || latest.settlement !== undefined)
|
|
44
|
+
return false;
|
|
45
|
+
return latest.disposition.released === undefined && latest.disposition.clearedBy === undefined;
|
|
46
|
+
}
|
|
47
|
+
const RANKS = Object.freeze({ of: (a) => (denyOf(a) !== undefined ? 1 : 0), top: 1 });
|
|
48
|
+
export function createToolCallStation(input) {
|
|
49
|
+
if (!input.bus.hasHandlers("tool.call"))
|
|
50
|
+
return undefined;
|
|
51
|
+
const refusal = (call, by, text) => {
|
|
52
|
+
if (input.occurrences.get(call.toolCallId) !== undefined) {
|
|
53
|
+
input.occurrences.refuse(call.toolCallId, "hook");
|
|
54
|
+
input.occurrences.answeredInPlace(call.toolCallId, by);
|
|
55
|
+
}
|
|
56
|
+
input.blockedToolCalls.add(call.toolCallId);
|
|
57
|
+
return { content: [{ type: "text", text: formatHookFeedback(text, input.reminderMark) }], details: {}, isError: true };
|
|
58
|
+
};
|
|
59
|
+
return async (call, run, signal) => {
|
|
60
|
+
const e = { ...classicEventBase(input.identity), tool: call.toolName, tool_use_id: call.toolCallId, input: judgedInputOf(call.args) };
|
|
61
|
+
const bodies = new Map();
|
|
62
|
+
let body;
|
|
63
|
+
const bottom = async () => {
|
|
64
|
+
body = run();
|
|
65
|
+
const result = await body;
|
|
66
|
+
const view = viewOf(result);
|
|
67
|
+
bodies.set(view, result);
|
|
68
|
+
return view;
|
|
69
|
+
};
|
|
70
|
+
const checkAnswer = (a, _e, _by, below, ran) => {
|
|
71
|
+
if (typeof a === "object" && a !== null && bodies.has(a))
|
|
72
|
+
return undefined;
|
|
73
|
+
const denied = denyOf(a) !== undefined;
|
|
74
|
+
if (!denied && substituteOf(a) === undefined)
|
|
75
|
+
return FORM;
|
|
76
|
+
if (ran.bottomStarted)
|
|
77
|
+
return `a ${denied ? "deny" : "result"} after the tool started (once the tool runs, only its own outcome stands)`;
|
|
78
|
+
if (denied)
|
|
79
|
+
return below.some((b) => denyOf(b) === undefined) ? "a deny while its next(e) still runs or after it was answered (deny in place of next)" : undefined;
|
|
80
|
+
if (below.includes(NEXT_IN_FLIGHT))
|
|
81
|
+
return "a result while its next(e) still runs (result in place of next)";
|
|
82
|
+
return letGoUnasked(input.occurrences, call.toolCallId) ? undefined : "a result in place of a call someone was asked about (a person's or a rule's yes is a yes to running the tool, so only the tool answers it)";
|
|
83
|
+
};
|
|
84
|
+
let outcome;
|
|
85
|
+
try {
|
|
86
|
+
outcome = await input.bus.dispatch("tool.call", e, { bottom, checkAnswer, ranks: RANKS, ...(signal !== undefined ? { signal } : {}) });
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
if (body !== undefined)
|
|
90
|
+
return body;
|
|
91
|
+
return refusal(call, ENGINE_ORIGIN.plugin, `the tool.call station could not be raised (${describeThrown(err)}); this call to "${extensionWords(call.toolName, 80)}" was NOT executed (fail-closed)`);
|
|
92
|
+
}
|
|
93
|
+
if (outcome.kind === "aborted") {
|
|
94
|
+
if (body !== undefined)
|
|
95
|
+
return body;
|
|
96
|
+
return { content: [{ type: "text", text: "Operation aborted" }], details: {}, isError: true };
|
|
97
|
+
}
|
|
98
|
+
if (outcome.kind === "failed") {
|
|
99
|
+
return refusal(call, outcome.registration, `a tool.call extension ${failedHandlerClause(outcome)} before this call to "${extensionWords(call.toolName, 80)}" ran; the call was NOT executed (fail-closed)`);
|
|
100
|
+
}
|
|
101
|
+
const answer = outcome.answer;
|
|
102
|
+
const ran = typeof answer === "object" && answer !== null ? bodies.get(answer) : undefined;
|
|
103
|
+
if (ran !== undefined)
|
|
104
|
+
return ran;
|
|
105
|
+
const by = outcome.answeredBy ?? ENGINE_ORIGIN.plugin;
|
|
106
|
+
const reason = denyOf(answer);
|
|
107
|
+
if (reason !== undefined)
|
|
108
|
+
return refusal(call, by, `extension "${extensionWords(by, 80)}" refused this call to "${extensionWords(call.toolName, 80)}" before it ran: ${extensionWords(reason, 300)}`);
|
|
109
|
+
const content = substituteOf(answer);
|
|
110
|
+
if (content === undefined)
|
|
111
|
+
return refusal(call, by, `extension "${extensionWords(by, 80)}" answered this call in a form tool.call does not take; the call was NOT executed (fail-closed)`);
|
|
112
|
+
if (input.occurrences.get(call.toolCallId) !== undefined)
|
|
113
|
+
input.occurrences.answeredInPlace(call.toolCallId, by);
|
|
114
|
+
input.blockedToolCalls.add(call.toolCallId);
|
|
115
|
+
return { content, details: {} };
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
const AGENT_DOOR = "runs the Agent tool: that is $.agent.spawn";
|
|
119
|
+
const OTHER_DOOR = new Map([
|
|
120
|
+
[toolFace("ask-user-question").contract.contractId, "runs the AskUserQuestion tool, which puts a question to the person: an extension's call does not ask the person"],
|
|
121
|
+
[toolFace("workflow").contract.contractId, "runs the Workflow tool, whose agents run outside the at-once bound on spawns: $.agent.spawn is the door"],
|
|
122
|
+
]);
|
|
123
|
+
export function createToolCallEntry(input) {
|
|
124
|
+
return async (args, ctx) => {
|
|
125
|
+
const by = ctx.origin.plugin;
|
|
126
|
+
const { tool, ...callInput } = args;
|
|
127
|
+
if (typeof tool !== "string" || tool === "")
|
|
128
|
+
throw new TypeError(`${by}: $.tool.call takes the event's input: { tool, ...args }`);
|
|
129
|
+
const toolCallId = `ext-${randomUUID()}`;
|
|
130
|
+
return runExtensionCall(input.bus, toolCallId, ctx, async (call) => {
|
|
131
|
+
const finalized = await input.harness.callTool({ type: "toolCall", id: toolCallId, name: tool, arguments: { ...callInput } }, ctx.signal, (t) => {
|
|
132
|
+
const contractId = input.faceOf(t.name)?.contractId;
|
|
133
|
+
const door = declaredDelegationNameOf(input.specOf(t.name)) !== undefined ? AGENT_DOOR : contractId !== undefined ? OTHER_DOOR.get(contractId) : undefined;
|
|
134
|
+
if (door !== undefined)
|
|
135
|
+
throw new TypeError(`${by}: $.tool.call(${extensionWords(t.name, 80)}) ${door}`);
|
|
136
|
+
});
|
|
137
|
+
if (call.denied)
|
|
138
|
+
return Object.freeze({ deny: textOf(finalized.result.content) });
|
|
139
|
+
return viewOf({ ...finalized.result, isError: finalized.isError });
|
|
140
|
+
});
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
export function extensionCallOverlap(input) {
|
|
144
|
+
const others = input.occurrences.live().filter((o) => o.toolCallId !== input.toolCallId);
|
|
145
|
+
const name = extensionWords(input.toolName, 80);
|
|
146
|
+
if (!input.batchSafe(input.toolName, input.args)) {
|
|
147
|
+
return others.length === 0 ? undefined : `${name}: an extension's call of a tool that has the run to itself cannot run while another call is in flight`;
|
|
148
|
+
}
|
|
149
|
+
const exclusive = others.find((o) => o.life === "released" && !input.batchSafe(o.wireName ?? o.spelledName, o.finalInput ?? o.args));
|
|
150
|
+
return exclusive === undefined ? undefined : `${name}: an extension's call cannot run beside "${extensionWords(exclusive.wireName ?? exclusive.spelledName, 80)}", which has the run to itself`;
|
|
151
|
+
}
|
|
152
|
+
const textOf = (content) => (Array.isArray(content) ? content.map((b) => (isPlainRecord(b) && b["type"] === "text" && typeof b["text"] === "string" ? b["text"] : "")).join("") : "");
|
|
@@ -1,29 +1,49 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* The name matchers of the rule grammar and of a run's tool-name lists: the linear `*` glob and the covering forms of a tool name —
|
|
3
|
+
* a glob over the whole name (`Re*d`, `mcp__*`, the lone `*`; read by a list that restricts) and the protocol-namespace peer
|
|
4
|
+
* (`<ns>__<peer>`). A leaf module — the allow layer's rule model and the run's list reader both import it, so neither needs the
|
|
5
|
+
* other's dependency tree.
|
|
6
|
+
*/
|
|
7
|
+
import type { ProtocolNamespace } from "./protocol-table.js";
|
|
8
|
+
import type { RuleBehavior } from "./permission-rule-model.js";
|
|
9
|
+
/**
|
|
10
|
+
* `*` glob match (design/127 M6: NOT a RegExp — patterns may come from tenant-supplied Settings layers; the same semantics as
|
|
11
|
+
* CC's anchored `^…$`+dotAll construction: every non-`*` char is literal, `*` spans anything incl. newlines). The literal
|
|
12
|
+
* before the first star and the one after the last are checked at the two ends, and each literal between two stars is put at
|
|
13
|
+
* its earliest place after the one before it (the earliest placement leaves the most room, so no later one need be tried):
|
|
14
|
+
* there is no backtracking, so no arrangement of stars multiplies the work and there is no ReDoS surface. The cost is at most
|
|
15
|
+
* the product of the two lengths, in the engine's native comparisons: a literal after the last star is refused at the end in
|
|
16
|
+
* one pass over its own length (`*` + k `a` + `b` against 2k `a`s costs k, not k²), and the shape that does reach the product
|
|
17
|
+
* is a long literal between two stars that matches over most of its length at every place — `*` + k `a` + `b` + k `a` + `*`
|
|
18
|
+
* against n `a`s is about k × n comparisons (49 ms at k = 1 000, n = 65 536).
|
|
5
19
|
*/
|
|
6
20
|
export declare function wildcardMatch(pattern: string, value: string): boolean;
|
|
7
21
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
22
|
+
* True ⇔ this rule name reaches a SET of tool names rather than one exact name — the shapes {@link ruleNameCovers} answers and an
|
|
23
|
+
* exact-name table cannot hold — on a list of `behavior`. Every lane that keys entries by exact tool name asks it to know which
|
|
24
|
+
* entries it must NOT key that way. Two shapes:
|
|
25
|
+
* · a `*` in the name — on a list that RESTRICTS (`deny`, `ask`; {@link readsNameGlob}) anywhere in it (`Re*d`, `mcp__*`, `*`);
|
|
26
|
+
* on a list that GRANTS only in the tool segment after a literal `<ns>__<peer>__` (`mcp__srv__*`, `mcp__srv__get_*`): any other
|
|
27
|
+
* `*` names no scope an allow widens ({@link grantWildcardRefusalOf}), so it is no covering name there — the readers refuse it;
|
|
28
|
+
* · a protocol peer with no tool segment (`<ns>__<peer>`): every tool of that peer, in every list.
|
|
29
|
+
* `behavior` = the behavior of the list the name is written in — required: a list's `*` has no reading without it, so a value
|
|
30
|
+
* that is no behavior word (an array index handed by `filter`, say) is refused loudly, never read as either list.
|
|
31
|
+
*/
|
|
32
|
+
export declare function isCoveringRuleName(name: string, behavior: RuleBehavior): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Does a covering rule name ({@link isCoveringRuleName}) cover `toolName`? A name with a `*` is a glob over the WHOLE name
|
|
35
|
+
* ({@link wildcardMatch} — the reference's `p` matcher): `mcp__srv__get_*` reaches `mcp__srv__get_issue`, `mcp__*` every MCP tool,
|
|
36
|
+
* `*` every tool. A protocol peer (`<ns>__<peer>`) reaches every tool minted under that peer, in the SAME namespace, the peer
|
|
37
|
+
* compared EXACTLY (CC `s.serverName === a.serverName`): a rule spells the peer the way the mint does. A literal name is an exact
|
|
38
|
+
* tool name, not a covering one — the exact tables answer it. This matcher does not know whose list a name was written in: a caller
|
|
39
|
+
* asks {@link isCoveringRuleName} with the list's behavior first and matches only what it admits.
|
|
40
|
+
*/
|
|
41
|
+
export declare function ruleNameCovers(ruleName: string, toolName: string): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* How far a covering rule name reaches into the peer `peer` of namespace `ns`: `"all"` — every tool of it; `"some"` — some tools of
|
|
44
|
+
* it (a glob over that peer's tool segment); `"none"` — none of it, as far as a list that dials peers needs to know. A glob reaches
|
|
45
|
+
* EVERY tool of the peer exactly when it ends in `*` and matches the peer's own prefix (`<ns>__<peer>__`): a prefix of every name
|
|
46
|
+
* minted under the peer is then matched by the glob up to its last `*`, which takes the rest; a glob that does not end in `*` leaves
|
|
47
|
+
* a tool name it does not match. The one reading of a name against a peer that the tool-name lists take.
|
|
24
48
|
*/
|
|
25
|
-
export declare function
|
|
26
|
-
/** True ⇔ this rule name is a namespaced name whose reach is a SET of tools rather than one exact tool
|
|
27
|
-
* — i.e. the shapes {@link namespacedRuleNameCovers} answers and an exact name table cannot. Every
|
|
28
|
-
* lane that keys rules by exact tool name needs this to know which entries it must NOT key that way. */
|
|
29
|
-
export declare function isNamespacedCoveringRuleName(name: string): boolean;
|
|
49
|
+
export declare function ruleNameReachIntoPeer(ruleName: string, ns: ProtocolNamespace, peer: string): "all" | "some" | "none";
|
|
@@ -1,52 +1,59 @@
|
|
|
1
|
-
import { splitNamespacedName } from "./tool-name-aliases.js";
|
|
1
|
+
import { grantWildcardRefusalOf, readsNameGlob, splitNamespacedName } from "./tool-name-aliases.js";
|
|
2
2
|
export function wildcardMatch(pattern, value) {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
return false;
|
|
3
|
+
const first = pattern.indexOf("*");
|
|
4
|
+
if (first < 0)
|
|
5
|
+
return pattern === value;
|
|
6
|
+
const last = pattern.lastIndexOf("*");
|
|
7
|
+
const head = pattern.slice(0, first);
|
|
8
|
+
const tail = pattern.slice(last + 1);
|
|
9
|
+
if (value.length < head.length + tail.length || !value.startsWith(head) || !value.endsWith(tail))
|
|
10
|
+
return false;
|
|
11
|
+
const end = value.length - tail.length;
|
|
12
|
+
let at = head.length;
|
|
13
|
+
for (let from = first + 1; from <= last;) {
|
|
14
|
+
const next = pattern.indexOf("*", from);
|
|
15
|
+
if (next > from) {
|
|
16
|
+
const literal = pattern.slice(from, next);
|
|
17
|
+
const found = value.indexOf(literal, at);
|
|
18
|
+
if (found < 0 || found + literal.length > end)
|
|
19
|
+
return false;
|
|
20
|
+
at = found + literal.length;
|
|
22
21
|
}
|
|
22
|
+
from = next + 1;
|
|
23
23
|
}
|
|
24
|
-
|
|
25
|
-
p++;
|
|
26
|
-
return p === pattern.length;
|
|
24
|
+
return true;
|
|
27
25
|
}
|
|
28
|
-
function
|
|
26
|
+
function namespacedPeerOf(name) {
|
|
29
27
|
const split = splitNamespacedName(name);
|
|
30
|
-
|
|
31
|
-
return undefined;
|
|
32
|
-
return split.tool !== undefined ? { protocol: split.ns.id, peer: split.peer, tool: split.tool } : { protocol: split.ns.id, peer: split.peer };
|
|
28
|
+
return split === undefined || split.peer === "" ? undefined : split;
|
|
33
29
|
}
|
|
34
|
-
export function
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
30
|
+
export function isCoveringRuleName(name, behavior) {
|
|
31
|
+
if (behavior !== "deny" && behavior !== "ask" && behavior !== "allow") {
|
|
32
|
+
throw new TypeError(`isCoveringRuleName: the list's behavior must be "deny", "ask" or "allow" (got ${typeof behavior === "string" ? JSON.stringify(behavior) : typeof behavior}) — a "*" in a name reads one way on a list that restricts and another on one that grants`);
|
|
33
|
+
}
|
|
34
|
+
if (name.includes("*"))
|
|
35
|
+
return readsNameGlob(behavior) || grantWildcardRefusalOf(name) === undefined;
|
|
36
|
+
const peer = namespacedPeerOf(name);
|
|
37
|
+
return peer !== undefined && peer.tool === undefined;
|
|
38
|
+
}
|
|
39
|
+
export function ruleNameCovers(ruleName, toolName) {
|
|
40
|
+
if (ruleName.includes("*"))
|
|
41
|
+
return wildcardMatch(ruleName, toolName);
|
|
42
|
+
const rule = namespacedPeerOf(ruleName);
|
|
43
|
+
if (rule === undefined || rule.tool !== undefined)
|
|
44
44
|
return false;
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
return target.tool !== undefined && rule.tool.includes("*") && wildcardMatch(rule.tool, target.tool);
|
|
45
|
+
const target = namespacedPeerOf(toolName);
|
|
46
|
+
return target !== undefined && target.ns.id === rule.ns.id && target.peer === rule.peer;
|
|
48
47
|
}
|
|
49
|
-
export function
|
|
50
|
-
|
|
51
|
-
|
|
48
|
+
export function ruleNameReachIntoPeer(ruleName, ns, peer) {
|
|
49
|
+
if (ruleName.includes("*")) {
|
|
50
|
+
if (ruleName.endsWith("*") && wildcardMatch(ruleName, `${ns.prefix}${peer}__`))
|
|
51
|
+
return "all";
|
|
52
|
+
const rule = namespacedPeerOf(ruleName);
|
|
53
|
+
return rule !== undefined && rule.ns.id === ns.id && rule.peer === peer ? "some" : "none";
|
|
54
|
+
}
|
|
55
|
+
const rule = namespacedPeerOf(ruleName);
|
|
56
|
+
if (rule === undefined || rule.ns.id !== ns.id || rule.peer !== peer)
|
|
57
|
+
return "none";
|
|
58
|
+
return rule.tool === undefined ? "all" : "some";
|
|
52
59
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The longest output-style NAME the seat admits — the reference implementation's own bound (its `output_style`
|
|
3
|
-
* renderer checks `style.length` against `HQe`, declared `HQe=256
|
|
3
|
+
* renderer checks `style.length` against `HQe`, declared `HQe=256`). Past it the reference drops the
|
|
4
4
|
* per-turn reminder and logs an error; here the seat is refused at prepare (`config.output_style_invalid`), so a
|
|
5
5
|
* name the deployment declared is never silently not stated.
|
|
6
6
|
*/
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** The longest scalar an argument rule reads, unless a policy states its own (`caps.maxScalarValueChars`): a longer value is not
|
|
2
|
+
* read, and the rule's lane wins (fail-closed). */
|
|
3
|
+
export declare const DEFAULT_MAX_SCALAR_VALUE_CHARS = 16384;
|
|
4
|
+
/** The call an argument rule is judged on: its arguments as the loop handed them, and its face (the tool's reading). */
|
|
5
|
+
export interface ParamRuleCall {
|
|
6
|
+
readonly args: unknown;
|
|
7
|
+
readonly face?: object | undefined;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Does the rule on argument `param` with `pattern` reach this call? Non-object arguments ⇒ no; own top-level properties only
|
|
11
|
+
* (`param` is a literal key, never a dotted path); scalar values only, trimmed, matched whole by the `*` glob; a value longer than
|
|
12
|
+
* `maxScalarValueChars` FAIL-CLOSES (reached: it cannot be read, so the rule's lane wins). A call without the parameter is reached
|
|
13
|
+
* by a rule whose value the tool's reading folds away ({@link readingAbsorbs}).
|
|
14
|
+
*/
|
|
15
|
+
export declare function paramRuleReaches(call: ParamRuleCall, param: string, pattern: string, maxScalarValueChars?: number): boolean;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { canonicalize, UNCANONICALIZABLE } from "./canonical-json.js";
|
|
2
|
+
import { argsAsTheToolReads } from "./effective-path-target.js";
|
|
3
|
+
import { wildcardMatch } from "./namespaced-rule-name.js";
|
|
4
|
+
export const DEFAULT_MAX_SCALAR_VALUE_CHARS = 16_384;
|
|
5
|
+
export function paramRuleReaches(call, param, pattern, maxScalarValueChars = DEFAULT_MAX_SCALAR_VALUE_CHARS) {
|
|
6
|
+
const args = call.args;
|
|
7
|
+
if (typeof args !== "object" || args === null || Array.isArray(args))
|
|
8
|
+
return false;
|
|
9
|
+
if (!Object.hasOwn(args, param))
|
|
10
|
+
return readingAbsorbs(call, args, param, pattern);
|
|
11
|
+
const raw = args[param];
|
|
12
|
+
if (raw === undefined || raw === null)
|
|
13
|
+
return false;
|
|
14
|
+
const t = typeof raw;
|
|
15
|
+
if (t === "object" || t === "function" || t === "symbol")
|
|
16
|
+
return false;
|
|
17
|
+
const value = String(raw).trim();
|
|
18
|
+
return value.length > maxScalarValueChars || wildcardMatch(pattern, value);
|
|
19
|
+
}
|
|
20
|
+
function readingAbsorbs(call, args, param, pattern) {
|
|
21
|
+
if (pattern.includes("*"))
|
|
22
|
+
return false;
|
|
23
|
+
try {
|
|
24
|
+
const read = canonicalize(argsAsTheToolReads(call, { ...args, [param]: pattern }));
|
|
25
|
+
return read !== UNCANONICALIZABLE && read === canonicalize(args);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -14,7 +14,7 @@ import type { EngineDollar } from "./mods/dollar.js";
|
|
|
14
14
|
import type { ToolExecuteContext } from "./tool-spec.js";
|
|
15
15
|
import type { TaskSpec } from "./types.js";
|
|
16
16
|
/** The fields of a spec the seat carries — one `Pick`, shared by the mint's input and the apply's target. */
|
|
17
|
-
export type ParentSpecSeatFields = Pick<TaskSpec, "principal" | "oneShot" | "clientContext" | "onQuestion" | "mods" | "additionalDirectories" | "additionalReadDirectories" | "envFacts" | "memoryPersistenceCapable" | "memory" | "compaction" | "skillListingBudgetFraction" | "skillListingMaxDescChars" | "fileHistory" | "promptForm" | "promptBinding">;
|
|
17
|
+
export type ParentSpecSeatFields = Pick<TaskSpec, "principal" | "oneShot" | "clientContext" | "onQuestion" | "mods" | "additionalDirectories" | "additionalReadDirectories" | "envFacts" | "memoryPersistenceCapable" | "memory" | "compaction" | "skillListingBudgetFraction" | "skillListingMaxDescChars" | "fileHistory" | "projectMemory" | "promptForm" | "promptBinding" | "advisorModel" | "attachments">;
|
|
18
18
|
/**
|
|
19
19
|
* The seat a run hands its children. Every member is the parent's own value, frozen at mint (arrays copied and
|
|
20
20
|
* frozen; the facts object copied). Members present iff the parent carries them — an absent member is "nothing to
|
|
@@ -50,11 +50,20 @@ export type ParentSpecSeatFields = Pick<TaskSpec, "principal" | "oneShot" | "cli
|
|
|
50
50
|
* and every leg multiplies it by its own.
|
|
51
51
|
* · `fileHistory` — the request's file-history off switch (`"disabled"`, its only word), for the edits its delegates
|
|
52
52
|
* make on its behalf too. An ORDINARY member (fill law); with one word no child can author it back on.
|
|
53
|
+
* · `projectMemory` — the request's off switch for the deployment's project context (`"disabled"`, its only word): the
|
|
54
|
+
* delegates that work for it read no project context either. An ORDINARY member (fill law), the `fileHistory` shape.
|
|
53
55
|
* · `promptForm` — the host form of the system prompt (`"minimal"`, its only word: the core-behavior band is out). A
|
|
54
56
|
* host's product choice for the whole delegation tree, so every engine-built child (both delegation lanes and the
|
|
55
57
|
* observer sidecar) composes the same set of sections. An ORDINARY member (fill law).
|
|
56
58
|
* · `promptBinding` — the binding (a deployment's scenario name), a prompt selector value. A child composes its
|
|
57
59
|
* parent's center artifact, so its overlays' `when.binding` reads the same binding. An ORDINARY member (fill law).
|
|
60
|
+
* · `advisorModel` — the person's advisor setting: every engine-built child judges it against its OWN model (an advisor
|
|
61
|
+
* weaker than the child's model does not attach there). An ORDINARY member (fill law); the observer sidecar takes it and
|
|
62
|
+
* excludes the tool by name.
|
|
63
|
+
* · `attachments` — the request's attachment-lane declaration, WHOLE (which frames ride the legs' requests and which are
|
|
64
|
+
* switched off): one declaration for the delegation tree, so a lane the parent turned on or off is on or off for the
|
|
65
|
+
* delegates that work for it. An ORDINARY member (fill law): a child that authors `attachments` at all keeps exactly what it
|
|
66
|
+
* authored, never half to the parent.
|
|
58
67
|
*/
|
|
59
68
|
export interface ParentSpecSeat {
|
|
60
69
|
readonly principal?: string;
|
|
@@ -73,8 +82,11 @@ export interface ParentSpecSeat {
|
|
|
73
82
|
readonly skillListingBudgetFraction?: number;
|
|
74
83
|
readonly skillListingMaxDescChars?: number;
|
|
75
84
|
readonly fileHistory?: "disabled";
|
|
85
|
+
readonly projectMemory?: "disabled";
|
|
76
86
|
readonly promptForm?: "minimal";
|
|
77
87
|
readonly promptBinding?: string;
|
|
88
|
+
readonly advisorModel?: TaskSpec["advisorModel"];
|
|
89
|
+
readonly attachments?: TaskSpec["attachments"];
|
|
78
90
|
}
|
|
79
91
|
/** Refuse (by name, `config.deps_retired_key`) a seat that still carries a retired member. Read at every door a seat enters
|
|
80
92
|
* by hand: the ctx reader, the apply, and the send lane's waker clamps. */
|
|
@@ -22,8 +22,11 @@ export function parentSpecSeatOf(spec, frozenOnQuestion) {
|
|
|
22
22
|
...(spec.skillListingBudgetFraction !== undefined ? { skillListingBudgetFraction: spec.skillListingBudgetFraction } : {}),
|
|
23
23
|
...(spec.skillListingMaxDescChars !== undefined ? { skillListingMaxDescChars: spec.skillListingMaxDescChars } : {}),
|
|
24
24
|
...(spec.fileHistory !== undefined ? { fileHistory: spec.fileHistory } : {}),
|
|
25
|
+
...(spec.projectMemory !== undefined ? { projectMemory: spec.projectMemory } : {}),
|
|
25
26
|
...(spec.promptForm !== undefined ? { promptForm: spec.promptForm } : {}),
|
|
26
27
|
...(spec.promptBinding !== undefined ? { promptBinding: spec.promptBinding } : {}),
|
|
28
|
+
...(spec.advisorModel !== undefined ? { advisorModel: spec.advisorModel } : {}),
|
|
29
|
+
...(spec.attachments !== undefined ? { attachments: Object.freeze({ ...spec.attachments }) } : {}),
|
|
27
30
|
...clampFieldSeatsOf(spec),
|
|
28
31
|
});
|
|
29
32
|
}
|
|
@@ -45,8 +48,11 @@ export function applyParentSpecSeat(child, seat) {
|
|
|
45
48
|
...fill("skillListingBudgetFraction", seat.skillListingBudgetFraction),
|
|
46
49
|
...fill("skillListingMaxDescChars", seat.skillListingMaxDescChars),
|
|
47
50
|
...fill("fileHistory", seat.fileHistory),
|
|
51
|
+
...fill("projectMemory", seat.projectMemory),
|
|
48
52
|
...fill("promptForm", seat.promptForm),
|
|
49
53
|
...fill("promptBinding", seat.promptBinding),
|
|
54
|
+
...fill("advisorModel", seat.advisorModel),
|
|
55
|
+
...fill("attachments", (seat.attachments !== undefined ? { ...seat.attachments } : undefined)),
|
|
50
56
|
...(seat.oneShot === true ? { oneShot: true } : {}),
|
|
51
57
|
...(seat.memoryPersistenceCapable === false ? { memoryPersistenceCapable: false } : fill("memoryPersistenceCapable", seat.memoryPersistenceCapable)),
|
|
52
58
|
};
|
|
@@ -82,15 +82,26 @@ export type PendingKind = (typeof PAUSE_REGISTRY)[GateKind]["pending"];
|
|
|
82
82
|
export type ResumeGate = (typeof PAUSE_REGISTRY)[GateKind]["resume"] | "wake";
|
|
83
83
|
/** Runtime twin of {@link GateKind}. */
|
|
84
84
|
export declare function isGateKind(v: unknown): v is GateKind;
|
|
85
|
-
/**
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
85
|
+
/**
|
|
86
|
+
* The approval cards whose parked row takes another deadline semantic than its gate kind's: a question parked under an
|
|
87
|
+
* approval gate kind is not an approval, so its deadline voids it (`B`) instead of denying it (`A`). Read only on an
|
|
88
|
+
* approval gate, and only for a word of the closed card set ({@link parkedApprovalCardOf}). It is data so that a backend
|
|
89
|
+
* keeping the row's stored card word beside its gate kind (`checkpointIndexFacts`) generates its facet predicate from
|
|
90
|
+
* this table and the registry's `facet` column — the column's word IN this table's keys takes the key's facet, any other
|
|
91
|
+
* word, NULL or a non-approval kind takes the kind's — rather than from a list of its own. The facet itself is never
|
|
92
|
+
* stored: a stored copy goes stale the day a row of this table changes.
|
|
93
|
+
*/
|
|
94
|
+
export declare const CARD_FACET_OVERRIDES: Readonly<{
|
|
95
|
+
readonly question: "B";
|
|
96
|
+
}>;
|
|
97
|
+
/** The deadline semantic of a parked row — the registry's `facet` column, unless the approval gate's card is a key of
|
|
98
|
+
* {@link CARD_FACET_OVERRIDES}. No gate kind of its own (the once-only winner, the reaper deadline and the batch stay
|
|
99
|
+
* one family). */
|
|
89
100
|
export declare function facetOf(gate: {
|
|
90
101
|
readonly kind: GateKind;
|
|
91
102
|
readonly approvalCard?: unknown;
|
|
92
103
|
}): "A" | "B" | "-";
|
|
93
|
-
/** Is this parked row a question to the user: an approval
|
|
104
|
+
/** Is this parked row a question to the user: an approval gate whose card is the reserved `"question"`. */
|
|
94
105
|
export declare function isQuestionGate(gate: {
|
|
95
106
|
readonly kind: GateKind;
|
|
96
107
|
readonly approvalCard?: unknown;
|
|
@@ -10,11 +10,15 @@ export const PAUSE_REGISTRY = {
|
|
|
10
10
|
export function isGateKind(v) {
|
|
11
11
|
return typeof v === "string" && Object.prototype.hasOwnProperty.call(PAUSE_REGISTRY, v);
|
|
12
12
|
}
|
|
13
|
+
export const CARD_FACET_OVERRIDES = Object.freeze({ question: "B" });
|
|
13
14
|
export function facetOf(gate) {
|
|
14
|
-
|
|
15
|
+
const reading = parkedApprovalCardOf(gate);
|
|
16
|
+
const overrides = CARD_FACET_OVERRIDES;
|
|
17
|
+
return (reading.kind === "card" ? overrides[reading.card] : undefined) ?? PAUSE_REGISTRY[gate.kind].facet;
|
|
15
18
|
}
|
|
16
19
|
export function isQuestionGate(gate) {
|
|
17
|
-
|
|
20
|
+
const reading = parkedApprovalCardOf(gate);
|
|
21
|
+
return reading.kind === "card" && reading.card === "question";
|
|
18
22
|
}
|
|
19
23
|
export function parkedApprovalCardOf(gate) {
|
|
20
24
|
const kind = gate.kind;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { PeerSendVerdict } from "../agents/cross-session-judge.js";
|
|
2
|
+
import type { PermissionModeClass } from "../agents/cross-session-envelope.js";
|
|
3
|
+
/** The listening session: whose box an inbound frame lands in, and the host's hooks. */
|
|
4
|
+
export interface PeerChannelSelf {
|
|
5
|
+
/** This session's id — its box is `session.<sessionId>`; a frame addressed to another id is not appended. */
|
|
6
|
+
sessionId: string;
|
|
7
|
+
/** The mailbox scope this session's box lives in. */
|
|
8
|
+
scope: string;
|
|
9
|
+
/** The doorbell rang (a peer appended to this session's box). The HOST decides what to do with it —
|
|
10
|
+
* start a turn now, or let the next boundary drain; the engine never starts a turn on a frame. */
|
|
11
|
+
onNudge?: () => void;
|
|
12
|
+
/** One event per refused connection, dropped frame or appended frame (the channel's account — a host
|
|
13
|
+
* logs or counts it). Never thrown into the listener. */
|
|
14
|
+
onEvent?: (event: PeerChannelEvent) => void;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Why the listener dropped a connection or a frame (closed set):
|
|
18
|
+
* - `first_line_deadline` — no complete line within the first-line deadline (the connection closes);
|
|
19
|
+
* - `line_too_long` — a line grew past the line wall before its newline (the connection closes);
|
|
20
|
+
* - `unauthenticated` — the first line was not an auth frame, or was blank / not JSON (the connection closes);
|
|
21
|
+
* - `bad_token` — the auth frame's token is not this session's (the connection closes);
|
|
22
|
+
* - `malformed_line` — an authenticated line that is not JSON, not an object, or a message without text;
|
|
23
|
+
* - `session_mismatch` — a message addressed to another session id;
|
|
24
|
+
* - `box_full` — this session's box is at its queued-message bound, so the message was not appended;
|
|
25
|
+
* - `unhandled_frame` — a frame type, control action or attachment this engine does not take over the socket;
|
|
26
|
+
* - `append_failed` — the box refused the append (the store's own error).
|
|
27
|
+
*/
|
|
28
|
+
export declare const PEER_CHANNEL_DROP_REASONS: readonly ["first_line_deadline", "line_too_long", "unauthenticated", "bad_token", "malformed_line", "session_mismatch", "box_full", "unhandled_frame", "append_failed"];
|
|
29
|
+
export type PeerChannelDropReason = (typeof PEER_CHANNEL_DROP_REASONS)[number];
|
|
30
|
+
export type PeerChannelEvent = {
|
|
31
|
+
kind: "dropped";
|
|
32
|
+
reason: PeerChannelDropReason;
|
|
33
|
+
detail?: string;
|
|
34
|
+
} | {
|
|
35
|
+
kind: "appended";
|
|
36
|
+
seq: number;
|
|
37
|
+
} | {
|
|
38
|
+
kind: "nudged";
|
|
39
|
+
};
|
|
40
|
+
/** A bound listener. */
|
|
41
|
+
export interface PeerChannelListener {
|
|
42
|
+
/** The address peers reach this session at (the socket path). */
|
|
43
|
+
readonly address: string;
|
|
44
|
+
/** Stop listening and withdraw everything `listen` published. */
|
|
45
|
+
close(): Promise<void>;
|
|
46
|
+
}
|
|
47
|
+
/** One outbound message (the reference agent's dialect is the channel's business). */
|
|
48
|
+
export interface PeerChannelMessage {
|
|
49
|
+
/** The message text. */
|
|
50
|
+
body: string;
|
|
51
|
+
/** The sender's session id (self-claimed on the wire). */
|
|
52
|
+
fromSession?: string;
|
|
53
|
+
/** The sender's display name. */
|
|
54
|
+
fromName?: string;
|
|
55
|
+
/** The sender's self-attested permission-mode class. */
|
|
56
|
+
fromMode?: PermissionModeClass;
|
|
57
|
+
/** The prospective forwarding chain (this sender's own token already appended). */
|
|
58
|
+
hopChain: readonly string[];
|
|
59
|
+
}
|
|
60
|
+
/** The transport contract. A host wires one implementation; the engine dials and rings through it. */
|
|
61
|
+
export interface PeerChannel {
|
|
62
|
+
/** Bind this session's inbound address and publish whatever peers need to reach it. */
|
|
63
|
+
listen(self: PeerChannelSelf): Promise<PeerChannelListener>;
|
|
64
|
+
/** Carry one message to a reference-agent session at `address`. Never throws: every outcome is a verdict
|
|
65
|
+
* (`via: "uds"` on success; the `peer_send.*` transport codes otherwise). */
|
|
66
|
+
dial(address: string, message: PeerChannelMessage): Promise<PeerSendVerdict>;
|
|
67
|
+
/** Ring the doorbell of a session of this engine at `address`. Best-effort: `false` when the frame did not
|
|
68
|
+
* go out; never throws — the message is already in the recipient's box either way. */
|
|
69
|
+
nudge(address: string): Promise<boolean>;
|
|
70
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const PEER_CHANNEL_DROP_REASONS = Object.freeze(["first_line_deadline", "line_too_long", "unauthenticated", "bad_token", "malformed_line", "session_mismatch", "box_full", "unhandled_frame", "append_failed"]);
|