@sema-agent/core 7.55.0 → 7.56.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +513 -0
- package/dist/agents/cascade.js +1 -1
- package/dist/agents/cc-peer-directory.js +1 -0
- package/dist/agents/child-model-seat.d.ts +0 -11
- package/dist/agents/child-model-seat.js +0 -3
- package/dist/agents/list-agents-tool.d.ts +3 -1
- package/dist/agents/list-agents-tool.js +7 -7
- package/dist/agents/peer-directory.d.ts +22 -4
- package/dist/agents/peer-directory.js +24 -2
- package/dist/agents/peer-session-drain.js +2 -2
- package/dist/agents/repair-loop.js +2 -2
- package/dist/agents/send-message-tool.js +4 -4
- package/dist/agents/subagent.d.ts +6 -4
- package/dist/agents/subagent.js +64 -60
- package/dist/agents/tool-filter.d.ts +7 -5
- package/dist/agents/tool-filter.js +12 -9
- package/dist/agents/verify.d.ts +3 -2
- package/dist/agents/verify.js +3 -3
- package/dist/brain/anthropic.js +30 -73
- package/dist/brain/media-degrade.d.ts +18 -7
- package/dist/brain/media-degrade.js +13 -2
- package/dist/brain/model-capability.d.ts +37 -0
- package/dist/brain/model-capability.js +34 -0
- package/dist/brain/model-presets.d.ts +2 -8
- package/dist/brain/model-presets.js +1 -6
- package/dist/brain/open-responses.js +13 -26
- package/dist/brain/openai.js +14 -87
- package/dist/brain/reasoning-request.d.ts +96 -0
- package/dist/brain/reasoning-request.js +174 -0
- package/dist/brain/reasoning.d.ts +11 -11
- package/dist/brain/reasoning.js +4 -3
- package/dist/brain/request-params.d.ts +7 -4
- package/dist/brain/request-params.js +7 -4
- package/dist/brain/status-sink.d.ts +20 -0
- package/dist/brain/status-sink.js +7 -0
- package/dist/core/a2a.d.ts +2 -1
- package/dist/core/a2a.js +19 -13
- package/dist/core/agent-definition.d.ts +10 -0
- package/dist/core/allow-entry.d.ts +20 -13
- package/dist/core/allow-entry.js +26 -22
- package/dist/core/allow-rule-shadow.d.ts +3 -3
- package/dist/core/ask-origin.d.ts +64 -18
- package/dist/core/ask-origin.js +63 -23
- package/dist/core/ask-question.d.ts +51 -8
- package/dist/core/ask-question.js +3 -4
- package/dist/core/ask-unresolvable-notice.d.ts +8 -3
- package/dist/core/ask-unresolvable-notice.js +16 -2
- package/dist/core/checkpoint-generation.d.ts +53 -0
- package/dist/core/checkpoint-generation.js +35 -0
- package/dist/core/checkpoint-queries.d.ts +180 -0
- package/dist/core/checkpoint-queries.js +272 -0
- package/dist/core/checkpoint-requirements.d.ts +13 -1
- package/dist/core/checkpoint-requirements.js +4 -0
- package/dist/core/checkpoint-store.d.ts +88 -24
- package/dist/core/checkpoint-store.js +24 -9
- package/dist/core/cross-boundary-taint.d.ts +6 -5
- package/dist/core/cross-boundary-taint.js +1 -3
- package/dist/core/decision-receipt.d.ts +37 -3
- package/dist/core/decision-receipt.js +17 -17
- package/dist/core/delegation-not-started.d.ts +6 -0
- package/dist/core/delegation-not-started.js +17 -0
- package/dist/core/engine-attestation.d.ts +93 -0
- package/dist/core/engine-attestation.js +70 -0
- package/dist/core/engine-capabilities.d.ts +4 -1
- package/dist/core/engine-capabilities.js +1 -1
- package/dist/core/engine-notice.d.ts +30 -11
- package/dist/core/file-history-store.d.ts +90 -14
- package/dist/core/file-history-store.js +23 -15
- package/dist/core/gate-fold.d.ts +1 -1
- package/dist/core/gate-fold.js +22 -10
- package/dist/core/gate-lanes.js +73 -64
- package/dist/core/gate-outcome.d.ts +26 -5
- package/dist/core/gate-outcome.js +26 -0
- package/dist/core/governance-codes.d.ts +5 -1
- package/dist/core/governance-codes.js +6 -0
- package/dist/core/hooks.d.ts +17 -16
- package/dist/core/hooks.js +3 -1
- package/dist/core/host-floor.d.ts +128 -0
- package/dist/core/host-floor.js +206 -0
- package/dist/core/host-target.d.ts +38 -3
- package/dist/core/host-target.js +38 -5
- package/dist/core/mcp.d.ts +5 -1
- package/dist/core/mcp.js +67 -41
- package/dist/core/memory-engine/delegation-settlement.js +15 -24
- package/dist/core/memory-engine/engine.js +4 -4
- package/dist/core/memory-engine/layout.d.ts +60 -8
- package/dist/core/memory-engine/layout.js +65 -6
- package/dist/core/model-seat.d.ts +10 -3
- package/dist/core/mods/classic-events.d.ts +67 -0
- package/dist/core/mods/classic-events.js +1 -0
- package/dist/core/mods/dollar.d.ts +13 -0
- package/dist/core/mods/extension-call.d.ts +31 -0
- package/dist/core/mods/extension-call.js +43 -0
- package/dist/core/mods/kernel/dispatch.d.ts +20 -3
- package/dist/core/mods/kernel/dispatch.js +140 -69
- package/dist/core/mods/kernel/events.d.ts +47 -11
- package/dist/core/mods/kernel/events.js +66 -42
- package/dist/core/mods/kernel/index.d.ts +4 -4
- package/dist/core/mods/kernel/index.js +2 -2
- package/dist/core/mods/kernel/receive.d.ts +39 -5
- package/dist/core/mods/kernel/receive.js +290 -17
- package/dist/core/mods/kernel/registration.d.ts +33 -2
- package/dist/core/mods/kernel/registration.js +6 -7
- package/dist/core/mods/kernel/site-rules.d.ts +44 -16
- package/dist/core/mods/kernel/site-rules.js +24 -42
- package/dist/core/mods/spec-seats.d.ts +69 -0
- package/dist/core/mods/spec-seats.js +114 -0
- package/dist/core/mods/stations.d.ts +28 -8
- package/dist/core/mods/stations.js +29 -13
- package/dist/core/mods/tool-call.d.ts +79 -0
- package/dist/core/mods/tool-call.js +152 -0
- package/dist/core/namespaced-rule-name.d.ts +32 -38
- package/dist/core/namespaced-rule-name.js +29 -36
- package/dist/core/parent-spec-seat.d.ts +6 -1
- package/dist/core/parent-spec-seat.js +2 -0
- package/dist/core/park-selfcheck.js +1 -0
- package/dist/core/permission-rule-consent.d.ts +19 -0
- package/dist/core/permission-rule-consent.js +116 -26
- package/dist/core/permission-rule-model.d.ts +14 -3
- package/dist/core/permission-rule-model.js +39 -24
- package/dist/core/permission-rule-org.d.ts +6 -2
- package/dist/core/permission-rule-org.js +7 -3
- package/dist/core/permission-rule-provider.d.ts +5 -2
- package/dist/core/permission-rule-provider.js +41 -11
- package/dist/core/permission-rule-store.d.ts +3 -2
- package/dist/core/permission-rule-store.js +11 -2
- package/dist/core/permission-rule-sync.js +3 -2
- package/dist/core/permission-rule-syntax.d.ts +5 -4
- package/dist/core/permission-rule-syntax.js +2 -2
- package/dist/core/permission-rules.d.ts +4 -4
- package/dist/core/permission-rules.js +11 -20
- package/dist/core/persisted-rule-arms.d.ts +2 -2
- package/dist/core/persisted-rule-arms.js +10 -12
- package/dist/core/principal-name.d.ts +20 -0
- package/dist/core/principal-name.js +22 -0
- package/dist/core/prompt-section-seat.js +4 -6
- package/dist/core/protocol-http-auth.d.ts +26 -5
- package/dist/core/protocol-http-auth.js +137 -4
- package/dist/core/retired-keys.d.ts +16 -0
- package/dist/core/retired-keys.js +16 -4
- package/dist/core/rewrite-rejudge.d.ts +60 -0
- package/dist/core/rewrite-rejudge.js +36 -0
- package/dist/core/roles.d.ts +28 -1
- package/dist/core/roles.js +31 -19
- package/dist/core/rule-lane-reads.d.ts +20 -15
- package/dist/core/rule-lane-reads.js +45 -17
- package/dist/core/rule-owner.d.ts +3 -3
- package/dist/core/rule-owner.js +3 -2
- package/dist/core/runner/announce-once-ledger.d.ts +14 -0
- package/dist/core/runner/announce-once-ledger.js +5 -0
- package/dist/core/runner/assemble-result.d.ts +1 -0
- package/dist/core/runner/assemble-result.js +1 -1
- package/dist/core/runner/call-hook-stations.d.ts +3 -2
- package/dist/core/runner/caller-roster.d.ts +16 -4
- package/dist/core/runner/caller-roster.js +33 -6
- package/dist/core/runner/capability-withheld-seat.d.ts +5 -0
- package/dist/core/runner/capability-withheld-seat.js +24 -0
- package/dist/core/runner/classifier-ladder.d.ts +7 -9
- package/dist/core/runner/classifier-ladder.js +3 -3
- package/dist/core/runner/construction-doors.js +3 -0
- package/dist/core/runner/contracts.d.ts +28 -25
- package/dist/core/runner/cross-boundary-lane.d.ts +17 -13
- package/dist/core/runner/cross-boundary-lane.js +40 -27
- package/dist/core/runner/denial-limit-arms.d.ts +2 -2
- package/dist/core/runner/denial-limit-arms.js +1 -1
- package/dist/core/runner/file-history-request.d.ts +18 -0
- package/dist/core/runner/file-history-request.js +21 -13
- package/dist/core/runner/file-history-restore.d.ts +45 -0
- package/dist/core/runner/file-history-restore.js +46 -0
- package/dist/core/runner/gate-exit.d.ts +3 -3
- package/dist/core/runner/gate-exit.js +4 -3
- package/dist/core/runner/image.d.ts +7 -17
- package/dist/core/runner/image.js +9 -60
- package/dist/core/runner/permission-rule-lanes.d.ts +4 -4
- package/dist/core/runner/permission-rule-lanes.js +26 -10
- package/dist/core/runner/person-path-rows.d.ts +12 -9
- package/dist/core/runner/person-path-rows.js +18 -7
- package/dist/core/runner/prepare-ask-lane.d.ts +2 -2
- package/dist/core/runner/prepare-ask-lane.js +5 -2
- package/dist/core/runner/prepare-caps-and-workflow.d.ts +4 -6
- package/dist/core/runner/prepare-caps-and-workflow.js +4 -3
- package/dist/core/runner/prepare-config-doors.d.ts +29 -38
- package/dist/core/runner/prepare-config-doors.js +42 -25
- package/dist/core/runner/prepare-defer-classify.d.ts +4 -3
- package/dist/core/runner/prepare-defer-classify.js +7 -8
- package/dist/core/runner/prepare-file-history.d.ts +48 -8
- package/dist/core/runner/prepare-file-history.js +7 -39
- package/dist/core/runner/prepare-gate-stations.d.ts +1 -1
- package/dist/core/runner/prepare-gate-stations.js +10 -1
- package/dist/core/runner/prepare-hands-readface.d.ts +2 -8
- package/dist/core/runner/prepare-hands-readface.js +15 -14
- package/dist/core/runner/prepare-inherited-gate.d.ts +6 -3
- package/dist/core/runner/prepare-inherited-gate.js +5 -3
- package/dist/core/runner/prepare-memory-engine-session.js +1 -1
- package/dist/core/runner/prepare-park-ask.js +5 -5
- package/dist/core/runner/prepare-policy-chain.d.ts +6 -3
- package/dist/core/runner/prepare-policy-chain.js +65 -72
- package/dist/core/runner/prepare-prompt-assembly.d.ts +5 -7
- package/dist/core/runner/prepare-prompt-assembly.js +10 -8
- package/dist/core/runner/prepare-prompt-inputs.d.ts +11 -9
- package/dist/core/runner/prepare-prompt-inputs.js +3 -5
- package/dist/core/runner/prepare-protocol-tools.d.ts +2 -0
- package/dist/core/runner/prepare-protocol-tools.js +3 -3
- package/dist/core/runner/prepare-safety-scan.d.ts +1 -1
- package/dist/core/runner/prepare-safety-scan.js +0 -17
- package/dist/core/runner/prepare-suspend-saga.d.ts +2 -0
- package/dist/core/runner/prepare-suspend-saga.js +5 -6
- package/dist/core/runner/prepare-task.d.ts +1 -1
- package/dist/core/runner/prepare-task.js +29 -20
- package/dist/core/runner/prepare-tool-disclosure-mount.d.ts +7 -4
- package/dist/core/runner/prepare-tool-disclosure-mount.js +20 -16
- package/dist/core/runner/prepare-turn-wiring.d.ts +0 -4
- package/dist/core/runner/prepare-turn-wiring.js +2 -7
- package/dist/core/runner/prepare-wiring-manifest.d.ts +6 -2
- package/dist/core/runner/prepare-wiring-manifest.js +3 -3
- package/dist/core/runner/resume-admission.js +1 -1
- package/dist/core/runner/resume-apply.js +11 -12
- package/dist/core/runner/resume-checkpoint-screen.js +3 -0
- package/dist/core/runner/resume-claim.d.ts +4 -2
- package/dist/core/runner/resume-claim.js +15 -8
- package/dist/core/runner/retired-runner-deps.js +1 -0
- package/dist/core/runner/rewind-files.d.ts +15 -0
- package/dist/core/runner/rewind-files.js +132 -0
- package/dist/core/runner/run-attachment-seats.js +2 -1
- package/dist/core/runner/run-brain-sinks.d.ts +4 -1
- package/dist/core/runner/run-brain-sinks.js +4 -2
- package/dist/core/runner/run-harness-handlers.js +12 -4
- package/dist/core/runner/run-leg.d.ts +1 -1
- package/dist/core/runner/run-leg.js +30 -18
- package/dist/core/runner/run-settle-and-teardown.js +2 -1
- package/dist/core/runner/run-turn-boundary.js +1 -10
- package/dist/core/runner/runtask.d.ts +3 -0
- package/dist/core/runner/runtask.js +8 -9
- package/dist/core/runner/session-read-file-states.d.ts +15 -0
- package/dist/core/runner/session-read-file-states.js +28 -0
- package/dist/core/runner/session-rule-policy.js +4 -3
- package/dist/core/runner/shell-env-withheld.d.ts +33 -0
- package/dist/core/runner/shell-env-withheld.js +51 -0
- package/dist/core/runner/skills-seat.js +6 -2
- package/dist/core/runner/stream-settle-backstop.js +1 -1
- package/dist/core/runner/sub-agent-deny-lists.js +4 -7
- package/dist/core/runner/synthetic-tools.d.ts +6 -0
- package/dist/core/runner/synthetic-tools.js +4 -1
- package/dist/core/runner/tool-disclosure.d.ts +10 -12
- package/dist/core/runner/tool-disclosure.js +1 -3
- package/dist/core/runner/tool-end-body.d.ts +1 -1
- package/dist/core/runner/tool-end-body.js +10 -9
- package/dist/core/runner/tool-not-executed.d.ts +5 -0
- package/dist/core/runner/tool-not-executed.js +11 -0
- package/dist/core/runner/tool-occurrence.d.ts +8 -0
- package/dist/core/runner/tool-occurrence.js +7 -0
- package/dist/core/runner/turn-attachments.d.ts +33 -15
- package/dist/core/runner/turn-attachments.js +62 -37
- package/dist/core/runner-deps.d.ts +5 -5
- package/dist/core/safety-axis-vocab.d.ts +6 -4
- package/dist/core/safety-axis-vocab.js +6 -5
- package/dist/core/safety-merge-corpus.js +11 -3
- package/dist/core/secret-env.d.ts +26 -3
- package/dist/core/secret-env.js +44 -8
- package/dist/core/select-model.js +3 -3
- package/dist/core/session-policy-store.d.ts +27 -15
- package/dist/core/session-policy-store.js +156 -36
- package/dist/core/session-store.d.ts +29 -10
- package/dist/core/session-store.js +51 -19
- package/dist/core/session.d.ts +82 -16
- package/dist/core/session.js +53 -0
- package/dist/core/shell-read-silence.d.ts +11 -12
- package/dist/core/shell-read-silence.js +9 -5
- package/dist/core/shell-run-candidates.js +3 -1
- package/dist/core/shell-wrapper-projection.js +1 -1
- package/dist/core/shell-wrapper-table.d.ts +14 -7
- package/dist/core/shell-wrapper-table.js +5 -4
- package/dist/core/side-query.js +10 -1
- package/dist/core/skill-grant.d.ts +7 -2
- package/dist/core/skill-grant.js +5 -0
- package/dist/core/skills-directory.js +6 -2
- package/dist/core/store-contracts/checkpoint-store-contract.d.ts +11 -1
- package/dist/core/store-contracts/checkpoint-store-contract.js +140 -2
- package/dist/core/store-contracts/file-history-store-contract.js +31 -1
- package/dist/core/store-contracts/peer-directory-contract.d.ts +7 -2
- package/dist/core/store-contracts/peer-directory-contract.js +14 -2
- package/dist/core/store-contracts/session-repo-contract.js +51 -0
- package/dist/core/store-contracts/session-store-contract.d.ts +2 -1
- package/dist/core/store-contracts/session-store-contract.js +150 -14
- package/dist/core/stub-env.d.ts +2 -0
- package/dist/core/stub-env.js +1 -0
- package/dist/core/synthetic-read-verdict.js +3 -3
- package/dist/core/task-event.d.ts +32 -4
- package/dist/core/task-notification.d.ts +16 -12
- package/dist/core/task-registry.d.ts +9 -0
- package/dist/core/task-registry.js +11 -1
- package/dist/core/task-result.d.ts +18 -0
- package/dist/core/task-spec.d.ts +18 -13
- package/dist/core/tighten-task-spec.js +2 -1
- package/dist/core/tool-catalog-entries.d.ts +17 -0
- package/dist/core/tool-catalog-entries.js +13 -2
- package/dist/core/tool-check-reading.d.ts +11 -0
- package/dist/core/tool-check-reading.js +11 -6
- package/dist/core/tool-model-gate.d.ts +2 -2
- package/dist/core/tool-name-aliases.d.ts +16 -16
- package/dist/core/tool-name-aliases.js +13 -19
- package/dist/core/tool-name-readings.d.ts +5 -35
- package/dist/core/tool-name-readings.js +1 -9
- package/dist/core/tool-policy.d.ts +68 -198
- package/dist/core/tool-policy.js +149 -198
- package/dist/core/tool-result-store.js +3 -0
- package/dist/core/tool-roster.d.ts +14 -19
- package/dist/core/tool-roster.js +11 -44
- package/dist/core/tool-spec-members.js +7 -2
- package/dist/core/tool-spec.d.ts +19 -11
- package/dist/core/tools.js +49 -9
- package/dist/core/trace.d.ts +2 -2
- package/dist/core/types.d.ts +1 -1
- package/dist/core/user-attachment.d.ts +8 -1
- package/dist/core/user-attachment.js +64 -4
- package/dist/core/wiring-manifest.d.ts +9 -0
- package/dist/core/wiring-manifest.js +1 -0
- package/dist/core/workflow-journal-store.js +1 -1
- package/dist/engine/compaction/compaction.js +3 -2
- package/dist/engine/execution-env/node-execution-env.d.ts +7 -3
- package/dist/engine/execution-env/node-execution-env.js +11 -2
- package/dist/engine/harness/agent-harness.d.ts +25 -1
- package/dist/engine/harness/agent-harness.js +54 -7
- package/dist/engine/harness/types.d.ts +29 -2
- package/dist/engine/llm/types.d.ts +28 -11
- package/dist/engine/loop/agent-loop.d.ts +22 -0
- package/dist/engine/loop/agent-loop.js +16 -26
- package/dist/engine/loop/types.d.ts +16 -6
- package/dist/engine/session/memory-repo.d.ts +9 -2
- package/dist/engine/session/memory-repo.js +11 -1
- package/dist/engine/session/repo-utils.d.ts +6 -5
- package/dist/engine/session/repo-utils.js +14 -6
- package/dist/index.d.ts +22 -10
- package/dist/index.js +15 -7
- package/dist/internal/harness-types.d.ts +1 -1
- package/dist/internal/llm.d.ts +1 -1
- package/dist/orchestration/run-workflow-tool.d.ts +6 -4
- package/dist/orchestration/run-workflow-tool.js +5 -3
- package/dist/orchestration/workflow.d.ts +3 -0
- package/dist/orchestration/workflow.js +36 -18
- package/dist/prompt-assembly/artifact.d.ts +2 -2
- package/dist/prompt-assembly/artifact.js +5 -3
- package/dist/prompt-assembly/assemble.d.ts +3 -2
- package/dist/prompt-assembly/assemble.js +1 -1
- package/dist/prompt-assembly/catalog/schema.d.ts +43 -12
- package/dist/prompt-assembly/catalog/schema.js +34 -2
- package/dist/prompt-assembly/catalog/sections.js +0 -1
- package/dist/prompt-assembly/composer.d.ts +3 -1
- package/dist/prompt-assembly/composer.js +1 -1
- package/dist/prompt-assembly/event-registry.js +1 -0
- package/dist/prompt-assembly/overlay.js +3 -3
- package/dist/prompt-assembly/renderers.d.ts +1 -1
- package/dist/prompt-assembly/renderers.js +0 -3
- package/dist/prompt-assembly/role-base.d.ts +15 -0
- package/dist/prompt-assembly/role-base.js +9 -0
- package/dist/prompt-assembly/select.d.ts +39 -14
- package/dist/prompt-assembly/select.js +47 -16
- package/dist/prompt-assembly/sugar.d.ts +17 -11
- package/dist/prompt-assembly/sugar.js +8 -3
- package/dist/prompt-assembly/tool-catalog.d.ts +37 -3
- package/dist/prompt-assembly/tool-catalog.js +114 -4
- package/dist/prompt-assembly/turn-snapshot.d.ts +4 -10
- package/dist/prompt-assembly/turn-snapshot.js +0 -3
- package/dist/prompt-assembly/types.d.ts +0 -7
- package/dist/scenarios/full-body.d.ts +11 -11
- package/dist/scenarios/full-body.js +4 -3
- package/dist/shell/lex.js +10 -1
- package/dist/stores/file/adoption/adopt.js +4 -3
- package/dist/stores/file/adoption/marker.js +3 -2
- package/dist/stores/file/checkpoint-store.d.ts +21 -0
- package/dist/stores/file/checkpoint-store.js +38 -6
- package/dist/stores/file/file-history-store.js +6 -7
- package/dist/stores/file/index.js +2 -1
- package/dist/stores/file/permission-rule-adopt.js +4 -3
- package/dist/stores/file/permission-rule-store.js +11 -5
- package/dist/stores/file/session-store.d.ts +29 -6
- package/dist/stores/file/session-store.js +42 -50
- package/dist/tools/artifact/artifact-tool.js +3 -2
- package/dist/tools/fs/bash-program-position.d.ts +19 -2
- package/dist/tools/fs/bash-program-position.js +56 -9
- package/dist/tools/fs/fs-bash.js +5 -5
- package/dist/tools/fs/fs-glob.d.ts +86 -0
- package/dist/tools/fs/fs-glob.js +226 -0
- package/dist/tools/fs/fs-read.js +14 -14
- package/dist/tools/fs/fs-search-tools.js +7 -7
- package/dist/tools/fs/pattern-kill-guard.d.ts +22 -0
- package/dist/tools/fs/pattern-kill-guard.js +397 -0
- package/dist/tools/fs/pdf.d.ts +9 -6
- package/dist/tools/fs/pdf.js +3 -3
- package/dist/tools/fs/program-read-model.d.ts +57 -7
- package/dist/tools/fs/program-read-model.js +11 -1
- package/dist/tools/fs/program-read-model.rows.js +78 -21
- package/dist/tools/fs/read-deny-home.js +3 -2
- package/dist/tools/fs/removal-targets.d.ts +17 -7
- package/dist/tools/fs/removal-targets.js +47 -20
- package/dist/tools/fs/search.d.ts +10 -0
- package/dist/tools/fs/search.js +20 -26
- package/dist/tools/fs/shell-read-argv.js +89 -12
- package/dist/tools/fs/shell-read-bindings.d.ts +31 -0
- package/dist/tools/fs/shell-read-bindings.js +41 -0
- package/dist/tools/fs/shell-read-check.js +6 -19
- package/dist/tools/fs/shell-read-environment.d.ts +5 -1
- package/dist/tools/fs/shell-read-environment.js +3 -2
- package/dist/tools/fs/shell-read-establish.d.ts +15 -0
- package/dist/tools/fs/shell-read-establish.js +19 -20
- package/dist/tools/fs/shell-read-plan.js +24 -16
- package/dist/tools/fs/shell-read-start.d.ts +6 -1
- package/dist/tools/fs/shell-read-write-targets.d.ts +5 -1
- package/dist/tools/fs/shell-read-write-targets.js +2 -3
- package/dist/tools/fs/shell-reentry-text.d.ts +9 -0
- package/dist/tools/fs/shell-reentry-text.js +40 -2
- package/dist/tools/todo.js +63 -63
- package/dist/tools/web.d.ts +19 -14
- package/dist/tools/web.js +38 -55
- package/package.json +1 -1
- package/test/export-surface.snapshot.json +143 -5
- package/wire-changes/core@7.56.0.json +3891 -0
- package/wire-changes/mods-kernel@7.56.0.json +303 -0
package/dist/agents/subagent.js
CHANGED
|
@@ -2,6 +2,7 @@ import { Type } from "typebox";
|
|
|
2
2
|
import { isAbsolute } from "node:path";
|
|
3
3
|
import { backgroundChildTerminal } from "../core/delegation-frames.js";
|
|
4
4
|
import { bindDelegationName } from "../core/delegation-name.js";
|
|
5
|
+
import { principalNameOf } from "../core/principal-name.js";
|
|
5
6
|
import { resumeRefusalDetailOf, resumeStartupCauseOf } from "../core/resume-startup-cause.js";
|
|
6
7
|
import { errorCodeOf, thrownFailureOf } from "../core/runner/terminal-account.js";
|
|
7
8
|
import { applyParentSpecSeat, parentSpecSeatOfCtx } from "../core/parent-spec-seat.js";
|
|
@@ -11,6 +12,7 @@ import { assertNoRetiredKeys } from "../core/retired-keys.js";
|
|
|
11
12
|
import { stripSpawnTurnQuestionFace } from "../core/ask-question.js";
|
|
12
13
|
import { withDelegationProvenance } from "../core/tool-policy.js";
|
|
13
14
|
import { errorResult } from "../core/tools.js";
|
|
15
|
+
import { notStartedResult } from "../core/delegation-not-started.js";
|
|
14
16
|
import { isHighSurrogate, isLowSurrogate } from "../core/surrogate-safe-slice.js";
|
|
15
17
|
import { newDelegationProvenanceAggregate, reduceDelegationAttestation } from "../core/memory-engine/delegation-provenance.js";
|
|
16
18
|
import { registerDelegationLaunch, replayExternalSettlementEffects, settleDelegation } from "../core/memory-engine/delegation-settlement.js";
|
|
@@ -21,12 +23,14 @@ export { childThinkingSeat, deploymentSubagentThinking, deploymentSubagentTierMo
|
|
|
21
23
|
import { REPORT_BLOCKED_TOOL_NAME } from "../core/runner/synthetic-tools.js";
|
|
22
24
|
import { TOOL_SEARCH_NAME } from "../core/runner/tool-disclosure.js";
|
|
23
25
|
import { OFFLOAD_TOOL_NAME } from "../core/tool-result-store.js";
|
|
24
|
-
import { compileToolSelector, delegationListWhere, snapshotDefinitionLists, toolListsDigest, toolNameAllowed, toolNameListFlaw } from "./tool-filter.js";
|
|
26
|
+
import { compileToolSelector, delegationListWhere, namesEveryTool, snapshotDefinitionLists, toolListsDigest, toolNameAllowed, toolNameListFlaw } from "./tool-filter.js";
|
|
25
27
|
import { readToolNameList, snapshotToolNameList } from "../core/tool-name-list.js";
|
|
26
28
|
import { EXTRA_TOOL_NAMES_CODE, delegationPoolFace, extraToolNamesError, firstUndeclaredExtraTool, readExtraToolNames } from "./extra-tool-names.js";
|
|
27
29
|
import { builtinAgentDefinitions } from "./builtin-agents.js";
|
|
28
30
|
import { normalizePeerName, reservedPeerNameReason } from "./cross-session-ref.js";
|
|
29
31
|
import { SUBAGENT_PROMPT } from "../prompts/default.js";
|
|
32
|
+
import { roleBaseOf } from "../prompt-assembly/role-base.js";
|
|
33
|
+
import { readPromptRole } from "../prompt-assembly/select.js";
|
|
30
34
|
import { hasSessionFork } from "../core/session.js";
|
|
31
35
|
import { isDurablePause, pauseFamily } from "./suspend-guard.js";
|
|
32
36
|
import { childRejection, childTerminalFace, childThrownText } from "./child-failure.js";
|
|
@@ -280,19 +284,6 @@ const WORKTREE_UNAVAILABLE = {
|
|
|
280
284
|
seatSilent: worktreeUnavailableSentence("the runner this tool runs children on does not declare whether it can place a child in a tree other than the caller's (its seat has no canRerootChild), and an undeclared answer is read as no; use a Runner, or add that method to the seat"),
|
|
281
285
|
};
|
|
282
286
|
const placementRefused = (terminal) => terminal?.kind === "failed" && terminal.code === "isolation.unavailable";
|
|
283
|
-
const NOT_STARTED_RESULTS = new WeakSet();
|
|
284
|
-
function notStartedResult(result) {
|
|
285
|
-
const details = result.details;
|
|
286
|
-
if (typeof details === "object" && details !== null)
|
|
287
|
-
NOT_STARTED_RESULTS.add(details);
|
|
288
|
-
return result;
|
|
289
|
-
}
|
|
290
|
-
export function isNotStartedDelegationResult(result) {
|
|
291
|
-
if (typeof result !== "object" || result === null)
|
|
292
|
-
return false;
|
|
293
|
-
const details = result.details;
|
|
294
|
-
return typeof details === "object" && details !== null && NOT_STARTED_RESULTS.has(details);
|
|
295
|
-
}
|
|
296
287
|
const isolationUnavailable = (content) => notStartedResult({
|
|
297
288
|
isError: true,
|
|
298
289
|
content,
|
|
@@ -352,6 +343,14 @@ const ccElapsedTag = (ms) => {
|
|
|
352
343
|
return sec >= 60 ? ` \u00b7 ${Math.floor(sec / 60)}m${sec % 60}s` : ` \u00b7 ${sec}s`;
|
|
353
344
|
};
|
|
354
345
|
const ccCompletionText = (desc, settled, rawStatus, elapsedMs) => `Agent "${desc}" ${settled === "killed" ? "stopped" : settled === "completed" ? "finished" : rawStatus}${ccElapsedTag(elapsedMs)}`;
|
|
346
|
+
const SYNC_ESCAPE_SENTENCE = "Pass `run_in_background: false` for a synchronous run when you need the result before continuing (a named agent always runs in the background).";
|
|
347
|
+
function continuationSentence(toolName, durableRevival, forkOffered) {
|
|
348
|
+
return (`Where the SendMessage tool is mounted, use it with the agent's ID or name to message a RUNNING agent, or — when session retention${durableRevival ? " or durable named-agent revival" : ""} is enabled — ` +
|
|
349
|
+
`to continue a COMPLETED one with its context intact; a new ${toolName} call starts fresh${forkOffered ? ` (except subagent_type: "${FORK_SUBAGENT_TYPE}", which inherits your context)` : ""}.`);
|
|
350
|
+
}
|
|
351
|
+
function launchContinuationSentence(taskId) {
|
|
352
|
+
return `Where the SendMessage tool is mounted, use it with to: '${taskId}', summary: '<5-10 word recap>' to continue this agent.`;
|
|
353
|
+
}
|
|
355
354
|
function resumabilityClaim(f) {
|
|
356
355
|
if (f.status === "killed" && f.stoppedBy === "user")
|
|
357
356
|
return false;
|
|
@@ -1248,7 +1247,7 @@ export function asyncLaunchedReceipt(p) {
|
|
|
1248
1247
|
const noteLines = (p.notes ?? []).filter((n) => n !== undefined && n !== "");
|
|
1249
1248
|
const oneShotBlocked = p.notify && p.oneShot === true;
|
|
1250
1249
|
return (`Async agent launched successfully. (${launchReceiptNoQuoteClause(", including the task_id below,")})\n` +
|
|
1251
|
-
`task_id: ${p.taskId} (internal ID - do not mention to user.
|
|
1250
|
+
`task_id: ${p.taskId} (internal ID - do not mention to user. ${launchContinuationSentence(p.taskId)})\n` +
|
|
1252
1251
|
(oneShotBlocked
|
|
1253
1252
|
? `${p.workingLine} This is a ONE-SHOT submission — there is no later turn for a background notification to land in, so do NOT end your turn expecting one. Actively wait instead: TaskOutput(task_id: "${p.taskId}", block: true). If it is still running after the wait, wait again (bounded) rather than ending the turn, or write out your best available answer now if you are near your own time budget.\n`
|
|
1254
1253
|
: p.notify
|
|
@@ -1270,6 +1269,7 @@ function runnerModelCatalog(runner) {
|
|
|
1270
1269
|
}
|
|
1271
1270
|
}
|
|
1272
1271
|
export function createSubagentTool(opts) {
|
|
1272
|
+
readPromptRole("SubagentToolOptions.promptRole", opts.promptRole);
|
|
1273
1273
|
const catalog = opts.runner.agentCatalog;
|
|
1274
1274
|
if (opts.agents === undefined && catalog?.agents)
|
|
1275
1275
|
opts = { ...opts, agents: catalog.agents };
|
|
@@ -1326,7 +1326,7 @@ export function createSubagentTool(opts) {
|
|
|
1326
1326
|
export function agentToolsNote(def) {
|
|
1327
1327
|
const allowRead = readToolNameList(def.allowTools);
|
|
1328
1328
|
const allow = allowRead.kind === "entries" ? allowRead.entries.filter((entry) => typeof entry === "string") : [];
|
|
1329
|
-
const hasAllow = allow.length > 0 && !allow.
|
|
1329
|
+
const hasAllow = allow.length > 0 && !allow.some(namesEveryTool);
|
|
1330
1330
|
const denyRead = readToolNameList(def.denyTools);
|
|
1331
1331
|
const deny = denyRead.kind === "entries" ? denyRead.entries.filter((entry) => typeof entry === "string") : [];
|
|
1332
1332
|
const hasDeny = deny.length > 0;
|
|
@@ -1427,41 +1427,41 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
|
|
|
1427
1427
|
: `- Each agent type's model, thinking level, and tools come from its agent definition.\n`) +
|
|
1428
1428
|
`- \`isolation: "worktree"\` gives the agent its own git worktree (auto-cleaned if unchanged).` +
|
|
1429
1429
|
(opts.background
|
|
1430
|
-
? `\n- Subagents run in the background by default${opts.background.notify ? "; you'll be notified when one completes" : "; the receipt's task_id retrieves progress and results via the TaskOutput tool where mounted"}.
|
|
1431
|
-
`-
|
|
1430
|
+
? `\n- Subagents run in the background by default${opts.background.notify ? "; you'll be notified when one completes" : "; the receipt's task_id retrieves progress and results via the TaskOutput tool where mounted"}. ${SYNC_ESCAPE_SENTENCE} Never fabricate or predict a pending agent's results — ${opts.background.notify ? "the notification is never something you write yourself; " : ""}if the user asks before it arrives, say it's still running.\n` +
|
|
1431
|
+
`- ${continuationSentence(opts.name ?? DEFAULT_SUBAGENT_TOOL_NAME, opts.background.agentStore !== undefined, forkOffered)}`
|
|
1432
1432
|
: `\n- \`run_in_background\` is unavailable here — only synchronous subagents.`),
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1433
|
+
descriptionVariants: [{ id: "classic", traits: { noneOf: ["lean_prompt"] }, text: `Launch a new agent. Delegate a self-contained subtask to an isolated sub-agent and get back a single report. ` +
|
|
1434
|
+
(opts.purpose ? `This sub-agent is for: ${opts.purpose}. ` : "") +
|
|
1435
|
+
(hasAgents ? `Available agent types are listed in <system-reminder> messages in the conversation. If \`subagent_type\` is omitted, a general-purpose sub-agent is used.\n` : "") +
|
|
1436
|
+
`The sub-agent starts with a clean context (it does NOT see this conversation), so put everything it needs in 'prompt'. ` +
|
|
1437
|
+
`It returns status (completed/blocked/failed) and a result you must verify before deciding the overall task is done.\n\n` +
|
|
1438
|
+
`When NOT to delegate (do it yourself — it's faster and you keep the understanding):\n` +
|
|
1439
|
+
`- Reading a specific known file → use Read directly.\n` +
|
|
1440
|
+
`- Finding a known symbol/class/definition, or searching within 2-3 known files → use Grep/Glob/Read.\n` +
|
|
1441
|
+
`- A lookup where you already know what you want and roughly where it is → just do it. Delegate open-ended INVESTIGATIONS (you don't know where the answer is), not lookups.\n\n` +
|
|
1442
|
+
`Writing the 'prompt' — brief the agent like a smart colleague who just walked into the room — it hasn't seen this conversation, doesn't know what you've tried, doesn't understand why this task matters:\n` +
|
|
1443
|
+
`- Make it fully self-contained and highly detailed: the sub-agent does the whole task end-to-end in one shot — you can't course-correct mid-run.\n` +
|
|
1444
|
+
`- State exactly what it must RETURN (e.g. "report the file:line of each call site", not "look into the call sites").\n` +
|
|
1445
|
+
`- Say explicitly whether you want it to WRITE CODE or only RESEARCH/REPORT — otherwise it may guess wrong.\n` +
|
|
1446
|
+
`- Never delegate understanding. Don't write "based on your findings, fix the bug" or "based on the research, implement it." Those phrases push synthesis onto the agent instead of doing it yourself. Write prompts that prove you understood: include file paths, line numbers, what specifically to change.\n\n` +
|
|
1447
|
+
`Use it for self-contained, parallelizable subtasks (e.g. independent searches/investigations) — it protects your main context; don't overuse it for trivial steps you can do directly. ` +
|
|
1448
|
+
`Once you delegate a piece of research, rely on the sub-agent's report rather than repeating that search yourself. ` +
|
|
1449
|
+
`The agent's final message is returned to you as the tool result; it is not shown to the user — relay what matters.\n\n` +
|
|
1450
|
+
`If the agent reports an action was refused because an approval could not be resolved, do not send the approval back as a message — messages never clear a permission gate. Surface the agent's report of the prepared action and its refusal text to your user. (An agent PARKED at an approval gate is not refused — it is waiting, and resumes when the pending approval is decided.)\n\n` +
|
|
1451
|
+
`Orchestration: When you launch multiple agents for independent work, send them in a single message with multiple tool uses so they run concurrently. Keep anything that needs shared context single-threaded. Once you've delegated a piece of work, don't also do it yourself — wait for the report.` +
|
|
1452
|
+
(forkOffered
|
|
1453
|
+
? `\n\nsubagent_type "${FORK_SUBAGENT_TYPE}" is built in: it spawns a child that INHERITS your full current context (this entire conversation — no re-explaining, shared prompt cache) and works on 'prompt' as its directive. The fork always runs on YOUR model (the 'model' parameter is ignored for forks) and is not available inside a forked agent.`
|
|
1454
|
+
: `\n\nNote: this deployment defines its own "${FORK_SUBAGENT_TYPE}" agent type, which OVERRIDES the built-in context-inheriting fork routing — subagent_type "${FORK_SUBAGENT_TYPE}" delegates to that definition instead.`) +
|
|
1455
|
+
`\n\nThe 'model' parameter optionally overrides the sub-agent's model. If omitted, the agent definition's model (or the inherited default) applies.` +
|
|
1456
|
+
`\nSet isolation: "worktree" to give the agent its own detached git worktree (auto-removed if it made no changes; kept for you to inspect/merge when it did).` +
|
|
1457
|
+
(opts.background
|
|
1458
|
+
?
|
|
1459
|
+
(opts.background.notify
|
|
1460
|
+
? `\n\nAgents run in the background by default. When an agent runs in the background, you will be automatically notified when it completes — do NOT sleep, poll, or proactively check on its progress. Continue with other work or respond to the user instead. ${SYNC_ESCAPE_SENTENCE}`
|
|
1461
|
+
: `\n\nAgents run in the background by default. A background agent's result is not pushed automatically — the launch receipt's task_id retrieves progress and results via the TaskOutput tool where mounted. ${SYNC_ESCAPE_SENTENCE}`) +
|
|
1462
|
+
` ${continuationSentence(opts.name ?? DEFAULT_SUBAGENT_TOOL_NAME, opts.background.agentStore !== undefined, forkOffered)}` +
|
|
1463
|
+
`\n\n**Don't race.** After launching, you know nothing about what the agent found. Never fabricate or predict agent results in any format — not as prose, summary, or structured output. ${opts.background.notify ? "The notification arrives as a user-role message in a later turn; it is never something you write yourself." : "The result exists only when you retrieve it; it is never something you write yourself."}`
|
|
1464
|
+
: `\n\nThe run_in_background parameter is not available in this context. Only synchronous subagents are supported.`) }],
|
|
1465
1465
|
parameters: Type.Object({
|
|
1466
1466
|
subagent_type: Type.Optional(Type.String({ description: "The type of specialized agent to use for this task" })),
|
|
1467
1467
|
description: Type.String({ description: "A short (3-5 word) description of the task." }),
|
|
@@ -1469,7 +1469,9 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
|
|
|
1469
1469
|
name: Type.Optional(Type.String({
|
|
1470
1470
|
maxLength: 64,
|
|
1471
1471
|
pattern: "^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$",
|
|
1472
|
-
description:
|
|
1472
|
+
description: opts.background
|
|
1473
|
+
? 'Name for the spawned agent. Where the SendMessage tool is mounted, the name makes the agent addressable via SendMessage({to: name}); either way a named agent always runs in the background (omit name to run one synchronously). "main" is reserved.'
|
|
1474
|
+
: 'Name for the spawned agent — a label only: agents on this mount run synchronously, so a name does not make one addressable. "main" is reserved.',
|
|
1473
1475
|
})),
|
|
1474
1476
|
cwd: Type.Optional(Type.String({
|
|
1475
1477
|
description: 'Absolute path to run the agent in. Overrides the working directory for all filesystem and shell operations within this agent. Mutually exclusive with isolation: "worktree".',
|
|
@@ -1486,8 +1488,8 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
|
|
|
1486
1488
|
? {
|
|
1487
1489
|
run_in_background: Type.Optional(Type.Boolean({
|
|
1488
1490
|
description: opts.background.notify
|
|
1489
|
-
? "Agents run in the background by default; you will be notified when one completes. Set to false to run this agent synchronously when you need its result before continuing."
|
|
1490
|
-
: "Agents run in the background by default; the launch receipt's task_id retrieves progress and results via the TaskOutput tool where mounted. Set to false to run this agent synchronously when you need its result before continuing.",
|
|
1491
|
+
? "Agents run in the background by default; you will be notified when one completes. Set to false to run this agent synchronously when you need its result before continuing (a named agent always runs in the background)."
|
|
1492
|
+
: "Agents run in the background by default; the launch receipt's task_id retrieves progress and results via the TaskOutput tool where mounted. Set to false to run this agent synchronously when you need its result before continuing (a named agent always runs in the background).",
|
|
1491
1493
|
})),
|
|
1492
1494
|
}
|
|
1493
1495
|
: {}),
|
|
@@ -1522,7 +1524,6 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
|
|
|
1522
1524
|
}
|
|
1523
1525
|
const omitted = rawType === "" || (!generalPurposeShadowed && rawType === GENERAL_PURPOSE_SUBAGENT_TYPE);
|
|
1524
1526
|
const def = hasAgents && !wantsFork && !omitted ? agentMap.get(rawType) : undefined;
|
|
1525
|
-
const wantsBackground = opts.background !== undefined && (a.run_in_background !== false || def?.background === true);
|
|
1526
1527
|
const spawnAgentType = wantsFork ? FORK_SUBAGENT_TYPE : omitted ? GENERAL_PURPOSE_SUBAGENT_TYPE : rawType;
|
|
1527
1528
|
const allowFlaw = toolNameListFlaw(delegationListWhere(toolName, def?.name), "allowed", def !== undefined ? def.allowTools : opts.allowTools);
|
|
1528
1529
|
if (allowFlaw !== undefined)
|
|
@@ -1553,6 +1554,7 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
|
|
|
1553
1554
|
});
|
|
1554
1555
|
}
|
|
1555
1556
|
}
|
|
1557
|
+
const wantsBackground = opts.background !== undefined && (a.run_in_background !== false || def?.background === true || agentName !== undefined);
|
|
1556
1558
|
if (a.cwd !== undefined && typeof a.cwd !== "string") {
|
|
1557
1559
|
return notStartedResult({ isError: true, content: "Sub-agent not started: cwd must be an absolute path string.", details: { error: "cwd.relative" } });
|
|
1558
1560
|
}
|
|
@@ -1843,8 +1845,9 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
|
|
|
1843
1845
|
const parentMcp = opts.tools === undefined && extraToolsNote === undefined ? ctx.mountedMcp?.() : undefined;
|
|
1844
1846
|
const childMcp = parentMcp !== undefined ? inheritedMcpDeclarations(parentMcp, compileToolSelector([...childCeiling, childOwnLayer])) : undefined;
|
|
1845
1847
|
const childTools = [...childPool];
|
|
1846
|
-
const
|
|
1847
|
-
const
|
|
1848
|
+
const childRoleBase = roleBaseOf([def !== undefined ? { systemPrompt: def.systemPrompt } : undefined, { promptRole: opts.promptRole, systemPrompt: opts.systemPrompt }]);
|
|
1849
|
+
const childSystemPrompt = childRoleBase?.systemPrompt;
|
|
1850
|
+
const childDefaultPersona = childRoleBase === undefined && !wantsFork ? SUBAGENT_PROMPT : undefined;
|
|
1848
1851
|
const defMaxTurns = typeof def?.maxTurns === "number" && Number.isFinite(def.maxTurns) && def.maxTurns > 0 ? def.maxTurns : undefined;
|
|
1849
1852
|
const childLimits = defMaxTurns !== undefined ? { ...opts.limits, maxTurns: defMaxTurns } : opts.limits;
|
|
1850
1853
|
const nextExcluded = def ? new Set([...excluded, def.name]) : excluded;
|
|
@@ -1923,7 +1926,7 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
|
|
|
1923
1926
|
...(ctx.deferTools !== undefined ? { deferTools: [...ctx.deferTools] } : {}),
|
|
1924
1927
|
...(ctx.alwaysLoadTools !== undefined ? { alwaysLoadTools: [...ctx.alwaysLoadTools] } : {}),
|
|
1925
1928
|
...(ctx.restoreGatedTools !== undefined ? { restoreGatedTools: ctx.restoreGatedTools === true ? true : [...ctx.restoreGatedTools] } : {}),
|
|
1926
|
-
...(ctx.
|
|
1929
|
+
...(ctx.promptLean !== undefined ? { promptLean: ctx.promptLean } : {}),
|
|
1927
1930
|
...engineHeadlessLegSeats(),
|
|
1928
1931
|
...childClampSeats(clampSourceOf(ctx)),
|
|
1929
1932
|
enableBlockedReport: false,
|
|
@@ -2200,6 +2203,7 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
|
|
|
2200
2203
|
tools: childTools,
|
|
2201
2204
|
...(childMcp !== undefined && childMcp.length > 0 ? { mcp: childMcp } : {}),
|
|
2202
2205
|
systemPrompt: childSystemPrompt,
|
|
2206
|
+
...(childRoleBase?.promptRole !== undefined ? { promptRole: childRoleBase.promptRole } : {}),
|
|
2203
2207
|
...(def?.memory ? { memory: def.memory } : {}),
|
|
2204
2208
|
...(def?.skills?.length ? { skills: def.skills } : {}),
|
|
2205
2209
|
...(def?.memoryPersistenceCapable !== undefined ? { memoryPersistenceCapable: def.memoryPersistenceCapable } : {}),
|
|
@@ -2211,7 +2215,7 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
|
|
|
2211
2215
|
...(ctx.deferTools !== undefined ? { deferTools: [...ctx.deferTools] } : {}),
|
|
2212
2216
|
...(ctx.alwaysLoadTools !== undefined ? { alwaysLoadTools: [...ctx.alwaysLoadTools] } : {}),
|
|
2213
2217
|
...(ctx.restoreGatedTools !== undefined ? { restoreGatedTools: ctx.restoreGatedTools === true ? true : [...ctx.restoreGatedTools] } : {}),
|
|
2214
|
-
...(ctx.
|
|
2218
|
+
...(ctx.promptLean !== undefined ? { promptLean: ctx.promptLean } : {}),
|
|
2215
2219
|
...(ctx.getApiKeyAndHeaders !== undefined ? { getApiKeyAndHeaders: ctx.getApiKeyAndHeaders } : {}),
|
|
2216
2220
|
enableBlockedReport: true,
|
|
2217
2221
|
limits: childLimits,
|
|
@@ -2376,6 +2380,7 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
|
|
|
2376
2380
|
objective: objectiveSample.text,
|
|
2377
2381
|
tools: spawnToolNames,
|
|
2378
2382
|
systemPrompt: systemPromptSample?.text,
|
|
2383
|
+
...(childRoleBase?.promptRole !== undefined ? { promptRole: childRoleBase.promptRole } : {}),
|
|
2379
2384
|
...(spawnCoverage ? { reviewCoverage: spawnCoverage } : {}),
|
|
2380
2385
|
},
|
|
2381
2386
|
toolCallId: ctx.toolCallId,
|
|
@@ -2408,7 +2413,7 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
|
|
|
2408
2413
|
releaseForked = forkHandle?.release;
|
|
2409
2414
|
}
|
|
2410
2415
|
else {
|
|
2411
|
-
forkedId = (await opts.runner.sessions.fork?.(ctx.sessionId, ctx.principal ?? null)) ?? null;
|
|
2416
|
+
forkedId = (await opts.runner.sessions.fork?.(ctx.sessionId, principalNameOf(ctx.principal) ?? null)) ?? null;
|
|
2412
2417
|
}
|
|
2413
2418
|
}
|
|
2414
2419
|
catch (e) {
|
|
@@ -3834,7 +3839,6 @@ function createSubagentToolNode(opts, depth, excluded, extraToolsBudget) {
|
|
|
3834
3839
|
: "",
|
|
3835
3840
|
`stats: turns=${child.stats.turns} tokens=${child.stats.tokens}`,
|
|
3836
3841
|
!retainEntry && failureRetained ? `transcript_id: ${child.sessionId} (internal ID - do not mention to user; inspect via AgentTranscript where mounted)` : "",
|
|
3837
|
-
retainEntry ? `resumable: true` : "",
|
|
3838
3842
|
failureRetained
|
|
3839
3843
|
? `session_retained: this child's session is kept for a short time (~15 min) so its transcript stays inspectable via transcript_id; it is released automatically afterwards.`
|
|
3840
3844
|
: "",
|
|
@@ -14,8 +14,8 @@ import { type ToolNameListReading } from "../core/tool-name-list.js";
|
|
|
14
14
|
* - a layer above a run (its ceiling) bounds it: a child's `"*"` never widens what its parent could use.
|
|
15
15
|
*
|
|
16
16
|
* An entry is read by the rule syntax ({@link readDeniedEntry}); a protocol spelling (`mcp__srv`, `mcp__srv__*`, a glob over the
|
|
17
|
-
* tool segment) reaches the tools of that peer, including ones it lists later
|
|
18
|
-
* reaches one mounted later. Judged at the prepare that receives it
|
|
17
|
+
* tool segment) reaches the tools of that peer, including ones it lists later, and on a denied list any glob (`Re*d`, `*`) the
|
|
18
|
+
* names it matches; an entry no tool answers to is kept by name and reaches one mounted later. Judged at the prepare that receives it.
|
|
19
19
|
*
|
|
20
20
|
* `"*"` in an allowed list is the "allow all" sentinel and never a name (`caller-tool-name.ts` refuses it at the mount).
|
|
21
21
|
*/
|
|
@@ -66,8 +66,8 @@ export declare function toolNameListFlaw(where: string, side: ToolNameListSide,
|
|
|
66
66
|
export declare function snapshotDefinitionLists(def: AgentDefinition): AgentDefinition;
|
|
67
67
|
/**
|
|
68
68
|
* What ONE tool-name list reaches — the single reading every consumer of an allowed or a denied list takes: `names` are exact
|
|
69
|
-
* spellings (a tool answers to its wire name and every alias it declares); `covering` the
|
|
70
|
-
* (`mcp__srv`, `
|
|
69
|
+
* spellings (a tool answers to its wire name and every alias it declares); `covering` the spellings that cover a SET
|
|
70
|
+
* ({@link isCoveringRuleName}: `mcp__srv`, `mcp__srv__get_*`; on a denied list any glob, `Re*d`, `*`).
|
|
71
71
|
*/
|
|
72
72
|
export interface ToolNameListReach {
|
|
73
73
|
readonly names: ReadonlySet<string>;
|
|
@@ -89,9 +89,11 @@ export declare function isCanonicalToolName(entry: unknown): boolean;
|
|
|
89
89
|
* refuses it before the park, the reader again.
|
|
90
90
|
*/
|
|
91
91
|
export declare function persistedToolNameList(entries: readonly string[], side: ToolNameListSide): string[];
|
|
92
|
+
/** Is this allowed-tools entry the selector's wildcard (`*`, `*()`, `*(*)`) — no allowlist on its layer? The one test every reader asks. */
|
|
93
|
+
export declare function namesEveryTool(entry: unknown): boolean;
|
|
92
94
|
/**
|
|
93
95
|
* What an allowed-tools value admits, or `undefined` when it names no allowlist: absent, `null`, or a list holding the wildcard
|
|
94
|
-
* ({@link
|
|
96
|
+
* ({@link namesEveryTool}). A value that is not a list admits NOTHING (refused before the run).
|
|
95
97
|
*/
|
|
96
98
|
export declare function readAllowedToolList(allowTools: unknown): ToolNameListReach | undefined;
|
|
97
99
|
/** What a denied value hides: its string entries read as {@link readDeniedEntry} reads them (an entry it reads as `unreadable` or not a string, or a value that is not a list, hides nothing here — the judgment before the run refuses each). */
|
|
@@ -3,8 +3,8 @@ import { canonicalize, UNCANONICALIZABLE } from "../core/canonical-json.js";
|
|
|
3
3
|
import { SPAWNER_SURFACE_LEG_KINDS } from "../core/tool-face.js";
|
|
4
4
|
import { ruleSpellingOf } from "../core/permission-rule-syntax.js";
|
|
5
5
|
import { TOOL_CATALOG_ENTRIES } from "../core/tool-catalog-entries.js";
|
|
6
|
-
import {
|
|
7
|
-
import { splitNamespacedName
|
|
6
|
+
import { isCoveringRuleName, ruleNameCovers, ruleNameReachIntoPeer } from "../core/namespaced-rule-name.js";
|
|
7
|
+
import { splitNamespacedName } from "../core/tool-name-aliases.js";
|
|
8
8
|
import { readToolNameList, snapshotToolNameList, valueTypeLabel } from "../core/tool-name-list.js";
|
|
9
9
|
export function readDeniedEntry(entry) {
|
|
10
10
|
if (typeof entry !== "string")
|
|
@@ -75,20 +75,23 @@ function reachOf(entries, side) {
|
|
|
75
75
|
const name = toolNameOfEntry(entry, side);
|
|
76
76
|
if (name === undefined)
|
|
77
77
|
continue;
|
|
78
|
-
if (
|
|
78
|
+
if (isCoveringRuleName(name, side === "denied" ? "deny" : "allow"))
|
|
79
79
|
covering.push(name);
|
|
80
|
-
else if (
|
|
80
|
+
else if (!name.includes("*"))
|
|
81
81
|
names.add(name);
|
|
82
82
|
}
|
|
83
83
|
return { names, covering };
|
|
84
84
|
}
|
|
85
|
+
export function namesEveryTool(entry) {
|
|
86
|
+
return toolNameOfEntry(entry, "allowed") === "*";
|
|
87
|
+
}
|
|
85
88
|
export function readAllowedToolList(allowTools) {
|
|
86
89
|
if (allowTools === undefined || allowTools === null)
|
|
87
90
|
return undefined;
|
|
88
91
|
const list = readToolNameList(allowTools);
|
|
89
92
|
if (list.kind !== "entries")
|
|
90
93
|
return reachOf([], "allowed");
|
|
91
|
-
if (list.entries.some(
|
|
94
|
+
if (list.entries.some(namesEveryTool))
|
|
92
95
|
return undefined;
|
|
93
96
|
return reachOf(list.entries, "allowed");
|
|
94
97
|
}
|
|
@@ -101,7 +104,7 @@ export function listReaches(reach, tool) {
|
|
|
101
104
|
if (reach.names.has(spelling))
|
|
102
105
|
return true;
|
|
103
106
|
for (const pattern of reach.covering)
|
|
104
|
-
if (
|
|
107
|
+
if (ruleNameCovers(pattern, spelling))
|
|
105
108
|
return true;
|
|
106
109
|
}
|
|
107
110
|
return false;
|
|
@@ -114,11 +117,11 @@ export function protocolToolNames(legs) {
|
|
|
114
117
|
return [...new Set(PROTOCOL_ROWS.filter((r) => r.legs.some((l) => legs.includes(l))).map((r) => r.name))];
|
|
115
118
|
}
|
|
116
119
|
function reachTouchesPeer(reach, peer) {
|
|
117
|
-
const into = (spelling) =>
|
|
120
|
+
const into = (spelling) => ruleNameReachIntoPeer(spelling, peer.ns, peer.peer) !== "none";
|
|
118
121
|
return [...reach.names].some(into) || reach.covering.some(into);
|
|
119
122
|
}
|
|
120
123
|
function reachCoversPeer(reach, peer) {
|
|
121
|
-
return reach.covering.some((pattern) =>
|
|
124
|
+
return reach.covering.some((pattern) => ruleNameReachIntoPeer(pattern, peer.ns, peer.peer) === "all");
|
|
122
125
|
}
|
|
123
126
|
export function isToolSelectorLayer(layer) {
|
|
124
127
|
return typeof layer === "object" && layer !== null && !Array.isArray(layer);
|
|
@@ -143,7 +146,7 @@ export function compileToolSelector(layers, legs = []) {
|
|
|
143
146
|
const split = splitNamespacedName(prefix);
|
|
144
147
|
if (split === undefined)
|
|
145
148
|
return false;
|
|
146
|
-
const peer = { ns: split.ns
|
|
149
|
+
const peer = { ns: split.ns, peer: split.peer };
|
|
147
150
|
return compiled.every((l) => (l.allow === undefined || reachTouchesPeer(l.allow, peer)) && !reachCoversPeer(l.deny, peer));
|
|
148
151
|
},
|
|
149
152
|
});
|
package/dist/agents/verify.d.ts
CHANGED
|
@@ -338,8 +338,9 @@ export interface DeveloperTaskConfig extends VerifyConfig {
|
|
|
338
338
|
verify?: boolean;
|
|
339
339
|
}
|
|
340
340
|
/**
|
|
341
|
-
* One-stop developer-mode convenience:
|
|
342
|
-
* own
|
|
341
|
+
* One-stop developer-mode convenience: gives the task the catalog's coding role base by word (`promptRole: "code"`, on
|
|
342
|
+
* the task's own seat, so no role preset overtakes it) unless the task names a role base of its own (`promptRole` or
|
|
343
|
+
* `systemPrompt`), and, by default, runs the {@link runWithVerification} gate. Equivalent to wiring
|
|
343
344
|
* the building blocks by hand — use the building blocks directly when you want full control.
|
|
344
345
|
*
|
|
345
346
|
* Pair with a role map that gives a strong implementation model and cheaper helper/verifier models for
|
package/dist/agents/verify.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Type } from "typebox";
|
|
2
|
-
import {
|
|
2
|
+
import { namesRoleBase } from "../prompt-assembly/role-base.js";
|
|
3
3
|
import { releaseSession } from "./session-util.js";
|
|
4
4
|
import { childClampSeats, clampSourceOf, engineHeadlessLegSeats } from "../core/child-clamp-seats.js";
|
|
5
5
|
import { mapNestedSuspend, isDurablePause, pauseFamily } from "./suspend-guard.js";
|
|
@@ -179,7 +179,7 @@ export async function verifyCompleted(runner, result, specBase, objective, confi
|
|
|
179
179
|
? { restoreGatedTools: Array.isArray(specBase.restoreGatedTools) ? [...specBase.restoreGatedTools] : specBase.restoreGatedTools }
|
|
180
180
|
: {}),
|
|
181
181
|
...(specBase.clientContext !== undefined ? { clientContext: { ...specBase.clientContext } } : {}),
|
|
182
|
-
...(specBase.
|
|
182
|
+
...(specBase.promptLean !== undefined ? { promptLean: specBase.promptLean } : {}),
|
|
183
183
|
signal: specBase.signal,
|
|
184
184
|
};
|
|
185
185
|
const v = await runner.runTask(verifierSpec, withLegIdentity(legInternals(), { kind: "verifier", round }));
|
|
@@ -297,7 +297,7 @@ export async function resumeWithVerification(runner, token, outcome, taskConfig,
|
|
|
297
297
|
return verifyCompleted(runner, result, taskConfig, objective, config, internals);
|
|
298
298
|
}
|
|
299
299
|
export async function runDeveloperTask(runner, spec, config = {}, internals) {
|
|
300
|
-
const implSpec =
|
|
300
|
+
const implSpec = namesRoleBase(spec) ? spec : { ...spec, promptRole: "code" };
|
|
301
301
|
if (config.verify === false) {
|
|
302
302
|
const result = await runner.runTask(implSpec, withLegIdentity(internals, IMPL_LEG));
|
|
303
303
|
return { ...result, verification: { verdict: "unverified", unverifiedReason: "opted_out", rounds: 0, findings: [] } };
|
package/dist/brain/anthropic.js
CHANGED
|
@@ -5,21 +5,15 @@ import { DEGENERATE_MESSAGE, trimDegenerateTail } from "./repetition.js";
|
|
|
5
5
|
import { STREAM_TORN_WARNING, createRepetitionPoll, createStreamEndLedger, modelOutputInvalidOf, noteResponseModel, nameMissingCause, parseStreamedToolArgs, placeTurnNotes, truncationCauseClause } from "./stream-shared.js";
|
|
6
6
|
import { admitToolCallId, providerResultIds, providerToolCallId, responseToolCallIds } from "./tool-call-id.js";
|
|
7
7
|
import { emitBrainTelemetry, reportReasoningWireFacts } from "./status-sink.js";
|
|
8
|
-
import { errorResultMediaNote, IMAGE_OMITTED_NO_VISION,
|
|
9
|
-
import { ANTHROPIC_RESERVED, OUTPUT_CAP_KEYS, applyExtraBody, effectiveOutputCap, headerBagOnce, lockHeader, mergeHeaders,
|
|
8
|
+
import { errorResultMediaNote, IMAGE_OMITTED_NO_VISION, imageWithholdOf, reportImagesWithheld, sendableImages } from "./media-degrade.js";
|
|
9
|
+
import { ANTHROPIC_RESERVED, OUTPUT_CAP_KEYS, applyExtraBody, effectiveOutputCap, headerBagOnce, lockHeader, mergeHeaders, takeHeaderSpellings } from "./request-params.js";
|
|
10
10
|
import { admitRouteRequest, applyRouteCredentialHeaders, assertServableRequestRoot, brainConfigSnapshot, createBrainRouteJudge, joinRequestUrl, resolveRequestRootOf, resolveRouteCredential } from "./route-adjudicator.js";
|
|
11
11
|
import { requestRouteOf } from "./request-route.js";
|
|
12
12
|
import { NAMES_AS_WRITTEN, resolveProviderDialect, endpointToolNames } from "./provider-dialect.js";
|
|
13
|
-
import {
|
|
13
|
+
import { applyReasoningToRequest, mergeReasoningHeaders } from "./reasoning-request.js";
|
|
14
14
|
import { runStreamingBrain } from "./stream-engine.js";
|
|
15
15
|
import { refuseRetiredTimeoutKnobs } from "./timeout.js";
|
|
16
16
|
import { resolveFetch } from "./transport.js";
|
|
17
|
-
function thinkingBudget(maxTokens, share, fixed, hardCap = false) {
|
|
18
|
-
const max = hardCap ? maxTokens : Math.max(maxTokens, MIN_THINKING_TOKENS * 2);
|
|
19
|
-
const want = fixed ?? Math.floor(max * share);
|
|
20
|
-
const budget = Math.min(Math.max(MIN_THINKING_TOKENS, want), max - 1);
|
|
21
|
-
return { max, budget };
|
|
22
|
-
}
|
|
23
17
|
const EPHEMERAL = { type: "ephemeral" };
|
|
24
18
|
const DOCUMENT_OMITTED_NO_VISION = "[PDF document omitted: the serving model does not support document input; extract the text via Bash instead (e.g. `pdftotext`).]";
|
|
25
19
|
function textOf(content) {
|
|
@@ -27,7 +21,7 @@ function textOf(content) {
|
|
|
27
21
|
? content
|
|
28
22
|
: content.filter((c) => c.type === "text" && typeof c.text === "string").map((c) => c.text).join("");
|
|
29
23
|
}
|
|
30
|
-
function toUserBlocks(content,
|
|
24
|
+
function toUserBlocks(content, withhold) {
|
|
31
25
|
if (typeof content === "string") {
|
|
32
26
|
return content.length > 0 ? [{ type: "text", text: content }] : [];
|
|
33
27
|
}
|
|
@@ -38,7 +32,7 @@ function toUserBlocks(content, supportsVision = true) {
|
|
|
38
32
|
blocks.push({ type: "text", text: c.text });
|
|
39
33
|
}
|
|
40
34
|
else if (c.type === "image" && c.data && c.mimeType) {
|
|
41
|
-
if (
|
|
35
|
+
if (withhold === undefined)
|
|
42
36
|
blocks.push({ type: "image", source: { type: "base64", media_type: c.mimeType, data: c.data } });
|
|
43
37
|
else {
|
|
44
38
|
omitted++;
|
|
@@ -46,12 +40,13 @@ function toUserBlocks(content, supportsVision = true) {
|
|
|
46
40
|
}
|
|
47
41
|
}
|
|
48
42
|
}
|
|
49
|
-
if (
|
|
50
|
-
|
|
43
|
+
if (withhold !== undefined)
|
|
44
|
+
reportImagesWithheld(withhold, omitted);
|
|
51
45
|
return blocks;
|
|
52
46
|
}
|
|
53
47
|
function toAnthropicMessages(ctx, model, toolNames) {
|
|
54
|
-
const
|
|
48
|
+
const imageWithhold = imageWithholdOf(model);
|
|
49
|
+
const supportsVision = imageWithhold === undefined;
|
|
55
50
|
const raw = [];
|
|
56
51
|
let pendingDocs = [];
|
|
57
52
|
const flushDocs = () => {
|
|
@@ -65,7 +60,7 @@ function toAnthropicMessages(ctx, model, toolNames) {
|
|
|
65
60
|
if (m.role !== "toolResult")
|
|
66
61
|
flushDocs();
|
|
67
62
|
if (m.role === "user") {
|
|
68
|
-
const ub = toUserBlocks(m.content,
|
|
63
|
+
const ub = toUserBlocks(m.content, imageWithhold);
|
|
69
64
|
raw.push({ role: "user", content: ub.length ? ub : [{ type: "text", text: NO_CONTENT }] });
|
|
70
65
|
}
|
|
71
66
|
else if (m.role === "assistant") {
|
|
@@ -97,7 +92,7 @@ function toAnthropicMessages(ctx, model, toolNames) {
|
|
|
97
92
|
const docs = parts ? parts.filter((c) => c.type === "document") : [];
|
|
98
93
|
const rest = docs.length > 0 && parts ? parts.filter((c) => c.type !== "document") : m.content;
|
|
99
94
|
const hasImage = !m.isError && Array.isArray(rest) && rest.some((c) => c.type === "image");
|
|
100
|
-
let inner = hasImage ? toUserBlocks(rest,
|
|
95
|
+
let inner = hasImage ? toUserBlocks(rest, imageWithhold) : textOf(rest);
|
|
101
96
|
if (docs.length > 0 && !m.isError) {
|
|
102
97
|
if (supportsVision) {
|
|
103
98
|
for (const d of docs) {
|
|
@@ -290,68 +285,30 @@ export function createAnthropicBrain(given = {}) {
|
|
|
290
285
|
if (options?.temperature !== undefined && anthCompat.supportsTemperature !== false) {
|
|
291
286
|
body.temperature = options.temperature;
|
|
292
287
|
}
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
if (budgetCapSkipsThinking(builtReasoningFacts.outputCapTokens, builtReasoningFacts.hardOutputCap)) {
|
|
304
|
-
body.thinking = undefined;
|
|
305
|
-
delete body.thinking;
|
|
306
|
-
}
|
|
307
|
-
else {
|
|
308
|
-
const share = config.thinkingBudgetShare ?? reasoningBudgetShare(options.reasoning);
|
|
309
|
-
const { max, budget } = thinkingBudget(body.max_tokens, share, config.thinkingBudgetTokens, hardCap);
|
|
310
|
-
body.max_tokens = max;
|
|
311
|
-
body.thinking = { type: "enabled", budget_tokens: budget };
|
|
312
|
-
thinkingOn = true;
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
if (thinkingOn)
|
|
316
|
-
delete body.temperature;
|
|
317
|
-
}
|
|
318
|
-
else if (model.reasoning && options?.reasoning === "off" && anthCompat.thinkingMode !== "adaptive") {
|
|
319
|
-
body.thinking = { type: "disabled" };
|
|
320
|
-
}
|
|
321
|
-
const betas = [];
|
|
322
|
-
let sendEffortBeta = false;
|
|
323
|
-
const declaredEffort = declaredEffortLevels(anthCompat.effortLevels);
|
|
324
|
-
if (declaredEffort !== undefined && reasoningRequestCarried(model, options?.reasoning)) {
|
|
325
|
-
const { effective } = resolveEffort(options.reasoning, declaredEffort);
|
|
326
|
-
const wireEffort = effective === "minimal" ? "low" : effective;
|
|
327
|
-
body.output_config = { effort: wireEffort };
|
|
328
|
-
sendEffortBeta = true;
|
|
329
|
-
}
|
|
330
|
-
if (sendEffortBeta)
|
|
331
|
-
betas.push("effort-2025-11-24");
|
|
332
|
-
if (anthCompat.contextManagement && thinkingOn) {
|
|
333
|
-
body.context_management = { edits: [{ type: "clear_thinking_20251015", keep: "all" }] };
|
|
334
|
-
betas.push("context-management-2025-06-27");
|
|
335
|
-
}
|
|
336
|
-
if (anthCompat.interleavedThinking) {
|
|
337
|
-
betas.push("interleaved-thinking-2025-05-14");
|
|
338
|
-
}
|
|
339
|
-
const headers = mergeHeaders(modelHeaders, config.headers, optionsHeaders);
|
|
288
|
+
const hardCap = overrides?.maxOutputTokens !== undefined || options?.maxTokens !== undefined;
|
|
289
|
+
const { body: reasoningBody, headers: reasoningHeaders, wireFacts: builtReasoningFacts, } = applyReasoningToRequest({
|
|
290
|
+
api: "anthropic-messages",
|
|
291
|
+
model,
|
|
292
|
+
level: options?.reasoning,
|
|
293
|
+
body,
|
|
294
|
+
budget: { capIsHard: hardCap, share: config.thinkingBudgetShare, tokens: config.thinkingBudgetTokens },
|
|
295
|
+
});
|
|
296
|
+
const headerLayers = [modelHeaders, config.headers, optionsHeaders];
|
|
297
|
+
const headers = mergeHeaders(...headerLayers);
|
|
340
298
|
applyRouteCredentialHeaders(headers, routeCredential);
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
for (const
|
|
344
|
-
if (
|
|
345
|
-
|
|
346
|
-
}
|
|
347
|
-
headers["anthropic-beta"] = existing.join(",");
|
|
299
|
+
takeHeaderSpellings(headers, "anthropic-beta");
|
|
300
|
+
for (const layer of headerLayers) {
|
|
301
|
+
for (const [name, value] of Object.entries(layer ?? {}))
|
|
302
|
+
if (name.toLowerCase() === "anthropic-beta")
|
|
303
|
+
mergeReasoningHeaders(headers, { [name]: value });
|
|
348
304
|
}
|
|
305
|
+
mergeReasoningHeaders(headers, reasoningHeaders);
|
|
349
306
|
lockHeader(headers, "content-type", "application/json");
|
|
350
307
|
lockHeader(headers, "anthropic-version", config.version ?? "2023-06-01");
|
|
351
308
|
if (apiKey)
|
|
352
309
|
lockHeader(headers, ANTHROPIC_KEY_HEADER, apiKey);
|
|
353
|
-
const builtThinkingRequested =
|
|
354
|
-
const builtMaxTokens =
|
|
310
|
+
const builtThinkingRequested = reasoningBody.thinking !== undefined;
|
|
311
|
+
const builtMaxTokens = reasoningBody.max_tokens;
|
|
355
312
|
const builtMaxTokensLane = overrides?.maxOutputTokens !== undefined
|
|
356
313
|
? "engine"
|
|
357
314
|
: options?.maxTokens !== undefined
|
|
@@ -359,7 +316,7 @@ export function createAnthropicBrain(given = {}) {
|
|
|
359
316
|
: model.maxTokens !== undefined
|
|
360
317
|
? "model"
|
|
361
318
|
: "config-default";
|
|
362
|
-
const { body: wire, dropped: extraBodyDropped } = applyExtraBody(
|
|
319
|
+
const { body: wire, dropped: extraBodyDropped } = applyExtraBody(reasoningBody, model, ANTHROPIC_RESERVED);
|
|
363
320
|
return {
|
|
364
321
|
url,
|
|
365
322
|
headers,
|