@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.
Files changed (502) hide show
  1. package/CHANGELOG.md +1054 -0
  2. package/LICENSE +1 -1
  3. package/dist/agents/cascade.js +1 -1
  4. package/dist/agents/cc-peer-directory.js +1 -0
  5. package/dist/agents/child-model-seat.d.ts +0 -11
  6. package/dist/agents/child-model-seat.js +0 -3
  7. package/dist/agents/list-agents-tool.d.ts +3 -1
  8. package/dist/agents/list-agents-tool.js +7 -7
  9. package/dist/agents/org-delivery-gate.js +3 -4
  10. package/dist/agents/peer-directory.d.ts +22 -4
  11. package/dist/agents/peer-directory.js +24 -2
  12. package/dist/agents/peer-held-queue.d.ts +69 -49
  13. package/dist/agents/peer-held-queue.js +255 -106
  14. package/dist/agents/peer-session-drain.js +65 -45
  15. package/dist/agents/repair-loop.js +2 -2
  16. package/dist/agents/send-message-tool.js +7 -6
  17. package/dist/agents/subagent.d.ts +6 -4
  18. package/dist/agents/subagent.js +72 -68
  19. package/dist/agents/tool-filter.d.ts +7 -5
  20. package/dist/agents/tool-filter.js +12 -9
  21. package/dist/agents/verify.d.ts +3 -2
  22. package/dist/agents/verify.js +3 -3
  23. package/dist/brain/anthropic.js +45 -80
  24. package/dist/brain/media-degrade.d.ts +18 -7
  25. package/dist/brain/media-degrade.js +13 -2
  26. package/dist/brain/model-capability.d.ts +37 -0
  27. package/dist/brain/model-capability.js +34 -0
  28. package/dist/brain/model-presets.d.ts +2 -8
  29. package/dist/brain/model-presets.js +1 -6
  30. package/dist/brain/open-responses.js +23 -34
  31. package/dist/brain/openai.js +25 -96
  32. package/dist/brain/provider-dialect.d.ts +3 -2
  33. package/dist/brain/provider-dialect.js +2 -2
  34. package/dist/brain/reasoning-request.d.ts +96 -0
  35. package/dist/brain/reasoning-request.js +174 -0
  36. package/dist/brain/reasoning.d.ts +11 -11
  37. package/dist/brain/reasoning.js +4 -3
  38. package/dist/brain/request-params.d.ts +13 -4
  39. package/dist/brain/request-params.js +21 -5
  40. package/dist/brain/status-sink.d.ts +20 -0
  41. package/dist/brain/status-sink.js +7 -0
  42. package/dist/brain/stream-engine.d.ts +9 -0
  43. package/dist/brain/stream-engine.js +24 -10
  44. package/dist/brain/stream-shared.d.ts +5 -4
  45. package/dist/brain/stream-shared.js +4 -4
  46. package/dist/core/a2a.d.ts +2 -1
  47. package/dist/core/a2a.js +19 -13
  48. package/dist/core/agent-definition.d.ts +10 -0
  49. package/dist/core/allow-entry.d.ts +23 -23
  50. package/dist/core/allow-entry.js +42 -46
  51. package/dist/core/allow-rule-shadow.d.ts +3 -3
  52. package/dist/core/approval-object.d.ts +21 -5
  53. package/dist/core/approval-object.js +44 -17
  54. package/dist/core/ask-origin.d.ts +66 -20
  55. package/dist/core/ask-origin.js +63 -23
  56. package/dist/core/ask-question.d.ts +51 -8
  57. package/dist/core/ask-question.js +3 -4
  58. package/dist/core/ask-unresolvable-notice.d.ts +8 -3
  59. package/dist/core/ask-unresolvable-notice.js +16 -2
  60. package/dist/core/auto-compaction.d.ts +71 -6
  61. package/dist/core/auto-compaction.js +42 -26
  62. package/dist/core/background-agent-store.d.ts +6 -2
  63. package/dist/core/background-agent-store.js +1 -1
  64. package/dist/core/checkpoint-generation.d.ts +53 -0
  65. package/dist/core/checkpoint-generation.js +35 -0
  66. package/dist/core/checkpoint-queries.d.ts +180 -0
  67. package/dist/core/checkpoint-queries.js +272 -0
  68. package/dist/core/checkpoint-requirements.d.ts +19 -1
  69. package/dist/core/checkpoint-requirements.js +6 -0
  70. package/dist/core/checkpoint-store.d.ts +105 -53
  71. package/dist/core/checkpoint-store.js +43 -20
  72. package/dist/core/cross-boundary-taint.d.ts +6 -5
  73. package/dist/core/cross-boundary-taint.js +5 -5
  74. package/dist/core/decision-receipt.d.ts +37 -3
  75. package/dist/core/decision-receipt.js +17 -17
  76. package/dist/core/delegation-not-started.d.ts +6 -0
  77. package/dist/core/delegation-not-started.js +17 -0
  78. package/dist/core/engine-attestation.d.ts +93 -0
  79. package/dist/core/engine-attestation.js +70 -0
  80. package/dist/core/engine-capabilities.d.ts +4 -1
  81. package/dist/core/engine-capabilities.js +1 -1
  82. package/dist/core/engine-notice.d.ts +32 -12
  83. package/dist/core/engine-notice.js +6 -0
  84. package/dist/core/file-history-store.d.ts +104 -22
  85. package/dist/core/file-history-store.js +37 -19
  86. package/dist/core/gate-fold.d.ts +1 -1
  87. package/dist/core/gate-fold.js +22 -10
  88. package/dist/core/gate-lanes.js +73 -65
  89. package/dist/core/gate-outcome.d.ts +26 -5
  90. package/dist/core/gate-outcome.js +26 -0
  91. package/dist/core/governance-codes.d.ts +5 -1
  92. package/dist/core/governance-codes.js +6 -0
  93. package/dist/core/hooks.d.ts +19 -18
  94. package/dist/core/hooks.js +3 -1
  95. package/dist/core/host-floor.d.ts +128 -0
  96. package/dist/core/host-floor.js +206 -0
  97. package/dist/core/host-target.d.ts +38 -3
  98. package/dist/core/host-target.js +38 -5
  99. package/dist/core/mailbox-store.d.ts +62 -1
  100. package/dist/core/mailbox-store.js +59 -0
  101. package/dist/core/mcp-name-judge.d.ts +46 -0
  102. package/dist/core/mcp-name-judge.js +61 -0
  103. package/dist/core/mcp-probe.d.ts +1 -1
  104. package/dist/core/mcp-probe.js +2 -5
  105. package/dist/core/mcp.d.ts +5 -1
  106. package/dist/core/mcp.js +70 -64
  107. package/dist/core/memory-engine/consolidation-driver.js +4 -3
  108. package/dist/core/memory-engine/delegation-settlement.js +15 -24
  109. package/dist/core/memory-engine/distiller.js +26 -17
  110. package/dist/core/memory-engine/engine.js +4 -4
  111. package/dist/core/memory-engine/layout.d.ts +60 -8
  112. package/dist/core/memory-engine/layout.js +70 -8
  113. package/dist/core/model-seat.d.ts +10 -3
  114. package/dist/core/mods/classic-events.d.ts +67 -0
  115. package/dist/core/mods/classic-events.js +1 -0
  116. package/dist/core/mods/dollar.d.ts +13 -0
  117. package/dist/core/mods/extension-call.d.ts +31 -0
  118. package/dist/core/mods/extension-call.js +43 -0
  119. package/dist/core/mods/kernel/dispatch.d.ts +20 -3
  120. package/dist/core/mods/kernel/dispatch.js +140 -69
  121. package/dist/core/mods/kernel/events.d.ts +47 -11
  122. package/dist/core/mods/kernel/events.js +66 -42
  123. package/dist/core/mods/kernel/index.d.ts +4 -4
  124. package/dist/core/mods/kernel/index.js +2 -2
  125. package/dist/core/mods/kernel/receive.d.ts +39 -5
  126. package/dist/core/mods/kernel/receive.js +290 -17
  127. package/dist/core/mods/kernel/registration.d.ts +33 -2
  128. package/dist/core/mods/kernel/registration.js +6 -7
  129. package/dist/core/mods/kernel/site-rules.d.ts +44 -16
  130. package/dist/core/mods/kernel/site-rules.js +24 -42
  131. package/dist/core/mods/spec-seats.d.ts +69 -0
  132. package/dist/core/mods/spec-seats.js +114 -0
  133. package/dist/core/mods/stations.d.ts +28 -8
  134. package/dist/core/mods/stations.js +29 -13
  135. package/dist/core/mods/tool-call.d.ts +79 -0
  136. package/dist/core/mods/tool-call.js +152 -0
  137. package/dist/core/namespaced-rule-name.d.ts +32 -38
  138. package/dist/core/namespaced-rule-name.js +29 -36
  139. package/dist/core/parent-spec-seat.d.ts +6 -1
  140. package/dist/core/parent-spec-seat.js +2 -0
  141. package/dist/core/park-selfcheck.js +3 -0
  142. package/dist/core/permission-rule-consent.d.ts +24 -3
  143. package/dist/core/permission-rule-consent.js +136 -41
  144. package/dist/core/permission-rule-model.d.ts +57 -5
  145. package/dist/core/permission-rule-model.js +90 -31
  146. package/dist/core/permission-rule-org.d.ts +6 -2
  147. package/dist/core/permission-rule-org.js +8 -4
  148. package/dist/core/permission-rule-provider.d.ts +5 -2
  149. package/dist/core/permission-rule-provider.js +41 -11
  150. package/dist/core/permission-rule-store.d.ts +3 -2
  151. package/dist/core/permission-rule-store.js +11 -2
  152. package/dist/core/permission-rule-sync.js +3 -2
  153. package/dist/core/permission-rule-syntax.d.ts +5 -4
  154. package/dist/core/permission-rule-syntax.js +2 -2
  155. package/dist/core/permission-rules.d.ts +4 -4
  156. package/dist/core/permission-rules.js +11 -20
  157. package/dist/core/persisted-rule-arms.d.ts +2 -2
  158. package/dist/core/persisted-rule-arms.js +10 -12
  159. package/dist/core/principal-name.d.ts +20 -0
  160. package/dist/core/principal-name.js +22 -0
  161. package/dist/core/prompt-section-seat.js +4 -6
  162. package/dist/core/protocol-http-auth.d.ts +40 -5
  163. package/dist/core/protocol-http-auth.js +168 -4
  164. package/dist/core/protocol-naming.d.ts +20 -0
  165. package/dist/core/protocol-naming.js +20 -3
  166. package/dist/core/read-only-shell.d.ts +20 -5
  167. package/dist/core/read-only-shell.js +29 -14
  168. package/dist/core/remote-env.d.ts +37 -1
  169. package/dist/core/remote-env.js +11 -0
  170. package/dist/core/resume-startup-cause.d.ts +24 -2
  171. package/dist/core/resume-startup-cause.js +20 -1
  172. package/dist/core/retired-keys.d.ts +16 -0
  173. package/dist/core/retired-keys.js +16 -4
  174. package/dist/core/rewrite-rejudge.d.ts +60 -0
  175. package/dist/core/rewrite-rejudge.js +36 -0
  176. package/dist/core/roles.d.ts +28 -1
  177. package/dist/core/roles.js +81 -26
  178. package/dist/core/rule-lane-reads.d.ts +20 -15
  179. package/dist/core/rule-lane-reads.js +45 -17
  180. package/dist/core/rule-owner.d.ts +3 -3
  181. package/dist/core/rule-owner.js +3 -2
  182. package/dist/core/runner/announce-once-ledger.d.ts +14 -0
  183. package/dist/core/runner/announce-once-ledger.js +5 -0
  184. package/dist/core/runner/assemble-result.d.ts +1 -0
  185. package/dist/core/runner/assemble-result.js +1 -1
  186. package/dist/core/runner/call-hook-stations.d.ts +3 -2
  187. package/dist/core/runner/caller-roster.d.ts +16 -4
  188. package/dist/core/runner/caller-roster.js +33 -6
  189. package/dist/core/runner/capability-withheld-seat.d.ts +5 -0
  190. package/dist/core/runner/capability-withheld-seat.js +24 -0
  191. package/dist/core/runner/classifier-ladder.d.ts +7 -9
  192. package/dist/core/runner/classifier-ladder.js +3 -3
  193. package/dist/core/runner/compact-session.d.ts +10 -0
  194. package/dist/core/runner/compact-session.js +202 -0
  195. package/dist/core/runner/compaction-call-options.d.ts +2 -2
  196. package/dist/core/runner/compaction-seams.d.ts +21 -1
  197. package/dist/core/runner/compaction-seams.js +11 -8
  198. package/dist/core/runner/construction-doors.js +3 -0
  199. package/dist/core/runner/contracts.d.ts +50 -40
  200. package/dist/core/runner/cross-boundary-lane.d.ts +17 -13
  201. package/dist/core/runner/cross-boundary-lane.js +40 -27
  202. package/dist/core/runner/denial-limit-arms.d.ts +2 -2
  203. package/dist/core/runner/denial-limit-arms.js +1 -1
  204. package/dist/core/runner/derived-route-fallback.d.ts +13 -0
  205. package/dist/core/runner/derived-route-fallback.js +6 -0
  206. package/dist/core/runner/env-capability-census.d.ts +3 -2
  207. package/dist/core/runner/env-capability-census.js +9 -3
  208. package/dist/core/runner/file-history-request.d.ts +18 -0
  209. package/dist/core/runner/file-history-request.js +21 -13
  210. package/dist/core/runner/file-history-restore.d.ts +45 -0
  211. package/dist/core/runner/file-history-restore.js +46 -0
  212. package/dist/core/runner/gate-exit.d.ts +3 -3
  213. package/dist/core/runner/gate-exit.js +4 -3
  214. package/dist/core/runner/image.d.ts +7 -17
  215. package/dist/core/runner/image.js +9 -60
  216. package/dist/core/runner/permission-rule-lanes.d.ts +11 -11
  217. package/dist/core/runner/permission-rule-lanes.js +39 -17
  218. package/dist/core/runner/person-path-rows.d.ts +12 -9
  219. package/dist/core/runner/person-path-rows.js +18 -7
  220. package/dist/core/runner/prepare-acquire-reconcile.d.ts +3 -0
  221. package/dist/core/runner/prepare-acquire-reconcile.js +2 -1
  222. package/dist/core/runner/prepare-ask-lane.d.ts +2 -2
  223. package/dist/core/runner/prepare-ask-lane.js +5 -2
  224. package/dist/core/runner/prepare-caps-and-workflow.d.ts +4 -6
  225. package/dist/core/runner/prepare-caps-and-workflow.js +4 -3
  226. package/dist/core/runner/prepare-config-doors.d.ts +35 -38
  227. package/dist/core/runner/prepare-config-doors.js +46 -28
  228. package/dist/core/runner/prepare-defer-classify.d.ts +4 -3
  229. package/dist/core/runner/prepare-defer-classify.js +7 -8
  230. package/dist/core/runner/prepare-file-history.d.ts +48 -8
  231. package/dist/core/runner/prepare-file-history.js +7 -39
  232. package/dist/core/runner/prepare-gate-stations.d.ts +1 -1
  233. package/dist/core/runner/prepare-gate-stations.js +10 -1
  234. package/dist/core/runner/prepare-hands-readface.d.ts +5 -9
  235. package/dist/core/runner/prepare-hands-readface.js +17 -14
  236. package/dist/core/runner/prepare-inherited-gate.d.ts +6 -3
  237. package/dist/core/runner/prepare-inherited-gate.js +5 -3
  238. package/dist/core/runner/prepare-memory-engine-session.js +1 -1
  239. package/dist/core/runner/prepare-park-ask.d.ts +2 -0
  240. package/dist/core/runner/prepare-park-ask.js +7 -7
  241. package/dist/core/runner/prepare-policy-chain.d.ts +6 -3
  242. package/dist/core/runner/prepare-policy-chain.js +67 -76
  243. package/dist/core/runner/prepare-prompt-assembly.d.ts +5 -7
  244. package/dist/core/runner/prepare-prompt-assembly.js +10 -8
  245. package/dist/core/runner/prepare-prompt-inputs.d.ts +11 -9
  246. package/dist/core/runner/prepare-prompt-inputs.js +3 -5
  247. package/dist/core/runner/prepare-protocol-tools.d.ts +2 -0
  248. package/dist/core/runner/prepare-protocol-tools.js +3 -3
  249. package/dist/core/runner/prepare-safety-scan.d.ts +1 -1
  250. package/dist/core/runner/prepare-safety-scan.js +0 -17
  251. package/dist/core/runner/prepare-suspend-saga.d.ts +2 -0
  252. package/dist/core/runner/prepare-suspend-saga.js +5 -6
  253. package/dist/core/runner/prepare-task.d.ts +5 -2
  254. package/dist/core/runner/prepare-task.js +48 -43
  255. package/dist/core/runner/prepare-tool-disclosure-mount.d.ts +20 -4
  256. package/dist/core/runner/prepare-tool-disclosure-mount.js +33 -23
  257. package/dist/core/runner/prepare-turn-wiring.d.ts +0 -4
  258. package/dist/core/runner/prepare-turn-wiring.js +2 -7
  259. package/dist/core/runner/prepare-wiring-manifest.d.ts +6 -2
  260. package/dist/core/runner/prepare-wiring-manifest.js +3 -3
  261. package/dist/core/runner/resume-admission.js +1 -1
  262. package/dist/core/runner/resume-apply.js +11 -12
  263. package/dist/core/runner/resume-checkpoint-screen.js +3 -0
  264. package/dist/core/runner/resume-claim.d.ts +4 -2
  265. package/dist/core/runner/resume-claim.js +15 -8
  266. package/dist/core/runner/retired-runner-deps.js +1 -0
  267. package/dist/core/runner/rewind-files.d.ts +12 -0
  268. package/dist/core/runner/rewind-files.js +90 -0
  269. package/dist/core/runner/run-attachment-seats.js +2 -1
  270. package/dist/core/runner/run-brain-sinks.d.ts +4 -1
  271. package/dist/core/runner/run-brain-sinks.js +4 -2
  272. package/dist/core/runner/run-harness-handlers.js +12 -4
  273. package/dist/core/runner/run-leg.d.ts +1 -1
  274. package/dist/core/runner/run-leg.js +40 -39
  275. package/dist/core/runner/run-notification-lane.d.ts +2 -0
  276. package/dist/core/runner/run-notification-lane.js +2 -2
  277. package/dist/core/runner/run-recovery-lanes.js +3 -4
  278. package/dist/core/runner/run-settle-and-teardown.js +7 -12
  279. package/dist/core/runner/run-terminal-adoption.js +3 -4
  280. package/dist/core/runner/run-turn-boundary.js +4 -15
  281. package/dist/core/runner/runtask.d.ts +10 -0
  282. package/dist/core/runner/runtask.js +35 -42
  283. package/dist/core/runner/send-message-continuation.js +1 -1
  284. package/dist/core/runner/session-read-file-states.d.ts +15 -0
  285. package/dist/core/runner/session-read-file-states.js +28 -0
  286. package/dist/core/runner/session-rule-policy.js +4 -3
  287. package/dist/core/runner/session-verb-doors.d.ts +28 -0
  288. package/dist/core/runner/session-verb-doors.js +48 -0
  289. package/dist/core/runner/session-write-ledger.d.ts +30 -0
  290. package/dist/core/runner/session-write-ledger.js +101 -0
  291. package/dist/core/runner/shell-env-withheld.d.ts +33 -0
  292. package/dist/core/runner/shell-env-withheld.js +51 -0
  293. package/dist/core/runner/skills-seat.js +6 -2
  294. package/dist/core/runner/stream-settle-backstop.js +12 -15
  295. package/dist/core/runner/sub-agent-deny-lists.d.ts +25 -3
  296. package/dist/core/runner/sub-agent-deny-lists.js +25 -17
  297. package/dist/core/runner/synthetic-tools.d.ts +6 -0
  298. package/dist/core/runner/synthetic-tools.js +4 -1
  299. package/dist/core/runner/teardown-bounded.d.ts +1 -0
  300. package/dist/core/runner/teardown-bounded.js +1 -0
  301. package/dist/core/runner/tool-disclosure.d.ts +10 -12
  302. package/dist/core/runner/tool-disclosure.js +1 -3
  303. package/dist/core/runner/tool-end-body.d.ts +1 -1
  304. package/dist/core/runner/tool-end-body.js +10 -9
  305. package/dist/core/runner/tool-not-executed.d.ts +5 -0
  306. package/dist/core/runner/tool-not-executed.js +11 -0
  307. package/dist/core/runner/tool-occurrence.d.ts +8 -0
  308. package/dist/core/runner/tool-occurrence.js +7 -0
  309. package/dist/core/runner/turn-attachments.d.ts +33 -15
  310. package/dist/core/runner/turn-attachments.js +62 -37
  311. package/dist/core/runner-deps.d.ts +7 -7
  312. package/dist/core/safety-axis-vocab.d.ts +6 -4
  313. package/dist/core/safety-axis-vocab.js +6 -5
  314. package/dist/core/safety-merge-corpus.js +11 -3
  315. package/dist/core/secret-env.d.ts +30 -3
  316. package/dist/core/secret-env.js +47 -8
  317. package/dist/core/select-model.js +3 -3
  318. package/dist/core/session-policy-store.d.ts +32 -15
  319. package/dist/core/session-policy-store.js +156 -36
  320. package/dist/core/session-store.d.ts +29 -10
  321. package/dist/core/session-store.js +51 -19
  322. package/dist/core/session.d.ts +82 -16
  323. package/dist/core/session.js +53 -0
  324. package/dist/core/shell-read-silence.d.ts +11 -12
  325. package/dist/core/shell-read-silence.js +9 -5
  326. package/dist/core/shell-run-candidates.js +3 -1
  327. package/dist/core/shell-wrapper-projection.d.ts +1 -1
  328. package/dist/core/shell-wrapper-projection.js +1 -1
  329. package/dist/core/shell-wrapper-table.d.ts +14 -7
  330. package/dist/core/shell-wrapper-table.js +5 -4
  331. package/dist/core/side-query.js +10 -1
  332. package/dist/core/skill-grant.d.ts +7 -2
  333. package/dist/core/skill-grant.js +5 -0
  334. package/dist/core/skills-directory.js +6 -2
  335. package/dist/core/store-contracts/background-agent-store-contract.js +1 -0
  336. package/dist/core/store-contracts/checkpoint-store-contract.d.ts +11 -1
  337. package/dist/core/store-contracts/checkpoint-store-contract.js +141 -2
  338. package/dist/core/store-contracts/file-history-store-contract.js +40 -1
  339. package/dist/core/store-contracts/mailbox-store-contract.js +49 -1
  340. package/dist/core/store-contracts/peer-directory-contract.d.ts +7 -2
  341. package/dist/core/store-contracts/peer-directory-contract.js +14 -2
  342. package/dist/core/store-contracts/session-repo-contract.js +51 -0
  343. package/dist/core/store-contracts/session-store-contract.d.ts +2 -1
  344. package/dist/core/store-contracts/session-store-contract.js +150 -14
  345. package/dist/core/stub-env.d.ts +2 -0
  346. package/dist/core/stub-env.js +1 -0
  347. package/dist/core/synthetic-read-verdict.js +3 -3
  348. package/dist/core/task-event.d.ts +32 -4
  349. package/dist/core/task-notification.d.ts +16 -12
  350. package/dist/core/task-registry-agent.d.ts +8 -4
  351. package/dist/core/task-registry-agent.js +14 -8
  352. package/dist/core/task-registry-shared.d.ts +35 -6
  353. package/dist/core/task-registry-shared.js +11 -0
  354. package/dist/core/task-registry.d.ts +10 -1
  355. package/dist/core/task-registry.js +12 -2
  356. package/dist/core/task-result.d.ts +18 -0
  357. package/dist/core/task-spec.d.ts +18 -13
  358. package/dist/core/tighten-task-spec.js +2 -1
  359. package/dist/core/tool-catalog-entries.d.ts +23 -0
  360. package/dist/core/tool-catalog-entries.js +14 -2
  361. package/dist/core/tool-check-reading.d.ts +11 -0
  362. package/dist/core/tool-check-reading.js +11 -6
  363. package/dist/core/tool-model-gate.d.ts +2 -2
  364. package/dist/core/tool-name-aliases.d.ts +48 -18
  365. package/dist/core/tool-name-aliases.js +36 -19
  366. package/dist/core/tool-name-readings.d.ts +6 -32
  367. package/dist/core/tool-name-readings.js +2 -9
  368. package/dist/core/tool-policy.d.ts +78 -204
  369. package/dist/core/tool-policy.js +152 -204
  370. package/dist/core/tool-result-store.js +3 -0
  371. package/dist/core/tool-roster.d.ts +14 -19
  372. package/dist/core/tool-roster.js +11 -44
  373. package/dist/core/tool-spec-members.js +7 -2
  374. package/dist/core/tool-spec.d.ts +19 -11
  375. package/dist/core/tools.js +49 -9
  376. package/dist/core/trace.d.ts +6 -3
  377. package/dist/core/trace.js +2 -1
  378. package/dist/core/types.d.ts +1 -1
  379. package/dist/core/untrusted-egress.d.ts +20 -0
  380. package/dist/core/untrusted-egress.js +77 -3
  381. package/dist/core/user-attachment.d.ts +8 -1
  382. package/dist/core/user-attachment.js +64 -4
  383. package/dist/core/wiring-manifest.d.ts +9 -0
  384. package/dist/core/wiring-manifest.js +1 -0
  385. package/dist/core/workflow-journal-store.js +1 -1
  386. package/dist/engine/compaction/compaction.js +3 -2
  387. package/dist/engine/execution-env/node-execution-env.d.ts +7 -3
  388. package/dist/engine/execution-env/node-execution-env.js +11 -2
  389. package/dist/engine/harness/agent-harness.d.ts +32 -6
  390. package/dist/engine/harness/agent-harness.js +65 -9
  391. package/dist/engine/harness/types.d.ts +29 -2
  392. package/dist/engine/llm/types.d.ts +28 -11
  393. package/dist/engine/loop/agent-loop.d.ts +23 -4
  394. package/dist/engine/loop/agent-loop.js +42 -30
  395. package/dist/engine/loop/types.d.ts +16 -6
  396. package/dist/engine/session/memory-repo.d.ts +9 -2
  397. package/dist/engine/session/memory-repo.js +11 -1
  398. package/dist/engine/session/repo-utils.d.ts +6 -5
  399. package/dist/engine/session/repo-utils.js +14 -6
  400. package/dist/index.d.ts +34 -17
  401. package/dist/index.js +22 -11
  402. package/dist/internal/harness-types.d.ts +1 -1
  403. package/dist/internal/harness.d.ts +2 -1
  404. package/dist/internal/harness.js +1 -0
  405. package/dist/internal/llm.d.ts +1 -1
  406. package/dist/orchestration/run-workflow-tool.d.ts +6 -4
  407. package/dist/orchestration/run-workflow-tool.js +5 -3
  408. package/dist/orchestration/workflow.d.ts +3 -0
  409. package/dist/orchestration/workflow.js +36 -18
  410. package/dist/primitives/credential-ref.d.ts +89 -0
  411. package/dist/primitives/credential-ref.js +125 -0
  412. package/dist/primitives/index.d.ts +2 -0
  413. package/dist/primitives/index.js +1 -0
  414. package/dist/prompt-assembly/artifact.d.ts +2 -2
  415. package/dist/prompt-assembly/artifact.js +5 -3
  416. package/dist/prompt-assembly/assemble.d.ts +3 -2
  417. package/dist/prompt-assembly/assemble.js +1 -1
  418. package/dist/prompt-assembly/catalog/schema.d.ts +43 -12
  419. package/dist/prompt-assembly/catalog/schema.js +34 -2
  420. package/dist/prompt-assembly/catalog/sections.js +0 -1
  421. package/dist/prompt-assembly/composer.d.ts +3 -1
  422. package/dist/prompt-assembly/composer.js +1 -1
  423. package/dist/prompt-assembly/event-registry.js +1 -0
  424. package/dist/prompt-assembly/overlay.js +3 -3
  425. package/dist/prompt-assembly/renderers.d.ts +1 -1
  426. package/dist/prompt-assembly/renderers.js +0 -3
  427. package/dist/prompt-assembly/role-base.d.ts +15 -0
  428. package/dist/prompt-assembly/role-base.js +9 -0
  429. package/dist/prompt-assembly/select.d.ts +39 -14
  430. package/dist/prompt-assembly/select.js +47 -16
  431. package/dist/prompt-assembly/sugar.d.ts +17 -11
  432. package/dist/prompt-assembly/sugar.js +8 -3
  433. package/dist/prompt-assembly/tool-catalog.d.ts +37 -3
  434. package/dist/prompt-assembly/tool-catalog.js +114 -4
  435. package/dist/prompt-assembly/turn-snapshot.d.ts +4 -10
  436. package/dist/prompt-assembly/turn-snapshot.js +0 -3
  437. package/dist/prompt-assembly/types.d.ts +0 -7
  438. package/dist/scenarios/full-body.d.ts +11 -11
  439. package/dist/scenarios/full-body.js +4 -3
  440. package/dist/shell/lex.js +10 -1
  441. package/dist/stores/file/adoption/adopt.js +4 -3
  442. package/dist/stores/file/adoption/marker.js +3 -2
  443. package/dist/stores/file/checkpoint-store.d.ts +21 -4
  444. package/dist/stores/file/checkpoint-store.js +38 -7
  445. package/dist/stores/file/file-history-store.js +18 -11
  446. package/dist/stores/file/index.js +2 -1
  447. package/dist/stores/file/mailbox-store.d.ts +2 -1
  448. package/dist/stores/file/mailbox-store.js +26 -1
  449. package/dist/stores/file/permission-rule-adopt.js +4 -3
  450. package/dist/stores/file/permission-rule-store.js +11 -5
  451. package/dist/stores/file/session-store.d.ts +29 -6
  452. package/dist/stores/file/session-store.js +42 -50
  453. package/dist/tools/artifact/artifact-tool.js +3 -2
  454. package/dist/tools/fs/bash-program-position.d.ts +19 -2
  455. package/dist/tools/fs/bash-program-position.js +56 -9
  456. package/dist/tools/fs/bash-readonly-classifier.d.ts +15 -19
  457. package/dist/tools/fs/bash-readonly-classifier.js +5 -10
  458. package/dist/tools/fs/fs-bash.js +15 -8
  459. package/dist/tools/fs/fs-glob.d.ts +86 -0
  460. package/dist/tools/fs/fs-glob.js +226 -0
  461. package/dist/tools/fs/fs-read.js +14 -14
  462. package/dist/tools/fs/fs-search-tools.js +7 -7
  463. package/dist/tools/fs/pattern-kill-guard.d.ts +23 -0
  464. package/dist/tools/fs/pattern-kill-guard.js +429 -0
  465. package/dist/tools/fs/pdf.d.ts +9 -6
  466. package/dist/tools/fs/pdf.js +3 -3
  467. package/dist/tools/fs/program-read-model.d.ts +57 -7
  468. package/dist/tools/fs/program-read-model.js +11 -1
  469. package/dist/tools/fs/program-read-model.rows.js +78 -21
  470. package/dist/tools/fs/read-deny-home.js +3 -2
  471. package/dist/tools/fs/removal-targets.d.ts +17 -7
  472. package/dist/tools/fs/removal-targets.js +47 -20
  473. package/dist/tools/fs/search.d.ts +10 -0
  474. package/dist/tools/fs/search.js +20 -26
  475. package/dist/tools/fs/shell-read-argv.js +89 -12
  476. package/dist/tools/fs/shell-read-bindings.d.ts +31 -0
  477. package/dist/tools/fs/shell-read-bindings.js +41 -0
  478. package/dist/tools/fs/shell-read-check.d.ts +10 -0
  479. package/dist/tools/fs/shell-read-check.js +13 -20
  480. package/dist/tools/fs/shell-read-environment.d.ts +5 -1
  481. package/dist/tools/fs/shell-read-environment.js +3 -2
  482. package/dist/tools/fs/shell-read-establish.d.ts +15 -0
  483. package/dist/tools/fs/shell-read-establish.js +19 -20
  484. package/dist/tools/fs/shell-read-identity.d.ts +12 -9
  485. package/dist/tools/fs/shell-read-identity.js +9 -4
  486. package/dist/tools/fs/shell-read-plan.js +24 -16
  487. package/dist/tools/fs/shell-read-start.d.ts +6 -1
  488. package/dist/tools/fs/shell-read-write-targets.d.ts +5 -1
  489. package/dist/tools/fs/shell-read-write-targets.js +2 -3
  490. package/dist/tools/fs/shell-reentry-text.d.ts +9 -0
  491. package/dist/tools/fs/shell-reentry-text.js +40 -2
  492. package/dist/tools/todo.js +63 -63
  493. package/dist/tools/web.d.ts +19 -14
  494. package/dist/tools/web.js +46 -61
  495. package/package.json +1 -1
  496. package/test/export-surface.snapshot.json +221 -7
  497. package/wire-changes/core-stores-sql@7.57.0.json +29 -0
  498. package/wire-changes/core@7.56.0.json +3891 -0
  499. package/wire-changes/core@7.57.0.json +1487 -0
  500. package/wire-changes/mods-kernel@7.56.0.json +303 -0
  501. package/wire-changes/mods-kernel@7.57.0.json +29 -0
  502. 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
