@sema-agent/core 7.55.0 → 7.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1054 -0
- package/LICENSE +1 -1
- package/dist/agents/cascade.js +1 -1
- package/dist/agents/cc-peer-directory.js +1 -0
- package/dist/agents/child-model-seat.d.ts +0 -11
- package/dist/agents/child-model-seat.js +0 -3
- package/dist/agents/list-agents-tool.d.ts +3 -1
- package/dist/agents/list-agents-tool.js +7 -7
- package/dist/agents/org-delivery-gate.js +3 -4
- package/dist/agents/peer-directory.d.ts +22 -4
- package/dist/agents/peer-directory.js +24 -2
- package/dist/agents/peer-held-queue.d.ts +69 -49
- package/dist/agents/peer-held-queue.js +255 -106
- package/dist/agents/peer-session-drain.js +65 -45
- package/dist/agents/repair-loop.js +2 -2
- package/dist/agents/send-message-tool.js +7 -6
- package/dist/agents/subagent.d.ts +6 -4
- package/dist/agents/subagent.js +72 -68
- package/dist/agents/tool-filter.d.ts +7 -5
- package/dist/agents/tool-filter.js +12 -9
- package/dist/agents/verify.d.ts +3 -2
- package/dist/agents/verify.js +3 -3
- package/dist/brain/anthropic.js +45 -80
- package/dist/brain/media-degrade.d.ts +18 -7
- package/dist/brain/media-degrade.js +13 -2
- package/dist/brain/model-capability.d.ts +37 -0
- package/dist/brain/model-capability.js +34 -0
- package/dist/brain/model-presets.d.ts +2 -8
- package/dist/brain/model-presets.js +1 -6
- package/dist/brain/open-responses.js +23 -34
- package/dist/brain/openai.js +25 -96
- package/dist/brain/provider-dialect.d.ts +3 -2
- package/dist/brain/provider-dialect.js +2 -2
- package/dist/brain/reasoning-request.d.ts +96 -0
- package/dist/brain/reasoning-request.js +174 -0
- package/dist/brain/reasoning.d.ts +11 -11
- package/dist/brain/reasoning.js +4 -3
- package/dist/brain/request-params.d.ts +13 -4
- package/dist/brain/request-params.js +21 -5
- package/dist/brain/status-sink.d.ts +20 -0
- package/dist/brain/status-sink.js +7 -0
- package/dist/brain/stream-engine.d.ts +9 -0
- package/dist/brain/stream-engine.js +24 -10
- package/dist/brain/stream-shared.d.ts +5 -4
- package/dist/brain/stream-shared.js +4 -4
- package/dist/core/a2a.d.ts +2 -1
- package/dist/core/a2a.js +19 -13
- package/dist/core/agent-definition.d.ts +10 -0
- package/dist/core/allow-entry.d.ts +23 -23
- package/dist/core/allow-entry.js +42 -46
- package/dist/core/allow-rule-shadow.d.ts +3 -3
- package/dist/core/approval-object.d.ts +21 -5
- package/dist/core/approval-object.js +44 -17
- package/dist/core/ask-origin.d.ts +66 -20
- package/dist/core/ask-origin.js +63 -23
- package/dist/core/ask-question.d.ts +51 -8
- package/dist/core/ask-question.js +3 -4
- package/dist/core/ask-unresolvable-notice.d.ts +8 -3
- package/dist/core/ask-unresolvable-notice.js +16 -2
- package/dist/core/auto-compaction.d.ts +71 -6
- package/dist/core/auto-compaction.js +42 -26
- package/dist/core/background-agent-store.d.ts +6 -2
- package/dist/core/background-agent-store.js +1 -1
- package/dist/core/checkpoint-generation.d.ts +53 -0
- package/dist/core/checkpoint-generation.js +35 -0
- package/dist/core/checkpoint-queries.d.ts +180 -0
- package/dist/core/checkpoint-queries.js +272 -0
- package/dist/core/checkpoint-requirements.d.ts +19 -1
- package/dist/core/checkpoint-requirements.js +6 -0
- package/dist/core/checkpoint-store.d.ts +105 -53
- package/dist/core/checkpoint-store.js +43 -20
- package/dist/core/cross-boundary-taint.d.ts +6 -5
- package/dist/core/cross-boundary-taint.js +5 -5
- package/dist/core/decision-receipt.d.ts +37 -3
- package/dist/core/decision-receipt.js +17 -17
- package/dist/core/delegation-not-started.d.ts +6 -0
- package/dist/core/delegation-not-started.js +17 -0
- package/dist/core/engine-attestation.d.ts +93 -0
- package/dist/core/engine-attestation.js +70 -0
- package/dist/core/engine-capabilities.d.ts +4 -1
- package/dist/core/engine-capabilities.js +1 -1
- package/dist/core/engine-notice.d.ts +32 -12
- package/dist/core/engine-notice.js +6 -0
- package/dist/core/file-history-store.d.ts +104 -22
- package/dist/core/file-history-store.js +37 -19
- package/dist/core/gate-fold.d.ts +1 -1
- package/dist/core/gate-fold.js +22 -10
- package/dist/core/gate-lanes.js +73 -65
- package/dist/core/gate-outcome.d.ts +26 -5
- package/dist/core/gate-outcome.js +26 -0
- package/dist/core/governance-codes.d.ts +5 -1
- package/dist/core/governance-codes.js +6 -0
- package/dist/core/hooks.d.ts +19 -18
- package/dist/core/hooks.js +3 -1
- package/dist/core/host-floor.d.ts +128 -0
- package/dist/core/host-floor.js +206 -0
- package/dist/core/host-target.d.ts +38 -3
- package/dist/core/host-target.js +38 -5
- package/dist/core/mailbox-store.d.ts +62 -1
- package/dist/core/mailbox-store.js +59 -0
- package/dist/core/mcp-name-judge.d.ts +46 -0
- package/dist/core/mcp-name-judge.js +61 -0
- package/dist/core/mcp-probe.d.ts +1 -1
- package/dist/core/mcp-probe.js +2 -5
- package/dist/core/mcp.d.ts +5 -1
- package/dist/core/mcp.js +70 -64
- package/dist/core/memory-engine/consolidation-driver.js +4 -3
- package/dist/core/memory-engine/delegation-settlement.js +15 -24
- package/dist/core/memory-engine/distiller.js +26 -17
- package/dist/core/memory-engine/engine.js +4 -4
- package/dist/core/memory-engine/layout.d.ts +60 -8
- package/dist/core/memory-engine/layout.js +70 -8
- package/dist/core/model-seat.d.ts +10 -3
- package/dist/core/mods/classic-events.d.ts +67 -0
- package/dist/core/mods/classic-events.js +1 -0
- package/dist/core/mods/dollar.d.ts +13 -0
- package/dist/core/mods/extension-call.d.ts +31 -0
- package/dist/core/mods/extension-call.js +43 -0
- package/dist/core/mods/kernel/dispatch.d.ts +20 -3
- package/dist/core/mods/kernel/dispatch.js +140 -69
- package/dist/core/mods/kernel/events.d.ts +47 -11
- package/dist/core/mods/kernel/events.js +66 -42
- package/dist/core/mods/kernel/index.d.ts +4 -4
- package/dist/core/mods/kernel/index.js +2 -2
- package/dist/core/mods/kernel/receive.d.ts +39 -5
- package/dist/core/mods/kernel/receive.js +290 -17
- package/dist/core/mods/kernel/registration.d.ts +33 -2
- package/dist/core/mods/kernel/registration.js +6 -7
- package/dist/core/mods/kernel/site-rules.d.ts +44 -16
- package/dist/core/mods/kernel/site-rules.js +24 -42
- package/dist/core/mods/spec-seats.d.ts +69 -0
- package/dist/core/mods/spec-seats.js +114 -0
- package/dist/core/mods/stations.d.ts +28 -8
- package/dist/core/mods/stations.js +29 -13
- package/dist/core/mods/tool-call.d.ts +79 -0
- package/dist/core/mods/tool-call.js +152 -0
- package/dist/core/namespaced-rule-name.d.ts +32 -38
- package/dist/core/namespaced-rule-name.js +29 -36
- package/dist/core/parent-spec-seat.d.ts +6 -1
- package/dist/core/parent-spec-seat.js +2 -0
- package/dist/core/park-selfcheck.js +3 -0
- package/dist/core/permission-rule-consent.d.ts +24 -3
- package/dist/core/permission-rule-consent.js +136 -41
- package/dist/core/permission-rule-model.d.ts +57 -5
- package/dist/core/permission-rule-model.js +90 -31
- package/dist/core/permission-rule-org.d.ts +6 -2
- package/dist/core/permission-rule-org.js +8 -4
- package/dist/core/permission-rule-provider.d.ts +5 -2
- package/dist/core/permission-rule-provider.js +41 -11
- package/dist/core/permission-rule-store.d.ts +3 -2
- package/dist/core/permission-rule-store.js +11 -2
- package/dist/core/permission-rule-sync.js +3 -2
- package/dist/core/permission-rule-syntax.d.ts +5 -4
- package/dist/core/permission-rule-syntax.js +2 -2
- package/dist/core/permission-rules.d.ts +4 -4
- package/dist/core/permission-rules.js +11 -20
- package/dist/core/persisted-rule-arms.d.ts +2 -2
- package/dist/core/persisted-rule-arms.js +10 -12
- package/dist/core/principal-name.d.ts +20 -0
- package/dist/core/principal-name.js +22 -0
- package/dist/core/prompt-section-seat.js +4 -6
- package/dist/core/protocol-http-auth.d.ts +40 -5
- package/dist/core/protocol-http-auth.js +168 -4
- package/dist/core/protocol-naming.d.ts +20 -0
- package/dist/core/protocol-naming.js +20 -3
- package/dist/core/read-only-shell.d.ts +20 -5
- package/dist/core/read-only-shell.js +29 -14
- package/dist/core/remote-env.d.ts +37 -1
- package/dist/core/remote-env.js +11 -0
- package/dist/core/resume-startup-cause.d.ts +24 -2
- package/dist/core/resume-startup-cause.js +20 -1
- package/dist/core/retired-keys.d.ts +16 -0
- package/dist/core/retired-keys.js +16 -4
- package/dist/core/rewrite-rejudge.d.ts +60 -0
- package/dist/core/rewrite-rejudge.js +36 -0
- package/dist/core/roles.d.ts +28 -1
- package/dist/core/roles.js +81 -26
- package/dist/core/rule-lane-reads.d.ts +20 -15
- package/dist/core/rule-lane-reads.js +45 -17
- package/dist/core/rule-owner.d.ts +3 -3
- package/dist/core/rule-owner.js +3 -2
- package/dist/core/runner/announce-once-ledger.d.ts +14 -0
- package/dist/core/runner/announce-once-ledger.js +5 -0
- package/dist/core/runner/assemble-result.d.ts +1 -0
- package/dist/core/runner/assemble-result.js +1 -1
- package/dist/core/runner/call-hook-stations.d.ts +3 -2
- package/dist/core/runner/caller-roster.d.ts +16 -4
- package/dist/core/runner/caller-roster.js +33 -6
- package/dist/core/runner/capability-withheld-seat.d.ts +5 -0
- package/dist/core/runner/capability-withheld-seat.js +24 -0
- package/dist/core/runner/classifier-ladder.d.ts +7 -9
- package/dist/core/runner/classifier-ladder.js +3 -3
- package/dist/core/runner/compact-session.d.ts +10 -0
- package/dist/core/runner/compact-session.js +202 -0
- package/dist/core/runner/compaction-call-options.d.ts +2 -2
- package/dist/core/runner/compaction-seams.d.ts +21 -1
- package/dist/core/runner/compaction-seams.js +11 -8
- package/dist/core/runner/construction-doors.js +3 -0
- package/dist/core/runner/contracts.d.ts +50 -40
- package/dist/core/runner/cross-boundary-lane.d.ts +17 -13
- package/dist/core/runner/cross-boundary-lane.js +40 -27
- package/dist/core/runner/denial-limit-arms.d.ts +2 -2
- package/dist/core/runner/denial-limit-arms.js +1 -1
- package/dist/core/runner/derived-route-fallback.d.ts +13 -0
- package/dist/core/runner/derived-route-fallback.js +6 -0
- package/dist/core/runner/env-capability-census.d.ts +3 -2
- package/dist/core/runner/env-capability-census.js +9 -3
- package/dist/core/runner/file-history-request.d.ts +18 -0
- package/dist/core/runner/file-history-request.js +21 -13
- package/dist/core/runner/file-history-restore.d.ts +45 -0
- package/dist/core/runner/file-history-restore.js +46 -0
- package/dist/core/runner/gate-exit.d.ts +3 -3
- package/dist/core/runner/gate-exit.js +4 -3
- package/dist/core/runner/image.d.ts +7 -17
- package/dist/core/runner/image.js +9 -60
- package/dist/core/runner/permission-rule-lanes.d.ts +11 -11
- package/dist/core/runner/permission-rule-lanes.js +39 -17
- package/dist/core/runner/person-path-rows.d.ts +12 -9
- package/dist/core/runner/person-path-rows.js +18 -7
- package/dist/core/runner/prepare-acquire-reconcile.d.ts +3 -0
- package/dist/core/runner/prepare-acquire-reconcile.js +2 -1
- package/dist/core/runner/prepare-ask-lane.d.ts +2 -2
- package/dist/core/runner/prepare-ask-lane.js +5 -2
- package/dist/core/runner/prepare-caps-and-workflow.d.ts +4 -6
- package/dist/core/runner/prepare-caps-and-workflow.js +4 -3
- package/dist/core/runner/prepare-config-doors.d.ts +35 -38
- package/dist/core/runner/prepare-config-doors.js +46 -28
- package/dist/core/runner/prepare-defer-classify.d.ts +4 -3
- package/dist/core/runner/prepare-defer-classify.js +7 -8
- package/dist/core/runner/prepare-file-history.d.ts +48 -8
- package/dist/core/runner/prepare-file-history.js +7 -39
- package/dist/core/runner/prepare-gate-stations.d.ts +1 -1
- package/dist/core/runner/prepare-gate-stations.js +10 -1
- package/dist/core/runner/prepare-hands-readface.d.ts +5 -9
- package/dist/core/runner/prepare-hands-readface.js +17 -14
- package/dist/core/runner/prepare-inherited-gate.d.ts +6 -3
- package/dist/core/runner/prepare-inherited-gate.js +5 -3
- package/dist/core/runner/prepare-memory-engine-session.js +1 -1
- package/dist/core/runner/prepare-park-ask.d.ts +2 -0
- package/dist/core/runner/prepare-park-ask.js +7 -7
- package/dist/core/runner/prepare-policy-chain.d.ts +6 -3
- package/dist/core/runner/prepare-policy-chain.js +67 -76
- package/dist/core/runner/prepare-prompt-assembly.d.ts +5 -7
- package/dist/core/runner/prepare-prompt-assembly.js +10 -8
- package/dist/core/runner/prepare-prompt-inputs.d.ts +11 -9
- package/dist/core/runner/prepare-prompt-inputs.js +3 -5
- package/dist/core/runner/prepare-protocol-tools.d.ts +2 -0
- package/dist/core/runner/prepare-protocol-tools.js +3 -3
- package/dist/core/runner/prepare-safety-scan.d.ts +1 -1
- package/dist/core/runner/prepare-safety-scan.js +0 -17
- package/dist/core/runner/prepare-suspend-saga.d.ts +2 -0
- package/dist/core/runner/prepare-suspend-saga.js +5 -6
- package/dist/core/runner/prepare-task.d.ts +5 -2
- package/dist/core/runner/prepare-task.js +48 -43
- package/dist/core/runner/prepare-tool-disclosure-mount.d.ts +20 -4
- package/dist/core/runner/prepare-tool-disclosure-mount.js +33 -23
- package/dist/core/runner/prepare-turn-wiring.d.ts +0 -4
- package/dist/core/runner/prepare-turn-wiring.js +2 -7
- package/dist/core/runner/prepare-wiring-manifest.d.ts +6 -2
- package/dist/core/runner/prepare-wiring-manifest.js +3 -3
- package/dist/core/runner/resume-admission.js +1 -1
- package/dist/core/runner/resume-apply.js +11 -12
- package/dist/core/runner/resume-checkpoint-screen.js +3 -0
- package/dist/core/runner/resume-claim.d.ts +4 -2
- package/dist/core/runner/resume-claim.js +15 -8
- package/dist/core/runner/retired-runner-deps.js +1 -0
- package/dist/core/runner/rewind-files.d.ts +12 -0
- package/dist/core/runner/rewind-files.js +90 -0
- package/dist/core/runner/run-attachment-seats.js +2 -1
- package/dist/core/runner/run-brain-sinks.d.ts +4 -1
- package/dist/core/runner/run-brain-sinks.js +4 -2
- package/dist/core/runner/run-harness-handlers.js +12 -4
- package/dist/core/runner/run-leg.d.ts +1 -1
- package/dist/core/runner/run-leg.js +40 -39
- package/dist/core/runner/run-notification-lane.d.ts +2 -0
- package/dist/core/runner/run-notification-lane.js +2 -2
- package/dist/core/runner/run-recovery-lanes.js +3 -4
- package/dist/core/runner/run-settle-and-teardown.js +7 -12
- package/dist/core/runner/run-terminal-adoption.js +3 -4
- package/dist/core/runner/run-turn-boundary.js +4 -15
- package/dist/core/runner/runtask.d.ts +10 -0
- package/dist/core/runner/runtask.js +35 -42
- package/dist/core/runner/send-message-continuation.js +1 -1
- package/dist/core/runner/session-read-file-states.d.ts +15 -0
- package/dist/core/runner/session-read-file-states.js +28 -0
- package/dist/core/runner/session-rule-policy.js +4 -3
- package/dist/core/runner/session-verb-doors.d.ts +28 -0
- package/dist/core/runner/session-verb-doors.js +48 -0
- package/dist/core/runner/session-write-ledger.d.ts +30 -0
- package/dist/core/runner/session-write-ledger.js +101 -0
- package/dist/core/runner/shell-env-withheld.d.ts +33 -0
- package/dist/core/runner/shell-env-withheld.js +51 -0
- package/dist/core/runner/skills-seat.js +6 -2
- package/dist/core/runner/stream-settle-backstop.js +12 -15
- package/dist/core/runner/sub-agent-deny-lists.d.ts +25 -3
- package/dist/core/runner/sub-agent-deny-lists.js +25 -17
- package/dist/core/runner/synthetic-tools.d.ts +6 -0
- package/dist/core/runner/synthetic-tools.js +4 -1
- package/dist/core/runner/teardown-bounded.d.ts +1 -0
- package/dist/core/runner/teardown-bounded.js +1 -0
- package/dist/core/runner/tool-disclosure.d.ts +10 -12
- package/dist/core/runner/tool-disclosure.js +1 -3
- package/dist/core/runner/tool-end-body.d.ts +1 -1
- package/dist/core/runner/tool-end-body.js +10 -9
- package/dist/core/runner/tool-not-executed.d.ts +5 -0
- package/dist/core/runner/tool-not-executed.js +11 -0
- package/dist/core/runner/tool-occurrence.d.ts +8 -0
- package/dist/core/runner/tool-occurrence.js +7 -0
- package/dist/core/runner/turn-attachments.d.ts +33 -15
- package/dist/core/runner/turn-attachments.js +62 -37
- package/dist/core/runner-deps.d.ts +7 -7
- package/dist/core/safety-axis-vocab.d.ts +6 -4
- package/dist/core/safety-axis-vocab.js +6 -5
- package/dist/core/safety-merge-corpus.js +11 -3
- package/dist/core/secret-env.d.ts +30 -3
- package/dist/core/secret-env.js +47 -8
- package/dist/core/select-model.js +3 -3
- package/dist/core/session-policy-store.d.ts +32 -15
- package/dist/core/session-policy-store.js +156 -36
- package/dist/core/session-store.d.ts +29 -10
- package/dist/core/session-store.js +51 -19
- package/dist/core/session.d.ts +82 -16
- package/dist/core/session.js +53 -0
- package/dist/core/shell-read-silence.d.ts +11 -12
- package/dist/core/shell-read-silence.js +9 -5
- package/dist/core/shell-run-candidates.js +3 -1
- package/dist/core/shell-wrapper-projection.d.ts +1 -1
- package/dist/core/shell-wrapper-projection.js +1 -1
- package/dist/core/shell-wrapper-table.d.ts +14 -7
- package/dist/core/shell-wrapper-table.js +5 -4
- package/dist/core/side-query.js +10 -1
- package/dist/core/skill-grant.d.ts +7 -2
- package/dist/core/skill-grant.js +5 -0
- package/dist/core/skills-directory.js +6 -2
- package/dist/core/store-contracts/background-agent-store-contract.js +1 -0
- package/dist/core/store-contracts/checkpoint-store-contract.d.ts +11 -1
- package/dist/core/store-contracts/checkpoint-store-contract.js +141 -2
- package/dist/core/store-contracts/file-history-store-contract.js +40 -1
- package/dist/core/store-contracts/mailbox-store-contract.js +49 -1
- package/dist/core/store-contracts/peer-directory-contract.d.ts +7 -2
- package/dist/core/store-contracts/peer-directory-contract.js +14 -2
- package/dist/core/store-contracts/session-repo-contract.js +51 -0
- package/dist/core/store-contracts/session-store-contract.d.ts +2 -1
- package/dist/core/store-contracts/session-store-contract.js +150 -14
- package/dist/core/stub-env.d.ts +2 -0
- package/dist/core/stub-env.js +1 -0
- package/dist/core/synthetic-read-verdict.js +3 -3
- package/dist/core/task-event.d.ts +32 -4
- package/dist/core/task-notification.d.ts +16 -12
- package/dist/core/task-registry-agent.d.ts +8 -4
- package/dist/core/task-registry-agent.js +14 -8
- package/dist/core/task-registry-shared.d.ts +35 -6
- package/dist/core/task-registry-shared.js +11 -0
- package/dist/core/task-registry.d.ts +10 -1
- package/dist/core/task-registry.js +12 -2
- package/dist/core/task-result.d.ts +18 -0
- package/dist/core/task-spec.d.ts +18 -13
- package/dist/core/tighten-task-spec.js +2 -1
- package/dist/core/tool-catalog-entries.d.ts +23 -0
- package/dist/core/tool-catalog-entries.js +14 -2
- package/dist/core/tool-check-reading.d.ts +11 -0
- package/dist/core/tool-check-reading.js +11 -6
- package/dist/core/tool-model-gate.d.ts +2 -2
- package/dist/core/tool-name-aliases.d.ts +48 -18
- package/dist/core/tool-name-aliases.js +36 -19
- package/dist/core/tool-name-readings.d.ts +6 -32
- package/dist/core/tool-name-readings.js +2 -9
- package/dist/core/tool-policy.d.ts +78 -204
- package/dist/core/tool-policy.js +152 -204
- package/dist/core/tool-result-store.js +3 -0
- package/dist/core/tool-roster.d.ts +14 -19
- package/dist/core/tool-roster.js +11 -44
- package/dist/core/tool-spec-members.js +7 -2
- package/dist/core/tool-spec.d.ts +19 -11
- package/dist/core/tools.js +49 -9
- package/dist/core/trace.d.ts +6 -3
- package/dist/core/trace.js +2 -1
- package/dist/core/types.d.ts +1 -1
- package/dist/core/untrusted-egress.d.ts +20 -0
- package/dist/core/untrusted-egress.js +77 -3
- package/dist/core/user-attachment.d.ts +8 -1
- package/dist/core/user-attachment.js +64 -4
- package/dist/core/wiring-manifest.d.ts +9 -0
- package/dist/core/wiring-manifest.js +1 -0
- package/dist/core/workflow-journal-store.js +1 -1
- package/dist/engine/compaction/compaction.js +3 -2
- package/dist/engine/execution-env/node-execution-env.d.ts +7 -3
- package/dist/engine/execution-env/node-execution-env.js +11 -2
- package/dist/engine/harness/agent-harness.d.ts +32 -6
- package/dist/engine/harness/agent-harness.js +65 -9
- package/dist/engine/harness/types.d.ts +29 -2
- package/dist/engine/llm/types.d.ts +28 -11
- package/dist/engine/loop/agent-loop.d.ts +23 -4
- package/dist/engine/loop/agent-loop.js +42 -30
- package/dist/engine/loop/types.d.ts +16 -6
- package/dist/engine/session/memory-repo.d.ts +9 -2
- package/dist/engine/session/memory-repo.js +11 -1
- package/dist/engine/session/repo-utils.d.ts +6 -5
- package/dist/engine/session/repo-utils.js +14 -6
- package/dist/index.d.ts +34 -17
- package/dist/index.js +22 -11
- package/dist/internal/harness-types.d.ts +1 -1
- package/dist/internal/harness.d.ts +2 -1
- package/dist/internal/harness.js +1 -0
- package/dist/internal/llm.d.ts +1 -1
- package/dist/orchestration/run-workflow-tool.d.ts +6 -4
- package/dist/orchestration/run-workflow-tool.js +5 -3
- package/dist/orchestration/workflow.d.ts +3 -0
- package/dist/orchestration/workflow.js +36 -18
- package/dist/primitives/credential-ref.d.ts +89 -0
- package/dist/primitives/credential-ref.js +125 -0
- package/dist/primitives/index.d.ts +2 -0
- package/dist/primitives/index.js +1 -0
- package/dist/prompt-assembly/artifact.d.ts +2 -2
- package/dist/prompt-assembly/artifact.js +5 -3
- package/dist/prompt-assembly/assemble.d.ts +3 -2
- package/dist/prompt-assembly/assemble.js +1 -1
- package/dist/prompt-assembly/catalog/schema.d.ts +43 -12
- package/dist/prompt-assembly/catalog/schema.js +34 -2
- package/dist/prompt-assembly/catalog/sections.js +0 -1
- package/dist/prompt-assembly/composer.d.ts +3 -1
- package/dist/prompt-assembly/composer.js +1 -1
- package/dist/prompt-assembly/event-registry.js +1 -0
- package/dist/prompt-assembly/overlay.js +3 -3
- package/dist/prompt-assembly/renderers.d.ts +1 -1
- package/dist/prompt-assembly/renderers.js +0 -3
- package/dist/prompt-assembly/role-base.d.ts +15 -0
- package/dist/prompt-assembly/role-base.js +9 -0
- package/dist/prompt-assembly/select.d.ts +39 -14
- package/dist/prompt-assembly/select.js +47 -16
- package/dist/prompt-assembly/sugar.d.ts +17 -11
- package/dist/prompt-assembly/sugar.js +8 -3
- package/dist/prompt-assembly/tool-catalog.d.ts +37 -3
- package/dist/prompt-assembly/tool-catalog.js +114 -4
- package/dist/prompt-assembly/turn-snapshot.d.ts +4 -10
- package/dist/prompt-assembly/turn-snapshot.js +0 -3
- package/dist/prompt-assembly/types.d.ts +0 -7
- package/dist/scenarios/full-body.d.ts +11 -11
- package/dist/scenarios/full-body.js +4 -3
- package/dist/shell/lex.js +10 -1
- package/dist/stores/file/adoption/adopt.js +4 -3
- package/dist/stores/file/adoption/marker.js +3 -2
- package/dist/stores/file/checkpoint-store.d.ts +21 -4
- package/dist/stores/file/checkpoint-store.js +38 -7
- package/dist/stores/file/file-history-store.js +18 -11
- package/dist/stores/file/index.js +2 -1
- package/dist/stores/file/mailbox-store.d.ts +2 -1
- package/dist/stores/file/mailbox-store.js +26 -1
- package/dist/stores/file/permission-rule-adopt.js +4 -3
- package/dist/stores/file/permission-rule-store.js +11 -5
- package/dist/stores/file/session-store.d.ts +29 -6
- package/dist/stores/file/session-store.js +42 -50
- package/dist/tools/artifact/artifact-tool.js +3 -2
- package/dist/tools/fs/bash-program-position.d.ts +19 -2
- package/dist/tools/fs/bash-program-position.js +56 -9
- package/dist/tools/fs/bash-readonly-classifier.d.ts +15 -19
- package/dist/tools/fs/bash-readonly-classifier.js +5 -10
- package/dist/tools/fs/fs-bash.js +15 -8
- package/dist/tools/fs/fs-glob.d.ts +86 -0
- package/dist/tools/fs/fs-glob.js +226 -0
- package/dist/tools/fs/fs-read.js +14 -14
- package/dist/tools/fs/fs-search-tools.js +7 -7
- package/dist/tools/fs/pattern-kill-guard.d.ts +23 -0
- package/dist/tools/fs/pattern-kill-guard.js +429 -0
- package/dist/tools/fs/pdf.d.ts +9 -6
- package/dist/tools/fs/pdf.js +3 -3
- package/dist/tools/fs/program-read-model.d.ts +57 -7
- package/dist/tools/fs/program-read-model.js +11 -1
- package/dist/tools/fs/program-read-model.rows.js +78 -21
- package/dist/tools/fs/read-deny-home.js +3 -2
- package/dist/tools/fs/removal-targets.d.ts +17 -7
- package/dist/tools/fs/removal-targets.js +47 -20
- package/dist/tools/fs/search.d.ts +10 -0
- package/dist/tools/fs/search.js +20 -26
- package/dist/tools/fs/shell-read-argv.js +89 -12
- package/dist/tools/fs/shell-read-bindings.d.ts +31 -0
- package/dist/tools/fs/shell-read-bindings.js +41 -0
- package/dist/tools/fs/shell-read-check.d.ts +10 -0
- package/dist/tools/fs/shell-read-check.js +13 -20
- package/dist/tools/fs/shell-read-environment.d.ts +5 -1
- package/dist/tools/fs/shell-read-environment.js +3 -2
- package/dist/tools/fs/shell-read-establish.d.ts +15 -0
- package/dist/tools/fs/shell-read-establish.js +19 -20
- package/dist/tools/fs/shell-read-identity.d.ts +12 -9
- package/dist/tools/fs/shell-read-identity.js +9 -4
- package/dist/tools/fs/shell-read-plan.js +24 -16
- package/dist/tools/fs/shell-read-start.d.ts +6 -1
- package/dist/tools/fs/shell-read-write-targets.d.ts +5 -1
- package/dist/tools/fs/shell-read-write-targets.js +2 -3
- package/dist/tools/fs/shell-reentry-text.d.ts +9 -0
- package/dist/tools/fs/shell-reentry-text.js +40 -2
- package/dist/tools/todo.js +63 -63
- package/dist/tools/web.d.ts +19 -14
- package/dist/tools/web.js +46 -61
- package/package.json +1 -1
- package/test/export-surface.snapshot.json +221 -7
- package/wire-changes/core-stores-sql@7.57.0.json +29 -0
- package/wire-changes/core@7.56.0.json +3891 -0
- package/wire-changes/core@7.57.0.json +1487 -0
- package/wire-changes/mods-kernel@7.56.0.json +303 -0
- package/wire-changes/mods-kernel@7.57.0.json +29 -0
- package/wire-changes/primitives@7.57.0.json +245 -0
|
@@ -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);
|
|
@@ -1,18 +1,21 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The pre-spawn identity comparison: which established reads of one plan resolve somewhere else now.
|
|
3
|
-
*
|
|
4
|
-
* Compared PER CANDIDATE, never as one pooled set of targets: a candidate is keyed by where it stands in the plan
|
|
5
|
-
* (segment, nested plan) and by what it is (deny-only or a read, provenance, spelling, expansion, raw word), and its
|
|
6
|
-
* set of established targets is compared with the same candidate's set from the re-establishment. A pooled set let
|
|
7
|
-
* one candidate's targets hide another's move — `head linkx` retargeted onto a path some other word's pattern already
|
|
8
|
-
* matched, or onto a home shadow's target, left the pool unchanged and the call was admitted unjudged.
|
|
9
|
-
*/
|
|
10
1
|
import type { EstablishedPlan } from "./shell-read-establish.js";
|
|
11
2
|
import type { ObservedEnvironment } from "./shell-read-environment.js";
|
|
12
3
|
import type { EstablishedRead } from "./shell-read-judge.js";
|
|
13
4
|
import { type HomeViewsCarrier } from "./read-deny-home.js";
|
|
14
5
|
/** Every read of either establishment whose candidate's settled target set differs between the two. */
|
|
15
6
|
export declare function movedReads(previous: EstablishedPlan, again: EstablishedPlan): EstablishedRead[];
|
|
7
|
+
/** One read candidate's landing: its key and where it settled, each as a sha256 hex digest (the key's raw tuple joins on
|
|
8
|
+
* NUL and follows the command's length; a pattern lands on up to thousands of entries), with the raw word and the
|
|
9
|
+
* settled targets kept for the sentence that names a moved one. */
|
|
10
|
+
export interface ReadLanding {
|
|
11
|
+
readonly key: string;
|
|
12
|
+
readonly landing: string;
|
|
13
|
+
readonly raw: string;
|
|
14
|
+
readonly targets: readonly string[];
|
|
15
|
+
}
|
|
16
|
+
/** Every read candidate of the establishment (nested plans included) with where it landed, in plan order. A candidate
|
|
17
|
+
* that settled nowhere (a lexical or unestablishable read) lands on the empty set — placed later, that is a move. */
|
|
18
|
+
export declare function readLandingsOf(e: EstablishedPlan): ReadLanding[];
|
|
16
19
|
/**
|
|
17
20
|
* The establishment with every read that landed carrying its HOME VIEW (read-deny-home.ts) among its spellings, nested
|
|
18
21
|
* plans included: the deny judge then places a home-anchored row wherever the target IS below the home, whatever it is
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
1
2
|
import { homeViewsOf } from "./read-deny-home.js";
|
|
2
3
|
export function movedReads(previous, again) {
|
|
3
4
|
const before = targetsByCandidate(previous);
|
|
@@ -6,12 +7,19 @@ export function movedReads(previous, again) {
|
|
|
6
7
|
for (const key of new Set([...before.keys(), ...after.keys()])) {
|
|
7
8
|
const b = before.get(key);
|
|
8
9
|
const a = after.get(key);
|
|
9
|
-
if (b !== undefined && a !== undefined &&
|
|
10
|
+
if (b !== undefined && a !== undefined && landingOf(b.targets) === landingOf(a.targets))
|
|
10
11
|
continue;
|
|
11
12
|
changed.push(...(b?.reads ?? []), ...(a?.reads ?? []));
|
|
12
13
|
}
|
|
13
14
|
return changed.filter((r) => r.target !== undefined);
|
|
14
15
|
}
|
|
16
|
+
export function readLandingsOf(e) {
|
|
17
|
+
return [...targetsByCandidate(e)].map(([key, l]) => ({ key: digest(key), landing: landingOf(l.targets), raw: l.reads[0]?.candidate.raw ?? "", targets: [...l.targets].sort() }));
|
|
18
|
+
}
|
|
19
|
+
function landingOf(targets) {
|
|
20
|
+
return digest(JSON.stringify([...targets].sort()));
|
|
21
|
+
}
|
|
22
|
+
const digest = (s) => createHash("sha256").update(s, "utf8").digest("hex");
|
|
15
23
|
function targetsByCandidate(e) {
|
|
16
24
|
const out = new Map();
|
|
17
25
|
const walk = (p, at) => {
|
|
@@ -35,9 +43,6 @@ function targetsByCandidate(e) {
|
|
|
35
43
|
walk(e, "");
|
|
36
44
|
return out;
|
|
37
45
|
}
|
|
38
|
-
function sameTargets(a, b) {
|
|
39
|
-
return a.size === b.size && [...a].every((t) => b.has(t));
|
|
40
|
-
}
|
|
41
46
|
export async function withHomeViews(door, placed, established, signal) {
|
|
42
47
|
const views = homeViewsOf(door.fs, placed, signal);
|
|
43
48
|
const unread = [];
|
|
@@ -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\")." }),
|