@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
package/dist/core/mcp.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { egressText } from "./untrusted-egress.js";
|
|
2
1
|
import { __resetEnvKnobAnnouncements } from "./env-knob-announce.js";
|
|
3
2
|
import { resolveEnvBudget } from "./env-budget.js";
|
|
4
3
|
import { MCP_NAMESPACE } from "./protocol-table.js";
|
|
5
|
-
import { resolveProtocolHttpHeaders } from "./protocol-http-auth.js";
|
|
4
|
+
import { declaredHeaderValues, remoteWords, resolveProtocolHttpHeaders } from "./protocol-http-auth.js";
|
|
6
5
|
import { disposeSectionEntry, sectionAnswerWarning } from "./prompt-section-seat.js";
|
|
7
|
-
import {
|
|
6
|
+
import { createToolNameClaims, mintNamespacePrefix, normalizeNameSegment } from "./protocol-naming.js";
|
|
7
|
+
import { mcpToolDropReason, refuseCollidingMcpServerNames } from "./mcp-name-judge.js";
|
|
8
8
|
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
9
9
|
import { McpConnectionPool } from "./mcp-connection-pool.js";
|
|
10
10
|
import { SessionEndingTransport, requestSite } from "./mcp-session-end.js";
|
|
@@ -22,6 +22,7 @@ import { DEFAULT_REQUEST_TIMEOUT_MSEC } from "@modelcontextprotocol/sdk/shared/p
|
|
|
22
22
|
import { MCP_IMAGE_MAX_BASE64, sharpImageResizer } from "./image-downsample.js";
|
|
23
23
|
import { sliceHeadSafe, sliceTailSafe } from "./surrogate-safe-slice.js";
|
|
24
24
|
import { truncateError } from "./tool-errors.js";
|
|
25
|
+
import { peerRequestRefusal } from "./host-floor.js";
|
|
25
26
|
import { delimitUntrusted, inlineUntrusted, sanitizeUntrustedText } from "./untrusted-text.js";
|
|
26
27
|
import { discloseReminderShaped, observeReminderMarkEcho } from "./reminder-disclosure.js";
|
|
27
28
|
import { MARKED_BLOCK_AFTER_DATA } from "./reminder-mint.js";
|
|
@@ -161,21 +162,21 @@ export function collapseMcpErrorPrefix(message) {
|
|
|
161
162
|
out = out.slice(m[0].length);
|
|
162
163
|
}
|
|
163
164
|
}
|
|
164
|
-
function sanitizeMcpErrorTextInPlace(err) {
|
|
165
|
+
function sanitizeMcpErrorTextInPlace(err, declared) {
|
|
165
166
|
if (!(err instanceof Error))
|
|
166
167
|
return;
|
|
167
|
-
const sanitized =
|
|
168
|
+
const sanitized = remoteWords(err instanceof McpError ? collapseMcpErrorPrefix(err.message) : err.message, declared);
|
|
168
169
|
if (sanitized !== err.message)
|
|
169
170
|
err.message = sanitized;
|
|
170
171
|
}
|
|
171
|
-
function namedMcpFailureText(err) {
|
|
172
|
-
const detail = remoteErrorText(err, { collapse: true });
|
|
172
|
+
function namedMcpFailureText(err, declared) {
|
|
173
|
+
const detail = remoteErrorText(err, declared, { collapse: true });
|
|
173
174
|
const condition = thrownIs(err, McpError) ? describeMcpSpecErrorCode(readMember(err, "code")) : undefined;
|
|
174
175
|
return condition !== undefined ? `${condition}: ${detail}` : detail;
|
|
175
176
|
}
|
|
176
|
-
function remoteErrorText(err, opts) {
|
|
177
|
+
function remoteErrorText(err, declared, opts) {
|
|
177
178
|
const raw = thrownText(err);
|
|
178
|
-
return
|
|
179
|
+
return remoteWords(opts?.collapse === true ? collapseMcpErrorPrefix(raw) : raw, declared);
|
|
179
180
|
}
|
|
180
181
|
function writeEffectWarning(writeEffect) {
|
|
181
182
|
return writeEffect
|
|
@@ -194,7 +195,7 @@ function rethrowHonestMcpError(err, ctx) {
|
|
|
194
195
|
}
|
|
195
196
|
throw e;
|
|
196
197
|
};
|
|
197
|
-
sanitizeMcpErrorTextInPlace(err);
|
|
198
|
+
sanitizeMcpErrorTextInPlace(err, ctx.declared);
|
|
198
199
|
if (ctx.idle?.signal.reason === IDLE_WATCHDOG_ABORT_REASON) {
|
|
199
200
|
ctx.liveness?.observe?.("timeout");
|
|
200
201
|
const serverLabel = inlineUntrusted(ctx.server);
|
|
@@ -225,7 +226,7 @@ function rethrowHonestMcpError(err, ctx) {
|
|
|
225
226
|
case "connect_refused":
|
|
226
227
|
case "connection_failed": {
|
|
227
228
|
const httpFailure = describeHttpTransportFailure(err, ctx.site);
|
|
228
|
-
const detail = remoteErrorText(err);
|
|
229
|
+
const detail = remoteErrorText(err, ctx.declared);
|
|
229
230
|
const fenced = `\nThe transport error follows as external/untrusted data:\n${fenceServerText(`${ctx.server} transport error`, detail)}`;
|
|
230
231
|
finish(markMcpFailure(new Error(sessionGone(err, ctx.site)
|
|
231
232
|
? `${ctx.what} met a lost session on MCP server "${serverLabel}": ${httpFailure.condition}; ${ctx.resent === true ? "the call was sent again once on a fresh session, and the server reported that one gone too — if the server executed it before answering, it ran twice" : "the call was not sent again — if the server executed it before answering, it ran"}. The outcome is unknown.${writeEffectWarning(ctx.writeEffect)}${fenced}`
|
|
@@ -240,7 +241,7 @@ function rethrowHonestMcpError(err, ctx) {
|
|
|
240
241
|
finish(markMcpFailure(new Error(`${ctx.what} on MCP server "${serverLabel}" was rejected with MCP protocol error ${code} — ${condition}. The server's error text follows as external/untrusted data:\n${fenceServerText(`${ctx.server} error`, err.message)}`, { cause: err }), details({ specErrorCode: code })));
|
|
241
242
|
}
|
|
242
243
|
if (ctx.attributeServer) {
|
|
243
|
-
finish(markMcpFailure(new Error(`${ctx.what} on MCP server "${serverLabel}" failed. The server's error text follows as external/untrusted data:\n${fenceServerText(`${ctx.server} error`, remoteErrorText(err))}`, { cause: err }), details()));
|
|
244
|
+
finish(markMcpFailure(new Error(`${ctx.what} on MCP server "${serverLabel}" failed. The server's error text follows as external/untrusted data:\n${fenceServerText(`${ctx.server} error`, remoteErrorText(err, ctx.declared))}`, { cause: err }), details()));
|
|
244
245
|
}
|
|
245
246
|
finish(markMcpFailure(err, details()));
|
|
246
247
|
}
|
|
@@ -248,7 +249,7 @@ function rethrowHonestMcpError(err, ctx) {
|
|
|
248
249
|
case "invalid_config":
|
|
249
250
|
case "unknown": {
|
|
250
251
|
if (ctx.attributeServer) {
|
|
251
|
-
finish(markMcpFailure(new Error(`${ctx.what} on MCP server "${serverLabel}" failed. The server's error text follows as external/untrusted data:\n${fenceServerText(`${ctx.server} error`, remoteErrorText(err))}`, { cause: err }), details()));
|
|
252
|
+
finish(markMcpFailure(new Error(`${ctx.what} on MCP server "${serverLabel}" failed. The server's error text follows as external/untrusted data:\n${fenceServerText(`${ctx.server} error`, remoteErrorText(err, ctx.declared))}`, { cause: err }), details()));
|
|
252
253
|
}
|
|
253
254
|
if (err instanceof Error)
|
|
254
255
|
finish(markMcpFailure(err, details()));
|
|
@@ -641,7 +642,7 @@ export function mcpToolSchemaProblem(schema) {
|
|
|
641
642
|
}
|
|
642
643
|
return undefined;
|
|
643
644
|
}
|
|
644
|
-
export async function materializeMcpTools(specs, principal, onElicit, imageResizer, reminderDisclosure, mcpRevocations, poolOpts, promptSections, dialable, signal) {
|
|
645
|
+
export async function materializeMcpTools(specs, principal, onElicit, imageResizer, reminderDisclosure, mcpRevocations, poolOpts, promptSections, dialable, signal, hostFloor) {
|
|
645
646
|
const snapshot = snapshotMcpEntries(specs);
|
|
646
647
|
const axesRefused = new WeakMap();
|
|
647
648
|
const entries = snapshot.map((spec) => {
|
|
@@ -651,17 +652,7 @@ export async function materializeMcpTools(specs, principal, onElicit, imageResiz
|
|
|
651
652
|
axesRefused.set(spec, judged.error);
|
|
652
653
|
return spec;
|
|
653
654
|
});
|
|
654
|
-
|
|
655
|
-
const collision = findNamespacePrefixCollision(MCP_NAMESPACE, entries.map((s) => s.name));
|
|
656
|
-
if (collision) {
|
|
657
|
-
const [a, b] = collision.peers;
|
|
658
|
-
const e = new Error(a === b
|
|
659
|
-
? `MCP server "${inlineUntrusted(a, 120)}" is declared twice — each server needs its own name (both mount under "${collision.prefix}", so their tools would shadow each other and a refresh of one would unmount the other's).`
|
|
660
|
-
: `MCP server names "${inlineUntrusted(a, 120)}" and "${inlineUntrusted(b, 120)}" both mount under "${collision.prefix}" — 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.`);
|
|
661
|
-
e.code = "config.mcp_server_name_collision";
|
|
662
|
-
throw e;
|
|
663
|
-
}
|
|
664
|
-
}
|
|
655
|
+
refuseCollidingMcpServerNames(entries.map((s) => s.name));
|
|
665
656
|
let revocationProbeFailed = false;
|
|
666
657
|
const isServerRevoked = (serverName) => {
|
|
667
658
|
if (mcpRevocations === undefined)
|
|
@@ -767,18 +758,33 @@ export async function materializeMcpTools(specs, principal, onElicit, imageResiz
|
|
|
767
758
|
const gatesNow = (h) => {
|
|
768
759
|
const latest = h.listing.latest();
|
|
769
760
|
if (latest.at !== h.gatesAt.at)
|
|
770
|
-
h.gatesAt = { at: latest.at, gates: intakeListedTools({ tools: [...latest.entries], unproven: latest.unproven }, h.spec, linkOf(h.name), imageResizer, mcpDisclosure, isServerRevoked, h.transportKind).gates };
|
|
761
|
+
h.gatesAt = { at: latest.at, gates: intakeListedTools({ tools: [...latest.entries], unproven: latest.unproven }, h.spec, linkOf(h.name), echoOf(h.spec), imageResizer, mcpDisclosure, isServerRevoked, h.transportKind).gates };
|
|
771
762
|
return h.gatesAt.gates;
|
|
772
763
|
};
|
|
773
764
|
const linkOf = (server) => ({
|
|
774
765
|
live: () => liveOf(server),
|
|
775
766
|
recover: (lost) => redialFlights.running(server) ?? (liveOf(server) === lost ? redialFlights.start(server, () => redialDial(server)) : Promise.resolve()),
|
|
776
767
|
});
|
|
768
|
+
const endpointRefusal = (spec, dialKind) => {
|
|
769
|
+
const transport = spec.transport;
|
|
770
|
+
const raw = dialKind !== "stdio" && typeof transport === "object" && transport !== null && "url" in transport ? transport.url : undefined;
|
|
771
|
+
let url;
|
|
772
|
+
try {
|
|
773
|
+
if (typeof raw !== "string")
|
|
774
|
+
return undefined;
|
|
775
|
+
url = new URL(raw);
|
|
776
|
+
}
|
|
777
|
+
catch {
|
|
778
|
+
return undefined;
|
|
779
|
+
}
|
|
780
|
+
return peerRequestRefusal(`mcp: server "${inlineUntrusted(spec.name, 120)}"`, url, hostFloor);
|
|
781
|
+
};
|
|
777
782
|
const dialServer = (spec, dialKind, dialOpts) => {
|
|
778
|
-
const refusal = axesRefused.get(spec);
|
|
783
|
+
const refusal = axesRefused.get(spec) ?? endpointRefusal(spec, dialKind);
|
|
779
784
|
return refusal !== undefined ? Promise.reject(refusal) : connectServer(spec, principal, onElicit, imageResizer, mcpDisclosure, isServerRevoked, dialKind, poolOpts?.pool, { ...dialOpts, link: linkOf(spec.name), ...(signal !== undefined ? { signal } : {}) });
|
|
780
785
|
};
|
|
781
786
|
const prefixOf = (name) => mintNamespacePrefix(MCP_NAMESPACE, name);
|
|
787
|
+
const echoOf = (spec) => declaredHeaderValues(spec.transport, principal);
|
|
782
788
|
const heldCount = (name) => serverHandles.find((h) => h.name === name)?.tools.length ?? 0;
|
|
783
789
|
const reconcileInstructions = (name, after, connected) => {
|
|
784
790
|
if (!connected)
|
|
@@ -808,10 +814,11 @@ export async function materializeMcpTools(specs, principal, onElicit, imageResiz
|
|
|
808
814
|
commitConnectedServer(spec, s, dialKinds[i]);
|
|
809
815
|
}
|
|
810
816
|
else {
|
|
811
|
-
|
|
817
|
+
const declared = echoOf(spec);
|
|
818
|
+
warnings.push(asServerWarning(spec, r.reason, declared));
|
|
812
819
|
const { kind, delivered, httpStatus } = classifyMcpFailure(r.reason, { phase: "connect", transport: dialKinds[i] });
|
|
813
820
|
const liveness = livenessOf(kind, Date.now());
|
|
814
|
-
statuses.push({ name: spec.name, status: "failed", errorCode: kind, delivered, ...(httpStatus !== undefined ? { httpStatus } : {}), error: namedMcpFailureText(r.reason), ...(liveness !== undefined ? { liveness } : {}) });
|
|
821
|
+
statuses.push({ name: spec.name, status: "failed", errorCode: kind, delivered, ...(httpStatus !== undefined ? { httpStatus } : {}), error: namedMcpFailureText(r.reason, declared), ...(liveness !== undefined ? { liveness } : {}) });
|
|
815
822
|
}
|
|
816
823
|
}
|
|
817
824
|
const resourceTools = buildResourceTools(resourceServers, isServerRevoked);
|
|
@@ -859,20 +866,22 @@ export async function materializeMcpTools(specs, principal, onElicit, imageResiz
|
|
|
859
866
|
const err = dialed.err;
|
|
860
867
|
const { kind, delivered, httpStatus } = classifyMcpFailure(err, { phase: "connect", transport: dialKind });
|
|
861
868
|
const redialLiveness = livenessOf(kind, Date.now());
|
|
862
|
-
const
|
|
869
|
+
const declared = echoOf(spec);
|
|
870
|
+
const failure = namedMcpFailureText(err, declared);
|
|
871
|
+
const status = { name: server, status: "failed", errorCode: kind, delivered, ...(httpStatus !== undefined ? { httpStatus } : {}), error: failure, ...(redialLiveness !== undefined ? { liveness: redialLiveness } : {}) };
|
|
863
872
|
const sIdx = statuses.findIndex((st) => st.name === server);
|
|
864
873
|
if (sIdx === -1)
|
|
865
874
|
statuses.push(status);
|
|
866
875
|
else
|
|
867
876
|
statuses[sIdx] = status;
|
|
868
|
-
const raised = asServerWarning(spec, err);
|
|
877
|
+
const raised = asServerWarning(spec, err, declared);
|
|
869
878
|
warnings.push(raised);
|
|
870
879
|
reconcileInstructions(server, undefined, false);
|
|
871
880
|
return {
|
|
872
881
|
server,
|
|
873
882
|
prefix,
|
|
874
883
|
outcome: "refused",
|
|
875
|
-
reason: inlineUntrusted(
|
|
884
|
+
reason: inlineUntrusted(failure, 240),
|
|
876
885
|
toolCount: 0,
|
|
877
886
|
added: [],
|
|
878
887
|
removed: priorNames,
|
|
@@ -930,14 +939,14 @@ export async function materializeMcpTools(specs, principal, onElicit, imageResiz
|
|
|
930
939
|
try {
|
|
931
940
|
const at = h.listing.open();
|
|
932
941
|
const cacheTools = h.openListing();
|
|
933
|
-
const listed = await listToolsLenient(h.client);
|
|
942
|
+
const listed = await listToolsLenient(h.client, undefined, echoOf(h.spec));
|
|
934
943
|
const answered = h.listing.answer(at, listed.tools, listed.incomplete !== undefined);
|
|
935
944
|
const mergedRaw = answered.view;
|
|
936
945
|
if (!answered.recorded) {
|
|
937
946
|
results.push({ server: h.name, prefix: prefixOf(h.name), status: "failed", toolCount: h.tools.length, added: [], removed: [], error: "a later listing of this server was opened and applied while this one was in the air — this one was discarded" });
|
|
938
947
|
continue;
|
|
939
948
|
}
|
|
940
|
-
const { serverTools, serverAxes, gates, dropped, accepted } = intakeListedTools({ tools: [...mergedRaw], unproven: answered.unproven }, h.spec, linkOf(h.name), imageResizer, mcpDisclosure, isServerRevoked, h.transportKind);
|
|
949
|
+
const { serverTools, serverAxes, gates, dropped, accepted } = intakeListedTools({ tools: [...mergedRaw], unproven: answered.unproven }, h.spec, linkOf(h.name), echoOf(h.spec), imageResizer, mcpDisclosure, isServerRevoked, h.transportKind);
|
|
941
950
|
cacheTools(accepted, answered.kept);
|
|
942
951
|
const priorNames = h.tools.map((t) => t.name);
|
|
943
952
|
const newNames = serverTools.map((t) => t.name);
|
|
@@ -970,7 +979,7 @@ export async function materializeMcpTools(specs, principal, onElicit, imageResiz
|
|
|
970
979
|
toolCount: h.tools.length,
|
|
971
980
|
added: [],
|
|
972
981
|
removed: [],
|
|
973
|
-
error: inlineUntrusted(namingLostSession(err, site, namedMcpFailureText(err)), 240),
|
|
982
|
+
error: inlineUntrusted(namingLostSession(err, site, namedMcpFailureText(err, echoOf(h.spec))), 240),
|
|
974
983
|
});
|
|
975
984
|
}
|
|
976
985
|
}
|
|
@@ -1085,7 +1094,7 @@ export async function walkMcpListPages(fetchPage, opts) {
|
|
|
1085
1094
|
catch (err) {
|
|
1086
1095
|
if (pages === 0 || opts.signal?.aborted)
|
|
1087
1096
|
throw err;
|
|
1088
|
-
return { items, incomplete: { reason: "page_error", pages, error: remoteErrorText(err) } };
|
|
1097
|
+
return { items, incomplete: { reason: "page_error", pages, error: remoteErrorText(err, opts.declared ?? []) } };
|
|
1089
1098
|
}
|
|
1090
1099
|
opts.onPage?.();
|
|
1091
1100
|
const pageStart = items.length;
|
|
@@ -1168,13 +1177,13 @@ async function readDirViaExtension(rs, uri, signal, timeoutMs, watchdog) {
|
|
|
1168
1177
|
if (err instanceof McpError && err.code === ErrorCode.InvalidParams) {
|
|
1169
1178
|
if (pages > 0)
|
|
1170
1179
|
return { kind: "ok", resources, cursorInvalid: true };
|
|
1171
|
-
const detail = remoteErrorText(err, { collapse: true });
|
|
1180
|
+
const detail = remoteErrorText(err, rs.declared, { collapse: true });
|
|
1172
1181
|
return { kind: classifyDirReadInvalidParams(detail), detail };
|
|
1173
1182
|
}
|
|
1174
1183
|
if (err instanceof McpError && err.code === ErrorCode.MethodNotFound)
|
|
1175
1184
|
return { kind: "unsupported" };
|
|
1176
1185
|
if (pages > 0 && !signal?.aborted) {
|
|
1177
|
-
return { kind: "ok", resources, incomplete: remoteErrorText(err) };
|
|
1186
|
+
return { kind: "ok", resources, incomplete: remoteErrorText(err, rs.declared) };
|
|
1178
1187
|
}
|
|
1179
1188
|
throw err;
|
|
1180
1189
|
}
|
|
@@ -1266,7 +1275,7 @@ function buildResourceTools(resourceServers, isServerRevoked = () => false) {
|
|
|
1266
1275
|
throw watchdog.idleSignal.reason === IDLE_WATCHDOG_ABORT_REASON ? new Error(idleWatchdogTripText(idleMs)) : err;
|
|
1267
1276
|
});
|
|
1268
1277
|
return { items: page.resources, ...(page.nextCursor !== undefined ? { nextCursor: page.nextCursor } : {}) };
|
|
1269
|
-
}, { budgetMs: mcpToolTimeoutMs(), onPage: () => watchdog.rearm(), fingerprintOf: listEntryFingerprint, ...(signal !== undefined ? { signal } : {}) });
|
|
1278
|
+
}, { budgetMs: mcpToolTimeoutMs(), onPage: () => watchdog.rearm(), fingerprintOf: listEntryFingerprint, declared: rs.declared, ...(signal !== undefined ? { signal } : {}) });
|
|
1270
1279
|
all.push(...walk.items.map((r) => ({ server: rs.server, ...r })));
|
|
1271
1280
|
const lines = walk.items.map((r) => resourceLine(r));
|
|
1272
1281
|
const body = lines.length ? lines.join("\n") : "(no resources)";
|
|
@@ -1279,11 +1288,12 @@ function buildResourceTools(resourceServers, isServerRevoked = () => false) {
|
|
|
1279
1288
|
}
|
|
1280
1289
|
}
|
|
1281
1290
|
catch (err) {
|
|
1291
|
+
sanitizeMcpErrorTextInPlace(err, rs.declared);
|
|
1282
1292
|
if (signal?.aborted)
|
|
1283
1293
|
throw err;
|
|
1284
1294
|
const msg = watchdog.idleSignal.reason === IDLE_WATCHDOG_ABORT_REASON
|
|
1285
1295
|
? idleWatchdogTripText(idleMs)
|
|
1286
|
-
: namingLostSession(err, site, remoteErrorText(err));
|
|
1296
|
+
: namingLostSession(err, site, remoteErrorText(err, rs.declared));
|
|
1287
1297
|
errors.push({ server: rs.server, error: msg });
|
|
1288
1298
|
sections.push(`[${rs.server}] Error: could not list resources: ${inlineUntrusted(msg)}`);
|
|
1289
1299
|
}
|
|
@@ -1342,7 +1352,7 @@ function buildResourceTools(resourceServers, isServerRevoked = () => false) {
|
|
|
1342
1352
|
try {
|
|
1343
1353
|
res = await rs.client
|
|
1344
1354
|
.readResource({ uri }, { signal: watchdog.combinedSignal, timeout: timeoutMs })
|
|
1345
|
-
.catch((err) => rethrowHonestMcpError(err, { server, what, timeoutMs, writeEffect: false, signal, attributeServer: true, site, idle: { signal: watchdog.idleSignal, idleMs }, liveness: rs.health }));
|
|
1355
|
+
.catch((err) => rethrowHonestMcpError(err, { server, declared: rs.declared, what, timeoutMs, writeEffect: false, signal, attributeServer: true, site, idle: { signal: watchdog.idleSignal, idleMs }, liveness: rs.health }));
|
|
1346
1356
|
rs.health.observe?.("completed");
|
|
1347
1357
|
}
|
|
1348
1358
|
finally {
|
|
@@ -1403,7 +1413,7 @@ function buildResourceTools(resourceServers, isServerRevoked = () => false) {
|
|
|
1403
1413
|
try {
|
|
1404
1414
|
const ext = rs.client.getServerCapabilities()?.extensions?.[MCP_SKILLS_EXTENSION];
|
|
1405
1415
|
if (ext?.directoryRead === true) {
|
|
1406
|
-
const r = await readDirViaExtension(rs, uri, signal, timeoutMs, watchdog).catch((err) => rethrowHonestMcpError(err, { server, what, timeoutMs, writeEffect: false, signal, attributeServer: true, site, idle: { signal: watchdog.idleSignal, idleMs }, liveness: rs.health }));
|
|
1416
|
+
const r = await readDirViaExtension(rs, uri, signal, timeoutMs, watchdog).catch((err) => rethrowHonestMcpError(err, { server, declared: rs.declared, what, timeoutMs, writeEffect: false, signal, attributeServer: true, site, idle: { signal: watchdog.idleSignal, idleMs }, liveness: rs.health }));
|
|
1407
1417
|
const serverSaid = (detail) => `\nThe server's error text follows as external/untrusted data:\n${delimitUntrusted(`${server} error`, truncateMcpErrorText(detail))}`;
|
|
1408
1418
|
if (r.kind === "not_found") {
|
|
1409
1419
|
return {
|
|
@@ -1431,10 +1441,10 @@ function buildResourceTools(resourceServers, isServerRevoked = () => false) {
|
|
|
1431
1441
|
const walk = await walkMcpListPages(async (cursor, remainingMs) => {
|
|
1432
1442
|
const page = await rs.client
|
|
1433
1443
|
.listResources(cursor === undefined ? undefined : { cursor }, { signal: watchdog.combinedSignal, timeout: remainingMs })
|
|
1434
|
-
.catch((err) => rethrowHonestMcpError(err, { server, what, timeoutMs: remainingMs, writeEffect: false, signal, attributeServer: true, site, idle: { signal: watchdog.idleSignal, idleMs }, liveness: rs.health }));
|
|
1444
|
+
.catch((err) => rethrowHonestMcpError(err, { server, declared: rs.declared, what, timeoutMs: remainingMs, writeEffect: false, signal, attributeServer: true, site, idle: { signal: watchdog.idleSignal, idleMs }, liveness: rs.health }));
|
|
1435
1445
|
rs.health.observe?.("completed");
|
|
1436
1446
|
return { items: page.resources, ...(page.nextCursor !== undefined ? { nextCursor: page.nextCursor } : {}) };
|
|
1437
|
-
}, { budgetMs: timeoutMs, onPage: () => watchdog.rearm(), fingerprintOf: listEntryFingerprint, ...(signal !== undefined ? { signal } : {}) });
|
|
1447
|
+
}, { budgetMs: timeoutMs, onPage: () => watchdog.rearm(), fingerprintOf: listEntryFingerprint, declared: rs.declared, ...(signal !== undefined ? { signal } : {}) });
|
|
1438
1448
|
const dirPrefix = uri.endsWith("/") ? uri : `${uri}/`;
|
|
1439
1449
|
const children = walk.items.filter((r) => typeof r.uri === "string" && r.uri !== uri && r.uri.startsWith(dirPrefix));
|
|
1440
1450
|
return renderDirChildren(server, uri, children, walk.incomplete ? { listing: walk.incomplete } : undefined);
|
|
@@ -1499,7 +1509,7 @@ export function parseCallToolResultLenient(data) {
|
|
|
1499
1509
|
return { success: true, data: { ...parsed.data, structuredContent } };
|
|
1500
1510
|
}
|
|
1501
1511
|
const LENIENT_CALL_TOOL_RESULT_SCHEMA = { safeParse: parseCallToolResultLenient };
|
|
1502
|
-
async function listToolsLenient(client, options) {
|
|
1512
|
+
async function listToolsLenient(client, options, declared) {
|
|
1503
1513
|
if (!client.getServerCapabilities()?.tools)
|
|
1504
1514
|
return { tools: [], toolsCapabilityAbsent: true };
|
|
1505
1515
|
const walk = await walkMcpListPages(async (cursor, remainingMs) => {
|
|
@@ -1512,6 +1522,7 @@ async function listToolsLenient(client, options) {
|
|
|
1512
1522
|
}, {
|
|
1513
1523
|
budgetMs: options?.timeout ?? DEFAULT_REQUEST_TIMEOUT_MSEC,
|
|
1514
1524
|
fingerprintOf: listEntryFingerprint,
|
|
1525
|
+
declared,
|
|
1515
1526
|
...(options?.signal !== undefined ? { signal: options.signal } : {}),
|
|
1516
1527
|
});
|
|
1517
1528
|
return { tools: walk.items, ...(walk.incomplete !== undefined ? { incomplete: walk.incomplete } : {}) };
|
|
@@ -1583,9 +1594,10 @@ async function connectServer(spec, principal, onElicit, imageResizer, reminderDi
|
|
|
1583
1594
|
const listing = lease?.listing ?? new ConnectionListing();
|
|
1584
1595
|
const at = listing.open();
|
|
1585
1596
|
const cacheTools = openListing();
|
|
1586
|
-
const
|
|
1597
|
+
const declared = declaredHeaderValues(spec.transport, principal);
|
|
1598
|
+
const listed = await underStartupBound(startupMs, dialOpts?.signal, (options) => listToolsLenient(client, options, declared));
|
|
1587
1599
|
const answered = listing.answer(at, listed.tools, listed.incomplete !== undefined, dialOpts.carried);
|
|
1588
|
-
const { serverTools, serverAxes, gates, dropped, advisories, accepted } = intakeListedTools({ tools: [...answered.view], unproven: answered.unproven }, spec, dialOpts.link, imageResizer, reminderDisclosure, isServerRevoked, transportKind);
|
|
1600
|
+
const { serverTools, serverAxes, gates, dropped, advisories, accepted } = intakeListedTools({ tools: [...answered.view], unproven: answered.unproven }, spec, dialOpts.link, declared, imageResizer, reminderDisclosure, isServerRevoked, transportKind);
|
|
1589
1601
|
cacheTools(accepted, answered.kept);
|
|
1590
1602
|
const caps = client.getServerCapabilities();
|
|
1591
1603
|
const resourceInfo = caps?.resources
|
|
@@ -1623,7 +1635,7 @@ async function connectServer(spec, principal, onElicit, imageResizer, reminderDi
|
|
|
1623
1635
|
...(instructions ? { instructions } : {}),
|
|
1624
1636
|
...(disposed?.defect !== undefined ? { instructionsDefect: disposed.defect } : {}),
|
|
1625
1637
|
...(listed.incomplete !== undefined ? { listingIncomplete: listed.incomplete } : {}),
|
|
1626
|
-
...(resourceInfo && (resourceInfo.listAllowed || resourceInfo.readAllowed) ? { resourceServer: { server: spec.name, client, health, transportKind: idleKindOf(transportKind), ...resourceInfo } } : {}),
|
|
1638
|
+
...(resourceInfo && (resourceInfo.listAllowed || resourceInfo.readAllowed) ? { resourceServer: { server: spec.name, client, health, transportKind: idleKindOf(transportKind), declared, ...resourceInfo } } : {}),
|
|
1627
1639
|
};
|
|
1628
1640
|
}
|
|
1629
1641
|
catch (err) {
|
|
@@ -1631,7 +1643,7 @@ async function connectServer(spec, principal, onElicit, imageResizer, reminderDi
|
|
|
1631
1643
|
throw err;
|
|
1632
1644
|
}
|
|
1633
1645
|
}
|
|
1634
|
-
function intakeListedTools(listed, spec, link, imageResizer, reminderDisclosure, isServerRevoked, transportKind) {
|
|
1646
|
+
function intakeListedTools(listed, spec, link, declared, imageResizer, reminderDisclosure, isServerRevoked, transportKind) {
|
|
1635
1647
|
const declaredContentOrigin = spec.contentOrigin;
|
|
1636
1648
|
const serverTools = [];
|
|
1637
1649
|
const serverAxes = [];
|
|
@@ -1639,7 +1651,7 @@ function intakeListedTools(listed, spec, link, imageResizer, reminderDisclosure,
|
|
|
1639
1651
|
const dropped = [];
|
|
1640
1652
|
const accepted = [];
|
|
1641
1653
|
const advisories = [];
|
|
1642
|
-
const
|
|
1654
|
+
const claimToolName = createToolNameClaims(MCP_NAMESPACE, spec.name);
|
|
1643
1655
|
for (const t of listed.tools) {
|
|
1644
1656
|
if (spec.allowTools && !spec.allowTools.includes(t.name)) {
|
|
1645
1657
|
continue;
|
|
@@ -1679,18 +1691,11 @@ function intakeListedTools(listed, spec, link, imageResizer, reminderDisclosure,
|
|
|
1679
1691
|
}
|
|
1680
1692
|
const remoteName = t.name;
|
|
1681
1693
|
const taskRequired = t.execution !== null && typeof t.execution === "object" && t.execution.taskSupport === "required";
|
|
1682
|
-
const namespacedName =
|
|
1683
|
-
const mintedBy = mintedNames.get(namespacedName);
|
|
1694
|
+
const { minted: namespacedName, heldBy: mintedBy } = claimToolName(remoteName);
|
|
1684
1695
|
if (mintedBy !== undefined) {
|
|
1685
|
-
dropped.push({
|
|
1686
|
-
tool: inlineUntrusted(t.name),
|
|
1687
|
-
reason: mintedBy === t.name
|
|
1688
|
-
? `this server listed this tool name more than once in one listing; the first entry is mounted as "${namespacedName}" and the repeat is dropped (one name cannot denote two tools)`
|
|
1689
|
-
: `name collides with an earlier tool of this server: both mount as "${namespacedName}" after namespacing (only [a-zA-Z0-9_-] survives), and one name cannot denote two tools`,
|
|
1690
|
-
});
|
|
1696
|
+
dropped.push({ tool: inlineUntrusted(t.name), reason: mcpToolDropReason(namespacedName, mintedBy, t.name) });
|
|
1691
1697
|
continue;
|
|
1692
1698
|
}
|
|
1693
|
-
mintedNames.set(namespacedName, t.name);
|
|
1694
1699
|
const hintAxis = mcpAxisFor(namespacedName, t.annotations);
|
|
1695
1700
|
const axis = applyCallerAxisOverride(namespacedName, hintAxis, spec.toolAxes?.[remoteName]);
|
|
1696
1701
|
if (axis)
|
|
@@ -1750,6 +1755,7 @@ function intakeListedTools(listed, spec, link, imageResizer, reminderDisclosure,
|
|
|
1750
1755
|
try {
|
|
1751
1756
|
return rethrowHonestMcpError(err, {
|
|
1752
1757
|
server: spec.name,
|
|
1758
|
+
declared,
|
|
1753
1759
|
what,
|
|
1754
1760
|
timeoutMs,
|
|
1755
1761
|
writeEffect,
|
|
@@ -1793,7 +1799,7 @@ function intakeListedTools(listed, spec, link, imageResizer, reminderDisclosure,
|
|
|
1793
1799
|
const errScLine = structuredContentErrorLine(res.structuredContent, parts.join("\n"));
|
|
1794
1800
|
if (errScLine !== undefined)
|
|
1795
1801
|
parts.push(errScLine);
|
|
1796
|
-
const body = truncateMcpErrorText(
|
|
1802
|
+
const body = truncateMcpErrorText(remoteWords(parts.join("\n").trim(), declared));
|
|
1797
1803
|
const msg = body
|
|
1798
1804
|
? `MCP tool ${inlineUntrusted(remoteName)} reported an error. The server's error content follows as external/untrusted data:\n${delimitUntrusted(`${spec.name} tool error`, body)}`
|
|
1799
1805
|
: `MCP tool ${inlineUntrusted(remoteName)} reported an error`;
|
|
@@ -1842,8 +1848,8 @@ function intakeListedTools(listed, spec, link, imageResizer, reminderDisclosure,
|
|
|
1842
1848
|
}
|
|
1843
1849
|
return { serverTools, serverAxes, gates, dropped, advisories, accepted };
|
|
1844
1850
|
}
|
|
1845
|
-
function asServerWarning(spec, err) {
|
|
1846
|
-
const warning = new Error(`mcp: server "${spec.name}" failed to connect — skipped (${namedMcpFailureText(err)})`, { cause: sanitizedCause(err) });
|
|
1851
|
+
function asServerWarning(spec, err, declared) {
|
|
1852
|
+
const warning = new Error(`mcp: server "${spec.name}" failed to connect — skipped (${namedMcpFailureText(err, declared)})`, { cause: sanitizedCause(err, declared) });
|
|
1847
1853
|
warning.code = "mcp.server_unavailable";
|
|
1848
1854
|
return warning;
|
|
1849
1855
|
}
|
|
@@ -1868,8 +1874,8 @@ function dialDecision(dialable, spec) {
|
|
|
1868
1874
|
}
|
|
1869
1875
|
throw Object.assign(new Error(`MCP materialization refused: the dialable seat could not decide whether to dial server "${inlineUntrusted(spec.name, 120)}" — ${inlineUntrusted(why, 240)}. No server was dialed.`, cause), { code: "config.mcp_dialable_failed" });
|
|
1870
1876
|
}
|
|
1871
|
-
function sanitizedCause(err) {
|
|
1872
|
-
const copy = new Error(namedMcpFailureText(err));
|
|
1877
|
+
function sanitizedCause(err, declared) {
|
|
1878
|
+
const copy = new Error(namedMcpFailureText(err, declared));
|
|
1873
1879
|
const name = thrownName(err);
|
|
1874
1880
|
if (name !== undefined) {
|
|
1875
1881
|
if (name !== "")
|
|
@@ -2,6 +2,7 @@ import { join } from "node:path";
|
|
|
2
2
|
import { uuidv7 } from "../../internal/harness.js";
|
|
3
3
|
import { atomicWriteFileSync, ensureDirExists, lockedStrictUpdate, readStrictSidecar, enqueueMemoryAnnouncement, ControlPlaneCorruptError } from "./layout.js";
|
|
4
4
|
import { inlineUntrusted } from "../untrusted-text.js";
|
|
5
|
+
import { extensionWords } from "../untrusted-egress.js";
|
|
5
6
|
import { deliverEngineNotice } from "../engine-notice.js";
|
|
6
7
|
import { CONSOLIDATION_FORCE_THROTTLE_FLOOR_MS, screenConsolidationOptions, supersessionFuseCeiling, updateConsolidationGate, recommendationUnconsumed, CONSOLIDATION_WRITE_REFUSED_CODE, ConsolidationRefusedError, } from "./consolidation.js";
|
|
7
8
|
import { memoryConsolidationIncompleteNotice, memoryConsolidationWithheldNotice } from "./engine.js";
|
|
@@ -510,15 +511,15 @@ export async function runMemoryConsolidationDriver(engine, scope, opts) {
|
|
|
510
511
|
}
|
|
511
512
|
catch (err) {
|
|
512
513
|
if (err instanceof DriverMintFailure) {
|
|
513
|
-
announce([`memory consolidation driver run ${run.runId} for scope ${inlineUntrusted(scope, 80)} FAILED before any write: ${
|
|
514
|
+
announce([`memory consolidation driver run ${run.runId} for scope ${inlineUntrusted(scope, 80)} FAILED before any write: ${extensionWords(err.detail, 300)}`]);
|
|
514
515
|
return settle("driver_failed", undefined, err.detail);
|
|
515
516
|
}
|
|
516
517
|
if (err instanceof DriverPurityViolation) {
|
|
517
|
-
announce([`memory consolidation driver run ${run.runId} for scope ${inlineUntrusted(scope, 80)} REFUSED on the clean-arm purity gate (no writes): ${
|
|
518
|
+
announce([`memory consolidation driver run ${run.runId} for scope ${inlineUntrusted(scope, 80)} REFUSED on the clean-arm purity gate (no writes): ${extensionWords(err.detail, 300)}`]);
|
|
518
519
|
return settle("purity_violation", undefined, err.detail);
|
|
519
520
|
}
|
|
520
521
|
if (err instanceof MintInvalidated) {
|
|
521
|
-
announce([`memory consolidation driver run ${run.runId} for scope ${inlineUntrusted(scope, 80)} MINT INVALIDATED: ${
|
|
522
|
+
announce([`memory consolidation driver run ${run.runId} for scope ${inlineUntrusted(scope, 80)} MINT INVALIDATED: ${extensionWords(err.detail, 300)}`]);
|
|
522
523
|
if (run.residue === undefined && err.residue.length > 0)
|
|
523
524
|
run.residue = err.residue;
|
|
524
525
|
const partial = {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { closeSync, existsSync, fsyncSync, linkSync, lstatSync, openSync, readFileSync, readdirSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
|
|
3
3
|
import { basename, dirname, join } from "node:path";
|
|
4
|
-
import { QUARANTINE_DIR, appendChallengeEvents, enqueueMemoryAnnouncement, ensureDirExists, v1MemoryPathKeyResolver, lineageContributionsOfSession, lockedStrictUpdate, markSessionPolluted, readProjectionDebts, readSessionPollution, readStrictSidecar, ControlPlaneCorruptError } from "./layout.js";
|
|
4
|
+
import { QUARANTINE_DIR, appendChallengeEvents, claimStaging, enqueueMemoryAnnouncement, ensureDirExists, isSameFile, mintStagingName, stagingNamePattern, v1MemoryPathKeyResolver, lineageContributionsOfSession, lockedStrictUpdate, markSessionPolluted, readProjectionDebts, readSessionPollution, readStrictSidecar, ControlPlaneCorruptError } from "./layout.js";
|
|
5
5
|
import { thrownText } from "../thrown-value.js";
|
|
6
6
|
export const DELEGATION_SETTLEMENT_FILE = "delegation-settlement.json";
|
|
7
7
|
function reqStr(v) {
|
|
@@ -495,25 +495,6 @@ export function readHolds(controlDir) {
|
|
|
495
495
|
function sha256(buf) {
|
|
496
496
|
return createHash("sha256").update(buf).digest("hex");
|
|
497
497
|
}
|
|
498
|
-
let stagingSeq = 0;
|
|
499
|
-
function uniqueStagingName(holdId, now) {
|
|
500
|
-
stagingSeq += 1;
|
|
501
|
-
return `${holdId}.staging-${now()}-${process.pid}-${stagingSeq}`;
|
|
502
|
-
}
|
|
503
|
-
function stagingGenerationPattern(holdId) {
|
|
504
|
-
return new RegExp(`^${holdId.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\.staging-\\d+-\\d+-\\d+(?:\\.claim-\\d+-\\d+)*$`);
|
|
505
|
-
}
|
|
506
|
-
function claimStaging(stagingPath) {
|
|
507
|
-
stagingSeq += 1;
|
|
508
|
-
const claimed = `${stagingPath}.claim-${process.pid}-${stagingSeq}`;
|
|
509
|
-
try {
|
|
510
|
-
renameSync(stagingPath, claimed);
|
|
511
|
-
return claimed;
|
|
512
|
-
}
|
|
513
|
-
catch {
|
|
514
|
-
return stagingPath;
|
|
515
|
-
}
|
|
516
|
-
}
|
|
517
498
|
function dropStaging(claimedPath) {
|
|
518
499
|
try {
|
|
519
500
|
unlinkSync(claimedPath);
|
|
@@ -638,7 +619,7 @@ export function openInstructionHold(controlDir, input) {
|
|
|
638
619
|
if (!writeCustodyVerified(join(holdDir, captureName), buf)) {
|
|
639
620
|
return refuse("hold capture verification failed (the custody copy could not be written, made durable, or hashed back to the captured digest)", "capture_lost");
|
|
640
621
|
}
|
|
641
|
-
const stagingName =
|
|
622
|
+
const stagingName = mintStagingName(holdId, input.now);
|
|
642
623
|
const stagingPath = stagingPathBeside(input.absPath, stagingName);
|
|
643
624
|
try {
|
|
644
625
|
renameSync(input.absPath, stagingPath);
|
|
@@ -695,7 +676,7 @@ export function reconcileHolds(controlDir, input) {
|
|
|
695
676
|
}
|
|
696
677
|
};
|
|
697
678
|
const finishRemoval = (row, plane) => {
|
|
698
|
-
const stagingName =
|
|
679
|
+
const stagingName = mintStagingName(row.holdId, input.now);
|
|
699
680
|
renameSync(plane, stagingPathBeside(plane, stagingName));
|
|
700
681
|
const staging = claimStaging(stagingPathBeside(plane, stagingName));
|
|
701
682
|
if (sha256(readFileSync(staging)) === row.contentDigest) {
|
|
@@ -726,7 +707,14 @@ export function reconcileHolds(controlDir, input) {
|
|
|
726
707
|
};
|
|
727
708
|
const sweepStagingGenerations = (row, plane, custody) => {
|
|
728
709
|
const seatDir = dirname(plane);
|
|
729
|
-
const pattern =
|
|
710
|
+
const pattern = stagingNamePattern(row.holdId);
|
|
711
|
+
let seat;
|
|
712
|
+
try {
|
|
713
|
+
seat = lstatSync(plane);
|
|
714
|
+
}
|
|
715
|
+
catch {
|
|
716
|
+
seat = undefined;
|
|
717
|
+
}
|
|
730
718
|
for (const name of listSeat(seatDir)) {
|
|
731
719
|
if (!pattern.test(name))
|
|
732
720
|
continue;
|
|
@@ -746,7 +734,10 @@ export function reconcileHolds(controlDir, input) {
|
|
|
746
734
|
continue;
|
|
747
735
|
}
|
|
748
736
|
}
|
|
749
|
-
|
|
737
|
+
const onSeat = seat !== undefined && isSameFile(staged, seat);
|
|
738
|
+
const retired = retireStagingToCustody(staged, holdDir, name);
|
|
739
|
+
if (!(onSeat && retired.settled && isSameFile(plane, seat)))
|
|
740
|
+
discloseStranded(row.holdId, row.rel, retired.at);
|
|
750
741
|
}
|
|
751
742
|
};
|
|
752
743
|
const rows = readHolds(controlDir).filter((r) => r.status === "capturing");
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { requireWriteGate } from "./consolidation-write-gate.js";
|
|
2
2
|
import { readMember, thrownText } from "../thrown-value.js";
|
|
3
3
|
import { assertServableRequestRoot, joinRequestUrl } from "../../brain/route-adjudicator.js";
|
|
4
|
-
import { holdOwnCredentialValues } from "../secret-env.js";
|
|
4
|
+
import { holdOwnCredentialValues, namesASecret } from "../secret-env.js";
|
|
5
|
+
import { remoteWords } from "../protocol-http-auth.js";
|
|
5
6
|
export const DISTILLER_DEFAULT_MAX_INPUTS_PER_PRODUCT = 32;
|
|
6
7
|
const SIZE_CLAUSE = {
|
|
7
8
|
"dl-2": "- the index should be as small as it can be made without losing either of the above.",
|
|
@@ -171,29 +172,37 @@ export function openAiCompatChatSeat(seat) {
|
|
|
171
172
|
catch (e) {
|
|
172
173
|
throw distillerConfigRefusal(thrownText(e), e);
|
|
173
174
|
}
|
|
175
|
+
const declared = namesASecret(apiKey) ? [apiKey] : [];
|
|
174
176
|
return async (req) => {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
177
|
+
let res;
|
|
178
|
+
let text;
|
|
179
|
+
try {
|
|
180
|
+
res = await fetch(joinRequestUrl(requestRoot, "/chat/completions"), {
|
|
181
|
+
method: "POST",
|
|
182
|
+
headers: { "content-type": "application/json", authorization: `Bearer ${apiKey}` },
|
|
183
|
+
body: JSON.stringify({
|
|
184
|
+
model: seat.model,
|
|
185
|
+
messages: [
|
|
186
|
+
{ role: "system", content: req.system },
|
|
187
|
+
{ role: "user", content: req.user },
|
|
188
|
+
],
|
|
189
|
+
temperature: req.temperature,
|
|
190
|
+
max_tokens: req.maxTokens,
|
|
191
|
+
}),
|
|
192
|
+
});
|
|
193
|
+
text = await res.text();
|
|
194
|
+
}
|
|
195
|
+
catch (e) {
|
|
196
|
+
throw new Error(`model call failed: ${remoteWords(thrownText(e), declared)}`);
|
|
197
|
+
}
|
|
189
198
|
if (!res.ok)
|
|
190
|
-
throw new Error(`model call failed ${res.status}: ${text.slice(0, 400)}`);
|
|
199
|
+
throw new Error(`model call failed ${res.status}: ${remoteWords(text, declared).slice(0, 400)}`);
|
|
191
200
|
let body;
|
|
192
201
|
try {
|
|
193
202
|
body = JSON.parse(text);
|
|
194
203
|
}
|
|
195
204
|
catch {
|
|
196
|
-
throw new Error(`model returned non-JSON envelope: ${text.slice(0, 400)}`);
|
|
205
|
+
throw new Error(`model returned non-JSON envelope: ${remoteWords(text, declared).slice(0, 400)}`);
|
|
197
206
|
}
|
|
198
207
|
return {
|
|
199
208
|
content: body.choices?.[0]?.message?.content ?? "",
|
|
@@ -19,7 +19,7 @@ import { landedUndecided, layerDigest, layerObservationLookup, readOnlyLayerCand
|
|
|
19
19
|
import { markOriginClearanceTombstoned, openOriginClearance, readOriginClearances, settleOriginClearance } from "./origin-clearance.js";
|
|
20
20
|
import { DEFAULT_MAX_ENTRY_DEPTH, MEMORY_INDEX_FILENAME, captureErasureInput, erasureRequestInvalid, erasureSelectHash, scanEntryFiles, } from "./file-backend.js";
|
|
21
21
|
import { assembleMemoryExportBundle, computeMemoryBundleHash, memoryBundleInvalid, } from "./export-bundle.js";
|
|
22
|
-
import { QUARANTINE_DIR, SCAN_FUSE_THRESHOLD, quarantineAndTombstone, restoreContainedBaseline, indexLineIsStale, readIndexRevs, writeIndexRevs, bumpScanFuse, scanFuseKey, canonicalize, anchorStoreRoot, landingPathOf, landsOutsideStore, storeActRefusal, storeRootMovedRefusal, adoptRootScopeLayout, clearScanFuse, effectiveControlRootOf, drainMemoryAnnouncements, enqueueMemoryAnnouncement, ensureDirExists, markSessionPolluted, readSessionPollution, fileSessionCaptureRecordStore, recordRetrievedAccount, writeFileNoFollow, withPermissionRemedy, permissionRemedyOf, readRetrievedAccount, registerScope, registeredScopes, scopeDirFor, appendChallengeEvents, appendLineageAudit, rebuildStrictControlPlaneLedger, isStrictControlPlaneLedgerCorrupt, CHALLENGE_LEDGER_MAX_EVENTS, adjudicateLineagePending, challengedEntryIds, clearLineageForEntries, discardLineagePending, lineageAccountOfEntry, lineageContributionsOfSession, lineageLatchedIds, promoteLineagePending, readChallengeEvents, readChallengedHistory, readLineageRecord, recordChallengedHistory, recordLineageCredential, reconcileLineage, readProjectionDebts, resolveChallengeEvent, settleProjectionDebts, stageLineagePending, stageProjectionDebts, } from "./layout.js";
|
|
22
|
+
import { QUARANTINE_DIR, SCAN_FUSE_THRESHOLD, quarantineAndTombstone, restoreContainedBaseline, mintStagingName, indexLineIsStale, readIndexRevs, writeIndexRevs, bumpScanFuse, scanFuseKey, canonicalize, anchorStoreRoot, landingPathOf, landsOutsideStore, storeActRefusal, storeRootMovedRefusal, adoptRootScopeLayout, clearScanFuse, effectiveControlRootOf, drainMemoryAnnouncements, enqueueMemoryAnnouncement, ensureDirExists, markSessionPolluted, readSessionPollution, fileSessionCaptureRecordStore, recordRetrievedAccount, writeFileNoFollow, writeFileNoReplace, withPermissionRemedy, permissionRemedyOf, readRetrievedAccount, registerScope, registeredScopes, scopeDirFor, appendChallengeEvents, appendLineageAudit, rebuildStrictControlPlaneLedger, isStrictControlPlaneLedgerCorrupt, CHALLENGE_LEDGER_MAX_EVENTS, adjudicateLineagePending, challengedEntryIds, clearLineageForEntries, discardLineagePending, lineageAccountOfEntry, lineageContributionsOfSession, lineageLatchedIds, promoteLineagePending, readChallengeEvents, readChallengedHistory, readLineageRecord, recordChallengedHistory, recordLineageCredential, reconcileLineage, readProjectionDebts, resolveChallengeEvent, settleProjectionDebts, stageLineagePending, stageProjectionDebts, } from "./layout.js";
|
|
23
23
|
import { createSessionIncarnationSeat, recalledForAnyIdentity, recalledForIdentity, rememberForIdentity } from "./session-incarnation.js";
|
|
24
24
|
import { scanMemoryFileName, scanMemoryWrite, scanRemediation } from "./scan.js";
|
|
25
25
|
import { writableRootOf } from "./types.js";
|
|
@@ -1516,7 +1516,7 @@ export class MemoryEngine {
|
|
|
1516
1516
|
}
|
|
1517
1517
|
let restoredCommitted = false;
|
|
1518
1518
|
if (captured) {
|
|
1519
|
-
const stagingName =
|
|
1519
|
+
const stagingName = mintStagingName(captureName, this.now);
|
|
1520
1520
|
const stagingPath = stagingPathBeside(canonical, stagingName);
|
|
1521
1521
|
try {
|
|
1522
1522
|
this.refuseOutsideStore(canonical, "containing session residue");
|
|
@@ -2475,8 +2475,8 @@ export class MemoryEngine {
|
|
|
2475
2475
|
if (committed !== undefined) {
|
|
2476
2476
|
try {
|
|
2477
2477
|
this.refuseOutsideStore(f.canonical, "restoring a held entry's committed content", handle);
|
|
2478
|
-
|
|
2479
|
-
|
|
2478
|
+
if (writeFileNoReplace(f.canonical, committed) === "written")
|
|
2479
|
+
report.restored.push(rel);
|
|
2480
2480
|
}
|
|
2481
2481
|
catch (err) {
|
|
2482
2482
|
report.warnings.push(`${rel}: the committed content could not be restored after the hold captured this session's edit — the entry is unavailable on the plane until release or the next restore: ${this.writeFailureText(err)}`);
|