- let src = "";
16
+ const tokens = [];
16
17
  for (let i = 0; i < pattern.length; i++) {
17
18
  const ch = pattern[i];
18
19
  if (ch === "*") {
19
- src += "[^/]*";
20
+ tokens.push({ kind: "star" });
20
21
  }
21
22
  else if (ch === "?") {
22
- src += "[^/]";
23
+ tokens.push({ kind: "one" });
23
24
  }
24
25
  else if (ch === "[") {
25
- const cls = parseBracketExpression(pattern, i);
26
- if (cls === undefined)
27
- src += "\\[";
26
+ const bracket = parseBracketExpression(pattern, i);
27
+ if (bracket === undefined)
28
+ tokens.push({ kind: "text", text: "[" });
28
29
  else {
29
- src += cls.source;
30
- i = cls.end;
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
- src += ch.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
38
+ tokens.push({ kind: "text", text: ch });
35
39
  }
36
40
  }
37
- try {
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 !== "not_found" && canon.error.code !== "not_directory")
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 === "not_found" || listed.error.code === "not_directory")
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 === "not_found" || entry.error.code === "not_directory" ? name : undefined;
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 && sameTargets(b.targets, a.targets))
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 (runsShellText(basename))
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 words = segment.argv.map((w) => ({ raw: w.raw, spelled: w.folded }));
8
- const at = words.findIndex((w) => w.spelled === segment.verb?.name);
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);
@@ -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
- descriptionClassic: "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.",
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\")." }),