@sema-agent/core 7.55.0 → 7.57.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 +1054 -0
- package/LICENSE +1 -1
- package/dist/agents/cascade.js +1 -1
- package/dist/agents/cc-peer-directory.js +1 -0
- package/dist/agents/child-model-seat.d.ts +0 -11
- package/dist/agents/child-model-seat.js +0 -3
- package/dist/agents/list-agents-tool.d.ts +3 -1
- package/dist/agents/list-agents-tool.js +7 -7
- package/dist/agents/org-delivery-gate.js +3 -4
- package/dist/agents/peer-directory.d.ts +22 -4
- package/dist/agents/peer-directory.js +24 -2
- package/dist/agents/peer-held-queue.d.ts +69 -49
- package/dist/agents/peer-held-queue.js +255 -106
- package/dist/agents/peer-session-drain.js +65 -45
- package/dist/agents/repair-loop.js +2 -2
- package/dist/agents/send-message-tool.js +7 -6
- package/dist/agents/subagent.d.ts +6 -4
- package/dist/agents/subagent.js +72 -68
- package/dist/agents/tool-filter.d.ts +7 -5
- package/dist/agents/tool-filter.js +12 -9
- package/dist/agents/verify.d.ts +3 -2
- package/dist/agents/verify.js +3 -3
- package/dist/brain/anthropic.js +45 -80
- package/dist/brain/media-degrade.d.ts +18 -7
- package/dist/brain/media-degrade.js +13 -2
- package/dist/brain/model-capability.d.ts +37 -0
- package/dist/brain/model-capability.js +34 -0
- package/dist/brain/model-presets.d.ts +2 -8
- package/dist/brain/model-presets.js +1 -6
- package/dist/brain/open-responses.js +23 -34
- package/dist/brain/openai.js +25 -96
- package/dist/brain/provider-dialect.d.ts +3 -2
- package/dist/brain/provider-dialect.js +2 -2
- package/dist/brain/reasoning-request.d.ts +96 -0
- package/dist/brain/reasoning-request.js +174 -0
- package/dist/brain/reasoning.d.ts +11 -11
- package/dist/brain/reasoning.js +4 -3
- package/dist/brain/request-params.d.ts +13 -4
- package/dist/brain/request-params.js +21 -5
- package/dist/brain/status-sink.d.ts +20 -0
- package/dist/brain/status-sink.js +7 -0
- package/dist/brain/stream-engine.d.ts +9 -0
- package/dist/brain/stream-engine.js +24 -10
- package/dist/brain/stream-shared.d.ts +5 -4
- package/dist/brain/stream-shared.js +4 -4
- package/dist/core/a2a.d.ts +2 -1
- package/dist/core/a2a.js +19 -13
- package/dist/core/agent-definition.d.ts +10 -0
- package/dist/core/allow-entry.d.ts +23 -23
- package/dist/core/allow-entry.js +42 -46
- package/dist/core/allow-rule-shadow.d.ts +3 -3
- package/dist/core/approval-object.d.ts +21 -5
- package/dist/core/approval-object.js +44 -17
- package/dist/core/ask-origin.d.ts +66 -20
- package/dist/core/ask-origin.js +63 -23
- package/dist/core/ask-question.d.ts +51 -8
- package/dist/core/ask-question.js +3 -4
- package/dist/core/ask-unresolvable-notice.d.ts +8 -3
- package/dist/core/ask-unresolvable-notice.js +16 -2
- package/dist/core/auto-compaction.d.ts +71 -6
- package/dist/core/auto-compaction.js +42 -26
- package/dist/core/background-agent-store.d.ts +6 -2
- package/dist/core/background-agent-store.js +1 -1
- 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 -1
- package/dist/core/checkpoint-requirements.js +6 -0
- package/dist/core/checkpoint-store.d.ts +105 -53
- package/dist/core/checkpoint-store.js +43 -20
- package/dist/core/cross-boundary-taint.d.ts +6 -5
- package/dist/core/cross-boundary-taint.js +5 -5
- package/dist/core/decision-receipt.d.ts +37 -3
- package/dist/core/decision-receipt.js +17 -17
- package/dist/core/delegation-not-started.d.ts +6 -0
- package/dist/core/delegation-not-started.js +17 -0
- package/dist/core/engine-attestation.d.ts +93 -0
- package/dist/core/engine-attestation.js +70 -0
- package/dist/core/engine-capabilities.d.ts +4 -1
- package/dist/core/engine-capabilities.js +1 -1
- package/dist/core/engine-notice.d.ts +32 -12
- package/dist/core/engine-notice.js +6 -0
- package/dist/core/file-history-store.d.ts +104 -22
- package/dist/core/file-history-store.js +37 -19
- package/dist/core/gate-fold.d.ts +1 -1
- package/dist/core/gate-fold.js +22 -10
- package/dist/core/gate-lanes.js +73 -65
- package/dist/core/gate-outcome.d.ts +26 -5
- package/dist/core/gate-outcome.js +26 -0
- package/dist/core/governance-codes.d.ts +5 -1
- package/dist/core/governance-codes.js +6 -0
- package/dist/core/hooks.d.ts +19 -18
- package/dist/core/hooks.js +3 -1
- package/dist/core/host-floor.d.ts +128 -0
- package/dist/core/host-floor.js +206 -0
- package/dist/core/host-target.d.ts +38 -3
- package/dist/core/host-target.js +38 -5
- package/dist/core/mailbox-store.d.ts +62 -1
- package/dist/core/mailbox-store.js +59 -0
- package/dist/core/mcp-name-judge.d.ts +46 -0
- package/dist/core/mcp-name-judge.js +61 -0
- package/dist/core/mcp-probe.d.ts +1 -1
- package/dist/core/mcp-probe.js +2 -5
- package/dist/core/mcp.d.ts +5 -1
- package/dist/core/mcp.js +70 -64
- package/dist/core/memory-engine/consolidation-driver.js +4 -3
- package/dist/core/memory-engine/delegation-settlement.js +15 -24
- package/dist/core/memory-engine/distiller.js +26 -17
- 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 +70 -8
- package/dist/core/model-seat.d.ts +10 -3
- package/dist/core/mods/classic-events.d.ts +67 -0
- package/dist/core/mods/classic-events.js +1 -0
- package/dist/core/mods/dollar.d.ts +13 -0
- package/dist/core/mods/extension-call.d.ts +31 -0
- package/dist/core/mods/extension-call.js +43 -0
- package/dist/core/mods/kernel/dispatch.d.ts +20 -3
- package/dist/core/mods/kernel/dispatch.js +140 -69
- package/dist/core/mods/kernel/events.d.ts +47 -11
- package/dist/core/mods/kernel/events.js +66 -42
- package/dist/core/mods/kernel/index.d.ts +4 -4
- package/dist/core/mods/kernel/index.js +2 -2
- package/dist/core/mods/kernel/receive.d.ts +39 -5
- package/dist/core/mods/kernel/receive.js +290 -17
- package/dist/core/mods/kernel/registration.d.ts +33 -2
- package/dist/core/mods/kernel/registration.js +6 -7
- package/dist/core/mods/kernel/site-rules.d.ts +44 -16
- package/dist/core/mods/kernel/site-rules.js +24 -42
- package/dist/core/mods/spec-seats.d.ts +69 -0
- package/dist/core/mods/spec-seats.js +114 -0
- package/dist/core/mods/stations.d.ts +28 -8
- package/dist/core/mods/stations.js +29 -13
- package/dist/core/mods/tool-call.d.ts +79 -0
- package/dist/core/mods/tool-call.js +152 -0
- package/dist/core/namespaced-rule-name.d.ts +32 -38
- package/dist/core/namespaced-rule-name.js +29 -36
- package/dist/core/parent-spec-seat.d.ts +6 -1
- package/dist/core/parent-spec-seat.js +2 -0
- package/dist/core/park-selfcheck.js +3 -0
- package/dist/core/permission-rule-consent.d.ts +24 -3
- package/dist/core/permission-rule-consent.js +136 -41
- package/dist/core/permission-rule-model.d.ts +57 -5
- package/dist/core/permission-rule-model.js +90 -31
- package/dist/core/permission-rule-org.d.ts +6 -2
- package/dist/core/permission-rule-org.js +8 -4
- package/dist/core/permission-rule-provider.d.ts +5 -2
- package/dist/core/permission-rule-provider.js +41 -11
- package/dist/core/permission-rule-store.d.ts +3 -2
- package/dist/core/permission-rule-store.js +11 -2
- package/dist/core/permission-rule-sync.js +3 -2
- package/dist/core/permission-rule-syntax.d.ts +5 -4
- package/dist/core/permission-rule-syntax.js +2 -2
- package/dist/core/permission-rules.d.ts +4 -4
- package/dist/core/permission-rules.js +11 -20
- package/dist/core/persisted-rule-arms.d.ts +2 -2
- package/dist/core/persisted-rule-arms.js +10 -12
- package/dist/core/principal-name.d.ts +20 -0
- package/dist/core/principal-name.js +22 -0
- package/dist/core/prompt-section-seat.js +4 -6
- package/dist/core/protocol-http-auth.d.ts +40 -5
- package/dist/core/protocol-http-auth.js +168 -4
- package/dist/core/protocol-naming.d.ts +20 -0
- package/dist/core/protocol-naming.js +20 -3
- package/dist/core/read-only-shell.d.ts +20 -5
- package/dist/core/read-only-shell.js +29 -14
- package/dist/core/remote-env.d.ts +37 -1
- package/dist/core/remote-env.js +11 -0
- package/dist/core/resume-startup-cause.d.ts +24 -2
- package/dist/core/resume-startup-cause.js +20 -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 +28 -1
- package/dist/core/roles.js +81 -26
- package/dist/core/rule-lane-reads.d.ts +20 -15
- package/dist/core/rule-lane-reads.js +45 -17
- package/dist/core/rule-owner.d.ts +3 -3
- package/dist/core/rule-owner.js +3 -2
- package/dist/core/runner/announce-once-ledger.d.ts +14 -0
- package/dist/core/runner/announce-once-ledger.js +5 -0
- package/dist/core/runner/assemble-result.d.ts +1 -0
- package/dist/core/runner/assemble-result.js +1 -1
- package/dist/core/runner/call-hook-stations.d.ts +3 -2
- package/dist/core/runner/caller-roster.d.ts +16 -4
- package/dist/core/runner/caller-roster.js +33 -6
- package/dist/core/runner/capability-withheld-seat.d.ts +5 -0
- package/dist/core/runner/capability-withheld-seat.js +24 -0
- package/dist/core/runner/classifier-ladder.d.ts +7 -9
- package/dist/core/runner/classifier-ladder.js +3 -3
- package/dist/core/runner/compact-session.d.ts +10 -0
- package/dist/core/runner/compact-session.js +202 -0
- package/dist/core/runner/compaction-call-options.d.ts +2 -2
- package/dist/core/runner/compaction-seams.d.ts +21 -1
- package/dist/core/runner/compaction-seams.js +11 -8
- package/dist/core/runner/construction-doors.js +3 -0
- package/dist/core/runner/contracts.d.ts +50 -40
- package/dist/core/runner/cross-boundary-lane.d.ts +17 -13
- package/dist/core/runner/cross-boundary-lane.js +40 -27
- package/dist/core/runner/denial-limit-arms.d.ts +2 -2
- package/dist/core/runner/denial-limit-arms.js +1 -1
- package/dist/core/runner/derived-route-fallback.d.ts +13 -0
- package/dist/core/runner/derived-route-fallback.js +6 -0
- package/dist/core/runner/env-capability-census.d.ts +3 -2
- package/dist/core/runner/env-capability-census.js +9 -3
- package/dist/core/runner/file-history-request.d.ts +18 -0
- package/dist/core/runner/file-history-request.js +21 -13
- package/dist/core/runner/file-history-restore.d.ts +45 -0
- package/dist/core/runner/file-history-restore.js +46 -0
- package/dist/core/runner/gate-exit.d.ts +3 -3
- package/dist/core/runner/gate-exit.js +4 -3
- package/dist/core/runner/image.d.ts +7 -17
- package/dist/core/runner/image.js +9 -60
- package/dist/core/runner/permission-rule-lanes.d.ts +11 -11
- package/dist/core/runner/permission-rule-lanes.js +39 -17
- package/dist/core/runner/person-path-rows.d.ts +12 -9
- package/dist/core/runner/person-path-rows.js +18 -7
- package/dist/core/runner/prepare-acquire-reconcile.d.ts +3 -0
- package/dist/core/runner/prepare-acquire-reconcile.js +2 -1
- package/dist/core/runner/prepare-ask-lane.d.ts +2 -2
- package/dist/core/runner/prepare-ask-lane.js +5 -2
- package/dist/core/runner/prepare-caps-and-workflow.d.ts +4 -6
- package/dist/core/runner/prepare-caps-and-workflow.js +4 -3
- package/dist/core/runner/prepare-config-doors.d.ts +35 -38
- package/dist/core/runner/prepare-config-doors.js +46 -28
- package/dist/core/runner/prepare-defer-classify.d.ts +4 -3
- package/dist/core/runner/prepare-defer-classify.js +7 -8
- package/dist/core/runner/prepare-file-history.d.ts +48 -8
- package/dist/core/runner/prepare-file-history.js +7 -39
- package/dist/core/runner/prepare-gate-stations.d.ts +1 -1
- package/dist/core/runner/prepare-gate-stations.js +10 -1
- package/dist/core/runner/prepare-hands-readface.d.ts +5 -9
- package/dist/core/runner/prepare-hands-readface.js +17 -14
- package/dist/core/runner/prepare-inherited-gate.d.ts +6 -3
- package/dist/core/runner/prepare-inherited-gate.js +5 -3
- package/dist/core/runner/prepare-memory-engine-session.js +1 -1
- package/dist/core/runner/prepare-park-ask.d.ts +2 -0
- package/dist/core/runner/prepare-park-ask.js +7 -7
- package/dist/core/runner/prepare-policy-chain.d.ts +6 -3
- package/dist/core/runner/prepare-policy-chain.js +67 -76
- package/dist/core/runner/prepare-prompt-assembly.d.ts +5 -7
- package/dist/core/runner/prepare-prompt-assembly.js +10 -8
- package/dist/core/runner/prepare-prompt-inputs.d.ts +11 -9
- package/dist/core/runner/prepare-prompt-inputs.js +3 -5
- package/dist/core/runner/prepare-protocol-tools.d.ts +2 -0
- package/dist/core/runner/prepare-protocol-tools.js +3 -3
- package/dist/core/runner/prepare-safety-scan.d.ts +1 -1
- package/dist/core/runner/prepare-safety-scan.js +0 -17
- package/dist/core/runner/prepare-suspend-saga.d.ts +2 -0
- package/dist/core/runner/prepare-suspend-saga.js +5 -6
- package/dist/core/runner/prepare-task.d.ts +5 -2
- package/dist/core/runner/prepare-task.js +48 -43
- package/dist/core/runner/prepare-tool-disclosure-mount.d.ts +20 -4
- package/dist/core/runner/prepare-tool-disclosure-mount.js +33 -23
- package/dist/core/runner/prepare-turn-wiring.d.ts +0 -4
- package/dist/core/runner/prepare-turn-wiring.js +2 -7
- package/dist/core/runner/prepare-wiring-manifest.d.ts +6 -2
- package/dist/core/runner/prepare-wiring-manifest.js +3 -3
- package/dist/core/runner/resume-admission.js +1 -1
- package/dist/core/runner/resume-apply.js +11 -12
- package/dist/core/runner/resume-checkpoint-screen.js +3 -0
- package/dist/core/runner/resume-claim.d.ts +4 -2
- package/dist/core/runner/resume-claim.js +15 -8
- package/dist/core/runner/retired-runner-deps.js +1 -0
- package/dist/core/runner/rewind-files.d.ts +12 -0
- package/dist/core/runner/rewind-files.js +90 -0
- package/dist/core/runner/run-attachment-seats.js +2 -1
- package/dist/core/runner/run-brain-sinks.d.ts +4 -1
- package/dist/core/runner/run-brain-sinks.js +4 -2
- package/dist/core/runner/run-harness-handlers.js +12 -4
- package/dist/core/runner/run-leg.d.ts +1 -1
- package/dist/core/runner/run-leg.js +40 -39
- package/dist/core/runner/run-notification-lane.d.ts +2 -0
- package/dist/core/runner/run-notification-lane.js +2 -2
- package/dist/core/runner/run-recovery-lanes.js +3 -4
- package/dist/core/runner/run-settle-and-teardown.js +7 -12
- package/dist/core/runner/run-terminal-adoption.js +3 -4
- package/dist/core/runner/run-turn-boundary.js +4 -15
- package/dist/core/runner/runtask.d.ts +10 -0
- package/dist/core/runner/runtask.js +35 -42
- package/dist/core/runner/send-message-continuation.js +1 -1
- package/dist/core/runner/session-read-file-states.d.ts +15 -0
- package/dist/core/runner/session-read-file-states.js +28 -0
- package/dist/core/runner/session-rule-policy.js +4 -3
- package/dist/core/runner/session-verb-doors.d.ts +28 -0
- package/dist/core/runner/session-verb-doors.js +48 -0
- package/dist/core/runner/session-write-ledger.d.ts +30 -0
- package/dist/core/runner/session-write-ledger.js +101 -0
- package/dist/core/runner/shell-env-withheld.d.ts +33 -0
- package/dist/core/runner/shell-env-withheld.js +51 -0
- package/dist/core/runner/skills-seat.js +6 -2
- package/dist/core/runner/stream-settle-backstop.js +12 -15
- package/dist/core/runner/sub-agent-deny-lists.d.ts +25 -3
- package/dist/core/runner/sub-agent-deny-lists.js +25 -17
- package/dist/core/runner/synthetic-tools.d.ts +6 -0
- package/dist/core/runner/synthetic-tools.js +4 -1
- package/dist/core/runner/teardown-bounded.d.ts +1 -0
- package/dist/core/runner/teardown-bounded.js +1 -0
- package/dist/core/runner/tool-disclosure.d.ts +10 -12
- package/dist/core/runner/tool-disclosure.js +1 -3
- package/dist/core/runner/tool-end-body.d.ts +1 -1
- package/dist/core/runner/tool-end-body.js +10 -9
- package/dist/core/runner/tool-not-executed.d.ts +5 -0
- package/dist/core/runner/tool-not-executed.js +11 -0
- package/dist/core/runner/tool-occurrence.d.ts +8 -0
- package/dist/core/runner/tool-occurrence.js +7 -0
- package/dist/core/runner/turn-attachments.d.ts +33 -15
- package/dist/core/runner/turn-attachments.js +62 -37
- package/dist/core/runner-deps.d.ts +7 -7
- package/dist/core/safety-axis-vocab.d.ts +6 -4
- package/dist/core/safety-axis-vocab.js +6 -5
- package/dist/core/safety-merge-corpus.js +11 -3
- package/dist/core/secret-env.d.ts +30 -3
- package/dist/core/secret-env.js +47 -8
- package/dist/core/select-model.js +3 -3
- package/dist/core/session-policy-store.d.ts +32 -15
- package/dist/core/session-policy-store.js +156 -36
- package/dist/core/session-store.d.ts +29 -10
- package/dist/core/session-store.js +51 -19
- package/dist/core/session.d.ts +82 -16
- package/dist/core/session.js +53 -0
- package/dist/core/shell-read-silence.d.ts +11 -12
- package/dist/core/shell-read-silence.js +9 -5
- package/dist/core/shell-run-candidates.js +3 -1
- package/dist/core/shell-wrapper-projection.d.ts +1 -1
- package/dist/core/shell-wrapper-projection.js +1 -1
- package/dist/core/shell-wrapper-table.d.ts +14 -7
- package/dist/core/shell-wrapper-table.js +5 -4
- package/dist/core/side-query.js +10 -1
- package/dist/core/skill-grant.d.ts +7 -2
- package/dist/core/skill-grant.js +5 -0
- package/dist/core/skills-directory.js +6 -2
- package/dist/core/store-contracts/background-agent-store-contract.js +1 -0
- package/dist/core/store-contracts/checkpoint-store-contract.d.ts +11 -1
- package/dist/core/store-contracts/checkpoint-store-contract.js +141 -2
- package/dist/core/store-contracts/file-history-store-contract.js +40 -1
- package/dist/core/store-contracts/mailbox-store-contract.js +49 -1
- package/dist/core/store-contracts/peer-directory-contract.d.ts +7 -2
- package/dist/core/store-contracts/peer-directory-contract.js +14 -2
- package/dist/core/store-contracts/session-repo-contract.js +51 -0
- package/dist/core/store-contracts/session-store-contract.d.ts +2 -1
- package/dist/core/store-contracts/session-store-contract.js +150 -14
- package/dist/core/stub-env.d.ts +2 -0
- package/dist/core/stub-env.js +1 -0
- package/dist/core/synthetic-read-verdict.js +3 -3
- package/dist/core/task-event.d.ts +32 -4
- package/dist/core/task-notification.d.ts +16 -12
- package/dist/core/task-registry-agent.d.ts +8 -4
- package/dist/core/task-registry-agent.js +14 -8
- package/dist/core/task-registry-shared.d.ts +35 -6
- package/dist/core/task-registry-shared.js +11 -0
- package/dist/core/task-registry.d.ts +10 -1
- package/dist/core/task-registry.js +12 -2
- package/dist/core/task-result.d.ts +18 -0
- package/dist/core/task-spec.d.ts +18 -13
- package/dist/core/tighten-task-spec.js +2 -1
- package/dist/core/tool-catalog-entries.d.ts +23 -0
- package/dist/core/tool-catalog-entries.js +14 -2
- package/dist/core/tool-check-reading.d.ts +11 -0
- package/dist/core/tool-check-reading.js +11 -6
- package/dist/core/tool-model-gate.d.ts +2 -2
- package/dist/core/tool-name-aliases.d.ts +48 -18
- package/dist/core/tool-name-aliases.js +36 -19
- package/dist/core/tool-name-readings.d.ts +6 -32
- package/dist/core/tool-name-readings.js +2 -9
- package/dist/core/tool-policy.d.ts +78 -204
- package/dist/core/tool-policy.js +152 -204
- package/dist/core/tool-result-store.js +3 -0
- package/dist/core/tool-roster.d.ts +14 -19
- package/dist/core/tool-roster.js +11 -44
- package/dist/core/tool-spec-members.js +7 -2
- package/dist/core/tool-spec.d.ts +19 -11
- package/dist/core/tools.js +49 -9
- package/dist/core/trace.d.ts +6 -3
- package/dist/core/trace.js +2 -1
- package/dist/core/types.d.ts +1 -1
- package/dist/core/untrusted-egress.d.ts +20 -0
- package/dist/core/untrusted-egress.js +77 -3
- package/dist/core/user-attachment.d.ts +8 -1
- package/dist/core/user-attachment.js +64 -4
- package/dist/core/wiring-manifest.d.ts +9 -0
- package/dist/core/wiring-manifest.js +1 -0
- package/dist/core/workflow-journal-store.js +1 -1
- package/dist/engine/compaction/compaction.js +3 -2
- package/dist/engine/execution-env/node-execution-env.d.ts +7 -3
- package/dist/engine/execution-env/node-execution-env.js +11 -2
- package/dist/engine/harness/agent-harness.d.ts +32 -6
- package/dist/engine/harness/agent-harness.js +65 -9
- package/dist/engine/harness/types.d.ts +29 -2
- package/dist/engine/llm/types.d.ts +28 -11
- package/dist/engine/loop/agent-loop.d.ts +23 -4
- package/dist/engine/loop/agent-loop.js +42 -30
- package/dist/engine/loop/types.d.ts +16 -6
- package/dist/engine/session/memory-repo.d.ts +9 -2
- package/dist/engine/session/memory-repo.js +11 -1
- package/dist/engine/session/repo-utils.d.ts +6 -5
- package/dist/engine/session/repo-utils.js +14 -6
- package/dist/index.d.ts +34 -17
- package/dist/index.js +22 -11
- package/dist/internal/harness-types.d.ts +1 -1
- package/dist/internal/harness.d.ts +2 -1
- package/dist/internal/harness.js +1 -0
- package/dist/internal/llm.d.ts +1 -1
- package/dist/orchestration/run-workflow-tool.d.ts +6 -4
- package/dist/orchestration/run-workflow-tool.js +5 -3
- package/dist/orchestration/workflow.d.ts +3 -0
- package/dist/orchestration/workflow.js +36 -18
- package/dist/primitives/credential-ref.d.ts +89 -0
- package/dist/primitives/credential-ref.js +125 -0
- package/dist/primitives/index.d.ts +2 -0
- package/dist/primitives/index.js +1 -0
- package/dist/prompt-assembly/artifact.d.ts +2 -2
- package/dist/prompt-assembly/artifact.js +5 -3
- package/dist/prompt-assembly/assemble.d.ts +3 -2
- package/dist/prompt-assembly/assemble.js +1 -1
- package/dist/prompt-assembly/catalog/schema.d.ts +43 -12
- package/dist/prompt-assembly/catalog/schema.js +34 -2
- package/dist/prompt-assembly/catalog/sections.js +0 -1
- package/dist/prompt-assembly/composer.d.ts +3 -1
- package/dist/prompt-assembly/composer.js +1 -1
- package/dist/prompt-assembly/event-registry.js +1 -0
- package/dist/prompt-assembly/overlay.js +3 -3
- package/dist/prompt-assembly/renderers.d.ts +1 -1
- package/dist/prompt-assembly/renderers.js +0 -3
- package/dist/prompt-assembly/role-base.d.ts +15 -0
- package/dist/prompt-assembly/role-base.js +9 -0
- package/dist/prompt-assembly/select.d.ts +39 -14
- package/dist/prompt-assembly/select.js +47 -16
- package/dist/prompt-assembly/sugar.d.ts +17 -11
- package/dist/prompt-assembly/sugar.js +8 -3
- package/dist/prompt-assembly/tool-catalog.d.ts +37 -3
- package/dist/prompt-assembly/tool-catalog.js +114 -4
- package/dist/prompt-assembly/turn-snapshot.d.ts +4 -10
- package/dist/prompt-assembly/turn-snapshot.js +0 -3
- package/dist/prompt-assembly/types.d.ts +0 -7
- package/dist/scenarios/full-body.d.ts +11 -11
- package/dist/scenarios/full-body.js +4 -3
- package/dist/shell/lex.js +10 -1
- package/dist/stores/file/adoption/adopt.js +4 -3
- package/dist/stores/file/adoption/marker.js +3 -2
- package/dist/stores/file/checkpoint-store.d.ts +21 -4
- package/dist/stores/file/checkpoint-store.js +38 -7
- package/dist/stores/file/file-history-store.js +18 -11
- package/dist/stores/file/index.js +2 -1
- package/dist/stores/file/mailbox-store.d.ts +2 -1
- package/dist/stores/file/mailbox-store.js +26 -1
- package/dist/stores/file/permission-rule-adopt.js +4 -3
- package/dist/stores/file/permission-rule-store.js +11 -5
- package/dist/stores/file/session-store.d.ts +29 -6
- package/dist/stores/file/session-store.js +42 -50
- package/dist/tools/artifact/artifact-tool.js +3 -2
- package/dist/tools/fs/bash-program-position.d.ts +19 -2
- package/dist/tools/fs/bash-program-position.js +56 -9
- package/dist/tools/fs/bash-readonly-classifier.d.ts +15 -19
- package/dist/tools/fs/bash-readonly-classifier.js +5 -10
- package/dist/tools/fs/fs-bash.js +15 -8
- package/dist/tools/fs/fs-glob.d.ts +86 -0
- package/dist/tools/fs/fs-glob.js +226 -0
- package/dist/tools/fs/fs-read.js +14 -14
- package/dist/tools/fs/fs-search-tools.js +7 -7
- package/dist/tools/fs/pattern-kill-guard.d.ts +23 -0
- package/dist/tools/fs/pattern-kill-guard.js +429 -0
- package/dist/tools/fs/pdf.d.ts +9 -6
- package/dist/tools/fs/pdf.js +3 -3
- package/dist/tools/fs/program-read-model.d.ts +57 -7
- package/dist/tools/fs/program-read-model.js +11 -1
- package/dist/tools/fs/program-read-model.rows.js +78 -21
- package/dist/tools/fs/read-deny-home.js +3 -2
- package/dist/tools/fs/removal-targets.d.ts +17 -7
- package/dist/tools/fs/removal-targets.js +47 -20
- package/dist/tools/fs/search.d.ts +10 -0
- package/dist/tools/fs/search.js +20 -26
- package/dist/tools/fs/shell-read-argv.js +89 -12
- package/dist/tools/fs/shell-read-bindings.d.ts +31 -0
- package/dist/tools/fs/shell-read-bindings.js +41 -0
- package/dist/tools/fs/shell-read-check.d.ts +10 -0
- package/dist/tools/fs/shell-read-check.js +13 -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-identity.d.ts +12 -9
- package/dist/tools/fs/shell-read-identity.js +9 -4
- package/dist/tools/fs/shell-read-plan.js +24 -16
- package/dist/tools/fs/shell-read-start.d.ts +6 -1
- package/dist/tools/fs/shell-read-write-targets.d.ts +5 -1
- package/dist/tools/fs/shell-read-write-targets.js +2 -3
- package/dist/tools/fs/shell-reentry-text.d.ts +9 -0
- package/dist/tools/fs/shell-reentry-text.js +40 -2
- package/dist/tools/todo.js +63 -63
- package/dist/tools/web.d.ts +19 -14
- package/dist/tools/web.js +46 -61
- package/package.json +1 -1
- package/test/export-surface.snapshot.json +221 -7
- package/wire-changes/core-stores-sql@7.57.0.json +29 -0
- package/wire-changes/core@7.56.0.json +3891 -0
- package/wire-changes/core@7.57.0.json +1487 -0
- package/wire-changes/mods-kernel@7.56.0.json +303 -0
- package/wire-changes/mods-kernel@7.57.0.json +29 -0
- package/wire-changes/primitives@7.57.0.json +245 -0
|
@@ -18,7 +18,56 @@ export interface MailboxMessage {
|
|
|
18
18
|
* ABSENT = a pre-385 or foreign record (same semantics as an absent `hopChain`): the drain treats it
|
|
19
19
|
* as foreign, never retro-admits it. Validated at `append` ({@link readMailboxPeerMeta}). */
|
|
20
20
|
peerMeta?: MailboxPeerMeta;
|
|
21
|
+
/** The record's HOLD DECISION ({@link MailboxDecision}): absent = never held. Never appended — it
|
|
22
|
+
* starts absent and moves only through {@link MailboxStore.moveDecision}; every lease snapshot
|
|
23
|
+
* carries it, so every consumer of the box reads the same decision. */
|
|
24
|
+
decision?: MailboxDecision;
|
|
21
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* A parked record's hold decision — the durable answer about a record a recipient's setting put on
|
|
28
|
+
* hold, kept ON the record so every consumer of the box (another terminal, another process, the session's
|
|
29
|
+
* next run) reads the same answer. `held` — waiting for a person; `approved` — a person approved it, not yet
|
|
30
|
+
* handed over; `delivered` — a consumer holding the lease took the move and handed it over (a later
|
|
31
|
+
* answer about it learns that instead of claiming a decision); `denied` / `expired` / `refused` /
|
|
32
|
+
* `dropped` — final: the record is never delivered and only waits for the ack that removes it.
|
|
33
|
+
*/
|
|
34
|
+
export declare const MAILBOX_DECISIONS: readonly ["held", "approved", "delivered", "denied", "expired", "refused", "dropped"];
|
|
35
|
+
export type MailboxDecision = (typeof MAILBOX_DECISIONS)[number];
|
|
36
|
+
/** A stored decision word as a reader takes it: a word this engine does not know (a newer engine's) reads
|
|
37
|
+
* as `held` — never delivered on a guess, and left for a person (or that newer engine) to decide. */
|
|
38
|
+
export declare function readStoredMailboxDecision(raw: unknown): MailboxDecision | undefined;
|
|
39
|
+
/** The refusal code of a malformed {@link MailboxStore.moveDecision} call (a word outside the
|
|
40
|
+
* closed set, a non-positive seq, or an edge the decision law does not allow). */
|
|
41
|
+
export declare const MAILBOX_INVALID_DECISION_MOVE_CODE = "mailbox.invalid_decision_move";
|
|
42
|
+
export declare function isMailboxDecision(value: unknown): value is MailboxDecision;
|
|
43
|
+
/** Final states: the record is never delivered again, by any consumer. */
|
|
44
|
+
export declare function isMailboxDecisionFinal(state: MailboxDecision | undefined): boolean;
|
|
45
|
+
/** Deliverable states: a consumer holding the lease delivers the record (a setting that now refuses still wins). */
|
|
46
|
+
export declare function isMailboxDecisionDeliverable(state: MailboxDecision | undefined): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* THE decision law — a decision only moves forward, and every hand-over of a held record is itself a move:
|
|
49
|
+
* absent → `held`; `held` → `approved` / `delivered` / `denied` / `expired` / `refused`; `approved` →
|
|
50
|
+
* `delivered` or a final state; `delivered` → `dropped` (the handed-over frame was refused by policy inside a lease-holding pass) only;
|
|
51
|
+
* a final state never moves.
|
|
52
|
+
*/
|
|
53
|
+
export declare function mailboxDecisionEdgeAllowed(from: MailboxDecision | undefined, to: MailboxDecision): boolean;
|
|
54
|
+
/** What {@link MailboxStore.moveDecision} answers: the move happened, or the record's actual state
|
|
55
|
+
* (`unset` = never held, `gone` = no such record any more — acked, reaped or dropped). */
|
|
56
|
+
export type MailboxDecisionOutcome = {
|
|
57
|
+
readonly ok: true;
|
|
58
|
+
} | {
|
|
59
|
+
readonly ok: false;
|
|
60
|
+
readonly current: MailboxDecision | "unset" | "gone";
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* THE caller-side reading of {@link MailboxStore.moveDecision}: a fault can arrive AFTER the move
|
|
64
|
+
* committed (a lock release that failed, a reply lost on the wire), so a call that throws is asked once
|
|
65
|
+
* more, and a store that already holds `next` answers the first call's success. A second fault throws.
|
|
66
|
+
* Every engine-side decision move goes through this one function.
|
|
67
|
+
*/
|
|
68
|
+
export declare function moveMailboxDecision(store: Pick<MailboxStore, "moveDecision">, scope: string, handle: string, seq: number, expect: MailboxDecision | undefined, next: MailboxDecision): Promise<MailboxDecisionOutcome>;
|
|
69
|
+
/** The one validator every backend runs BEFORE touching storage: a malformed call has zero side effects. */
|
|
70
|
+
export declare function assertMailboxDecisionMove(seq: unknown, expect: unknown, next: unknown): void;
|
|
22
71
|
/** design/385 — the typed peer-metadata record on a parked message. ONE optional object, one-time
|
|
23
72
|
* contract extension; every field optional. Bundled backends persist it verbatim and hand back a
|
|
24
73
|
* detached copy. */
|
|
@@ -132,7 +181,7 @@ export declare const MAILBOX_TOMBSTONED_RECIPIENT_CODE = "mailbox.recipient_tomb
|
|
|
132
181
|
* A backend may raise the same code with a plain `Error` carrying `.code`; consumers branch on the
|
|
133
182
|
* string, not on this class (a cross-process/out-of-repo store cannot hand back an instance).
|
|
134
183
|
*/
|
|
135
|
-
export type MailboxStoreErrorCode = typeof MAILBOX_TOMBSTONED_RECIPIENT_CODE | typeof MAILBOX_INVALID_PEER_META_CODE | typeof MAILBOX_CROSS_PROCESS_UNSAFE_CODE;
|
|
184
|
+
export type MailboxStoreErrorCode = typeof MAILBOX_TOMBSTONED_RECIPIENT_CODE | typeof MAILBOX_INVALID_PEER_META_CODE | typeof MAILBOX_CROSS_PROCESS_UNSAFE_CODE | typeof MAILBOX_INVALID_DECISION_MOVE_CODE;
|
|
136
185
|
export declare class MailboxStoreError extends Error {
|
|
137
186
|
readonly code: MailboxStoreErrorCode;
|
|
138
187
|
constructor(code: MailboxStoreErrorCode, message: string);
|
|
@@ -241,6 +290,17 @@ export interface MailboxStore {
|
|
|
241
290
|
* Implementations report `{acked:true}` only when they actually consumed the prefix.
|
|
242
291
|
*/
|
|
243
292
|
ack(scope: string, handle: string, owner: string, upToSeq: number): Promise<MailboxAckResult>;
|
|
293
|
+
/**
|
|
294
|
+
* Move one record's hold decision from `expect` (absent = never held) to `next`, atomically
|
|
295
|
+
* against every other transition and against `ack` — the compare-and-set every decision about a held
|
|
296
|
+
* record goes through. NOT fenced by the lease: a person answers from whichever process shows the
|
|
297
|
+
* record, whether or not it holds the box. A state that is not `expect` answers `{ ok: false, current }`
|
|
298
|
+
* and changes nothing; a record no longer in the box answers `current: "gone"`. A malformed call (see
|
|
299
|
+
* {@link assertMailboxDecisionMove}) is refused with {@link MAILBOX_INVALID_DECISION_MOVE_CODE}
|
|
300
|
+
* before any side effect. The state is durable like the record, and `ack` / `reap` / `drop` remove it
|
|
301
|
+
* with the record.
|
|
302
|
+
*/
|
|
303
|
+
moveDecision(scope: string, handle: string, seq: number, expect: MailboxDecision | undefined, next: MailboxDecision): Promise<MailboxDecisionOutcome>;
|
|
244
304
|
releaseLease(scope: string, handle: string, owner: string): Promise<void>;
|
|
245
305
|
/** Observation face (the "N pending" receipt figure) — count of currently-visible messages. */
|
|
246
306
|
peekCount(scope: string, handle: string): Promise<number>;
|
|
@@ -291,6 +351,7 @@ export declare class InMemoryMailboxStore implements MailboxStore {
|
|
|
291
351
|
append(scope: string, handle: string, msg: MailboxAppendMessage): Promise<number>;
|
|
292
352
|
claimLease(scope: string, handle: string, owner: string, ttlMs: number, now?: number): Promise<MailboxLease | null>;
|
|
293
353
|
ack(scope: string, handle: string, owner: string, upToSeq: number): Promise<MailboxAckResult>;
|
|
354
|
+
moveDecision(scope: string, handle: string, seq: number, expect: MailboxDecision | undefined, next: MailboxDecision): Promise<MailboxDecisionOutcome>;
|
|
294
355
|
releaseLease(scope: string, handle: string, owner: string): Promise<void>;
|
|
295
356
|
peekCount(scope: string, handle: string): Promise<number>;
|
|
296
357
|
drop(scope: string, handle: string): Promise<void>;
|
|
@@ -1,4 +1,53 @@
|
|
|
1
1
|
import { assertRetentionPolicy } from "./retention-policy.js";
|
|
2
|
+
export const MAILBOX_DECISIONS = Object.freeze(["held", "approved", "delivered", "denied", "expired", "refused", "dropped"]);
|
|
3
|
+
export function readStoredMailboxDecision(raw) {
|
|
4
|
+
if (raw === undefined)
|
|
5
|
+
return undefined;
|
|
6
|
+
return isMailboxDecision(raw) ? raw : "held";
|
|
7
|
+
}
|
|
8
|
+
export const MAILBOX_INVALID_DECISION_MOVE_CODE = "mailbox.invalid_decision_move";
|
|
9
|
+
export function isMailboxDecision(value) {
|
|
10
|
+
return typeof value === "string" && MAILBOX_DECISIONS.includes(value);
|
|
11
|
+
}
|
|
12
|
+
export function isMailboxDecisionFinal(state) {
|
|
13
|
+
return state === "denied" || state === "expired" || state === "refused" || state === "dropped";
|
|
14
|
+
}
|
|
15
|
+
export function isMailboxDecisionDeliverable(state) {
|
|
16
|
+
return state === "approved" || state === "delivered";
|
|
17
|
+
}
|
|
18
|
+
export function mailboxDecisionEdgeAllowed(from, to) {
|
|
19
|
+
if (from === undefined)
|
|
20
|
+
return to === "held";
|
|
21
|
+
if (from === "held")
|
|
22
|
+
return to === "approved" || to === "delivered" || to === "denied" || to === "expired" || to === "refused";
|
|
23
|
+
if (from === "approved")
|
|
24
|
+
return to === "delivered" || isMailboxDecisionFinal(to);
|
|
25
|
+
if (from === "delivered")
|
|
26
|
+
return to === "dropped";
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
export async function moveMailboxDecision(store, scope, handle, seq, expect, next) {
|
|
30
|
+
try {
|
|
31
|
+
return await store.moveDecision(scope, handle, seq, expect, next);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
const again = await store.moveDecision(scope, handle, seq, expect, next);
|
|
35
|
+
return !again.ok && again.current === next ? { ok: true } : again;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export function assertMailboxDecisionMove(seq, expect, next) {
|
|
39
|
+
const refuse = (why) => {
|
|
40
|
+
throw new MailboxStoreError(MAILBOX_INVALID_DECISION_MOVE_CODE, `MailboxStore.moveDecision: ${why}`);
|
|
41
|
+
};
|
|
42
|
+
if (typeof seq !== "number" || !Number.isInteger(seq) || seq < 1)
|
|
43
|
+
refuse(`seq must be a positive integer (got ${String(seq)})`);
|
|
44
|
+
if (expect !== undefined && !isMailboxDecision(expect))
|
|
45
|
+
refuse(`expect must be absent or one of ${MAILBOX_DECISIONS.join("|")}`);
|
|
46
|
+
if (!isMailboxDecision(next))
|
|
47
|
+
refuse(`next must be one of ${MAILBOX_DECISIONS.join("|")}`);
|
|
48
|
+
if (!mailboxDecisionEdgeAllowed(expect, next))
|
|
49
|
+
refuse(`${String(expect ?? "unset")} → ${String(next)} is not a decision move (a decision only moves forward)`);
|
|
50
|
+
}
|
|
2
51
|
export const MAILBOX_PEER_FROM_MODES = Object.freeze(["bypass", "prompting"]);
|
|
3
52
|
export const MAILBOX_PEER_RECORD_KINDS = Object.freeze(["peer_message", "idle_notice", "delivery_notice", "idle_subscription", "engine_frame"]);
|
|
4
53
|
export const MAILBOX_PEER_NOTICE_STATES = Object.freeze(["held", "denied", "expired", "delivered", "refused", "dropped", "idle", "exited", "unavailable"]);
|
|
@@ -184,6 +233,16 @@ export class InMemoryMailboxStore {
|
|
|
184
233
|
b.lease = undefined;
|
|
185
234
|
return { acked: true };
|
|
186
235
|
}
|
|
236
|
+
async moveDecision(scope, handle, seq, expect, next) {
|
|
237
|
+
assertMailboxDecisionMove(seq, expect, next);
|
|
238
|
+
const m = this.boxes.get(this.key(scope, handle))?.messages.find((x) => x.seq === seq);
|
|
239
|
+
if (m === undefined)
|
|
240
|
+
return { ok: false, current: "gone" };
|
|
241
|
+
if (m.decision !== expect)
|
|
242
|
+
return { ok: false, current: m.decision ?? "unset" };
|
|
243
|
+
m.decision = next;
|
|
244
|
+
return { ok: true };
|
|
245
|
+
}
|
|
187
246
|
async releaseLease(scope, handle, owner) {
|
|
188
247
|
const b = this.boxes.get(this.key(scope, handle));
|
|
189
248
|
if (b?.lease?.owner === owner)
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One declared server, as far as its names go: `McpServerSpec` fits as it is. `tools` are the server's REMOTE tool names the asker
|
|
3
|
+
* already knows (a listing, a host's reading of one — never the minted `mcp__…` names); absent means none are known.
|
|
4
|
+
*/
|
|
5
|
+
export interface McpNameSetServer {
|
|
6
|
+
readonly name: string;
|
|
7
|
+
readonly tools?: readonly string[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* One contention: `names` are the two sources, the earlier one first (server names for `server_name`; the remote tool names for
|
|
11
|
+
* `tool_name`, where `server` says whose); `shared` is the name they mint — the prefix for `server_name`, the wire name for `tool_name`.
|
|
12
|
+
*/
|
|
13
|
+
export type McpNameConflict = {
|
|
14
|
+
readonly kind: "server_name";
|
|
15
|
+
readonly names: readonly [string, string];
|
|
16
|
+
readonly shared: string;
|
|
17
|
+
} | {
|
|
18
|
+
readonly kind: "tool_name";
|
|
19
|
+
readonly server: string;
|
|
20
|
+
readonly names: readonly [string, string];
|
|
21
|
+
readonly shared: string;
|
|
22
|
+
};
|
|
23
|
+
/** The judge's answer: `ok`, or EVERY contention in the set — server rows first, then tool rows, each in declaration order; never empty. */
|
|
24
|
+
export type McpNameVerdict = {
|
|
25
|
+
readonly ok: true;
|
|
26
|
+
} | {
|
|
27
|
+
readonly ok: false;
|
|
28
|
+
readonly conflicts: readonly [McpNameConflict, ...McpNameConflict[]];
|
|
29
|
+
};
|
|
30
|
+
/** Judge a declared set. Pure: reads nothing but the names it is handed; a malformed set is refused (`config.invalid_argument`), never read as clean. */
|
|
31
|
+
export declare function judgeMcpNames(servers: readonly McpNameSetServer[]): McpNameVerdict;
|
|
32
|
+
/**
|
|
33
|
+
* The sentence that says why a tool of one server is not mounted under its own name: `heldBy` is the raw name that took the wire
|
|
34
|
+
* name `minted` first, `tool` the raw name that came after. TWO FACTS, TWO SENTENCES (a fixed label must not head more than one
|
|
35
|
+
* cause): the same raw name listed again, where namespacing folded nothing, and two different raw names that fold onto one name.
|
|
36
|
+
* It carries no raw name — the caller's own field says which tool.
|
|
37
|
+
*/
|
|
38
|
+
export declare function mcpToolDropReason(minted: string, heldBy: string, tool: string): string;
|
|
39
|
+
/** One row as a sentence — the one the engine refuses a run with (`server_name`) or discloses a drop with (`tool_name`). Names are quoted single-line and bounded. */
|
|
40
|
+
export declare function describeMcpNameConflict(conflict: McpNameConflict): string;
|
|
41
|
+
/**
|
|
42
|
+
* The refusal of a declared set whose server names do not each own a namespace domain — thrown by the mount and by the no-run probe,
|
|
43
|
+
* so one set is refused with one code and one sentence wherever it is asked. It takes the NAMES only (a run's refusal reads no
|
|
44
|
+
* tool list); the FIRST `server_name` row speaks, naming both raw spellings.
|
|
45
|
+
*/
|
|
46
|
+
export declare function refuseCollidingMcpServerNames(serverNames: readonly string[]): void;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { MCP_NAMESPACE } from "./protocol-table.js";
|
|
2
|
+
import { createToolNameClaims, findNamespacePrefixCollisions } from "./protocol-naming.js";
|
|
3
|
+
import { inlineUntrusted } from "./untrusted-text.js";
|
|
4
|
+
function refuseArgument(problem) {
|
|
5
|
+
throw Object.assign(new Error(problem), { code: "config.invalid_argument" });
|
|
6
|
+
}
|
|
7
|
+
function readNameSet(servers) {
|
|
8
|
+
if (!Array.isArray(servers))
|
|
9
|
+
refuseArgument("judgeMcpNames takes a list of declared servers; what was passed is not a list.");
|
|
10
|
+
return Array.from(servers, (server, index) => {
|
|
11
|
+
if (typeof server !== "object" || server === null)
|
|
12
|
+
refuseArgument(`judgeMcpNames: entry ${index} is not a server declaration (an object with a "name").`);
|
|
13
|
+
const { name, tools } = server;
|
|
14
|
+
if (typeof name !== "string")
|
|
15
|
+
refuseArgument(`judgeMcpNames: entry ${index} has no string "name".`);
|
|
16
|
+
if (tools === undefined)
|
|
17
|
+
return { name };
|
|
18
|
+
const listed = Array.isArray(tools) ? Array.from(tools) : [undefined];
|
|
19
|
+
if (listed.some((tool) => typeof tool !== "string")) {
|
|
20
|
+
refuseArgument(`judgeMcpNames: entry ${index} ("${inlineUntrusted(name, 120)}") names its tools as something other than a list of strings.`);
|
|
21
|
+
}
|
|
22
|
+
return { name, tools: listed };
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
export function judgeMcpNames(servers) {
|
|
26
|
+
const set = readNameSet(servers);
|
|
27
|
+
const conflicts = findNamespacePrefixCollisions(MCP_NAMESPACE, set.map((s) => s.name)).map((c) => ({ kind: "server_name", names: c.peers, shared: c.prefix }));
|
|
28
|
+
for (const server of set) {
|
|
29
|
+
const claim = createToolNameClaims(MCP_NAMESPACE, server.name);
|
|
30
|
+
for (const tool of server.tools ?? []) {
|
|
31
|
+
const { minted, heldBy } = claim(tool);
|
|
32
|
+
if (heldBy !== undefined)
|
|
33
|
+
conflicts.push({ kind: "tool_name", server: server.name, names: [heldBy, tool], shared: minted });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const [first, ...rest] = conflicts;
|
|
37
|
+
return first === undefined ? { ok: true } : { ok: false, conflicts: [first, ...rest] };
|
|
38
|
+
}
|
|
39
|
+
export function mcpToolDropReason(minted, heldBy, tool) {
|
|
40
|
+
return heldBy === tool
|
|
41
|
+
? `this server listed this tool name more than once in one listing; the first entry is mounted as "${minted}" and the repeat is dropped (one name cannot denote two tools)`
|
|
42
|
+
: `name collides with an earlier tool of this server: both mount as "${minted}" after namespacing (only [a-zA-Z0-9_-] survives), and one name cannot denote two tools`;
|
|
43
|
+
}
|
|
44
|
+
export function describeMcpNameConflict(conflict) {
|
|
45
|
+
const [a, b] = conflict.names;
|
|
46
|
+
if (conflict.kind === "tool_name") {
|
|
47
|
+
return `MCP server "${inlineUntrusted(conflict.server, 120)}", tool "${inlineUntrusted(b, 120)}": ${mcpToolDropReason(conflict.shared, a, b)}`;
|
|
48
|
+
}
|
|
49
|
+
return a === b
|
|
50
|
+
? `MCP server "${inlineUntrusted(a, 120)}" is declared twice — each server needs its own name (both mount under "${conflict.shared}", so their tools would shadow each other and a refresh of one would unmount the other's).`
|
|
51
|
+
: `MCP server names "${inlineUntrusted(a, 120)}" and "${inlineUntrusted(b, 120)}" both mount under "${conflict.shared}" — the namespaced tool name keeps only [a-zA-Z0-9_-], so they are the same domain to this engine (their tools would shadow each other and a refresh of one would unmount the other's). Rename one.`;
|
|
52
|
+
}
|
|
53
|
+
export function refuseCollidingMcpServerNames(serverNames) {
|
|
54
|
+
const verdict = judgeMcpNames(serverNames.map((name) => ({ name })));
|
|
55
|
+
if (verdict.ok)
|
|
56
|
+
return;
|
|
57
|
+
const row = verdict.conflicts.find((c) => c.kind === "server_name");
|
|
58
|
+
if (row === undefined)
|
|
59
|
+
return;
|
|
60
|
+
throw Object.assign(new Error(describeMcpNameConflict(row)), { code: "config.mcp_server_name_collision" });
|
|
61
|
+
}
|
package/dist/core/mcp-probe.d.ts
CHANGED
|
@@ -93,7 +93,7 @@ export interface McpProbeOptions {
|
|
|
93
93
|
* FAILURE IS PER SERVER, REFUSAL IS NOT. A server that cannot be dialed, that answers a status, or that
|
|
94
94
|
* outlives `timeoutMs` takes its verdict in its own row and the walk continues. What DOES reject is the
|
|
95
95
|
* declaration set the materialization itself refuses — two names that mount under one namespace prefix
|
|
96
|
-
* are refused before any transport is touched, by
|
|
96
|
+
* are refused before any transport is touched, by the judge the mount asks, so the probe answers a colliding
|
|
97
97
|
* configuration exactly as a task would rather than showing two healthy-looking rows for a pair the
|
|
98
98
|
* engine would never mount.
|
|
99
99
|
*
|
package/dist/core/mcp-probe.js
CHANGED
|
@@ -2,8 +2,7 @@ import { ErrorCode, McpError } from "@modelcontextprotocol/sdk/types.js";
|
|
|
2
2
|
import { snapshotMcpEntries } from "./locked-config.js";
|
|
3
3
|
import { classifyMcpFailure, livenessOf } from "./mcp-failure.js";
|
|
4
4
|
import { MCP_ENV_MS_MAX, materializeMcpTools } from "./mcp.js";
|
|
5
|
-
import {
|
|
6
|
-
import { MCP_NAMESPACE } from "./protocol-table.js";
|
|
5
|
+
import { refuseCollidingMcpServerNames } from "./mcp-name-judge.js";
|
|
7
6
|
import { mcpManifestEntries } from "./runner/prepare-wiring-manifest.js";
|
|
8
7
|
const DECLINE_EVERY_ELICITATION = async () => ({ action: "decline" });
|
|
9
8
|
function wholeInRange(name, value, min, max) {
|
|
@@ -66,9 +65,7 @@ export async function probeMcpServers(specs, opts = {}) {
|
|
|
66
65
|
const concurrency = wholeInRange("concurrency", opts.concurrency, 1, Number.MAX_SAFE_INTEGER) ?? 1;
|
|
67
66
|
const onElicit = opts.onElicit ?? DECLINE_EVERY_ELICITATION;
|
|
68
67
|
const signal = opts.signal;
|
|
69
|
-
|
|
70
|
-
await materializeMcpTools(declared, opts.principal, onElicit);
|
|
71
|
-
}
|
|
68
|
+
refuseCollidingMcpServerNames(declared.map((e) => e.name));
|
|
72
69
|
const statuses = [];
|
|
73
70
|
const servers = new Array(declared.length);
|
|
74
71
|
const teardowns = [];
|
package/dist/core/mcp.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ import type { ImageContent, TextContent } from "../internal/llm.js";
|
|
|
6
6
|
import { type McpImageResizer } from "./image-downsample.js";
|
|
7
7
|
import type { McpServerSpec, OnElicit, ToolEffect } from "./types.js";
|
|
8
8
|
import type { McpRevocationLedger } from "./mcp-server-spec.js";
|
|
9
|
+
import { type HostFloor } from "./host-floor.js";
|
|
9
10
|
import { type ReminderDisclosureCounts } from "./reminder-disclosure.js";
|
|
10
11
|
export { resolveMcpDeclaredResultSize } from "./mcp-tool-meta.js";
|
|
11
12
|
/**
|
|
@@ -616,7 +617,7 @@ reminderDisclosure?: {
|
|
|
616
617
|
}, poolOpts?: {
|
|
617
618
|
pool: McpConnectionPool;
|
|
618
619
|
ownsPool?: boolean;
|
|
619
|
-
}, promptSections?: PromptSectionDisposer, dialable?: (spec: McpServerSpec) => boolean, signal?: AbortSignal): Promise<MaterializedMcp>;
|
|
620
|
+
}, promptSections?: PromptSectionDisposer, dialable?: (spec: McpServerSpec) => boolean, signal?: AbortSignal, hostFloor?: HostFloor): Promise<MaterializedMcp>;
|
|
620
621
|
/**
|
|
621
622
|
* Fold the caller's AUTHORITATIVE per-tool override (design F: caller = trust root) over the server-hint axis.
|
|
622
623
|
* Unlike server hints, the caller may RAISE or LOWER any axis: `effect` sets the repeat-safety class (lower to
|
|
@@ -720,6 +721,9 @@ export declare function walkMcpListPages<T>(fetchPage: (cursor: string | undefin
|
|
|
720
721
|
* entry before any of that ran — the only admissible definition of a tool, removed on the theory
|
|
721
722
|
* that a name cannot appear twice, which is a rule the layer below owns and applies differently. */
|
|
722
723
|
fingerprintOf?: (item: T) => string | undefined;
|
|
724
|
+
/** The header values the walk's requests carried ({@link declaredHeaderValues}): a failed continuation's text is minted without them.
|
|
725
|
+
* Absent only for the walker's own unit pins; every production consumer passes it. */
|
|
726
|
+
declared?: readonly string[];
|
|
723
727
|
}): Promise<{
|
|
724
728
|
items: T[];
|
|
725
729
|
incomplete?: McpListingIncomplete;
|