@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
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { describe } from "./events.js";
|
|
2
|
-
import { describeFault, isPlainRecord, MODS_PAYLOAD_MODE, receive } from "./receive.js";
|
|
2
|
+
import { describeFault, isPlainRecord, MODS_PAYLOAD_MODE, receive, sealedObjects } from "./receive.js";
|
|
3
|
+
export { sealedObjects } from "./receive.js";
|
|
3
4
|
export const MODS_VALUE_DEPTH = 1_000;
|
|
4
5
|
const HANDED_MODE = Object.freeze({ ...MODS_PAYLOAD_MODE, depth: MODS_VALUE_DEPTH + 1, past: "refuse" });
|
|
5
6
|
function payloadMode(isProxy) {
|
|
@@ -190,13 +191,13 @@ function rehomed(pinned, held, passed, homes, engines) {
|
|
|
190
191
|
Object.freeze(to);
|
|
191
192
|
return twins.get(passed);
|
|
192
193
|
}
|
|
193
|
-
export function answerViolation(answer, check, e, by, below) {
|
|
194
|
+
export function answerViolation(answer, check, e, by, below, run) {
|
|
194
195
|
if (answer === undefined)
|
|
195
196
|
return "returned no answer (return next(e) to pass the event on)";
|
|
196
197
|
if (check === undefined)
|
|
197
198
|
return undefined;
|
|
198
199
|
try {
|
|
199
|
-
return check(answer, e, by, below);
|
|
200
|
+
return check(answer, e, by, below, run);
|
|
200
201
|
}
|
|
201
202
|
catch {
|
|
202
203
|
return "returned an answer the station cannot read";
|
|
@@ -247,50 +248,31 @@ export function receiveEvent(e) {
|
|
|
247
248
|
const r = receiveRecord(e, MODS_PAYLOAD_MODE);
|
|
248
249
|
return "refusal" in r ? { refusal: r.refusal } : r;
|
|
249
250
|
}
|
|
250
|
-
export function answerUpward(v) {
|
|
251
|
-
if (typeof v !== "object" || v === null
|
|
251
|
+
export function answerUpward(v, isProxy) {
|
|
252
|
+
if (typeof v !== "object" || v === null)
|
|
252
253
|
return v;
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
254
|
+
const sealed = sealedObjects([v]);
|
|
255
|
+
if (sealed.has(v))
|
|
256
|
+
return v;
|
|
257
|
+
const r = receive(v, payloadMode(isProxy), sealed);
|
|
258
|
+
if (!r.ok)
|
|
259
|
+
throw new TypeError(`the chain's bottom answered ${faultClause(r.fault)}`);
|
|
260
|
+
return r.value;
|
|
256
261
|
}
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
return r.ok ? { answer: r.value } : { refusal: `answered ${faultClause(r.fault)}` };
|
|
262
|
+
function answerMode(isProxy) {
|
|
263
|
+
return Object.freeze({ ...payloadMode(isProxy), others: "refuse" });
|
|
260
264
|
}
|
|
261
|
-
|
|
265
|
+
export function receiveAnswer(answer, held, isProxy) {
|
|
266
|
+
const r = receive(answer, answerMode(isProxy), held);
|
|
267
|
+
if (r.ok)
|
|
268
|
+
return { answer: r.value };
|
|
269
|
+
const notData = r.fault.kind === "not-data" || r.fault.kind === "cycle";
|
|
270
|
+
return { refusal: `answered ${faultClause(r.fault)}${notData ? " (an answer is data: strings, numbers, booleans, null, plain objects and arrays)" : ""}` };
|
|
271
|
+
}
|
|
272
|
+
const DETACHED_MODE = Object.freeze({ accessors: "refuse", depth: Infinity, others: "as-is", leaves: "cloned" });
|
|
262
273
|
export function detachedCopy(e) {
|
|
263
274
|
const r = receive(e, DETACHED_MODE);
|
|
264
275
|
if (!r.ok)
|
|
265
276
|
throw new Error(`the observer's copy of the event could not be made: ${describeFault(r.fault)}`);
|
|
266
|
-
|
|
267
|
-
const clones = new Map();
|
|
268
|
-
const walked = new Set([copy]);
|
|
269
|
-
const stack = [copy];
|
|
270
|
-
while (stack.length > 0) {
|
|
271
|
-
const node = stack.pop();
|
|
272
|
-
for (const k of Object.keys(node)) {
|
|
273
|
-
const v = node[k];
|
|
274
|
-
if (typeof v !== "object" || v === null)
|
|
275
|
-
continue;
|
|
276
|
-
if (isPlainRecord(v) || (Array.isArray(v) && Object.getPrototypeOf(v) === Array.prototype)) {
|
|
277
|
-
if (!walked.has(v)) {
|
|
278
|
-
walked.add(v);
|
|
279
|
-
stack.push(v);
|
|
280
|
-
}
|
|
281
|
-
continue;
|
|
282
|
-
}
|
|
283
|
-
if (!clones.has(v)) {
|
|
284
|
-
let own = v;
|
|
285
|
-
try {
|
|
286
|
-
own = structuredClone(v);
|
|
287
|
-
}
|
|
288
|
-
catch {
|
|
289
|
-
}
|
|
290
|
-
clones.set(v, own);
|
|
291
|
-
}
|
|
292
|
-
Object.defineProperty(node, k, { value: clones.get(v), enumerable: true, writable: true, configurable: true });
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
return copy;
|
|
277
|
+
return r.value;
|
|
296
278
|
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The skill seats of the mods bus (`SkillSpec.mods`), admitted with the leg's other registrations on the task seat. Theirs alone:
|
|
3
|
+
* · the SCOPE RECORD — which skill each registration belongs to and which skills are active on the leg (opened by the grant
|
|
4
|
+
* table's activation write, or by a resumed leg's frozen scopes; closed with the run that holds the record);
|
|
5
|
+
* · two VIEWS of the leg bus: the leg's own raises take a skill's handlers only while its scope is open (presence counts them
|
|
6
|
+
* always, so what prepare arms is armed for a scope that opens later); the STANDING chain never holds them — what the leg
|
|
7
|
+
* hands its descendants, and what guards every call unconditionally;
|
|
8
|
+
* · the SEAT RULE — a skill carries hooks, `classic.*` events only (a method event's chain is dispatched inside the kernel,
|
|
9
|
+
* where no scope is read).
|
|
10
|
+
*/
|
|
11
|
+
import type { SkillSpec } from "../agent-definition.js";
|
|
12
|
+
import type { EngineDollar } from "./dollar.js";
|
|
13
|
+
import { type ModBus, type ModRegistration } from "./kernel/index.js";
|
|
14
|
+
/** The leg's record of its skills' scopes, as the activation write point and the park read it. */
|
|
15
|
+
export interface SkillScopes {
|
|
16
|
+
/** Open `skill`'s scope on this leg: from now to the run's end its registrations take part in the leg's raises. */
|
|
17
|
+
open(skill: string): void;
|
|
18
|
+
/** The active skills that carry registrations, sorted — what a park freezes (`undefined` = none). */
|
|
19
|
+
frozen(): string[] | undefined;
|
|
20
|
+
}
|
|
21
|
+
/** The record, with the readings the views take. */
|
|
22
|
+
export interface ScopeRecord extends SkillScopes {
|
|
23
|
+
/** The skill a registration (by name) belongs to, or undefined for a registration of no skill. */
|
|
24
|
+
ownerOf(registration: string): string | undefined;
|
|
25
|
+
isOpen(skill: string): boolean;
|
|
26
|
+
/** Whether any skill of the leg carries a registration (none ⇒ both views are the bus itself). */
|
|
27
|
+
carries(): boolean;
|
|
28
|
+
}
|
|
29
|
+
/** The registrations the leg's skills carry, in the skills' order, and which skill each belongs to. */
|
|
30
|
+
export interface SkillSeats {
|
|
31
|
+
readonly registrations: readonly ModRegistration<EngineDollar>[];
|
|
32
|
+
readonly owners: ReadonlyMap<string, string>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Read the leg's skills (the skills seat's copy) into their registrations, each READ ONCE into a frozen copy of its members
|
|
36
|
+
* (`register` still runs with the host's object as `this`): the name the scope owns it by is the very name the kernel admits
|
|
37
|
+
* it under, and the `uses` the seat rule judges is the very `uses` the kernel holds its `on` to. The seat rule is judged here,
|
|
38
|
+
* before admission — so no handler of a refused registration ever runs, not even on another registration's `plugin.register`.
|
|
39
|
+
* Anything else about a registration (its shape, its tier, a duplicate name) is the admission's screen, given the copy.
|
|
40
|
+
*/
|
|
41
|
+
export declare function skillSeatsOf(skills: readonly Pick<SkillSpec, "name" | "mods">[] | undefined): SkillSeats;
|
|
42
|
+
/**
|
|
43
|
+
* Mint the leg's scope record; `reopened` = the scopes a resumed leg's park froze (open from the start). What a park freezes:
|
|
44
|
+
* every open scope of a skill that carries registrations on this leg, and every scope this leg reopened (a reopened skill
|
|
45
|
+
* stays recorded whatever the resumed definition carries — the next resume may restore its hooks). A plain skill's
|
|
46
|
+
* activation is not recorded: the hooks a skill brings are the ones its definition carried when it was active.
|
|
47
|
+
*/
|
|
48
|
+
export declare function skillScopeRecord(owners: ReadonlyMap<string, string>, reopened: readonly string[] | undefined): ScopeRecord;
|
|
49
|
+
/**
|
|
50
|
+
* Read a park's frozen skill scopes (`CheckpointState.skillScopes`): absent ⇒ none; a list of skill names ⇒ those (copied by
|
|
51
|
+
* index, once); anything else ⇒ `undefined`, a damaged section — the resume screen refuses it before the claim, never read as
|
|
52
|
+
* "no scope" (that would resume the run with the skills' hooks silently shut).
|
|
53
|
+
*/
|
|
54
|
+
export declare function readFrozenSkillScopes(section: unknown): readonly string[] | undefined;
|
|
55
|
+
/** A resumed leg's reopened scopes off its checkpoint state; throws on a damaged section (the screen refused it pre-claim). */
|
|
56
|
+
export declare function frozenSkillScopesOf(state: {
|
|
57
|
+
readonly skillScopes?: unknown;
|
|
58
|
+
} | undefined): readonly string[] | undefined;
|
|
59
|
+
/**
|
|
60
|
+
* The leg's own raises over the admitted bus: a skill's handler takes part only while its scope is open; presence
|
|
61
|
+
* (`hasHandlers`, `mounted`) counts it always. With no skill registration, the bus itself.
|
|
62
|
+
*/
|
|
63
|
+
export declare function scopedLegBus(bus: ModBus, record: ScopeRecord): ModBus;
|
|
64
|
+
/**
|
|
65
|
+
* The leg's STANDING chain, over the leg bus: every registration that takes part on every raise — a skill's handlers are
|
|
66
|
+
* absent from it, from presence and from every dispatch. Two readers: what the leg hands its descendants (the screening
|
|
67
|
+
* constraint is minted over it; the chain identity is its), and what guards every call of the leg unconditionally.
|
|
68
|
+
*/
|
|
69
|
+
export declare function standingBus(leg: ModBus, record: ScopeRecord): ModBus;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { expandOnSide } from "./kernel/index.js";
|
|
2
|
+
import { modsInvalid } from "./kernel/registration.js";
|
|
3
|
+
export function skillSeatsOf(skills) {
|
|
4
|
+
const registrations = [];
|
|
5
|
+
const owners = new Map();
|
|
6
|
+
for (const s of skills ?? []) {
|
|
7
|
+
for (const r of s.mods ?? []) {
|
|
8
|
+
const copy = registrationCopy(r);
|
|
9
|
+
registrations.push(copy);
|
|
10
|
+
if (typeof copy !== "object" || copy === null)
|
|
11
|
+
continue;
|
|
12
|
+
const name = Reflect.get(copy, "name");
|
|
13
|
+
if (typeof name !== "string")
|
|
14
|
+
continue;
|
|
15
|
+
owners.set(name, s.name);
|
|
16
|
+
refuseNonClassic(name, s.name, Reflect.get(copy, "uses"));
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return { registrations, owners };
|
|
20
|
+
}
|
|
21
|
+
function registrationCopy(r) {
|
|
22
|
+
if (typeof r !== "object" || r === null)
|
|
23
|
+
return r;
|
|
24
|
+
const get = (k) => Reflect.get(r, k);
|
|
25
|
+
const register = get("register");
|
|
26
|
+
const uses = get("uses");
|
|
27
|
+
const list = (v) => (Array.isArray(v) ? Object.freeze(Array.from({ length: v.length }, (_, i) => v[i])) : v);
|
|
28
|
+
const usesCopy = typeof uses === "object" && uses !== null ? Object.freeze({ events: list(Reflect.get(uses, "events")), calls: list(Reflect.get(uses, "calls")) }) : uses;
|
|
29
|
+
const copy = { name: get("name"), uses: usesCopy };
|
|
30
|
+
for (const k of ["tier", "provenance", "budgetMs", "options"]) {
|
|
31
|
+
const v = get(k);
|
|
32
|
+
if (v !== undefined)
|
|
33
|
+
copy[k] = v;
|
|
34
|
+
}
|
|
35
|
+
copy["register"] = typeof register === "function" ? (on, options) => Reflect.apply(register, r, [on, options]) : register;
|
|
36
|
+
return Object.freeze(copy);
|
|
37
|
+
}
|
|
38
|
+
function refuseNonClassic(name, skill, uses) {
|
|
39
|
+
const events = typeof uses === "object" && uses !== null ? Reflect.get(uses, "events") : undefined;
|
|
40
|
+
if (!Array.isArray(events))
|
|
41
|
+
return;
|
|
42
|
+
for (const p of events) {
|
|
43
|
+
const expanded = expandOnSide(p, "engine");
|
|
44
|
+
const other = "names" in expanded ? expanded.names.find((n) => !n.startsWith("classic.")) : undefined;
|
|
45
|
+
if (other !== undefined)
|
|
46
|
+
throw modsInvalid(`${name} (TaskSpec.skills["${skill}"].mods): declares "${other}"; a registration a SkillSpec carries hangs classic.* events only — its handlers take part only while that SkillSpec is active, which is read where the leg's stations raise`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export function skillScopeRecord(owners, reopened) {
|
|
50
|
+
const carrying = new Set(owners.values());
|
|
51
|
+
const carried = new Set(reopened ?? []);
|
|
52
|
+
const open = new Set(reopened ?? []);
|
|
53
|
+
return {
|
|
54
|
+
open: (skill) => void open.add(skill),
|
|
55
|
+
frozen: () => {
|
|
56
|
+
const names = [...open].filter((s) => carrying.has(s) || carried.has(s)).sort();
|
|
57
|
+
return names.length > 0 ? names : undefined;
|
|
58
|
+
},
|
|
59
|
+
ownerOf: (registration) => owners.get(registration),
|
|
60
|
+
isOpen: (skill) => open.has(skill),
|
|
61
|
+
carries: () => owners.size > 0,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export function readFrozenSkillScopes(section) {
|
|
65
|
+
if (section === undefined)
|
|
66
|
+
return [];
|
|
67
|
+
if (!Array.isArray(section))
|
|
68
|
+
return undefined;
|
|
69
|
+
const out = [];
|
|
70
|
+
for (let i = 0; i < section.length; i++) {
|
|
71
|
+
const name = section[i];
|
|
72
|
+
if (typeof name !== "string")
|
|
73
|
+
return undefined;
|
|
74
|
+
out.push(name);
|
|
75
|
+
}
|
|
76
|
+
return out;
|
|
77
|
+
}
|
|
78
|
+
export function frozenSkillScopesOf(state) {
|
|
79
|
+
if (state === undefined)
|
|
80
|
+
return undefined;
|
|
81
|
+
const scopes = readFrozenSkillScopes(state.skillScopes);
|
|
82
|
+
if (scopes === undefined)
|
|
83
|
+
throw new Error("the resumed checkpoint's skill-scope section does not read as a list of SkillSpec names — refusing to resume the run with its active skills' hooks shut (the resume screen refuses this row before the claim)");
|
|
84
|
+
return scopes;
|
|
85
|
+
}
|
|
86
|
+
const withPart = (options, part) => {
|
|
87
|
+
const caller = options.participant;
|
|
88
|
+
return { ...options, participant: (p) => part(p) && (caller === undefined || caller(p)) };
|
|
89
|
+
};
|
|
90
|
+
export function scopedLegBus(bus, record) {
|
|
91
|
+
if (!record.carries())
|
|
92
|
+
return bus;
|
|
93
|
+
const openOrNone = (p) => {
|
|
94
|
+
const skill = record.ownerOf(p.plugin);
|
|
95
|
+
return skill === undefined || record.isOpen(skill);
|
|
96
|
+
};
|
|
97
|
+
return {
|
|
98
|
+
records: bus.records,
|
|
99
|
+
mounted: () => bus.mounted(),
|
|
100
|
+
hasHandlers: (event, participant) => bus.hasHandlers(event, participant),
|
|
101
|
+
dispatch: (event, e, options) => bus.dispatch(event, e, withPart(options, openOrNone)),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
export function standingBus(leg, record) {
|
|
105
|
+
if (!record.carries())
|
|
106
|
+
return leg;
|
|
107
|
+
const noSkill = (p) => record.ownerOf(p.plugin) === undefined;
|
|
108
|
+
return {
|
|
109
|
+
records: leg.records,
|
|
110
|
+
mounted: () => leg.mounted().filter(noSkill),
|
|
111
|
+
hasHandlers: (event, participant) => leg.hasHandlers(event, (p) => noSkill(p) && (participant === undefined || participant(p))),
|
|
112
|
+
dispatch: (event, e, options) => leg.dispatch(event, e, withPart(options, noSkill)),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
@@ -2,15 +2,18 @@ import type { ExecutionEnv } from "../../internal/harness-types.js";
|
|
|
2
2
|
import type { AssistantMessage, Message, Model, Usage } from "../../internal/llm.js";
|
|
3
3
|
import type { CwdRef } from "../../tools/fs/fs-shared.js";
|
|
4
4
|
import { type PermissionResult, type ToolCallRequest } from "../tool-policy.js";
|
|
5
|
-
import type { HookInvocationIdentity, PermissionDeniedPayload } from "../hooks.js";
|
|
5
|
+
import type { ClassicEventBase, HookInvocationIdentity, PermissionDeniedPayload, UserPromptSubmitEvent } from "../hooks.js";
|
|
6
|
+
import type { ClassicEventMap, ClassicEventName } from "./classic-events.js";
|
|
6
7
|
import type { PermissionMode } from "../ask-origin.js";
|
|
7
8
|
import type { RunnerDeps } from "../runner-deps.js";
|
|
8
9
|
import type { TaskSpec } from "../task-spec.js";
|
|
9
|
-
import { type ModBus, type
|
|
10
|
+
import { type ModAnswerRanks, type ModBus, type ModCallEntry, type ModMountedHandler, type ModDispatchOutcome, type ModEventPayload, type ModRegistration } from "./kernel/index.js";
|
|
10
11
|
import { type SourcedOverlay } from "../../prompt-assembly/overlay.js";
|
|
11
12
|
import type { BandId } from "../../prompt-assembly/catalog/schema.js";
|
|
12
13
|
import type { ModParticipant } from "./kernel/dispatch.js";
|
|
13
14
|
import { type EngineDollar, type ModelCompleteRequest, type ModelCompleteResult, type ModSeatView } from "./dollar.js";
|
|
15
|
+
import type { SkillSpec } from "../agent-definition.js";
|
|
16
|
+
import { type SkillScopes } from "./spec-seats.js";
|
|
14
17
|
/**
|
|
15
18
|
* What the engine's core answers at the bottom of every classic chain: the engine itself has nothing to add.
|
|
16
19
|
* Frozen and empty, so it reads as "no opinion" in every classic station's answer form, and a handler that
|
|
@@ -151,21 +154,23 @@ export declare function inheritedToolChecks<E extends InstallationEntry & {
|
|
|
151
154
|
readonly mods?: readonly ModChainLink[];
|
|
152
155
|
}>(entries: readonly E[], standsIn: (pc: E) => boolean, settleOf: (pc: E) => InstallationAskSettlement): readonly InheritedToolCheck[];
|
|
153
156
|
/** The members every classic `e` of a leg carries: the identity envelope, the delegated leg's `agentId`, the leg's observed mode. */
|
|
154
|
-
export declare function classicEventBase(identity: HookInvocationIdentity | undefined, permissionMode?: PermissionMode):
|
|
157
|
+
export declare function classicEventBase(identity: HookInvocationIdentity | undefined, permissionMode?: PermissionMode): ClassicEventBase;
|
|
155
158
|
/**
|
|
156
159
|
* Raise an observation event (a skip-on-failure event whose answer no station reads): no handler, no dispatch.
|
|
157
160
|
* Its failures are the bus's to report; a rejected dispatch (an engine fault, never a handler's) is swallowed —
|
|
158
|
-
* an observation must never change what it observes.
|
|
161
|
+
* an observation must never change what it observes. The `e` is the event's own, as {@link ClassicEventMap} types it.
|
|
159
162
|
*/
|
|
160
|
-
export declare function observeClassic(bus: LegModBus, event:
|
|
163
|
+
export declare function observeClassic<K extends ClassicEventName>(bus: LegModBus, event: K, e: ClassicEventMap[K]["e"], signal: AbortSignal | undefined): Promise<void>;
|
|
161
164
|
/**
|
|
162
165
|
* Raise a classic event whose answer the station reads: `undefined` when no handler hangs on it (the station
|
|
163
166
|
* runs as if the bus were not there), else the dispatch outcome. A rejection is an engine fault, never a
|
|
164
167
|
* handler's (handlers fail into the outcome); a decision station fails closed on it, an observation swallows it.
|
|
168
|
+
* The `e` is the event's own, as {@link ClassicEventMap} types it; a decision event names its answer ranks.
|
|
165
169
|
*/
|
|
166
|
-
export declare function dispatchClassic(bus: LegModBus, event:
|
|
170
|
+
export declare function dispatchClassic<K extends ClassicEventName>(bus: LegModBus, event: K, e: ClassicEventMap[K]["e"], options: {
|
|
167
171
|
readonly signal?: AbortSignal;
|
|
168
172
|
readonly checkAnswer?: (answer: unknown) => string | undefined;
|
|
173
|
+
readonly ranks?: ModAnswerRanks;
|
|
169
174
|
}): Promise<ModDispatchOutcome | undefined>;
|
|
170
175
|
/** The answer form of a classic event whose answer is an object of optional string members (`block`, `additionalContext`, …). */
|
|
171
176
|
export declare function stringMembersAnswer(event: string, members: readonly string[]): (answer: unknown) => string | undefined;
|
|
@@ -205,7 +210,7 @@ export type PromptScreen = {
|
|
|
205
210
|
* runs past its budget or breaks the site's contract ends the screen `failed`, and every entrance fails closed on it;
|
|
206
211
|
* a cancelled screen ends `aborted` at once. A dispatch the engine itself could not run is `failed` too.
|
|
207
212
|
*/
|
|
208
|
-
export declare function screenUserPrompt(bus: LegModBus, e:
|
|
213
|
+
export declare function screenUserPrompt(bus: LegModBus, e: UserPromptSubmitEvent, signal: AbortSignal | undefined): Promise<PromptScreen | undefined>;
|
|
209
214
|
/** The three words a `tool.check` verdict speaks. */
|
|
210
215
|
export declare const TOOL_CHECK_DECISIONS: readonly ["allow", "ask", "deny"];
|
|
211
216
|
export type ToolCheckDecision = (typeof TOOL_CHECK_DECISIONS)[number];
|
|
@@ -282,12 +287,21 @@ export interface LegFacadeSeats {
|
|
|
282
287
|
now(): number;
|
|
283
288
|
tools(): readonly string[];
|
|
284
289
|
agents(): readonly string[];
|
|
290
|
+
/** `$.tool.call`'s host entry (`createToolCallEntry`, `tool-call.ts`). */
|
|
291
|
+
readonly toolCall: ModCallEntry;
|
|
285
292
|
}
|
|
286
293
|
/** The leg's admitted bus, its chain identity (the one its admission recorded, {@link chainOfBus}) and the binding of the
|
|
287
|
-
* facade its `$` reaches.
|
|
294
|
+
* facade its `$` reaches. `bus` is the leg bus every station raises on ({@link legBusOf}: an extension's own call's
|
|
295
|
+
* events are raised under its frames). */
|
|
288
296
|
export interface LegMods {
|
|
289
297
|
readonly bus: ModBus;
|
|
298
|
+
/** The leg's standing chain ({@link standingBus}): the bus without the skills' registrations — what the leg hands its
|
|
299
|
+
* descendants (its screening constraint is minted over it) and what guards each of its calls unconditionally. The bus
|
|
300
|
+
* itself when no skill carries one. */
|
|
301
|
+
readonly standing: ModBus;
|
|
290
302
|
readonly chain: readonly ModChainLink[];
|
|
303
|
+
/** The leg's skill scopes (`SkillSpec.mods`): the grant table opens one on each activation, the park freezes them. */
|
|
304
|
+
readonly skillScopes: SkillScopes;
|
|
291
305
|
/** Bind the engine facade once the leg is prepared. Until then a `$` call throws, naming the method. */
|
|
292
306
|
bindFacade(seats: LegFacadeSeats): void;
|
|
293
307
|
}
|
|
@@ -301,6 +315,10 @@ export declare function admitLegMods(input: {
|
|
|
301
315
|
readonly spec: Pick<TaskSpec, "mods">;
|
|
302
316
|
readonly deps: Pick<RunnerDeps, "mods" | "onError" | "onNotice">;
|
|
303
317
|
readonly sessionId: string;
|
|
318
|
+
/** The leg's skills as the skills seat read them: each one's registrations join the task seat, scoped to its activation. */
|
|
319
|
+
readonly skills?: readonly Pick<SkillSpec, "name" | "mods">[];
|
|
320
|
+
/** The skills a resumed leg's park recorded active (their scopes open from the start). */
|
|
321
|
+
readonly reopenedSkills?: readonly string[];
|
|
304
322
|
}): Promise<LegMods>;
|
|
305
323
|
/** What a leg hands {@link legFacadeSeats}: the seats it already has. */
|
|
306
324
|
export interface LegFacadeInput {
|
|
@@ -328,6 +346,8 @@ export interface LegFacadeInput {
|
|
|
328
346
|
readonly usage: Usage | undefined;
|
|
329
347
|
readonly diagnostics?: AssistantMessage["diagnostics"];
|
|
330
348
|
}) => void;
|
|
349
|
+
/** `$.tool.call`'s host entry, over the leg's harness and occurrence table. */
|
|
350
|
+
readonly toolCall: ModCallEntry;
|
|
331
351
|
}
|
|
332
352
|
/** The engine facade's seats over a prepared leg — each one a seat the leg already has (no new capability). */
|
|
333
353
|
export declare function legFacadeSeats(input: LegFacadeInput): LegFacadeSeats;
|
|
@@ -6,11 +6,13 @@ import { inlineUntrusted } from "../untrusted-text.js";
|
|
|
6
6
|
import { extensionWords } from "../untrusted-egress.js";
|
|
7
7
|
import { askApproverIdentity, describeThrown, ownArgs } from "../tool-policy.js";
|
|
8
8
|
import { admitMods, expandModPattern } from "./kernel/index.js";
|
|
9
|
+
import { legBusOf } from "./extension-call.js";
|
|
9
10
|
import { validateOverlay } from "../../prompt-assembly/overlay.js";
|
|
10
11
|
import { modsInvalid } from "./kernel/registration.js";
|
|
11
12
|
import { isPlainRecord } from "./kernel/receive.js";
|
|
12
13
|
import { engineMethodBottoms } from "./dollar.js";
|
|
13
14
|
import { modSeatsOf, modsReportToOnError, registrationRefusedNotice } from "./host.js";
|
|
15
|
+
import { scopedLegBus, skillScopeRecord, skillSeatsOf, standingBus } from "./spec-seats.js";
|
|
14
16
|
export const ENGINE_CORE_ANSWER = Object.freeze({});
|
|
15
17
|
export function engineCore() {
|
|
16
18
|
return ENGINE_CORE_ANSWER;
|
|
@@ -141,6 +143,7 @@ export async function dispatchClassic(bus, event, e, options) {
|
|
|
141
143
|
bottom: engineCore,
|
|
142
144
|
...(options.signal !== undefined ? { signal: options.signal } : {}),
|
|
143
145
|
...(check !== undefined ? { checkAnswer: (a) => (a === ENGINE_CORE_ANSWER ? undefined : check(a)) } : {}),
|
|
146
|
+
...(options.ranks !== undefined ? { ranks: options.ranks } : {}),
|
|
144
147
|
});
|
|
145
148
|
}
|
|
146
149
|
export function stringMembersAnswer(event, members) {
|
|
@@ -196,12 +199,14 @@ export async function observePermissionDenied(input) {
|
|
|
196
199
|
}, input.onHostObserverFailure);
|
|
197
200
|
await observeClassic(own, "classic.PermissionDenied", e, input.signal);
|
|
198
201
|
}
|
|
202
|
+
const USER_PROMPT_RANKS = Object.freeze({ of: (a) => (stringMembersOf(a, ["block"]).block ? 1 : 0), top: 1 });
|
|
199
203
|
export async function screenUserPrompt(bus, e, signal) {
|
|
200
204
|
let outcome;
|
|
201
205
|
try {
|
|
202
206
|
outcome = await dispatchClassic(bus, "classic.UserPromptSubmit", e, {
|
|
203
207
|
...(signal !== undefined ? { signal } : {}),
|
|
204
208
|
checkAnswer: stringMembersAnswer("classic.UserPromptSubmit", ["block", "additionalContext"]),
|
|
209
|
+
ranks: USER_PROMPT_RANKS,
|
|
205
210
|
});
|
|
206
211
|
}
|
|
207
212
|
catch (err) {
|
|
@@ -215,6 +220,13 @@ export async function screenUserPrompt(bus, e, signal) {
|
|
|
215
220
|
}
|
|
216
221
|
export const TOOL_CHECK_DECISIONS = Object.freeze(["allow", "ask", "deny"]);
|
|
217
222
|
const isToolCheckDecision = (v) => TOOL_CHECK_DECISIONS.some((d) => d === v);
|
|
223
|
+
const TOOL_CHECK_RANKS = Object.freeze({
|
|
224
|
+
of: (a) => {
|
|
225
|
+
const read = readToolCheckAnswer(a);
|
|
226
|
+
return typeof read === "string" ? 0 : read.decision === "deny" ? 2 : read.decision === "ask" ? 1 : 0;
|
|
227
|
+
},
|
|
228
|
+
top: 2,
|
|
229
|
+
});
|
|
218
230
|
function readToolCheckAnswer(answer) {
|
|
219
231
|
if (typeof answer !== "object" || answer === null)
|
|
220
232
|
return `answered ${answer === null ? "null" : typeof answer}; tool.check takes { decision, reason? }`;
|
|
@@ -239,6 +251,7 @@ export async function raiseToolCheck(bus, e, projection, signal, judges) {
|
|
|
239
251
|
const read = readToolCheckAnswer(a);
|
|
240
252
|
return typeof read === "string" ? read : undefined;
|
|
241
253
|
},
|
|
254
|
+
ranks: TOOL_CHECK_RANKS,
|
|
242
255
|
});
|
|
243
256
|
}
|
|
244
257
|
catch (err) {
|
|
@@ -253,14 +266,13 @@ export async function raiseToolCheck(bus, e, projection, signal, judges) {
|
|
|
253
266
|
}
|
|
254
267
|
const NO_COMPOSE = Object.freeze({ deploy: Object.freeze([]), task: Object.freeze([]), warnings: Object.freeze([]) });
|
|
255
268
|
function composeOverlaysOf(answer) {
|
|
256
|
-
if (!isPlainRecord(answer))
|
|
257
|
-
return `answered ${answer === null ? "null" : Array.isArray(answer) ? "an array" : typeof answer
|
|
258
|
-
}
|
|
269
|
+
if (!isPlainRecord(answer))
|
|
270
|
+
return `answered ${answer === null ? "null" : Array.isArray(answer) ? "an array" : typeof answer}; prompt.compose takes { overlays }`;
|
|
259
271
|
const stray = Object.keys(answer).filter((k) => k !== "overlays");
|
|
260
272
|
if (stray.length > 0)
|
|
261
273
|
return `the answer carries ${stray.slice(0, 5).map((k) => JSON.stringify(extensionWords(k, 40))).join(", ")} (overlays only)`;
|
|
262
274
|
const overlays = answer["overlays"];
|
|
263
|
-
return Array.isArray(overlays)
|
|
275
|
+
return Array.isArray(overlays) ? overlays : "the answer's overlays is not an array";
|
|
264
276
|
}
|
|
265
277
|
export async function raisePromptCompose(bus, e, options) {
|
|
266
278
|
if (!bus.hasHandlers("prompt.compose"))
|
|
@@ -357,6 +369,7 @@ function lateView() {
|
|
|
357
369
|
};
|
|
358
370
|
return {
|
|
359
371
|
view,
|
|
372
|
+
entries: { "tool.call": (args, ctx) => need("tool.call").toolCall(args, ctx) },
|
|
360
373
|
bind: (s) => {
|
|
361
374
|
seats = s;
|
|
362
375
|
},
|
|
@@ -365,19 +378,21 @@ function lateView() {
|
|
|
365
378
|
export async function admitLegMods(input) {
|
|
366
379
|
const late = lateView();
|
|
367
380
|
const seats = modSeatsOf(input.spec, input.deps);
|
|
368
|
-
const
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
});
|
|
381
|
+
const skillSeats = skillSeatsOf(input.skills);
|
|
382
|
+
const admitted = skillSeats.registrations.length === 0 ? seats : { ...seats, task: [...(seats.task ?? []), ...skillSeats.registrations] };
|
|
383
|
+
const report = modsReportToOnError(input.deps.onError, input.sessionId);
|
|
384
|
+
const kernelBus = await admitMods({ side: "engine", seats: admitted, bottoms: engineMethodBottoms(late.view), entries: late.entries, report, describeThrown, isProxy: types.isProxy });
|
|
385
|
+
const skillScopes = skillScopeRecord(skillSeats.owners, input.reopenedSkills);
|
|
386
|
+
const bus = legBusOf(scopedLegBus(kernelBus, skillScopes), report);
|
|
387
|
+
const standing = standingBus(bus, skillScopes);
|
|
376
388
|
for (const record of bus.records) {
|
|
377
389
|
if ("refusedBy" in record)
|
|
378
390
|
deliverEngineNotice(input.deps.onNotice, registrationRefusedNotice(record, input.sessionId));
|
|
379
391
|
}
|
|
380
|
-
|
|
392
|
+
const chain = recordAdmittedChain(bus, seats);
|
|
393
|
+
if (standing !== bus)
|
|
394
|
+
ADMITTED_CHAINS.set(standing, chain);
|
|
395
|
+
return { bus, standing, chain, skillScopes, bindFacade: late.bind };
|
|
381
396
|
}
|
|
382
397
|
function replyText(reply) {
|
|
383
398
|
return reply.content.flatMap((c) => (c.type === "text" ? [c.text] : [])).join("");
|
|
@@ -415,6 +430,7 @@ export function legFacadeSeats(input) {
|
|
|
415
430
|
now: () => (input.deps.now ?? Date.now)(),
|
|
416
431
|
tools: () => [...input.activeTools],
|
|
417
432
|
agents: () => (input.agentListing?.entries ?? []).map((e) => e.name),
|
|
433
|
+
toolCall: input.toolCall,
|
|
418
434
|
};
|
|
419
435
|
}
|
|
420
436
|
export async function admitModChain(seats, onError) {
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `tool.call` station: raised on the leg's bus between the gate letting a call go and the tool's body, for every
|
|
3
|
+
* execution of a call (the live loop's lanes through the loop's execution seat, the resumed leg's approved call through
|
|
4
|
+
* the same function). The chain's bottom is the tool's body; the event's failure column is `refuse_until_run`, so a
|
|
5
|
+
* handler's failure refuses the call while the body has not started and, once it has, the body's real result stands.
|
|
6
|
+
*
|
|
7
|
+
* `e = { tool, tool_use_id, agentId?, input }` (all four pinned — what the gate judged is what runs; a rewrite belongs to
|
|
8
|
+
* `classic.PreToolUse`) plus the identity envelope. A handler answers:
|
|
9
|
+
* - `next(e)` — the body runs; what came up is `{ result: { content, isError } }`, a frozen view of the real result;
|
|
10
|
+
* - `{ deny: <reason> }` — refused before the body: the call is not executed and the record says an extension refused it
|
|
11
|
+
* (a deny once the body has started stands in place of a call that ran: a violation, the real result stands);
|
|
12
|
+
* - `{ result }` — an extension's own result in place of the body (a string, or a list of text blocks), taken only when
|
|
13
|
+
* both facts hold: the gate let this call go without anyone being asked about it (its latest gate record is an allow
|
|
14
|
+
* with no settlement, release or clearance — a person's or a rule's yes is a yes to running the tool), and the body
|
|
15
|
+
* has not started (the kernel's own record). Either missing, the answer is a violation: before the body the call is
|
|
16
|
+
* refused, after it the real result stands. A taken result is the call's result; the record says the body never ran
|
|
17
|
+
* and names the extension (`tool_end.notExecuted`, `tool_end.answeredBy`).
|
|
18
|
+
* Context for the model is added at `classic.PostToolUse`, not here. Whatever an extension answered in place of the body,
|
|
19
|
+
* the call's post-execution stations stay silent, as for a call the gate blocked.
|
|
20
|
+
*
|
|
21
|
+
* `$.tool.call({ tool, ...input })` is the event called (the table's `call` column): the host entry
|
|
22
|
+
* ({@link createToolCallEntry}) runs the loop's own per-call pipeline for the named tool — the whole gate, this station,
|
|
23
|
+
* the body, the post-execution stations — under the run's principal, with the caller's frames and origin on every event
|
|
24
|
+
* its pipeline raises (`extension-call.ts`), and no model message carrying it. It answers this event's own forms:
|
|
25
|
+
* `{ result: { content, isError } }` (the frozen view a handler's `next` gets), or `{ deny: <reason> }` when the call was
|
|
26
|
+
* refused (returned, not thrown).
|
|
27
|
+
*/
|
|
28
|
+
import type { AgentToolResult } from "../../internal/harness-types.js";
|
|
29
|
+
import type { HookInvocationIdentity } from "../hooks.js";
|
|
30
|
+
import type { ToolOccurrenceTable } from "../runner/tool-occurrence.js";
|
|
31
|
+
import { type LegModBus } from "./stations.js";
|
|
32
|
+
import type { ModBus, ModCallEntry } from "./kernel/index.js";
|
|
33
|
+
/** One execution as the station sees it: the call, the tool that runs (its mounted name), the arguments the gate let go. */
|
|
34
|
+
export interface ToolCallExecution {
|
|
35
|
+
readonly toolCallId: string;
|
|
36
|
+
readonly toolName: string;
|
|
37
|
+
readonly args: unknown;
|
|
38
|
+
}
|
|
39
|
+
/** The station over one execution: `run` runs the tool's body (at most once); the result is the call's result. */
|
|
40
|
+
export type ToolCallStation = (call: ToolCallExecution, run: () => Promise<AgentToolResult<unknown>>, signal: AbortSignal | undefined) => Promise<AgentToolResult<unknown>>;
|
|
41
|
+
export interface ToolCallStationInput {
|
|
42
|
+
readonly bus: LegModBus;
|
|
43
|
+
/** The leg's occurrence table: the gate record a substitute result is read against, and the answered-in-place record. */
|
|
44
|
+
readonly occurrences: Pick<ToolOccurrenceTable, "get" | "answeredInPlace" | "refuse">;
|
|
45
|
+
/** The calls whose post-execution stations stay silent (the gate's blocked set). */
|
|
46
|
+
readonly blockedToolCalls: Set<string>;
|
|
47
|
+
readonly identity?: HookInvocationIdentity;
|
|
48
|
+
readonly reminderMark?: string;
|
|
49
|
+
}
|
|
50
|
+
/** The station over the leg's bus, or undefined when no handler hangs on `tool.call` (nothing is raised; the body runs). */
|
|
51
|
+
export declare function createToolCallStation(input: ToolCallStationInput): ToolCallStation | undefined;
|
|
52
|
+
/** What the host entry runs a call on: the leg's harness (the loop's pipeline under the running prompt) and the tool identities. */
|
|
53
|
+
export interface ToolCallEntryInput {
|
|
54
|
+
/** The leg bus every station raises on ({@link import("./extension-call.js").legBusOf}). */
|
|
55
|
+
readonly bus: ModBus;
|
|
56
|
+
readonly harness: Pick<import("../../internal/harness.js").AgentHarness, "callTool">;
|
|
57
|
+
/** The live roster's face of a mounted tool, by the name it is mounted under (`toolCallFaceOf`): its catalog contract. */
|
|
58
|
+
readonly faceOf: (toolName: string) => {
|
|
59
|
+
readonly contractId: string;
|
|
60
|
+
} | undefined;
|
|
61
|
+
/** The tool the leg mounted under this name, as the caller handed it (the one an `execute` binding is read off). */
|
|
62
|
+
readonly specOf: (toolName: string) => unknown;
|
|
63
|
+
}
|
|
64
|
+
/** `$.tool.call`'s host entry: the loop's per-call pipeline for the named tool, run as the caller's call (see the module header). */
|
|
65
|
+
export declare function createToolCallEntry(input: ToolCallEntryInput): ModCallEntry;
|
|
66
|
+
/**
|
|
67
|
+
* The gate's last word on an extension's own call, at its allow exit, on the arguments it lets go: the loop gives a call that
|
|
68
|
+
* is not batch-safe (a `cd`) the run to itself, and an extension's call is in no batch of the loop's — so one that is not
|
|
69
|
+
* batch-safe is let go only when no other call of the run is in flight, and a batch-safe one only while no call that is not
|
|
70
|
+
* batch-safe has been let go. `batchSafe` is the loop's own reading (`isBatchSafeToolCall`, through the harness). Undefined:
|
|
71
|
+
* let it go; a sentence: refused before it runs.
|
|
72
|
+
*/
|
|
73
|
+
export declare function extensionCallOverlap(input: {
|
|
74
|
+
readonly occurrences: Pick<ToolOccurrenceTable, "live">;
|
|
75
|
+
readonly toolCallId: string;
|
|
76
|
+
readonly toolName: string;
|
|
77
|
+
readonly args: unknown;
|
|
78
|
+
readonly batchSafe: (toolName: string, args: unknown) => boolean;
|
|
79
|
+
}): string | undefined;
|