@sema-agent/core 7.54.1 → 7.56.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +950 -0
- package/dist/agents/agent-transcript-tool.js +2 -1
- package/dist/agents/builtin-agents.d.ts +12 -14
- package/dist/agents/cascade.js +1 -1
- package/dist/agents/cc-peer-directory.d.ts +36 -0
- package/dist/agents/cc-peer-directory.js +139 -0
- package/dist/agents/cc-peer-wire.d.ts +105 -0
- package/dist/agents/cc-peer-wire.js +98 -0
- package/dist/agents/cc-uds-peer-channel.d.ts +40 -0
- package/dist/agents/cc-uds-peer-channel.js +457 -0
- package/dist/agents/child-model-seat.d.ts +0 -11
- package/dist/agents/child-model-seat.js +0 -3
- package/dist/agents/cross-session-envelope.d.ts +4 -1
- package/dist/agents/cross-session-envelope.js +8 -1
- package/dist/agents/cross-session-judge.d.ts +2 -2
- package/dist/agents/list-agents-tool.d.ts +3 -1
- package/dist/agents/list-agents-tool.js +9 -8
- package/dist/agents/observer.d.ts +4 -5
- package/dist/agents/observer.js +2 -1
- package/dist/agents/peer-admission.d.ts +6 -0
- package/dist/agents/peer-admission.js +4 -1
- package/dist/agents/peer-directory.d.ts +65 -13
- package/dist/agents/peer-directory.js +90 -25
- package/dist/agents/peer-notices.d.ts +1 -1
- package/dist/agents/peer-session-drain.d.ts +3 -1
- package/dist/agents/peer-session-drain.js +3 -2
- package/dist/agents/read-inbox-tool.js +2 -1
- package/dist/agents/repair-loop.js +2 -2
- package/dist/agents/retain-ledger.d.ts +1 -1
- package/dist/agents/roster-store.d.ts +1 -1
- package/dist/agents/send-message-tool.d.ts +10 -0
- package/dist/agents/send-message-tool.js +37 -8
- package/dist/agents/subagent.d.ts +39 -82
- package/dist/agents/subagent.js +109 -106
- package/dist/agents/tool-filter.d.ts +31 -46
- package/dist/agents/tool-filter.js +13 -33
- package/dist/agents/verify.d.ts +6 -5
- package/dist/agents/verify.js +3 -3
- package/dist/brain/anthropic.js +43 -81
- package/dist/brain/errors.d.ts +15 -0
- package/dist/brain/errors.js +10 -0
- package/dist/brain/media-degrade.d.ts +18 -7
- package/dist/brain/media-degrade.js +13 -2
- package/dist/brain/model-capability.d.ts +37 -0
- package/dist/brain/model-capability.js +34 -0
- package/dist/brain/model-presets.d.ts +6 -12
- package/dist/brain/model-presets.js +1 -6
- package/dist/brain/open-responses.js +27 -35
- package/dist/brain/openai.js +30 -98
- package/dist/brain/provider-dialect.d.ts +39 -3
- package/dist/brain/provider-dialect.js +28 -0
- package/dist/brain/reasoning-request.d.ts +96 -0
- package/dist/brain/reasoning-request.js +174 -0
- package/dist/brain/reasoning.d.ts +12 -12
- package/dist/brain/reasoning.js +4 -3
- package/dist/brain/request-params.d.ts +62 -9
- package/dist/brain/request-params.js +42 -7
- package/dist/brain/retry.d.ts +1 -1
- package/dist/brain/route-adjudicator.d.ts +15 -0
- package/dist/brain/route-adjudicator.js +15 -0
- package/dist/brain/status-sink.d.ts +20 -0
- package/dist/brain/status-sink.js +7 -0
- package/dist/brain/stream-engine.js +6 -5
- package/dist/brain/stream-shared.d.ts +1 -1
- package/dist/core/a2a.d.ts +2 -1
- package/dist/core/a2a.js +19 -13
- package/dist/core/advisor-verdict.d.ts +120 -0
- package/dist/core/advisor-verdict.js +92 -0
- package/dist/core/agent-definition.d.ts +17 -8
- package/dist/core/allow-entry.d.ts +69 -36
- package/dist/core/allow-entry.js +81 -52
- package/dist/core/allow-rule-shadow.d.ts +10 -3
- package/dist/core/approval-object.d.ts +2 -1
- package/dist/core/approval-object.js +6 -6
- package/dist/core/ask-origin.d.ts +127 -29
- package/dist/core/ask-origin.js +87 -25
- package/dist/core/ask-question.d.ts +51 -8
- package/dist/core/ask-question.js +12 -7
- package/dist/core/ask-unresolvable-notice.d.ts +8 -3
- package/dist/core/ask-unresolvable-notice.js +16 -2
- package/dist/core/auto-compaction.d.ts +11 -8
- package/dist/core/auto-compaction.js +4 -2
- package/dist/core/auto-mode-arming.d.ts +2 -2
- package/dist/core/auto-mode-defaults.d.ts +8 -8
- package/dist/core/auto-mode-prompt-assets.d.ts +3 -3
- package/dist/core/auto-mode-prompt.d.ts +1 -1
- package/dist/core/auto-mode.d.ts +17 -9
- package/dist/core/auto-mode.js +9 -6
- package/dist/core/background-agent-store.d.ts +3 -3
- package/dist/core/canonical-json.d.ts +1 -1
- package/dist/core/canonical-json.js +2 -2
- package/dist/core/checkpoint-generation.d.ts +53 -0
- package/dist/core/checkpoint-generation.js +35 -0
- package/dist/core/checkpoint-queries.d.ts +180 -0
- package/dist/core/checkpoint-queries.js +272 -0
- package/dist/core/checkpoint-requirements.d.ts +19 -4
- package/dist/core/checkpoint-requirements.js +8 -14
- package/dist/core/checkpoint-store.d.ts +165 -72
- package/dist/core/checkpoint-store.js +79 -82
- package/dist/core/child-clamp-seats.d.ts +6 -0
- package/dist/core/child-clamp-seats.js +3 -16
- package/dist/core/compliance.d.ts +2 -2
- package/dist/core/context-edit.d.ts +6 -7
- package/dist/core/cross-boundary-taint.d.ts +11 -4
- package/dist/core/cross-boundary-taint.js +3 -3
- package/dist/core/decision-receipt.d.ts +37 -3
- package/dist/core/decision-receipt.js +19 -19
- package/dist/core/delegation-not-started.d.ts +6 -0
- package/dist/core/delegation-not-started.js +17 -0
- package/dist/core/effective-path-target.d.ts +1 -1
- package/dist/core/engine-attestation.d.ts +93 -0
- package/dist/core/engine-attestation.js +70 -0
- package/dist/core/engine-capabilities.d.ts +4 -1
- package/dist/core/engine-capabilities.js +1 -1
- package/dist/core/engine-notice.d.ts +45 -12
- package/dist/core/exec-output-tail.d.ts +1 -1
- package/dist/core/file-history-retention.d.ts +1 -1
- package/dist/core/file-history-store.d.ts +147 -21
- package/dist/core/file-history-store.js +58 -32
- package/dist/core/gate-fold.d.ts +1 -1
- package/dist/core/gate-fold.js +24 -11
- package/dist/core/gate-lanes.js +81 -68
- package/dist/core/gate-outcome.d.ts +40 -6
- package/dist/core/gate-outcome.js +56 -0
- package/dist/core/governance-codes.d.ts +17 -3
- package/dist/core/governance-codes.js +16 -0
- package/dist/core/hands-band.d.ts +1 -1
- package/dist/core/hooks.d.ts +21 -20
- package/dist/core/hooks.js +3 -1
- package/dist/core/host-floor.d.ts +128 -0
- package/dist/core/host-floor.js +206 -0
- package/dist/core/host-target.d.ts +84 -0
- package/dist/core/host-target.js +92 -0
- package/dist/core/image-downsample.d.ts +1 -1
- package/dist/core/lsp-diagnostics.d.ts +4 -4
- package/dist/core/lsp.d.ts +3 -3
- package/dist/core/mailbox-store.d.ts +4 -0
- package/dist/core/mcp-connection-pool.d.ts +18 -2
- package/dist/core/mcp-connection-pool.js +53 -6
- package/dist/core/mcp-failure.d.ts +23 -4
- package/dist/core/mcp-failure.js +26 -11
- package/dist/core/mcp-listing-drift.d.ts +10 -0
- package/dist/core/mcp-listing-drift.js +6 -0
- package/dist/core/mcp-server-link.d.ts +173 -0
- package/dist/core/mcp-server-link.js +127 -0
- package/dist/core/mcp-server-spec.d.ts +4 -2
- package/dist/core/mcp-session-end.d.ts +26 -0
- package/dist/core/mcp-session-end.js +29 -0
- package/dist/core/mcp-startup-request.d.ts +17 -0
- package/dist/core/mcp-startup-request.js +17 -0
- package/dist/core/mcp.d.ts +17 -13
- package/dist/core/mcp.js +240 -189
- package/dist/core/media-byte-cap.d.ts +1 -1
- package/dist/core/memory-engine/delegation-settlement.js +15 -24
- package/dist/core/memory-engine/engine.d.ts +9 -9
- package/dist/core/memory-engine/engine.js +4 -4
- package/dist/core/memory-engine/layout.d.ts +60 -8
- package/dist/core/memory-engine/layout.js +65 -6
- package/dist/core/memory-engine/provenance-wording.d.ts +1 -1
- package/dist/core/memory-engine/tools.js +4 -1
- package/dist/core/mode-policy.d.ts +1 -1
- package/dist/core/model-seat.d.ts +10 -3
- package/dist/core/mods/classic-events.d.ts +67 -0
- package/dist/core/mods/classic-events.js +1 -0
- package/dist/core/mods/dollar.d.ts +13 -0
- package/dist/core/mods/extension-call.d.ts +31 -0
- package/dist/core/mods/extension-call.js +43 -0
- package/dist/core/mods/kernel/dispatch.d.ts +20 -3
- package/dist/core/mods/kernel/dispatch.js +140 -69
- package/dist/core/mods/kernel/events.d.ts +47 -11
- package/dist/core/mods/kernel/events.js +66 -42
- package/dist/core/mods/kernel/index.d.ts +4 -4
- package/dist/core/mods/kernel/index.js +2 -2
- package/dist/core/mods/kernel/receive.d.ts +39 -5
- package/dist/core/mods/kernel/receive.js +290 -17
- package/dist/core/mods/kernel/registration.d.ts +33 -2
- package/dist/core/mods/kernel/registration.js +6 -7
- package/dist/core/mods/kernel/site-rules.d.ts +44 -16
- package/dist/core/mods/kernel/site-rules.js +24 -42
- package/dist/core/mods/spec-seats.d.ts +69 -0
- package/dist/core/mods/spec-seats.js +114 -0
- package/dist/core/mods/stations.d.ts +28 -8
- package/dist/core/mods/stations.js +29 -13
- package/dist/core/mods/tool-call.d.ts +79 -0
- package/dist/core/mods/tool-call.js +152 -0
- package/dist/core/namespaced-rule-name.d.ts +44 -24
- package/dist/core/namespaced-rule-name.js +50 -43
- package/dist/core/output-style.d.ts +1 -1
- package/dist/core/param-rule-reach.d.ts +15 -0
- package/dist/core/param-rule-reach.js +30 -0
- package/dist/core/parent-spec-seat.d.ts +13 -1
- package/dist/core/parent-spec-seat.js +6 -0
- package/dist/core/park-selfcheck.js +1 -0
- package/dist/core/pause-registry.d.ts +16 -5
- package/dist/core/pause-registry.js +6 -2
- package/dist/core/peer-channel.d.ts +70 -0
- package/dist/core/peer-channel.js +1 -0
- package/dist/core/permission-rule-consent.d.ts +30 -5
- package/dist/core/permission-rule-consent.js +147 -50
- package/dist/core/permission-rule-model.d.ts +245 -65
- package/dist/core/permission-rule-model.js +421 -107
- package/dist/core/permission-rule-org.d.ts +6 -2
- package/dist/core/permission-rule-org.js +7 -3
- package/dist/core/permission-rule-provider.d.ts +6 -2
- package/dist/core/permission-rule-provider.js +41 -11
- package/dist/core/permission-rule-store.d.ts +22 -26
- package/dist/core/permission-rule-store.js +12 -6
- package/dist/core/permission-rule-sync.d.ts +11 -2
- package/dist/core/permission-rule-sync.js +11 -3
- package/dist/core/permission-rule-syntax.d.ts +5 -4
- package/dist/core/permission-rule-syntax.js +2 -2
- package/dist/core/permission-rules.d.ts +53 -15
- package/dist/core/permission-rules.js +125 -100
- package/dist/core/persisted-rule-arms.d.ts +6 -4
- package/dist/core/persisted-rule-arms.js +10 -12
- package/dist/core/present-plan-tool.js +3 -1
- package/dist/core/principal-name.d.ts +20 -0
- package/dist/core/principal-name.js +22 -0
- package/dist/core/prompt-section-seat.js +4 -6
- package/dist/core/protocol-http-auth.d.ts +26 -5
- package/dist/core/protocol-http-auth.js +137 -4
- package/dist/core/protocol-naming.d.ts +2 -2
- package/dist/core/read-only-shell-table.d.ts +1 -1
- package/dist/core/read-only-shell.d.ts +1 -1
- package/dist/core/retired-keys.d.ts +16 -0
- package/dist/core/retired-keys.js +16 -4
- package/dist/core/rewrite-rejudge.d.ts +60 -0
- package/dist/core/rewrite-rejudge.js +36 -0
- package/dist/core/roles.d.ts +34 -3
- package/dist/core/roles.js +66 -53
- package/dist/core/rule-lane-reads.d.ts +20 -15
- package/dist/core/rule-lane-reads.js +45 -17
- package/dist/core/rule-offer-read.d.ts +53 -0
- package/dist/core/rule-offer-read.js +146 -0
- package/dist/core/rule-owner.d.ts +46 -0
- package/dist/core/rule-owner.js +29 -0
- package/dist/core/runner/advisor-instructions.d.ts +70 -0
- package/dist/core/runner/advisor-instructions.js +61 -0
- package/dist/core/runner/advisor-tool.d.ts +33 -0
- package/dist/core/runner/advisor-tool.js +112 -0
- package/dist/core/runner/announce-once-ledger.d.ts +18 -26
- package/dist/core/runner/announce-once-ledger.js +19 -46
- package/dist/core/runner/approval-feedback.js +6 -3
- package/dist/core/runner/assemble-result.d.ts +2 -1
- package/dist/core/runner/assemble-result.js +1 -1
- package/dist/core/runner/call-hook-stations.d.ts +3 -2
- package/dist/core/runner/caller-roster.d.ts +21 -2
- package/dist/core/runner/caller-roster.js +38 -0
- package/dist/core/runner/capability-withheld-seat.d.ts +5 -0
- package/dist/core/runner/capability-withheld-seat.js +24 -0
- package/dist/core/runner/classifier-ladder.d.ts +33 -13
- package/dist/core/runner/classifier-ladder.js +15 -14
- package/dist/core/runner/compaction-restate.d.ts +10 -6
- package/dist/core/runner/compaction-restate.js +9 -3
- package/dist/core/runner/construction-doors.js +3 -0
- package/dist/core/runner/contracts.d.ts +40 -33
- package/dist/core/runner/conversation-segment.d.ts +28 -0
- package/dist/core/runner/conversation-segment.js +42 -0
- package/dist/core/runner/cross-boundary-lane.d.ts +21 -16
- package/dist/core/runner/cross-boundary-lane.js +58 -34
- package/dist/core/runner/decide-continuation.d.ts +7 -4
- package/dist/core/runner/decide-continuation.js +2 -2
- package/dist/core/runner/denial-limit-arms.d.ts +4 -4
- package/dist/core/runner/denial-limit-arms.js +1 -1
- package/dist/core/runner/derived-route-fallback.d.ts +24 -24
- package/dist/core/runner/derived-route-fallback.js +9 -7
- package/dist/core/runner/file-history-request.d.ts +18 -0
- package/dist/core/runner/file-history-request.js +21 -13
- package/dist/core/runner/file-history-restore.d.ts +45 -0
- package/dist/core/runner/file-history-restore.js +46 -0
- package/dist/core/runner/gate-exit.d.ts +9 -3
- package/dist/core/runner/gate-exit.js +11 -5
- package/dist/core/runner/image.d.ts +7 -17
- package/dist/core/runner/image.js +9 -60
- package/dist/core/runner/initial-run-state.js +1 -1
- package/dist/core/runner/permission-rule-lanes.d.ts +6 -6
- package/dist/core/runner/permission-rule-lanes.js +38 -15
- package/dist/core/runner/person-path-rows.d.ts +12 -9
- package/dist/core/runner/person-path-rows.js +19 -8
- package/dist/core/runner/prepare-advisor.d.ts +63 -0
- package/dist/core/runner/prepare-advisor.js +77 -0
- package/dist/core/runner/prepare-ask-lane.d.ts +2 -2
- package/dist/core/runner/prepare-ask-lane.js +5 -2
- package/dist/core/runner/prepare-caps-and-workflow.d.ts +4 -6
- package/dist/core/runner/prepare-caps-and-workflow.js +5 -4
- package/dist/core/runner/prepare-config-doors.d.ts +31 -38
- package/dist/core/runner/prepare-config-doors.js +57 -34
- package/dist/core/runner/prepare-defer-classify.d.ts +4 -3
- package/dist/core/runner/prepare-defer-classify.js +7 -8
- package/dist/core/runner/prepare-delegation-surface.d.ts +2 -2
- package/dist/core/runner/prepare-delegation-surface.js +1 -1
- package/dist/core/runner/prepare-file-history.d.ts +48 -8
- package/dist/core/runner/prepare-file-history.js +41 -73
- package/dist/core/runner/prepare-gate-stations.d.ts +2 -5
- package/dist/core/runner/prepare-gate-stations.js +12 -8
- package/dist/core/runner/prepare-hands-readface.d.ts +2 -8
- package/dist/core/runner/prepare-hands-readface.js +15 -14
- package/dist/core/runner/prepare-inherited-gate.d.ts +11 -7
- package/dist/core/runner/prepare-inherited-gate.js +8 -6
- package/dist/core/runner/prepare-memory-engine-session.js +1 -1
- package/dist/core/runner/prepare-park-ask.js +12 -12
- package/dist/core/runner/prepare-policy-chain.d.ts +7 -4
- package/dist/core/runner/prepare-policy-chain.js +68 -81
- package/dist/core/runner/prepare-project-context.d.ts +5 -2
- package/dist/core/runner/prepare-project-context.js +6 -3
- package/dist/core/runner/prepare-prompt-assembly.d.ts +5 -7
- package/dist/core/runner/prepare-prompt-assembly.js +10 -8
- package/dist/core/runner/prepare-prompt-inputs.d.ts +11 -9
- package/dist/core/runner/prepare-prompt-inputs.js +4 -6
- package/dist/core/runner/prepare-protocol-tools.d.ts +4 -2
- package/dist/core/runner/prepare-protocol-tools.js +5 -4
- package/dist/core/runner/prepare-safety-scan.d.ts +9 -12
- package/dist/core/runner/prepare-safety-scan.js +8 -23
- package/dist/core/runner/prepare-suspend-saga.d.ts +2 -0
- package/dist/core/runner/prepare-suspend-saga.js +5 -6
- package/dist/core/runner/prepare-task.d.ts +1 -1
- package/dist/core/runner/prepare-task.js +41 -35
- package/dist/core/runner/prepare-tool-disclosure-mount.d.ts +7 -4
- package/dist/core/runner/prepare-tool-disclosure-mount.js +24 -18
- package/dist/core/runner/prepare-turn-wiring.d.ts +0 -4
- package/dist/core/runner/prepare-turn-wiring.js +2 -7
- package/dist/core/runner/prepare-wiring-manifest.d.ts +11 -4
- package/dist/core/runner/prepare-wiring-manifest.js +3 -3
- package/dist/core/runner/resume-admission.js +1 -1
- package/dist/core/runner/resume-apply.js +11 -12
- package/dist/core/runner/resume-checkpoint-screen.js +3 -0
- package/dist/core/runner/resume-claim.d.ts +4 -2
- package/dist/core/runner/resume-claim.js +15 -8
- package/dist/core/runner/resume-policy-outcome.js +1 -1
- package/dist/core/runner/retired-runner-deps.js +2 -1
- package/dist/core/runner/rewind-files.d.ts +15 -0
- package/dist/core/runner/rewind-files.js +132 -0
- package/dist/core/runner/run-attachment-seats.js +2 -2
- package/dist/core/runner/run-brain-sinks.d.ts +4 -1
- package/dist/core/runner/run-brain-sinks.js +4 -2
- package/dist/core/runner/run-compaction-machinery.d.ts +1 -1
- package/dist/core/runner/run-compaction-machinery.js +2 -12
- package/dist/core/runner/run-git-lane.d.ts +1 -0
- package/dist/core/runner/run-harness-handlers.js +14 -7
- package/dist/core/runner/run-leg.d.ts +1 -1
- package/dist/core/runner/run-leg.js +43 -18
- package/dist/core/runner/run-settle-and-teardown.js +3 -2
- package/dist/core/runner/run-telemetry-and-budget-seats.js +1 -1
- package/dist/core/runner/run-turn-boundary.d.ts +1 -0
- package/dist/core/runner/run-turn-boundary.js +15 -22
- package/dist/core/runner/runtask.d.ts +3 -0
- package/dist/core/runner/runtask.js +8 -9
- package/dist/core/runner/session-read-file-states.d.ts +15 -0
- package/dist/core/runner/session-read-file-states.js +28 -0
- package/dist/core/runner/session-rule-policy.d.ts +22 -21
- package/dist/core/runner/session-rule-policy.js +17 -31
- package/dist/core/runner/shell-env-withheld.d.ts +33 -0
- package/dist/core/runner/shell-env-withheld.js +51 -0
- package/dist/core/runner/side-call-account.d.ts +32 -8
- package/dist/core/runner/side-call-account.js +23 -1
- package/dist/core/runner/skills-seat.js +6 -2
- package/dist/core/runner/stream-settle-backstop.js +1 -1
- package/dist/core/runner/strict-output-schema.d.ts +1 -1
- package/dist/core/runner/sub-agent-deny-lists.js +4 -6
- package/dist/core/runner/synthetic-tools.d.ts +16 -13
- package/dist/core/runner/synthetic-tools.js +8 -3
- package/dist/core/runner/tool-disclosure.d.ts +10 -12
- package/dist/core/runner/tool-disclosure.js +3 -4
- package/dist/core/runner/tool-end-body.d.ts +1 -1
- package/dist/core/runner/tool-end-body.js +10 -9
- package/dist/core/runner/tool-face-overlay.d.ts +2 -1
- package/dist/core/runner/tool-face-overlay.js +17 -1
- package/dist/core/runner/tool-not-executed.d.ts +5 -0
- package/dist/core/runner/tool-not-executed.js +11 -0
- package/dist/core/runner/tool-occurrence.d.ts +8 -0
- package/dist/core/runner/tool-occurrence.js +7 -0
- package/dist/core/runner/tool-progress-lane.d.ts +2 -2
- package/dist/core/runner/tool-turn-repair-seat.d.ts +3 -2
- package/dist/core/runner/turn-attachments.d.ts +91 -80
- package/dist/core/runner/turn-attachments.js +62 -37
- package/dist/core/runner-deps.d.ts +42 -42
- package/dist/core/runtime-caps.d.ts +4 -4
- package/dist/core/safety-axis-vocab.d.ts +6 -4
- package/dist/core/safety-axis-vocab.js +6 -5
- package/dist/core/safety-merge-corpus.js +26 -2
- package/dist/core/same-plain-value.d.ts +40 -0
- package/dist/core/same-plain-value.js +49 -0
- package/dist/core/scheduler.d.ts +1 -1
- package/dist/core/secret-env.d.ts +26 -3
- package/dist/core/secret-env.js +44 -8
- package/dist/core/select-model.js +3 -3
- package/dist/core/sensitive-path-policy.d.ts +1 -1
- package/dist/core/sensitive-path-policy.js +1 -1
- package/dist/core/session-policy-store.d.ts +102 -35
- package/dist/core/session-policy-store.js +210 -48
- package/dist/core/session-reconcile.d.ts +2 -2
- package/dist/core/session-store.d.ts +106 -37
- package/dist/core/session-store.js +165 -91
- package/dist/core/session.d.ts +101 -57
- package/dist/core/session.js +53 -0
- package/dist/core/shared-memory/tools.js +3 -1
- package/dist/core/shared-memory/types.d.ts +1 -1
- package/dist/core/shell-read-silence.d.ts +11 -12
- package/dist/core/shell-read-silence.js +9 -5
- package/dist/core/shell-run-candidates.js +3 -1
- package/dist/core/shell-wrapper-projection.js +1 -1
- package/dist/core/shell-wrapper-table.d.ts +14 -7
- package/dist/core/shell-wrapper-table.js +5 -4
- package/dist/core/side-query.d.ts +10 -0
- package/dist/core/side-query.js +15 -1
- package/dist/core/skill-grant.d.ts +7 -2
- package/dist/core/skill-grant.js +5 -0
- package/dist/core/skills-directory.js +6 -2
- package/dist/core/store-contracts/checkpoint-store-contract.d.ts +11 -1
- package/dist/core/store-contracts/checkpoint-store-contract.js +168 -3
- package/dist/core/store-contracts/file-history-store-contract.js +74 -4
- package/dist/core/store-contracts/peer-directory-contract.d.ts +7 -2
- package/dist/core/store-contracts/peer-directory-contract.js +14 -2
- package/dist/core/store-contracts/session-policy-store-contract.d.ts +7 -0
- package/dist/core/store-contracts/session-policy-store-contract.js +130 -0
- package/dist/core/store-contracts/session-repo-contract.js +176 -0
- package/dist/core/store-contracts/session-store-contract.d.ts +6 -8
- package/dist/core/store-contracts/session-store-contract.js +361 -51
- package/dist/core/store-contracts/workflow-journal-store-contract.js +26 -1
- package/dist/core/stub-env.d.ts +2 -0
- package/dist/core/stub-env.js +1 -0
- package/dist/core/surrogate-safe-slice.d.ts +3 -3
- package/dist/core/synthetic-read-verdict.js +3 -3
- package/dist/core/task-event.d.ts +42 -8
- package/dist/core/task-notification.d.ts +19 -15
- package/dist/core/task-registry-agent.d.ts +4 -4
- package/dist/core/task-registry-shared.d.ts +4 -4
- package/dist/core/task-registry-shared.js +1 -0
- package/dist/core/task-registry.d.ts +13 -4
- package/dist/core/task-registry.js +14 -2
- package/dist/core/task-result.d.ts +21 -3
- package/dist/core/task-spec.d.ts +69 -64
- package/dist/core/task-stream.d.ts +6 -6
- package/dist/core/task-tool-shape.d.ts +4 -4
- package/dist/core/tighten-task-spec.d.ts +1 -1
- package/dist/core/tighten-task-spec.js +2 -1
- package/dist/core/tool-catalog-entries.d.ts +36 -2
- package/dist/core/tool-catalog-entries.js +69 -43
- package/dist/core/tool-check-reading.d.ts +11 -0
- package/dist/core/tool-check-reading.js +11 -6
- package/dist/core/tool-conformance.js +1 -0
- package/dist/core/tool-errors.d.ts +2 -2
- package/dist/core/tool-face-reader.js +5 -3
- package/dist/core/tool-face.d.ts +21 -2
- package/dist/core/tool-face.js +1 -1
- package/dist/core/tool-model-gate.d.ts +5 -5
- package/dist/core/tool-name-aliases.d.ts +29 -8
- package/dist/core/tool-name-aliases.js +22 -4
- package/dist/core/tool-name-readings.d.ts +10 -43
- package/dist/core/tool-name-readings.js +2 -11
- package/dist/core/tool-policy.d.ts +85 -196
- package/dist/core/tool-policy.js +150 -175
- package/dist/core/tool-registry.d.ts +14 -7
- package/dist/core/tool-registry.js +17 -7
- package/dist/core/tool-result-store.js +5 -1
- package/dist/core/tool-roster.d.ts +57 -33
- package/dist/core/tool-roster.js +56 -68
- package/dist/core/tool-spec-members.js +8 -3
- package/dist/core/tool-spec.d.ts +53 -31
- package/dist/core/tools.js +51 -10
- package/dist/core/trace.d.ts +6 -2
- package/dist/core/types.d.ts +1 -1
- package/dist/core/untrusted-egress.d.ts +1 -1
- package/dist/core/untrusted-text.d.ts +1 -1
- package/dist/core/user-attachment.d.ts +8 -1
- package/dist/core/user-attachment.js +64 -4
- package/dist/core/warm-resume.d.ts +1 -1
- package/dist/core/wiring-manifest.d.ts +58 -0
- package/dist/core/wiring-manifest.js +14 -5
- package/dist/core/workflow-journal-store.d.ts +62 -0
- package/dist/core/workflow-journal-store.js +78 -2
- package/dist/core/workflow-run-store.d.ts +6 -0
- package/dist/core/workflow-run-store.js +2 -0
- package/dist/engine/compaction/compaction.d.ts +9 -9
- package/dist/engine/compaction/compaction.js +3 -2
- package/dist/engine/execution-env/node-execution-env.d.ts +26 -8
- package/dist/engine/execution-env/node-execution-env.js +54 -24
- package/dist/engine/harness/agent-harness.d.ts +39 -9
- package/dist/engine/harness/agent-harness.js +87 -33
- package/dist/engine/harness/types.d.ts +58 -9
- package/dist/engine/harness/types.js +12 -1
- package/dist/engine/llm/types.d.ts +36 -19
- package/dist/engine/llm/validation.d.ts +4 -1
- package/dist/engine/llm/validation.js +13 -1
- package/dist/engine/loop/agent-loop.d.ts +23 -1
- package/dist/engine/loop/agent-loop.js +26 -34
- package/dist/engine/loop/types.d.ts +31 -19
- package/dist/engine/lsp/node-lsp-manager.d.ts +2 -2
- package/dist/engine/session/memory-repo.d.ts +18 -12
- package/dist/engine/session/memory-repo.js +24 -9
- package/dist/engine/session/parent-chain-guard.d.ts +3 -2
- package/dist/engine/session/parent-chain-guard.js +1 -1
- package/dist/engine/session/repo-utils.d.ts +32 -3
- package/dist/engine/session/repo-utils.js +50 -5
- package/dist/index.d.ts +47 -23
- package/dist/index.js +35 -17
- package/dist/internal/harness-types.d.ts +1 -1
- package/dist/internal/harness.d.ts +3 -3
- package/dist/internal/harness.js +2 -2
- package/dist/internal/llm.d.ts +2 -2
- package/dist/internal/llm.js +1 -1
- package/dist/orchestration/goal.js +2 -2
- package/dist/orchestration/run-workflow-tool.d.ts +8 -6
- package/dist/orchestration/run-workflow-tool.js +10 -6
- package/dist/orchestration/workflow-size-guideline.d.ts +4 -4
- package/dist/orchestration/workflow-types.d.ts +18 -0
- package/dist/orchestration/workflow-types.js +6 -0
- package/dist/orchestration/workflow.d.ts +5 -13
- package/dist/orchestration/workflow.js +57 -49
- package/dist/prompt-assembly/artifact.d.ts +2 -2
- package/dist/prompt-assembly/artifact.js +5 -3
- package/dist/prompt-assembly/assemble.d.ts +3 -2
- package/dist/prompt-assembly/assemble.js +1 -1
- package/dist/prompt-assembly/catalog/schema.d.ts +43 -12
- package/dist/prompt-assembly/catalog/schema.js +34 -2
- package/dist/prompt-assembly/catalog/sections.js +0 -1
- package/dist/prompt-assembly/composer.d.ts +3 -1
- package/dist/prompt-assembly/composer.js +1 -1
- package/dist/prompt-assembly/event-registry.js +2 -0
- package/dist/prompt-assembly/overlay.js +3 -3
- package/dist/prompt-assembly/renderers.d.ts +1 -1
- package/dist/prompt-assembly/renderers.js +0 -3
- package/dist/prompt-assembly/role-base.d.ts +15 -0
- package/dist/prompt-assembly/role-base.js +9 -0
- package/dist/prompt-assembly/select.d.ts +39 -14
- package/dist/prompt-assembly/select.js +47 -16
- package/dist/prompt-assembly/sugar.d.ts +17 -11
- package/dist/prompt-assembly/sugar.js +8 -3
- package/dist/prompt-assembly/tool-catalog.d.ts +39 -2
- package/dist/prompt-assembly/tool-catalog.js +117 -4
- package/dist/prompt-assembly/turn-snapshot.d.ts +4 -10
- package/dist/prompt-assembly/turn-snapshot.js +0 -3
- package/dist/prompt-assembly/types.d.ts +0 -7
- package/dist/prompts/default.d.ts +14 -14
- package/dist/scenarios/full-body.d.ts +15 -15
- package/dist/scenarios/full-body.js +4 -3
- package/dist/shell/lex.js +10 -1
- package/dist/stores/file/adoption/adopt.d.ts +4 -3
- package/dist/stores/file/adoption/adopt.js +27 -33
- package/dist/stores/file/adoption/marker.d.ts +6 -13
- package/dist/stores/file/adoption/marker.js +9 -17
- package/dist/stores/file/checkpoint-store.d.ts +24 -0
- package/dist/stores/file/checkpoint-store.js +45 -7
- package/dist/stores/file/file-history-store.d.ts +20 -19
- package/dist/stores/file/file-history-store.js +157 -141
- package/dist/stores/file/fs-atomic.d.ts +15 -0
- package/dist/stores/file/fs-atomic.js +89 -14
- package/dist/stores/file/index.d.ts +1 -1
- package/dist/stores/file/index.js +2 -1
- package/dist/stores/file/mailbox-store.d.ts +3 -0
- package/dist/stores/file/mailbox-store.js +3 -1
- package/dist/stores/file/permission-rule-adopt.d.ts +1 -1
- package/dist/stores/file/permission-rule-adopt.js +18 -18
- package/dist/stores/file/permission-rule-store.d.ts +18 -2
- package/dist/stores/file/permission-rule-store.js +31 -18
- package/dist/stores/file/session-policy-store.d.ts +3 -3
- package/dist/stores/file/session-store.d.ts +54 -16
- package/dist/stores/file/session-store.js +114 -85
- package/dist/stores/file/workflow-journal-store.d.ts +10 -4
- package/dist/stores/file/workflow-journal-store.js +28 -13
- package/dist/tools/artifact/artifact-text.d.ts +1 -1
- package/dist/tools/artifact/artifact-tool.js +5 -3
- package/dist/tools/fs/bash-program-position.d.ts +19 -2
- package/dist/tools/fs/bash-program-position.js +56 -9
- package/dist/tools/fs/bash-readonly-classifier.d.ts +3 -3
- package/dist/tools/fs/fs-bash.d.ts +2 -2
- package/dist/tools/fs/fs-bash.js +8 -6
- package/dist/tools/fs/fs-glob.d.ts +86 -0
- package/dist/tools/fs/fs-glob.js +226 -0
- package/dist/tools/fs/fs-read.js +14 -14
- package/dist/tools/fs/fs-search-tools.js +7 -7
- package/dist/tools/fs/fs-shared.d.ts +8 -8
- package/dist/tools/fs/gh-rate-limit.d.ts +1 -1
- package/dist/tools/fs/notebook.d.ts +2 -2
- package/dist/tools/fs/pattern-kill-guard.d.ts +22 -0
- package/dist/tools/fs/pattern-kill-guard.js +397 -0
- package/dist/tools/fs/pdf.d.ts +9 -6
- package/dist/tools/fs/pdf.js +3 -3
- package/dist/tools/fs/program-read-model.d.ts +57 -7
- package/dist/tools/fs/program-read-model.js +11 -1
- package/dist/tools/fs/program-read-model.rows.js +78 -21
- package/dist/tools/fs/read-deny-home.js +3 -2
- package/dist/tools/fs/read-deny.d.ts +29 -7
- package/dist/tools/fs/read-deny.js +63 -22
- package/dist/tools/fs/removal-targets.d.ts +18 -8
- package/dist/tools/fs/removal-targets.js +47 -20
- package/dist/tools/fs/safety.d.ts +9 -9
- package/dist/tools/fs/search.d.ts +16 -6
- package/dist/tools/fs/search.js +20 -26
- package/dist/tools/fs/shell-read-argv.js +89 -12
- package/dist/tools/fs/shell-read-bindings.d.ts +31 -0
- package/dist/tools/fs/shell-read-bindings.js +41 -0
- package/dist/tools/fs/shell-read-check.js +12 -20
- package/dist/tools/fs/shell-read-environment.d.ts +5 -1
- package/dist/tools/fs/shell-read-environment.js +3 -2
- package/dist/tools/fs/shell-read-establish.d.ts +15 -0
- package/dist/tools/fs/shell-read-establish.js +19 -20
- package/dist/tools/fs/shell-read-judge.d.ts +4 -0
- package/dist/tools/fs/shell-read-judge.js +5 -2
- package/dist/tools/fs/shell-read-plan.js +24 -16
- package/dist/tools/fs/shell-read-start.d.ts +6 -1
- package/dist/tools/fs/shell-read-write-targets.d.ts +5 -1
- package/dist/tools/fs/shell-read-write-targets.js +2 -3
- package/dist/tools/fs/shell-reentry-text.d.ts +9 -0
- package/dist/tools/fs/shell-reentry-text.js +40 -2
- package/dist/tools/loop-tick.d.ts +2 -2
- package/dist/tools/scheduler-tools.js +5 -1
- package/dist/tools/task-list.d.ts +7 -7
- package/dist/tools/task-list.js +5 -1
- package/dist/tools/todo.js +65 -64
- package/dist/tools/web.d.ts +20 -15
- package/dist/tools/web.js +55 -69
- package/dist/tools/worktree.d.ts +3 -3
- package/dist/tools/worktree.js +3 -1
- package/package.json +1 -1
- package/test/export-surface.snapshot.json +5894 -5638
- package/wire-changes/core@7.55.0.json +3318 -0
- package/wire-changes/core@7.56.0.json +3891 -0
- package/wire-changes/mods-kernel@7.56.0.json +303 -0
- package/dist/core/store-contracts/session-store-incarnation-contract.d.ts +0 -39
- package/dist/core/store-contracts/session-store-incarnation-contract.js +0 -95
|
@@ -1,45 +1,44 @@
|
|
|
1
|
-
import { canonicalRootsOnce, observeEnvironment } from "./shell-read-environment.js";
|
|
1
|
+
import { canonicalRootsOnce, isAbsence, observeEnvironment } from "./shell-read-environment.js";
|
|
2
2
|
import { anchorSpelling, normalizeAbsPathLexically, pathFamilyOf } from "./safety.js";
|
|
3
3
|
import { boundaryIsTheSandbox } from "../../core/remote-env.js";
|
|
4
4
|
import { resolveOperandSpellings } from "./bash-readonly-classifier.js";
|
|
5
5
|
import { judgedCandidatesOf, sedBackupNames } from "./shell-read-write-targets.js";
|
|
6
6
|
import { movedReads, withHomeViews } from "./shell-read-identity.js";
|
|
7
7
|
import { passesUnasked } from "./shell-read-device.js";
|
|
8
|
+
import { compileFsGlob, fsGlobClass } from "./fs-glob.js";
|
|
8
9
|
const GLOB_METACHAR_RE = /[*?[]/;
|
|
9
10
|
export const MAX_GLOB_DIRS = 256;
|
|
10
11
|
export const MAX_GLOB_MATCHES = 8192;
|
|
11
12
|
const WRITE_LINK_HOPS = 32;
|
|
12
|
-
function compileGlobSegment(pattern) {
|
|
13
|
+
export function compileGlobSegment(pattern) {
|
|
13
14
|
if (pattern.includes("\\"))
|
|
14
15
|
return undefined;
|
|
15
|
-
|
|
16
|
+
const tokens = [];
|
|
16
17
|
for (let i = 0; i < pattern.length; i++) {
|
|
17
18
|
const ch = pattern[i];
|
|
18
19
|
if (ch === "*") {
|
|
19
|
-
|
|
20
|
+
tokens.push({ kind: "star" });
|
|
20
21
|
}
|
|
21
22
|
else if (ch === "?") {
|
|
22
|
-
|
|
23
|
+
tokens.push({ kind: "one" });
|
|
23
24
|
}
|
|
24
25
|
else if (ch === "[") {
|
|
25
|
-
const
|
|
26
|
-
if (
|
|
27
|
-
|
|
26
|
+
const bracket = parseBracketExpression(pattern, i);
|
|
27
|
+
if (bracket === undefined)
|
|
28
|
+
tokens.push({ kind: "text", text: "[" });
|
|
28
29
|
else {
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
const cls = fsGlobClass(bracket.source);
|
|
31
|
+
if (cls === undefined)
|
|
32
|
+
return undefined;
|
|
33
|
+
tokens.push({ kind: "class", class: cls });
|
|
34
|
+
i = bracket.end;
|
|
31
35
|
}
|
|
32
36
|
}
|
|
33
37
|
else {
|
|
34
|
-
|
|
38
|
+
tokens.push({ kind: "text", text: ch });
|
|
35
39
|
}
|
|
36
40
|
}
|
|
37
|
-
|
|
38
|
-
return new RegExp(`^${src}$`, "s");
|
|
39
|
-
}
|
|
40
|
-
catch {
|
|
41
|
-
return undefined;
|
|
42
|
-
}
|
|
41
|
+
return compileFsGlob(tokens, "start");
|
|
43
42
|
}
|
|
44
43
|
function parseBracketExpression(pattern, start) {
|
|
45
44
|
let i = start + 1;
|
|
@@ -248,7 +247,7 @@ function establishLegOver(seen, readRoots) {
|
|
|
248
247
|
return { value: canon.value, exact: true };
|
|
249
248
|
return { value: [canon.value.replace(TRAILING_SEP, ""), ...[...tail].reverse()].join("/"), exact: false, missing: allAbsent };
|
|
250
249
|
}
|
|
251
|
-
if (canon.error.code
|
|
250
|
+
if (!isAbsence(canon.error.code))
|
|
252
251
|
allAbsent = false;
|
|
253
252
|
tail.push(parts.pop());
|
|
254
253
|
}
|
|
@@ -339,7 +338,7 @@ function establishLegOver(seen, readRoots) {
|
|
|
339
338
|
return { unverifiable: `"${dir}" cannot be resolved to verify what "${seg}" would expand to` };
|
|
340
339
|
const listed = await env.listDir(canonDir?.value ?? dir, signal);
|
|
341
340
|
if (!listed.ok) {
|
|
342
|
-
if (listed.error.code
|
|
341
|
+
if (isAbsence(listed.error.code))
|
|
343
342
|
continue;
|
|
344
343
|
return { unverifiable: `"${dir}" cannot be enumerated to verify what "${seg}" would expand to (${listed.error.code})` };
|
|
345
344
|
}
|
|
@@ -414,7 +413,7 @@ function establishLegOver(seen, readRoots) {
|
|
|
414
413
|
return parent.missing === true ? name : undefined;
|
|
415
414
|
const entry = await env.fileInfo(joinUnder(parent.value, leaf), signal);
|
|
416
415
|
if (!entry.ok)
|
|
417
|
-
return entry.error.code
|
|
416
|
+
return isAbsence(entry.error.code) ? name : undefined;
|
|
418
417
|
if (entry.value.kind !== "symlink")
|
|
419
418
|
return name;
|
|
420
419
|
const link = await env.readLink?.(joinUnder(parent.value, leaf), signal);
|
|
@@ -358,6 +358,10 @@ export interface ShellReadFold {
|
|
|
358
358
|
readonly finding: ShellReadFinding;
|
|
359
359
|
readonly witness?: ReadFinding;
|
|
360
360
|
readonly declined?: ShellReadSegment;
|
|
361
|
+
/** EVERY segment of the text that re-enters a shell (`sh -c S`, `eval S`, a launcher handing text to a shell, a shell fed on its
|
|
362
|
+
* standard input) and so is at least `unestablishable`, in text order — `declined` holds only the first finding of the rank, and the
|
|
363
|
+
* account of this question names each program, not the first. Present only with an `unestablished` fold. */
|
|
364
|
+
readonly reentered?: readonly ShellReadSegment[];
|
|
361
365
|
/** What the judge did not finish, for an `unanswered` finding: the first thing the establishment recorded ({@link Incomplete.detail}). */
|
|
362
366
|
readonly cause?: string;
|
|
363
367
|
/** Some read of the text could not be established (an `unestablishable`, `unanswered` or `declined` finding anywhere, winning or not). */
|
|
@@ -132,6 +132,7 @@ export function foldShellReadFindings(judged) {
|
|
|
132
132
|
let best = { finding: "none" };
|
|
133
133
|
let unestablished = false;
|
|
134
134
|
let unplacedRead = false;
|
|
135
|
+
const reentered = [];
|
|
135
136
|
const raise = (next) => {
|
|
136
137
|
if (next.finding === "unestablishable" || next.finding === "declined" || next.finding === "unanswered") {
|
|
137
138
|
const face = next.witness?.read.candidate.face;
|
|
@@ -158,8 +159,10 @@ export function foldShellReadFindings(judged) {
|
|
|
158
159
|
if (!denyOnly) {
|
|
159
160
|
if (s.segment.declines.length > 0)
|
|
160
161
|
raise({ finding: "declined", declined: s.segment });
|
|
161
|
-
if (s.segment.reentry === "shell")
|
|
162
|
+
if (s.segment.reentry === "shell") {
|
|
162
163
|
raise({ finding: "unestablishable", declined: s.segment });
|
|
164
|
+
reentered.push(s.segment);
|
|
165
|
+
}
|
|
163
166
|
if (s.segment.unreadProgramText !== undefined)
|
|
164
167
|
raise({ finding: "unestablishable", declined: s.segment });
|
|
165
168
|
const move = s.segment.baseMove;
|
|
@@ -177,7 +180,7 @@ export function foldShellReadFindings(judged) {
|
|
|
177
180
|
unestablished = true;
|
|
178
181
|
best = { finding: "unanswered", cause: unfinished.detail, ...(best.finding === "unestablishable" ? { ...(best.witness !== undefined ? { witness: best.witness } : {}), ...(best.declined !== undefined ? { declined: best.declined } : {}) } : {}) };
|
|
179
182
|
}
|
|
180
|
-
return { ...best, ...(unestablished ? { unestablished: true } : {}), ...(unplacedRead ? { unplacedRead: true } : {}) };
|
|
183
|
+
return { ...best, ...(unestablished ? { unestablished: true } : {}), ...(unplacedRead ? { unplacedRead: true } : {}), ...(unestablished && reentered.length > 0 ? { reentered } : {}) };
|
|
181
184
|
}
|
|
182
185
|
export function judgeEstablishedPlan(plan, established, boundary, nestedOf) {
|
|
183
186
|
return {
|
|
@@ -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);
|
|
@@ -19,9 +19,9 @@ export interface AutonomousLoopPromptOptions {
|
|
|
19
19
|
*/
|
|
20
20
|
pushNotification?: boolean;
|
|
21
21
|
}
|
|
22
|
-
/**
|
|
22
|
+
/** First-tick preamble, DEFAULT variant (steward framing). The reference later dropped this preamble. */
|
|
23
23
|
export declare const AUTONOMOUS_LOOP_PREAMBLE = "# Autonomous loop check\n\nYou're being invoked on a timer while the user is away or occupied. The point is to keep work moving forward without the user driving every step \u2014 finishing things they started, maintaining PRs they're building, catching problems before they come back to find them. You're a steward, not an initiator. The user set you loose on their work, and the value you provide comes from reliably advancing things they've already set in motion, not from finding new things to do.\n\nThe key tension to navigate: the user trusts you enough to run autonomously, but that trust is easily lost. Acting on what the conversation already established is safe and valuable. Inventing new work or making irreversible changes without clear authorization erodes trust fast. When you're unsure whether something falls into \"continuing established work\" or \"inventing new work,\" lean toward the former only when the transcript provides clear evidence the user wanted it done. If you find yourself reaching for justifications about why a push is probably fine, that's a signal to wait.\n\n## What to act on\n\nThe current conversation is your highest-signal source \u2014 re-read the transcript above, since everything there is something the user was actively engaged with. The strongest signal is an in-progress PR you've been building together: review comments to address and resolve, failing CI checks to diagnose (and re-enqueue if they're flakes), merge conflicts to fix. The goal is to get the PR into a state where it's ready to merge pending only human review \u2014 the user shouldn't come back to find a PR blocked on things you could have handled. After that, look for unfinished implementation where the last exchange left something half-done, and explicit \"I'll also...\" or \"next I'll...\" commitments the conversation made and didn't honor. Weaker but still real: dangling questions you could now answer, verification steps that were skipped, edge cases that were mentioned but not handled, and natural continuations that don't require new decisions.\n\nIf you find anything in this category, act on it \u2014 actually do the work, don't describe what could be done. Run the tests, don't say \"you could run the tests.\" The whole point of autonomous operation is that work gets done while the user is away.\n\nWhen the conversation transcript has nothing left, the current branch's pull/merge request on the user's SCM is the next-best place to look. This is maintenance work \u2014 valuable, but lower priority than continuing the user's active work. Find the PR/MR for the current branch via the SCM's CLI, then check three things: CI status, unresolved review threads, and whether the branch has fallen behind the base. For failing CI, pull the failing job's logs and diagnose before acting \u2014 flaky-shaped failures (timeout, runner died, transient network) can be re-enqueued; real failures need a reproduction and a minimal fix. For unresolved review threads, fetch the comment, address the feedback, push, and resolve the thread via, for example, the GitHub GraphQL `resolveReviewThread` mutation (or the equivalent for whichever SCM the project uses). Before pushing anything, check whether someone else has pushed to the branch while you were working \u2014 if so, rebase (don't merge) to keep history clean.\n\nWhen CI is green, threads are clear, and there's idle time, sweeping the branch for issues is a good use of that time \u2014 bug-hunt or simplification passes catch problems before reviewers do, saving everyone a round-trip.\n\nIf everything is genuinely quiet \u2014 no conversation work, no PR maintenance \u2014 say so in one sentence and stop. No summary of what you checked, no list of what you might do later. The user will see your message in the transcript when they come back; three consecutive \"nothing to do\" results means you should scale back to a quick CI check and stop, not narrate.\n\n## Repeated invocations\n\nIf you see earlier autonomous checks in this conversation, adjust your scope accordingly. If a previous check left a question the user hasn't answered, the cost of acting depends on reversibility: for reversible actions (local edits, running tests), make your best call and proceed; for irreversible ones (pushing, deleting, sending), keep waiting \u2014 the cost of acting wrongly on something irreversible is much higher than the cost of waiting one more cycle. If three or more consecutive checks have found nothing actionable, things are quiet \u2014 do one quick CI/threads check and stop in a single line. Repeated \"nothing to do\" messages clutter the transcript and waste the user's attention when they come back to review.\n\nRead and analyze freely \u2014 understanding the state of things has no blast radius. Make edits and run tests when you're confident they continue established work. Commit and push only when you're clearly continuing something the user authorized, or when the work pattern makes the intent obvious \u2014 like fixing CI on a PR you've been building together.\n";
|
|
24
|
-
/**
|
|
24
|
+
/** First-tick preamble, PERSISTENT variant. Later dropped by the reference. */
|
|
25
25
|
export declare const AUTONOMOUS_LOOP_PREAMBLE_PERSISTENT = "# Autonomous loop check\n\nYou're being invoked on a timer while the user is away or occupied. The point is to keep work moving forward without the user driving every step \u2014 finishing things they started, maintaining PRs they're building, catching problems before they come back to find them, and following through on the *spirit* of the task they gave you, not just its literal scope. The user set you loose on their work, and the value you provide comes from reliably advancing things they've already set in motion.\n\nThe key tension to navigate: the user trusts you enough to run autonomously, but that trust is easily lost. Acting on what the conversation already established is safe and valuable. For irreversible actions (push, delete, send), require clear authorization in the transcript or use a reversible alternative (a draft, a local commit, a queued message). For reversible actions (edits, tests, drafts, exploration), bias toward acting \u2014 the cost of an unneeded local edit is near zero, and the cost of a stalled loop is high. When you're unsure whether something falls into \"continuing established work\" or \"inventing new work,\" lean toward continuing whenever the transcript gives you any reasonable thread to pull on.\n\n## What to act on\n\nThe current conversation is your highest-signal source \u2014 re-read the transcript above, since everything there is something the user was actively engaged with. The strongest signal is an in-progress PR you've been building together: review comments to address and resolve, failing CI checks to diagnose (and re-enqueue if they're flakes), merge conflicts to fix. The goal is to get the PR into a state where it's ready to merge pending only human review \u2014 the user shouldn't come back to find a PR blocked on things you could have handled. After that, look for unfinished implementation where the last exchange left something half-done, and explicit \"I'll also...\" or \"next I'll...\" commitments the conversation made and didn't honor. Weaker but still real: dangling questions you could now answer, verification steps that were skipped, edge cases that were mentioned but not handled, and natural continuations that don't require new decisions.\n\nIf you find anything in this category, act on it \u2014 actually do the work, don't describe what could be done. Run the tests, don't say \"you could run the tests.\" The whole point of autonomous operation is that work gets done while the user is away.\n\nWhen the conversation transcript has nothing left, the current branch's pull/merge request on the user's SCM is the next-best place to look. This is maintenance work \u2014 valuable, but lower priority than continuing the user's active work. Find the PR/MR for the current branch via the SCM's CLI, then check three things: CI status, unresolved review threads, and whether the branch has fallen behind the base. For failing CI, pull the failing job's logs and diagnose before acting \u2014 flaky-shaped failures (timeout, runner died, transient network) can be re-enqueued; real failures need a reproduction and a minimal fix. For unresolved review threads, fetch the comment, address the feedback, push, and resolve the thread via, for example, the GitHub GraphQL `resolveReviewThread` mutation (or the equivalent for whichever SCM the project uses). Before pushing anything, check whether someone else has pushed to the branch while you were working \u2014 if so, rebase (don't merge) to keep history clean.\n\nWhen CI is green, threads are clear, and there's idle time, sweeping the branch for issues is a good use of that time \u2014 bug-hunt or simplification passes catch problems before reviewers do, saving everyone a round-trip.\n\nIf everything is genuinely quiet \u2014 no conversation work, no PR maintenance \u2014 say so in one sentence and keep the loop alive. Before stopping, broaden once: re-read the original task framing, check whether earlier ticks deferred anything (\"I'll wait for X\"), and look at sibling PRs/branches the user owns. Persistence is the point of autonomous mode. Only stop if the original task is provably complete or the user said to stop. (Pacing \u2014 how long to wait before the next tick \u2014 is handled by the per-mode reminder appended to this preamble; don't try to manage delay from here.)\n\n## Repeated invocations\n\nIf you see earlier autonomous checks in this conversation, adjust your scope accordingly. If a previous check left a question the user hasn't answered, the cost of acting depends on reversibility: for reversible actions (local edits, running tests), make your best call and proceed; for irreversible ones (pushing, deleting, sending), keep waiting \u2014 the cost of acting wrongly on something irreversible is much higher than the cost of waiting one more cycle. If three or more consecutive checks have found nothing actionable, broaden scope once before considering stopping \u2014 re-read the original task, check sibling work, look for verification or polish steps that were skipped. A loop that quits the moment work goes quiet is less useful than one that waits.\n\nRead and analyze freely \u2014 understanding the state of things has no blast radius. Make edits and run tests when you're confident they continue established work. Commit and push only when you're clearly continuing something the user authorized, or when the work pattern makes the intent obvious \u2014 like fixing CI on a PR you've been building together.\n";
|
|
26
26
|
/**
|
|
27
27
|
* Resolve a fire-time prompt: if it is one of the two autonomous-loop sentinels, return the tick
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Type } from "typebox";
|
|
2
2
|
import { defineTool, errorResult } from "../core/tools.js";
|
|
3
3
|
import { hasScheduler, isValidCronExpr, } from "../core/scheduler.js";
|
|
4
|
-
import { toolFace } from "../core/tool-catalog-entries.js";
|
|
4
|
+
import { mountRuleFace, toolFace } from "../core/tool-catalog-entries.js";
|
|
5
5
|
export const SCHEDULE_WAKEUP_TOOL_NAME = "ScheduleWakeup";
|
|
6
6
|
export const AUTONOMOUS_LOOP_SENTINEL = "<<autonomous-loop>>";
|
|
7
7
|
export const AUTONOMOUS_LOOP_DYNAMIC_SENTINEL = "<<autonomous-loop-dynamic>>";
|
|
@@ -201,6 +201,7 @@ Only use minute 0 or 30 when the user names that exact time and clearly means it
|
|
|
201
201
|
const cronCreate = defineTool({
|
|
202
202
|
name: "CronCreate",
|
|
203
203
|
...toolFace("cron-create"),
|
|
204
|
+
ruleFace: mountRuleFace("cron-create"),
|
|
204
205
|
description: cronCreateDescription,
|
|
205
206
|
parameters: Type.Object({
|
|
206
207
|
prompt: Type.String({ description: "Self-contained instructions for the future task (it runs unattended)." }),
|
|
@@ -306,6 +307,7 @@ Only use minute 0 or 30 when the user names that exact time and clearly means it
|
|
|
306
307
|
const cronCancel = defineTool({
|
|
307
308
|
name: "CronDelete",
|
|
308
309
|
...toolFace("cron-delete"),
|
|
310
|
+
ruleFace: mountRuleFace("cron-delete"),
|
|
309
311
|
description: "Cancel a cron job previously scheduled with CronCreate. Idempotent; ids also appear in CronList.",
|
|
310
312
|
parameters: Type.Object({ id: Type.String({ description: "Job ID returned by CronCreate." }) }),
|
|
311
313
|
execute: async (args) => {
|
|
@@ -329,6 +331,7 @@ Only use minute 0 or 30 when the user names that exact time and clearly means it
|
|
|
329
331
|
const cronList = defineTool({
|
|
330
332
|
name: "CronList",
|
|
331
333
|
...toolFace("cron-list"),
|
|
334
|
+
ruleFace: mountRuleFace("cron-list"),
|
|
332
335
|
description: "List all cron jobs scheduled via CronCreate (id, when, label).",
|
|
333
336
|
parameters: Type.Object({}),
|
|
334
337
|
execute: async () => {
|
|
@@ -408,6 +411,7 @@ MOUNT NOTE: this host does not vouch for session-scoped scheduling, so a wakeup
|
|
|
408
411
|
const scheduleWakeup = defineTool({
|
|
409
412
|
name: SCHEDULE_WAKEUP_TOOL_NAME,
|
|
410
413
|
...toolFace("schedule-wakeup"),
|
|
414
|
+
ruleFace: mountRuleFace("schedule-wakeup"),
|
|
411
415
|
description: `${SCHEDULE_WAKEUP_PROMPT}${wakeupMountNote}`,
|
|
412
416
|
parameters: Type.Object({
|
|
413
417
|
delaySeconds: Type.Optional(Type.Number({
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import type { ToolSpec } from "../core/types.js";
|
|
2
2
|
/**
|
|
3
|
-
* design/119
|
|
4
|
-
* `TaskUpdate` / `TaskList`.
|
|
3
|
+
* design/119 — the structured task-list tool family: `TaskCreate` / `TaskGet` /
|
|
4
|
+
* `TaskUpdate` / `TaskList`. The upgrade path over TodoWrite: individual tasks with stable ids,
|
|
5
5
|
* status transitions, dependencies (blocks/blockedBy), an optional owner, and free metadata — instead
|
|
6
|
-
* of TodoWrite's replace-the-whole-list.
|
|
7
|
-
* this one is the DEFAULT — TodoWrite mounts only when the task list is explicitly off (the
|
|
6
|
+
* of TodoWrite's replace-the-whole-list. The two families are MUTUALLY EXCLUSIVE and
|
|
7
|
+
* this one is the DEFAULT — TodoWrite mounts only when the task list is explicitly off (the reference
|
|
8
8
|
* shape: TodoWrite isEnabled = !taskList; see `scenarios/full-body.ts`).
|
|
9
9
|
*
|
|
10
10
|
* State default: like TodoWrite, the default store lives in this factory's closure — FRESH per task
|
|
11
11
|
* and torn down with it; nothing durable, no deps, no egress (the model's own scratch, projected to
|
|
12
|
-
* observers only through each call's tool result / `details`). Descriptions follow
|
|
12
|
+
* observers only through each call's tool result / `details`). Descriptions follow the reference
|
|
13
13
|
* (product-specific lines — teammate assignment, spinner/UI wording — trimmed or generalized).
|
|
14
14
|
*
|
|
15
|
-
* design/147 §6 D2 (
|
|
16
|
-
* task list across several agents —
|
|
15
|
+
* design/147 §6 D2 (shared team task list): pass a {@link TaskListStore} to share ONE
|
|
16
|
+
* task list across several agents — the reference's team coordination artifact ("Check the task list
|
|
17
17
|
* periodically. Create new tasks when work should be divided. Mark tasks resolved when complete.")
|
|
18
18
|
* is a task-list file under the team directory; the sema equivalent is this storage seam. A
|
|
19
19
|
* deployment mounts the SAME store instance into each teammate's tool bundle (same session = same
|
package/dist/tools/task-list.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Type } from "typebox";
|
|
2
|
-
import { toolFace } from "../core/tool-catalog-entries.js";
|
|
2
|
+
import { mountRuleFace, toolFace } from "../core/tool-catalog-entries.js";
|
|
3
3
|
const STATUS = Type.Union([
|
|
4
4
|
Type.Literal("pending"),
|
|
5
5
|
Type.Literal("in_progress"),
|
|
@@ -98,6 +98,7 @@ export function createTaskListTools(store) {
|
|
|
98
98
|
const taskCreate = {
|
|
99
99
|
name: "TaskCreate",
|
|
100
100
|
...toolFace("task-create"),
|
|
101
|
+
ruleFace: mountRuleFace("task-create"),
|
|
101
102
|
description: "Use this tool to create a structured task list for your current session. This helps you track progress, organize complex tasks, and demonstrate thoroughness.\n" +
|
|
102
103
|
"It also helps the user understand the progress of the task and overall progress of their requests.\n" +
|
|
103
104
|
"\n" +
|
|
@@ -170,6 +171,7 @@ export function createTaskListTools(store) {
|
|
|
170
171
|
const taskGet = {
|
|
171
172
|
name: "TaskGet",
|
|
172
173
|
...toolFace("task-get"),
|
|
174
|
+
ruleFace: mountRuleFace("task-get"),
|
|
173
175
|
description: "Use this tool to retrieve a task by its ID from the task list.\n" +
|
|
174
176
|
"\n" +
|
|
175
177
|
"## When to Use This Tool\n" +
|
|
@@ -201,6 +203,7 @@ export function createTaskListTools(store) {
|
|
|
201
203
|
const taskUpdate = {
|
|
202
204
|
name: "TaskUpdate",
|
|
203
205
|
...toolFace("task-update"),
|
|
206
|
+
ruleFace: mountRuleFace("task-update"),
|
|
204
207
|
description: "Use this tool to update a task in the task list.\n" +
|
|
205
208
|
"\n" +
|
|
206
209
|
"## When to Use This Tool\n" +
|
|
@@ -394,6 +397,7 @@ export function createTaskListTools(store) {
|
|
|
394
397
|
const taskList = {
|
|
395
398
|
name: "TaskList",
|
|
396
399
|
...toolFace("task-list"),
|
|
400
|
+
ruleFace: mountRuleFace("task-list"),
|
|
397
401
|
description: "Use this tool to list all tasks in the task list.\n" +
|
|
398
402
|
"\n" +
|
|
399
403
|
"## When to Use This Tool\n" +
|