@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
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { expansionsInHeredocBody, lexShell, PARSE_FAILURE_SENTENCE, substitutionsInHeredocBody, literalTextOf, literalTildeSpelling, parameterRereadsValue, UNRESOLVED_SENTENCE, } from "../../shell/lex.js";
|
|
2
2
|
import { programTextOf, readOfText, readsOf, rewritten, segmentReadingsOf, settledFieldsOf, spelledWithHome, unreadableSentenceOf } from "./shell-read-word.js";
|
|
3
3
|
import { assignmentArithmetic, bare, listedVerbCandidates, pathSubcommandOf, programTextSentence, pushAssignment, roleReads, subscriptOnly, unlistedWords } from "./shell-read-argv.js";
|
|
4
|
-
import { ARITHMETIC_TEST_OPERATORS, BindingThread, arithmeticSubstitutions, isArithmeticCommand, bindingEffectOf, joinRebound, loopListHeadAt, namesBoundIn, parameterBodySubstitutions, projectSegment, valueOf, } from "./shell-read-bindings.js";
|
|
4
|
+
import { ARITHMETIC_TEST_OPERATORS, BindingThread, arithmeticSubstitutions, inheritedFunctionsOf, inheritedExportedFunctions, isArithmeticCommand, bindingEffectOf, joinRebound, loopListHeadAt, namesBoundIn, parameterBodySubstitutions, projectSegment, valueOf, } from "./shell-read-bindings.js";
|
|
5
5
|
import { commandEnvironmentNames, isShellSyntaxWord, programBasename, programPositionRunsShell, readProgramPosition, shellScanDeclineOf, } from "./bash-program-position.js";
|
|
6
6
|
import { WorkdirThread, baseShiftOf, textCalls, textMayMove, textMovesOf, textSetsPhysical, withCommandEnvironment } from "./shell-read-workdir.js";
|
|
7
7
|
import { POLL_LOOP_MAX_BEATS, attachedOptionPayloads, resolveOperandLexically, isPathShapedToken, programTextSlotFiles, } from "./bash-readonly-classifier.js";
|
|
8
8
|
import { BLOCK_WORD_NAMES, commandLineOf, commandLineOptionSpellings, declaredAttributes, isDeclarationBuiltin, isInertBuiltin, launcherOptionPathRole, launcherOptionStep, readOptionRole, programLanguageOf, programTextOpensOf, selectedOptions, movesBaseByStack, opensNoOperand, programDelivery, programRow, readArgRoles, runsShellText, } from "./program-read-model.js";
|
|
9
9
|
import { shellWordsOf } from "../../shell/shell-words.js";
|
|
10
10
|
import { isAbsoluteForFamily } from "./safety.js";
|
|
11
|
-
import { codeBodies, launchedInput, reentryText, scriptFileAt, stdinTextsOf } from "./shell-reentry-text.js";
|
|
11
|
+
import { codeBodies, launchedInput, reentersShell, reentryText, scriptFileAt, stdinTextsOf } from "./shell-reentry-text.js";
|
|
12
12
|
import { heldAt, plannedOnce, rebasePlan, startedAt, stdinFeeds } from "./shell-read-start.js";
|
|
13
13
|
import { markStandardDevices } from "./shell-read-device.js";
|
|
14
14
|
export const READ_CANDIDATE_PROVENANCES = Object.freeze([
|
|
@@ -40,6 +40,7 @@ function planText(command, decl, depth, start, from) {
|
|
|
40
40
|
return { plan: { segments: [], unreadable: PARSE_FAILURE_SENTENCE[lexed.parseFailure.reason], shape }, end: "unmodelled", physical: false };
|
|
41
41
|
const unreadable = unreadableSentenceOf(lexed, command);
|
|
42
42
|
const projected = lexed.segments.map((segment) => projectSegment(segment));
|
|
43
|
+
const exportedFunctions = inheritedFunctionsOf(projected, start?.exportedFunctions), exportedNames = new Set(exportedFunctions.keys());
|
|
43
44
|
const named = projected.map((p, si) => bindingEffectOf(lexed.segments[si], p.argv, p, () => "unknown"));
|
|
44
45
|
const boundHere = (name) => named.some((e) => e.all === "unknown" || e.bindings.some((b) => b.name === name));
|
|
45
46
|
const boundAnywhere = (name) => boundHere(name) || start?.boundAnywhere(name) === true;
|
|
@@ -63,14 +64,15 @@ function planText(command, decl, depth, start, from) {
|
|
|
63
64
|
}
|
|
64
65
|
const names = new BindingThread(lexed.segments, named, initial, boundAnywhere, loopEndOf, start?.homeTouched === true, start?.inherited, start?.names);
|
|
65
66
|
const laterStart = { initial: (name) => declared(name, boundAnywhere(name)), boundAnywhere, homeTouched: boundAnywhere("HOME"), inherited: names.inheritedAt() };
|
|
66
|
-
const nestedPlanner = (table, si) => (text, kind, at) => planShellReads(text, decl, depth + 1, kind === "substitution" ? { initial: (name) => table.stateOf(name), boundAnywhere, homeTouched: table.homeTouched, inherited: table.inherited, thread: heldThread(moves.functions), names: heldAt(table) } : startedAt(kind === "now" ? { ...laterStart, inherited: { ...laterStart.inherited, rebound: joinRebound(table.inherited.rebound, commandEnvironmentNames(projected[si].argv)) }, ...(readProgramPosition(projected[si].argv).program?.basename === "eval" ? { thread: heldThread(moves.unread), names: heldAt(table, names.functionBound()) } : {}) } : { ...laterStart, thread: heldThread(moves.functions, workdir.mayBePhysical || moves.physicalAt.some(Boolean)), names: names.heldAnywhere() }, at));
|
|
67
|
+
const nestedPlanner = (table, si) => (text, kind, at) => planShellReads(text, decl, depth + 1, kind === "substitution" ? { initial: (name) => table.stateOf(name), boundAnywhere, homeTouched: table.homeTouched, inherited: table.inherited, thread: heldThread(moves.functions), names: heldAt(table), ...(exportedFunctions.size > 0 ? { exportedFunctions } : {}) } : startedAt(kind === "now" ? { ...laterStart, inherited: { ...laterStart.inherited, rebound: joinRebound(table.inherited.rebound, commandEnvironmentNames(projected[si].argv)) }, ...(exportedFunctions.size > 0 ? { exportedFunctions } : {}), ...(readProgramPosition(projected[si].argv).program?.basename === "eval" ? { thread: heldThread(moves.unread), names: heldAt(table, names.functionBound()) } : exportedFunctions.size > 0 ? { thread: { physical: false, functions: exportedNames, unread: exportedNames }, names: inheritedExportedFunctions(exportedFunctions) } : {}) } : { ...laterStart, thread: heldThread(moves.functions, workdir.mayBePhysical || moves.physicalAt.some(Boolean)), names: names.heldAnywhere(), ...(exportedFunctions.size > 0 ? { exportedFunctions } : {}) }, at));
|
|
67
68
|
const empty = lexed.segments.map((segment, si) => segmentIsEmpty(segment, projected[si]));
|
|
68
69
|
const facts = projected.map(() => undefined);
|
|
69
70
|
const tables = projected.map(() => undefined);
|
|
70
71
|
const fedAt = stdinFeeds(lexed.segments, start?.stdin ?? [], (si) => [{ from: `${lexed.segments[si - 1].text.trim()} |` }]);
|
|
72
|
+
const inheritedFns = new Set([...(start?.exportedFunctions ?? [])].flatMap(([name, body]) => (body === "unread" ? [name] : [])));
|
|
71
73
|
const factsAt = (si, table) => {
|
|
72
74
|
tables[si] ??= table;
|
|
73
|
-
return (facts[si] ??= segmentFacts(lexed.segments[si], projected[si], decl, table, nestedPlanner(table, si), fedAt(si)));
|
|
75
|
+
return (facts[si] ??= segmentFacts(lexed.segments[si], projected[si], decl, table, nestedPlanner(table, si), fedAt(si), inheritedFns));
|
|
74
76
|
};
|
|
75
77
|
const basesOf = projected.map(() => new Set());
|
|
76
78
|
const unmodelled = projected.map(() => false);
|
|
@@ -254,13 +256,13 @@ function segmentOpensNothing(f) {
|
|
|
254
256
|
const inertProgram = program === undefined || (program.name === program.basename && isInertBuiltin(program.basename) && !(isDeclarationBuiltin(program.basename) && f.argv.slice(at + 1).some((w) => /^[-+]/.test(w.folded))));
|
|
255
257
|
return inertProgram && f.argv.every((w) => !/[[\]$`]/.test(w.raw)) && f.nested.length === 0 && f.reentry === undefined && f.declines.length === 0 && f.launcherChain.length === 0 && f.redirects.every((r) => r.direction !== "in") && f.reads.every((c) => c.provenance === "env_assignment");
|
|
256
258
|
}
|
|
257
|
-
function segmentFacts(segment, p, decl, table, nestedPlan, fed) {
|
|
259
|
+
function segmentFacts(segment, p, decl, table, nestedPlan, fed, inheritedFns = new Set()) {
|
|
258
260
|
const targets = p.redirects.flatMap((r) => (r.target === undefined ? [] : [r.target]));
|
|
259
261
|
const readings = segmentReadingsOf(p.argv, targets, table, decl.homeDir);
|
|
260
262
|
if (readings.length === 1)
|
|
261
|
-
return readingFacts(segment, { ...p, argv: readings[0].argv }, decl, readings[0], nestedPlan, fed);
|
|
263
|
+
return readingFacts(segment, { ...p, argv: readings[0].argv }, decl, readings[0], nestedPlan, fed, inheritedFns);
|
|
262
264
|
const once = plannedOnce(nestedPlan);
|
|
263
|
-
return readInSeveral(readings.map((reading) => readingFacts(segment, { ...p, argv: reading.argv }, decl, reading, once, fed)));
|
|
265
|
+
return readInSeveral(readings.map((reading) => readingFacts(segment, { ...p, argv: reading.argv }, decl, reading, once, fed, inheritedFns)));
|
|
264
266
|
}
|
|
265
267
|
function readInSeveral(each) {
|
|
266
268
|
const first = each[0];
|
|
@@ -273,10 +275,10 @@ function readInSeveral(each) {
|
|
|
273
275
|
readings: each.flatMap((f) => f.readings ?? [f]),
|
|
274
276
|
};
|
|
275
277
|
}
|
|
276
|
-
function readingFacts(segment, p, decl, reading, nestedPlan, fed) {
|
|
278
|
+
function readingFacts(segment, p, decl, reading, nestedPlan, fed, inheritedFns = new Set()) {
|
|
277
279
|
const table = reading.table;
|
|
278
280
|
const planner = (text, kind, at) => nestedPlan(text, kind, kind !== "substitution" ? { ...at, floors: reading.floors } : at);
|
|
279
|
-
const facts = segmentFactsRead(segment, p, decl, table, planner, fed, reading.reads);
|
|
281
|
+
const facts = segmentFactsRead(segment, p, decl, table, planner, fed, reading.reads, inheritedFns);
|
|
280
282
|
const unresolvedRaw = new Set();
|
|
281
283
|
for (const t of segment.tokens) {
|
|
282
284
|
const w = t.kind === "word" ? t : t.kind === "redirect" ? t.target : undefined;
|
|
@@ -306,7 +308,7 @@ function readingFacts(segment, p, decl, reading, nestedPlan, fed) {
|
|
|
306
308
|
...(shift?.kind === "cd" && typeof shift.target !== "string" ? { shift: { ...shift, target: unsettle(shift.target) } } : {}),
|
|
307
309
|
};
|
|
308
310
|
}
|
|
309
|
-
function segmentFactsRead(segment, p, decl, table, nestedPlan, fed, toks) {
|
|
311
|
+
function segmentFactsRead(segment, p, decl, table, nestedPlan, fed, toks, inheritedFns = new Set()) {
|
|
310
312
|
const nested = [];
|
|
311
313
|
const elsewhere = new Set();
|
|
312
314
|
const ctx = { table, reentered: [], programTextSeen: false };
|
|
@@ -378,10 +380,10 @@ function segmentFactsRead(segment, p, decl, table, nestedPlan, fed, toks) {
|
|
|
378
380
|
const once = plannedOnce(nestedPlan);
|
|
379
381
|
const tail = (from) => ({ ...p, argv: p.argv.slice(coproc + from) });
|
|
380
382
|
const background = (f) => ({ ...f, backgrounds: true, ...(f.readings !== undefined ? { readings: f.readings.map((g) => ({ ...g, backgrounds: true })) } : {}) });
|
|
381
|
-
const first = segmentFacts(segment, tail(1), decl, table, once, fed);
|
|
383
|
+
const first = segmentFacts(segment, tail(1), decl, table, once, fed, inheritedFns);
|
|
382
384
|
if (toks.length < coproc + 3 || isShellSyntaxWord(p.argv[coproc + 1], RESERVED) || readProgramPosition(tail(2).argv.slice(0, 1)).refusal !== undefined)
|
|
383
385
|
return background(first);
|
|
384
|
-
return background(readInSeveral([first, segmentFacts(segment, tail(2), decl, table, once, fed)]));
|
|
386
|
+
return background(readInSeveral([first, segmentFacts(segment, tail(2), decl, table, once, fed, inheritedFns)]));
|
|
385
387
|
}
|
|
386
388
|
const loop = loopShapeOf(p);
|
|
387
389
|
if (loopListHeadAt(p.argv) !== undefined)
|
|
@@ -407,6 +409,8 @@ function segmentFactsRead(segment, p, decl, table, nestedPlan, fed, toks) {
|
|
|
407
409
|
declines.push(decline);
|
|
408
410
|
const program = pos.program;
|
|
409
411
|
const basename = program?.basename;
|
|
412
|
+
if (program?.name === basename && basename !== undefined && inheritedFns.has(basename) && !p.defines.includes(basename))
|
|
413
|
+
unread("runs a function this shell inherited from its environment, whose body is text the engine did not read");
|
|
410
414
|
const listed = basename !== undefined && (decl.readers.has(basename) || basename === "cd");
|
|
411
415
|
const verb = program === undefined ? undefined : { name: program.name, basename: program.basename, listed };
|
|
412
416
|
for (const k of pos.assignments) {
|
|
@@ -511,7 +515,7 @@ function segmentFactsRead(segment, p, decl, table, nestedPlan, fed, toks) {
|
|
|
511
515
|
return done({ empty: false, launcherChain, verb, reentry: "shell", declines, reads, moveProvable: false, ...(loopHead !== undefined ? { loopHead } : {}), ...(stdin.length > 0 ? { stdin } : {}), ...(shift !== undefined ? { shift } : {}) });
|
|
512
516
|
};
|
|
513
517
|
if (pos.refusal !== undefined) {
|
|
514
|
-
const owner = programRow(programBasename(pos.refusal.owner));
|
|
518
|
+
const owner = "owner" in pos.refusal ? programRow(programBasename(pos.refusal.owner)) : undefined;
|
|
515
519
|
if (pos.refusal.kind === "option_at_program_position" && owner !== undefined && commandLineOptionSpellings(owner).length > 0) {
|
|
516
520
|
const text = commandStringValue(owner, toks, pos.refusal.option);
|
|
517
521
|
if (text !== undefined) {
|
|
@@ -533,7 +537,11 @@ function segmentFactsRead(segment, p, decl, table, nestedPlan, fed, toks) {
|
|
|
533
537
|
return done({ empty: false, launcherChain, reentry: "shell", declines, reads, moveProvable: false, ...(loopHead !== undefined ? { loopHead } : {}) });
|
|
534
538
|
return reenterShell({ name: argvs[0].shell, basename: argvs[0].shell, listed: decl.readers.has(argvs[0].shell) }, argvs);
|
|
535
539
|
}
|
|
536
|
-
const from = pos.launchers[0]?.index ?? written;
|
|
540
|
+
const from = pos.refusal.kind === "wildcard_program_word" ? pos.refusal.at + 1 : pos.launchers[0]?.index ?? written;
|
|
541
|
+
if (pos.refusal.kind === "wildcard_program_word") {
|
|
542
|
+
const c = bare(toks[pos.refusal.at], "program_path");
|
|
543
|
+
reads.push(c.expands === "unresolvable" ? c : { ...c, denyOnly: true });
|
|
544
|
+
}
|
|
537
545
|
unlistedWords(reads, toks, from, launcherIndices, "unlisted_word", ctx);
|
|
538
546
|
return done({ empty: false, launcherChain, ...(verb !== undefined ? { verb } : {}), ...(reentry !== undefined ? { reentry } : {}), declines, reads, moveProvable: false, ...(loopHead !== undefined ? { loopHead } : {}) });
|
|
539
547
|
}
|
|
@@ -554,7 +562,7 @@ function segmentFactsRead(segment, p, decl, table, nestedPlan, fed, toks) {
|
|
|
554
562
|
shift = argReads.every((r) => literalTextOf(r.word.pieces) !== undefined) && reentryText("eval", texts) !== undefined ? { kind: "eval", text: reentryText("eval", texts) } : { kind: "lost" };
|
|
555
563
|
if (basename === "source" || basename === ".")
|
|
556
564
|
shift = { kind: "lost" };
|
|
557
|
-
if (
|
|
565
|
+
if (reentersShell(basename, args))
|
|
558
566
|
return reenterShell(verb, [{ shell: basename, texts, args, words: argReads }]);
|
|
559
567
|
const row = programRow(basename);
|
|
560
568
|
const delivery = programDelivery(row, args);
|
|
@@ -610,7 +618,7 @@ function segmentFactsRead(segment, p, decl, table, nestedPlan, fed, toks) {
|
|
|
610
618
|
const effectSub = pathSubcommandOf(row, args);
|
|
611
619
|
const effectRow = effectSub?.row ?? row;
|
|
612
620
|
const effectArgs = effectSub === undefined ? args : args.slice(effectSub.at + 1);
|
|
613
|
-
if (effectRow !== undefined && selectedOptions(effectRow, effectArgs).some((o) => o.effect === "executes"))
|
|
621
|
+
if (effectRow !== undefined && !runsShellText(basename) && selectedOptions(effectRow, effectArgs).some((o) => o.effect === "executes"))
|
|
614
622
|
reentry = "shell";
|
|
615
623
|
let unreadProgramText;
|
|
616
624
|
const slot = row === undefined ? undefined : programTextSlotFiles(row, args);
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* the segment it sits in ({@link rebasePlan}), unless it starts in a working directory of its own.
|
|
6
6
|
*/
|
|
7
7
|
import type { LexedSegment } from "../../shell/lex.js";
|
|
8
|
-
import type { BindingTable, FloorValue, InheritedFunctions, NameReader } from "./shell-read-bindings.js";
|
|
8
|
+
import type { BindingTable, FloorValue, InheritedBody, InheritedFunctions, NameReader } from "./shell-read-bindings.js";
|
|
9
9
|
import type { TargetUser } from "./program-read-model.js";
|
|
10
10
|
import type { StdinText } from "./shell-reentry-text.js";
|
|
11
11
|
import type { ReadCandidate, ShellReadPlan } from "./shell-read-plan.js";
|
|
@@ -31,6 +31,11 @@ export interface PlanStart {
|
|
|
31
31
|
readonly names?: InheritedFunctions;
|
|
32
32
|
/** What arrives on its own standard input (the input of the shell running it). */
|
|
33
33
|
readonly stdin?: readonly StdinText[];
|
|
34
|
+
/** The functions the shell running this text inherited (`export -f`, an environment's `BASH_FUNC_*`), each with whether
|
|
35
|
+
* its body is text the engine read ({@link InheritedBody}), inherited by it and by ITS child shells: a child adds its own
|
|
36
|
+
* exports and passes the whole on, so a grandchild still sees a function exported two shells up (#1628). Only on a
|
|
37
|
+
* child-shell start; a substitution / eval runs in the same shell and reads its functions whole. */
|
|
38
|
+
readonly exportedFunctions?: ReadonlyMap<string, InheritedBody>;
|
|
34
39
|
}
|
|
35
40
|
/** The thread of the shell that runs a text, at the segment that hands it on: a literal `eval` text is not a new plan but the next
|
|
36
41
|
* segment of the same thread, so it starts in all of it and hands the working directory and the physical mode back; a substitution
|
|
@@ -16,8 +16,12 @@ export type { WriteSeat } from "./program-read-model.js";
|
|
|
16
16
|
export interface ArgWord {
|
|
17
17
|
readonly raw: string;
|
|
18
18
|
readonly spelled: string;
|
|
19
|
+
/** The program receives a text the spelling is not (an expansion, or a value the lexer left unresolved: `$'-\x72f'`). */
|
|
20
|
+
readonly rewritten?: true;
|
|
21
|
+
/** Nothing but expansions that may yield no word (an unquoted `$E` or `$(cmd)`, `"$@"`): it may not be an argument at all. */
|
|
22
|
+
readonly vanishes?: true;
|
|
19
23
|
}
|
|
20
|
-
/** The words a segment hands its program — the argv after the program word (a launcher's own words are not the program's). */
|
|
24
|
+
/** The words a segment hands its program — the argv after the program word the program position names (a launcher's own words, whatever they are spelled, are not the program's). */
|
|
21
25
|
export declare function programArgs(segment: ShellReadSegment): ArgWord[];
|
|
22
26
|
/**
|
|
23
27
|
* The BACKUP names an in-place `sed` gives the file it knows as `name` — both readings a suffix has: GNU sed replaces every
|
|
@@ -4,9 +4,8 @@ import { renamed } from "./shell-read-word.js";
|
|
|
4
4
|
import { byteBoundIsSmall, implementationsOf, programRow, readArgRoles, selectedOptions, subcommandOf, writeReadings } from "./program-read-model.js";
|
|
5
5
|
import { programBasename, readProgramPosition } from "./bash-program-position.js";
|
|
6
6
|
export function programArgs(segment) {
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
return at < 0 ? [] : words.slice(at + 1);
|
|
7
|
+
const at = segment.verb === undefined ? undefined : readProgramPosition(segment.argv).program?.index;
|
|
8
|
+
return (at === undefined ? [] : segment.argv.slice(at + 1)).map((w) => ({ raw: w.raw, spelled: w.folded, ...(w.expansions.length > 0 || w.unresolved !== undefined ? { rewritten: true } : {}), ...(w.pieces.length > 0 && w.pieces.every((p) => p.expansion?.yields === "many") ? { vanishes: true } : {}) }));
|
|
10
9
|
}
|
|
11
10
|
export function sedBackupNames(name, suffix) {
|
|
12
11
|
const appended = `${name}${suffix}`;
|
|
@@ -21,6 +21,15 @@ import type { BoundValue } from "./shell-read-bindings.js";
|
|
|
21
21
|
* taken: a display option (`trap -p SIG`) and a lone operand (`trap SIG`) still count their operand as the body.
|
|
22
22
|
*/
|
|
23
23
|
export declare function codeBodies(basename: string, args: readonly string[]): readonly string[];
|
|
24
|
+
/** Does this program, handed `args`, run a line of the shell's HISTORY list (`fc -s`, `fc -e -`, `fc -e vi`, bare `fc`)? Its
|
|
25
|
+
* row's text is `history`, and either an option it selects RUNS at once — `effect: "executes"` (`-s`) or its
|
|
26
|
+
* `executesWhenValue` value (`-e -`), which win over a printing one (bash 5.3 runs `fc -l -s`, `fc -le -`) — or none it selects
|
|
27
|
+
* only prints (`fc -e vi` edits then runs; `fc -l`, `fc -ln -1`, `fc -e vi -l` list). What runs is a line no word of the
|
|
28
|
+
* command spells — a text built when the command runs, as a stream-fed or substituted script is. */
|
|
29
|
+
export declare function runsStoredLine(basename: string, args: readonly string[]): boolean;
|
|
30
|
+
/** Does this program, handed `args`, re-enter the shell — a shell re-entry row, unless its text is the history list and these
|
|
31
|
+
* options only print it (`fc -l`: a listing runs nothing)? */
|
|
32
|
+
export declare function reentersShell(basename: string, args: readonly string[]): boolean;
|
|
24
33
|
/** The shell text a re-entry program runs, by its row: the shell-text value its walk reads for a shell (`-c`'s), its
|
|
25
34
|
* words joined for `eval`, its non-option words for `parallel`; none for `source` / `.` (a script file operand), for a
|
|
26
35
|
* shell whose first operand (a script file) or `--` comes before any text, or for a program that is no re-entry. Where
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { literalHeredocBody, literalTextOf } from "../../shell/lex.js";
|
|
2
2
|
import { programBasename, readProgramPosition } from "./bash-program-position.js";
|
|
3
|
-
import { implementationRejects, implementationsOf, programRow, readArgRoles, selectedOptions, targetUserOf } from "./program-read-model.js";
|
|
3
|
+
import { implementationRejects, implementationsOf, programRow, readArgRoles, selectedOptions, selectedSpellings, targetUserOf } from "./program-read-model.js";
|
|
4
4
|
import { namesStandardInput } from "./safety.js";
|
|
5
5
|
export function codeBodies(basename, args) {
|
|
6
6
|
const row = programRow(basename);
|
|
@@ -43,8 +43,46 @@ function shellTextOf(e, args) {
|
|
|
43
43
|
return args[e.at];
|
|
44
44
|
if (e.kind === "option" && typeof e.reading === "object" && e.reading.role?.kind === "shell-text")
|
|
45
45
|
return e.reading.attached;
|
|
46
|
+
if (e.kind === "value" && e.spec?.runsLater !== undefined)
|
|
47
|
+
return laterCommandLine(e.spec.runsLater, args[e.at]);
|
|
48
|
+
if (e.kind === "option" && typeof e.reading === "object" && e.reading.spec?.runsLater !== undefined)
|
|
49
|
+
return laterCommandLine(e.reading.spec.runsLater, e.reading.attached);
|
|
46
50
|
return undefined;
|
|
47
51
|
}
|
|
52
|
+
const BOOLEAN_SPELLINGS = new Set(["", "true", "false", "yes", "no", "on", "off", "1", "0"]);
|
|
53
|
+
function laterCommandLine(table, setting) {
|
|
54
|
+
const eq = setting.indexOf("=");
|
|
55
|
+
if (eq <= 0)
|
|
56
|
+
return undefined;
|
|
57
|
+
const key = setting.slice(0, eq).toLowerCase();
|
|
58
|
+
const value = setting.slice(eq + 1);
|
|
59
|
+
const entry = table.keys.find((k) => new RegExp(`^${k.key.split("*").map((part) => part.replace(/[.+?^${}()|[\]\\]/g, "\\$&")).join(".*")}$`).test(key));
|
|
60
|
+
if (entry === undefined)
|
|
61
|
+
return undefined;
|
|
62
|
+
if (table.valueFrom === "environment")
|
|
63
|
+
return /^[A-Za-z_][A-Za-z0-9_]*$/.test(value) ? `"$${value}"` : undefined;
|
|
64
|
+
if (value.trim() === "")
|
|
65
|
+
return undefined;
|
|
66
|
+
if (entry.orBoolean === true && BOOLEAN_SPELLINGS.has(value.toLowerCase()))
|
|
67
|
+
return undefined;
|
|
68
|
+
if (entry.bang === true)
|
|
69
|
+
return value.startsWith("!") ? value.slice(1) : undefined;
|
|
70
|
+
if (entry.prefixed !== undefined)
|
|
71
|
+
return value.startsWith("!") ? value.slice(1) : value.startsWith("/") ? value : `${entry.prefixed}${value}`;
|
|
72
|
+
return value;
|
|
73
|
+
}
|
|
74
|
+
export function runsStoredLine(basename, args) {
|
|
75
|
+
const row = programRow(basename);
|
|
76
|
+
if (row?.reentry?.kind !== "shell" || row.reentry.text !== "history")
|
|
77
|
+
return false;
|
|
78
|
+
const selected = selectedOptions(row, args, "one-implementation");
|
|
79
|
+
const runsAtOnce = selected.some((o) => o.effect === "executes") || selectedSpellings(row, args).values.some((v) => v.spec.executesWhenValue !== undefined && (v.value ?? args[v.at]) === v.spec.executesWhenValue);
|
|
80
|
+
return runsAtOnce || !selected.some((o) => o.mode === "banner");
|
|
81
|
+
}
|
|
82
|
+
export function reentersShell(basename, args) {
|
|
83
|
+
const r = programRow(basename)?.reentry;
|
|
84
|
+
return r?.kind === "shell" && (r.text !== "history" || runsStoredLine(basename, args));
|
|
85
|
+
}
|
|
48
86
|
export function reentryText(basename, args, stdin) {
|
|
49
87
|
const row = programRow(basename);
|
|
50
88
|
const r = row?.reentry;
|
|
@@ -61,7 +99,7 @@ function argvText(row, at, args) {
|
|
|
61
99
|
return args.length === 0 ? undefined : args.join(" ");
|
|
62
100
|
if (at === "non-option-words")
|
|
63
101
|
return args.filter((a) => !a.startsWith("-")).join(" ") || undefined;
|
|
64
|
-
if (at === "file-operand")
|
|
102
|
+
if (at === "file-operand" || at === "history")
|
|
65
103
|
return undefined;
|
|
66
104
|
for (const e of optionSection(readArgRoles(row, args))) {
|
|
67
105
|
const text = shellTextOf(e, args);
|
package/dist/tools/todo.js
CHANGED
|
@@ -12,69 +12,69 @@ export function createTodoWriteTool() {
|
|
|
12
12
|
'- Each todo has `content`, `status` ("pending" | "in_progress" | "completed"), and `activeForm` (present-tense label shown while in progress).\n' +
|
|
13
13
|
"- Send the full list each call; it replaces the previous one.\n" +
|
|
14
14
|
"- Keep one item `in_progress` at a time and mark it `completed` when done.",
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
15
|
+
descriptionVariants: [{ id: "classic", traits: { noneOf: ["lean_prompt"] }, text: "Use this tool to create and manage a structured task list for your current coding session. This helps you track progress, organize complex tasks, and demonstrate thoroughness to the user.\n" +
|
|
16
|
+
"It also helps the user understand the progress of the task and overall progress of their requests.\n" +
|
|
17
|
+
"\n" +
|
|
18
|
+
"## When to Use This Tool\n" +
|
|
19
|
+
"Use this tool proactively in these scenarios:\n" +
|
|
20
|
+
"\n" +
|
|
21
|
+
"1. Complex multi-step tasks - When a task requires 3 or more distinct steps or actions\n" +
|
|
22
|
+
"2. Non-trivial and complex tasks - Tasks that require careful planning or multiple operations\n" +
|
|
23
|
+
"3. User explicitly requests todo list - When the user directly asks you to use the todo list\n" +
|
|
24
|
+
"4. User provides multiple tasks - When users provide a list of things to be done (numbered or comma-separated)\n" +
|
|
25
|
+
"5. After receiving new instructions - Immediately capture user requirements as todos\n" +
|
|
26
|
+
"6. When you start working on a task - Mark it as in_progress BEFORE beginning work. Ideally you should only have one todo as in_progress at a time\n" +
|
|
27
|
+
"7. After completing a task - Mark it as completed and add any new follow-up tasks discovered during implementation\n" +
|
|
28
|
+
"\n" +
|
|
29
|
+
"## When NOT to Use This Tool\n" +
|
|
30
|
+
"\n" +
|
|
31
|
+
"Skip using this tool when:\n" +
|
|
32
|
+
"1. There is only a single, straightforward task\n" +
|
|
33
|
+
"2. The task is trivial and tracking it provides no organizational benefit\n" +
|
|
34
|
+
"3. The task can be completed in less than 3 trivial steps\n" +
|
|
35
|
+
"4. The task is purely conversational or informational\n" +
|
|
36
|
+
"\n" +
|
|
37
|
+
"NOTE that you should not use this tool if there is only one trivial task to do. In this case you are better off just doing the task directly.\n" +
|
|
38
|
+
"\n" +
|
|
39
|
+
"## Task States and Management\n" +
|
|
40
|
+
"\n" +
|
|
41
|
+
"1. **Task States**: Use these states to track progress:\n" +
|
|
42
|
+
" - pending: Task not yet started\n" +
|
|
43
|
+
" - in_progress: Currently working on (limit to ONE task at a time)\n" +
|
|
44
|
+
" - completed: Task finished successfully\n" +
|
|
45
|
+
"\n" +
|
|
46
|
+
" **IMPORTANT**: Task descriptions must have two forms:\n" +
|
|
47
|
+
' - content: The imperative form describing what needs to be done (e.g., "Run tests", "Build the project")\n' +
|
|
48
|
+
' - activeForm: The present continuous form shown during execution (e.g., "Running tests", "Building the project")\n' +
|
|
49
|
+
"\n" +
|
|
50
|
+
"2. **Task Management**:\n" +
|
|
51
|
+
" - Update task status in real-time as you work\n" +
|
|
52
|
+
" - Mark tasks complete IMMEDIATELY after finishing (don't batch completions)\n" +
|
|
53
|
+
" - Exactly ONE task must be in_progress at any time (not less, not more)\n" +
|
|
54
|
+
" - Complete current tasks before starting new ones\n" +
|
|
55
|
+
" - Remove tasks that are no longer relevant from the list entirely\n" +
|
|
56
|
+
"\n" +
|
|
57
|
+
"3. **Task Completion Requirements**:\n" +
|
|
58
|
+
" - ONLY mark a task as completed when you have FULLY accomplished it\n" +
|
|
59
|
+
" - If you encounter errors, blockers, or cannot finish, keep the task as in_progress\n" +
|
|
60
|
+
" - When blocked, create a new task describing what needs to be resolved\n" +
|
|
61
|
+
" - Never mark a task as completed if:\n" +
|
|
62
|
+
" - Tests are failing\n" +
|
|
63
|
+
" - Implementation is partial\n" +
|
|
64
|
+
" - You encountered unresolved errors\n" +
|
|
65
|
+
" - You couldn't find necessary files or dependencies\n" +
|
|
66
|
+
"\n" +
|
|
67
|
+
"4. **Task Breakdown**:\n" +
|
|
68
|
+
" - Create specific, actionable items\n" +
|
|
69
|
+
" - Break complex tasks into smaller, manageable steps\n" +
|
|
70
|
+
" - Use clear, descriptive task names\n" +
|
|
71
|
+
" - Always provide both forms:\n" +
|
|
72
|
+
' - content: "Fix authentication bug"\n' +
|
|
73
|
+
' - activeForm: "Fixing authentication bug"\n' +
|
|
74
|
+
"\n" +
|
|
75
|
+
"When in doubt, use this tool. Being proactive with task management demonstrates attentiveness and ensures you complete all requirements successfully.\n" +
|
|
76
|
+
"\n" +
|
|
77
|
+
"Pass the COMPLETE todo list each call — it replaces the prior list." }],
|
|
78
78
|
parameters: Type.Object({
|
|
79
79
|
todos: Type.Array(Type.Object({
|
|
80
80
|
content: Type.String({ description: "The task, in imperative form (e.g. \"Run the tests\")." }),
|
package/dist/tools/web.d.ts
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import type { AgentTool } from "../internal/harness-types.js";
|
|
2
2
|
import type { Brain, ToolSpec } from "../core/types.js";
|
|
3
|
+
import { type HostFloor } from "../core/host-floor.js";
|
|
3
4
|
import type { Model } from "../internal/llm.js";
|
|
5
|
+
/** WebFetch's factory options. Which hosts it may reach is not one of them: that is the deployment's host floor (`RunnerDeps.hostFloor`),
|
|
6
|
+
* which the Runner hands every call through its context — a product used outside a Runner holds the private-network floor alone. */
|
|
4
7
|
export interface WebFetchConfig {
|
|
5
|
-
/** If set, ONLY these hostnames may be fetched (exact host match) — and the allowlist is enforced on
|
|
6
|
-
* **every redirect hop**, not just the initial URL (a redirect to a non-allowlisted host is refused
|
|
7
|
-
* before the request is made). Omitted ⇒ no host restriction (the deployment's tool-policy gate is then
|
|
8
|
-
* the only control — wire one for a multi-tenant deployment). */
|
|
9
|
-
allowHosts?: string[];
|
|
10
8
|
/** Injectable fetch (tests / a proxy). Defaults to the global `fetch`. */
|
|
11
9
|
fetchImpl?: typeof fetch;
|
|
12
10
|
/** Max response bytes to read (default 2 MB). */
|
|
@@ -80,14 +78,11 @@ export declare function webFetchToolSpec(config?: WebFetchConfig): ToolSpec;
|
|
|
80
78
|
/** Defined (harness) form of web_fetch — back-compat (RL-1336-webfetch-factory) for direct execution / tests. For `spec.tools`, use the raw
|
|
81
79
|
* {@link webFetchToolSpec} (prepare-task defineTool-wraps spec.tools entries).
|
|
82
80
|
*
|
|
83
|
-
* ⚠️ CTX-DEPENDENT BEHAVIOR: this factory takes no `enrichCtx`, so the product it returns
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
* `
|
|
87
|
-
*
|
|
88
|
-
* DEFUSE and its observation counters silently do not run for that mount. Two ways to keep them:
|
|
89
|
-
* hand `spec.tools` the raw {@link webFetchToolSpec} (the Runner then wraps it with its own trusted
|
|
90
|
-
* ctx builder), or call `defineTool(webFetchToolSpec(config), { enrichCtx })` yourself. */
|
|
81
|
+
* ⚠️ CTX-DEPENDENT BEHAVIOR: this factory takes no `enrichCtx`, so the product it returns runs on the minimal
|
|
82
|
+
* `{toolCallId, signal}` ctx when executed directly — every `ctx.*` read inside {@link webFetchToolSpec} reads absent:
|
|
83
|
+
* the deployment's host floor (`ctx.hostFloor` — the private-network floor alone then holds) and the design/319 exact-mark
|
|
84
|
+
* defuse with its counters. Fed into `TaskSpec.tools`, the Runner rebinds the product to its own trusted ctx builder
|
|
85
|
+
* (`rebindProductEntry`, caller-roster.ts), exactly as it wraps the raw {@link webFetchToolSpec}. */
|
|
91
86
|
export declare function createWebFetchTool(config?: WebFetchConfig): AgentTool;
|
|
92
87
|
/** {@link createWebFetchSummarizer}'s truncation bound — CC's `MAX_MARKDOWN_LENGTH`
|
|
93
88
|
* (WebFetchTool/utils.ts:128). Exported so a deployment wiring the reference summarizer doesn't need
|
|
@@ -216,10 +211,14 @@ export interface WebSearchConfig {
|
|
|
216
211
|
* `site:` query) can apply them up front. A backend MAY ignore `opts` — core re-enforces the domain
|
|
217
212
|
* constraint on the returned results as a floor (see `createWebSearchTool`), so honoring it is an
|
|
218
213
|
* optimization, not a correctness requirement. A backend declaring fewer parameters is accepted as is.
|
|
214
|
+
* `opts.hostFloor` is the run's compiled deployment host floor (`RunnerDeps.hostFloor`), present only when one is declared: a backend
|
|
215
|
+
* that connects to a host judges each request URL by it before sending (`createSearxngSearchBackend` does, on every hop); a backend
|
|
216
|
+
* that is not an engine executor (a provider-native search) holds its own egress and may ignore it.
|
|
219
217
|
*/
|
|
220
218
|
search: (query: string, signal?: AbortSignal, opts?: {
|
|
221
219
|
allowedDomains?: string[];
|
|
222
220
|
blockedDomains?: string[];
|
|
221
|
+
hostFloor?: HostFloor;
|
|
223
222
|
}) => Promise<Array<{
|
|
224
223
|
title: string;
|
|
225
224
|
url: string;
|
|
@@ -241,7 +240,8 @@ export declare function clipCodePoints(s: string, max: number): string;
|
|
|
241
240
|
export declare function createWebSearchTool(config: WebSearchConfig): ToolSpec;
|
|
242
241
|
/** Options for {@link createSearxngSearchBackend}. */
|
|
243
242
|
export interface SearxngBackendOptions {
|
|
244
|
-
/** Injected fetch (tests / exotic runtimes). Defaults to `globalThis.fetch`.
|
|
243
|
+
/** Injected fetch (tests / exotic runtimes). Defaults to `globalThis.fetch`. Called once per hop (the backend follows redirects itself):
|
|
244
|
+
* an implementation that adds a credential header must scope it to the origin it is for. */
|
|
245
245
|
fetchImpl?: typeof fetch;
|
|
246
246
|
/** Per-request wall clock in ms before the request is aborted. Defaults to 10 000 — well inside
|
|
247
247
|
* WebSearchConfig's own 30 s budget so the tool-level race never fires first on a healthy instance. */
|
|
@@ -263,6 +263,11 @@ export interface SearxngBackendOptions {
|
|
|
263
263
|
*
|
|
264
264
|
* Result mapping keeps the strict {title, url, snippet} shape: SearXNG's `content` field is the
|
|
265
265
|
* snippet; rows missing a url are dropped (an engine-side info box, not a citable result).
|
|
266
|
+
*
|
|
267
|
+
* The deployment's host floor (`opts.hostFloor`, the run's `RunnerDeps.hostFloor`) binds the request the way it binds the fetch tool:
|
|
268
|
+
* the base URL and every redirect target are judged by the one hop judge before they are requested, and a refused hop is never
|
|
269
|
+
* contacted (the search rejects with `config.host_floor_refused`). The private-network floor is not applied: the instance is the
|
|
270
|
+
* deployment's own declaration.
|
|
266
271
|
*/
|
|
267
272
|
export declare function createSearxngSearchBackend(baseUrl: string, options?: SearxngBackendOptions): WebSearchConfig["search"];
|
|
268
273
|
/**
|