@sema-agent/core 7.54.1 → 7.56.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (621) hide show
  1. package/CHANGELOG.md +950 -0
  2. package/dist/agents/agent-transcript-tool.js +2 -1
  3. package/dist/agents/builtin-agents.d.ts +12 -14
  4. package/dist/agents/cascade.js +1 -1
  5. package/dist/agents/cc-peer-directory.d.ts +36 -0
  6. package/dist/agents/cc-peer-directory.js +139 -0
  7. package/dist/agents/cc-peer-wire.d.ts +105 -0
  8. package/dist/agents/cc-peer-wire.js +98 -0
  9. package/dist/agents/cc-uds-peer-channel.d.ts +40 -0
  10. package/dist/agents/cc-uds-peer-channel.js +457 -0
  11. package/dist/agents/child-model-seat.d.ts +0 -11
  12. package/dist/agents/child-model-seat.js +0 -3
  13. package/dist/agents/cross-session-envelope.d.ts +4 -1
  14. package/dist/agents/cross-session-envelope.js +8 -1
  15. package/dist/agents/cross-session-judge.d.ts +2 -2
  16. package/dist/agents/list-agents-tool.d.ts +3 -1
  17. package/dist/agents/list-agents-tool.js +9 -8
  18. package/dist/agents/observer.d.ts +4 -5
  19. package/dist/agents/observer.js +2 -1
  20. package/dist/agents/peer-admission.d.ts +6 -0
  21. package/dist/agents/peer-admission.js +4 -1
  22. package/dist/agents/peer-directory.d.ts +65 -13
  23. package/dist/agents/peer-directory.js +90 -25
  24. package/dist/agents/peer-notices.d.ts +1 -1
  25. package/dist/agents/peer-session-drain.d.ts +3 -1
  26. package/dist/agents/peer-session-drain.js +3 -2
  27. package/dist/agents/read-inbox-tool.js +2 -1
  28. package/dist/agents/repair-loop.js +2 -2
  29. package/dist/agents/retain-ledger.d.ts +1 -1
  30. package/dist/agents/roster-store.d.ts +1 -1
  31. package/dist/agents/send-message-tool.d.ts +10 -0
  32. package/dist/agents/send-message-tool.js +37 -8
  33. package/dist/agents/subagent.d.ts +39 -82
  34. package/dist/agents/subagent.js +109 -106
  35. package/dist/agents/tool-filter.d.ts +31 -46
  36. package/dist/agents/tool-filter.js +13 -33
  37. package/dist/agents/verify.d.ts +6 -5
  38. package/dist/agents/verify.js +3 -3
  39. package/dist/brain/anthropic.js +43 -81
  40. package/dist/brain/errors.d.ts +15 -0
  41. package/dist/brain/errors.js +10 -0
  42. package/dist/brain/media-degrade.d.ts +18 -7
  43. package/dist/brain/media-degrade.js +13 -2
  44. package/dist/brain/model-capability.d.ts +37 -0
  45. package/dist/brain/model-capability.js +34 -0
  46. package/dist/brain/model-presets.d.ts +6 -12
  47. package/dist/brain/model-presets.js +1 -6
  48. package/dist/brain/open-responses.js +27 -35
  49. package/dist/brain/openai.js +30 -98
  50. package/dist/brain/provider-dialect.d.ts +39 -3
  51. package/dist/brain/provider-dialect.js +28 -0
  52. package/dist/brain/reasoning-request.d.ts +96 -0
  53. package/dist/brain/reasoning-request.js +174 -0
  54. package/dist/brain/reasoning.d.ts +12 -12
  55. package/dist/brain/reasoning.js +4 -3
  56. package/dist/brain/request-params.d.ts +62 -9
  57. package/dist/brain/request-params.js +42 -7
  58. package/dist/brain/retry.d.ts +1 -1
  59. package/dist/brain/route-adjudicator.d.ts +15 -0
  60. package/dist/brain/route-adjudicator.js +15 -0
  61. package/dist/brain/status-sink.d.ts +20 -0
  62. package/dist/brain/status-sink.js +7 -0
  63. package/dist/brain/stream-engine.js +6 -5
  64. package/dist/brain/stream-shared.d.ts +1 -1
  65. package/dist/core/a2a.d.ts +2 -1
  66. package/dist/core/a2a.js +19 -13
  67. package/dist/core/advisor-verdict.d.ts +120 -0
  68. package/dist/core/advisor-verdict.js +92 -0
  69. package/dist/core/agent-definition.d.ts +17 -8
  70. package/dist/core/allow-entry.d.ts +69 -36
  71. package/dist/core/allow-entry.js +81 -52
  72. package/dist/core/allow-rule-shadow.d.ts +10 -3
  73. package/dist/core/approval-object.d.ts +2 -1
  74. package/dist/core/approval-object.js +6 -6
  75. package/dist/core/ask-origin.d.ts +127 -29
  76. package/dist/core/ask-origin.js +87 -25
  77. package/dist/core/ask-question.d.ts +51 -8
  78. package/dist/core/ask-question.js +12 -7
  79. package/dist/core/ask-unresolvable-notice.d.ts +8 -3
  80. package/dist/core/ask-unresolvable-notice.js +16 -2
  81. package/dist/core/auto-compaction.d.ts +11 -8
  82. package/dist/core/auto-compaction.js +4 -2
  83. package/dist/core/auto-mode-arming.d.ts +2 -2
  84. package/dist/core/auto-mode-defaults.d.ts +8 -8
  85. package/dist/core/auto-mode-prompt-assets.d.ts +3 -3
  86. package/dist/core/auto-mode-prompt.d.ts +1 -1
  87. package/dist/core/auto-mode.d.ts +17 -9
  88. package/dist/core/auto-mode.js +9 -6
  89. package/dist/core/background-agent-store.d.ts +3 -3
  90. package/dist/core/canonical-json.d.ts +1 -1
  91. package/dist/core/canonical-json.js +2 -2
  92. package/dist/core/checkpoint-generation.d.ts +53 -0
  93. package/dist/core/checkpoint-generation.js +35 -0
  94. package/dist/core/checkpoint-queries.d.ts +180 -0
  95. package/dist/core/checkpoint-queries.js +272 -0
  96. package/dist/core/checkpoint-requirements.d.ts +19 -4
  97. package/dist/core/checkpoint-requirements.js +8 -14
  98. package/dist/core/checkpoint-store.d.ts +165 -72
  99. package/dist/core/checkpoint-store.js +79 -82
  100. package/dist/core/child-clamp-seats.d.ts +6 -0
  101. package/dist/core/child-clamp-seats.js +3 -16
  102. package/dist/core/compliance.d.ts +2 -2
  103. package/dist/core/context-edit.d.ts +6 -7
  104. package/dist/core/cross-boundary-taint.d.ts +11 -4
  105. package/dist/core/cross-boundary-taint.js +3 -3
  106. package/dist/core/decision-receipt.d.ts +37 -3
  107. package/dist/core/decision-receipt.js +19 -19
  108. package/dist/core/delegation-not-started.d.ts +6 -0
  109. package/dist/core/delegation-not-started.js +17 -0
  110. package/dist/core/effective-path-target.d.ts +1 -1
  111. package/dist/core/engine-attestation.d.ts +93 -0
  112. package/dist/core/engine-attestation.js +70 -0
  113. package/dist/core/engine-capabilities.d.ts +4 -1
  114. package/dist/core/engine-capabilities.js +1 -1
  115. package/dist/core/engine-notice.d.ts +45 -12
  116. package/dist/core/exec-output-tail.d.ts +1 -1
  117. package/dist/core/file-history-retention.d.ts +1 -1
  118. package/dist/core/file-history-store.d.ts +147 -21
  119. package/dist/core/file-history-store.js +58 -32
  120. package/dist/core/gate-fold.d.ts +1 -1
  121. package/dist/core/gate-fold.js +24 -11
  122. package/dist/core/gate-lanes.js +81 -68
  123. package/dist/core/gate-outcome.d.ts +40 -6
  124. package/dist/core/gate-outcome.js +56 -0
  125. package/dist/core/governance-codes.d.ts +17 -3
  126. package/dist/core/governance-codes.js +16 -0
  127. package/dist/core/hands-band.d.ts +1 -1
  128. package/dist/core/hooks.d.ts +21 -20
  129. package/dist/core/hooks.js +3 -1
  130. package/dist/core/host-floor.d.ts +128 -0
  131. package/dist/core/host-floor.js +206 -0
  132. package/dist/core/host-target.d.ts +84 -0
  133. package/dist/core/host-target.js +92 -0
  134. package/dist/core/image-downsample.d.ts +1 -1
  135. package/dist/core/lsp-diagnostics.d.ts +4 -4
  136. package/dist/core/lsp.d.ts +3 -3
  137. package/dist/core/mailbox-store.d.ts +4 -0
  138. package/dist/core/mcp-connection-pool.d.ts +18 -2
  139. package/dist/core/mcp-connection-pool.js +53 -6
  140. package/dist/core/mcp-failure.d.ts +23 -4
  141. package/dist/core/mcp-failure.js +26 -11
  142. package/dist/core/mcp-listing-drift.d.ts +10 -0
  143. package/dist/core/mcp-listing-drift.js +6 -0
  144. package/dist/core/mcp-server-link.d.ts +173 -0
  145. package/dist/core/mcp-server-link.js +127 -0
  146. package/dist/core/mcp-server-spec.d.ts +4 -2
  147. package/dist/core/mcp-session-end.d.ts +26 -0
  148. package/dist/core/mcp-session-end.js +29 -0
  149. package/dist/core/mcp-startup-request.d.ts +17 -0
  150. package/dist/core/mcp-startup-request.js +17 -0
  151. package/dist/core/mcp.d.ts +17 -13
  152. package/dist/core/mcp.js +240 -189
  153. package/dist/core/media-byte-cap.d.ts +1 -1
  154. package/dist/core/memory-engine/delegation-settlement.js +15 -24
  155. package/dist/core/memory-engine/engine.d.ts +9 -9
  156. package/dist/core/memory-engine/engine.js +4 -4
  157. package/dist/core/memory-engine/layout.d.ts +60 -8
  158. package/dist/core/memory-engine/layout.js +65 -6
  159. package/dist/core/memory-engine/provenance-wording.d.ts +1 -1
  160. package/dist/core/memory-engine/tools.js +4 -1
  161. package/dist/core/mode-policy.d.ts +1 -1
  162. package/dist/core/model-seat.d.ts +10 -3
  163. package/dist/core/mods/classic-events.d.ts +67 -0
  164. package/dist/core/mods/classic-events.js +1 -0
  165. package/dist/core/mods/dollar.d.ts +13 -0
  166. package/dist/core/mods/extension-call.d.ts +31 -0
  167. package/dist/core/mods/extension-call.js +43 -0
  168. package/dist/core/mods/kernel/dispatch.d.ts +20 -3
  169. package/dist/core/mods/kernel/dispatch.js +140 -69
  170. package/dist/core/mods/kernel/events.d.ts +47 -11
  171. package/dist/core/mods/kernel/events.js +66 -42
  172. package/dist/core/mods/kernel/index.d.ts +4 -4
  173. package/dist/core/mods/kernel/index.js +2 -2
  174. package/dist/core/mods/kernel/receive.d.ts +39 -5
  175. package/dist/core/mods/kernel/receive.js +290 -17
  176. package/dist/core/mods/kernel/registration.d.ts +33 -2
  177. package/dist/core/mods/kernel/registration.js +6 -7
  178. package/dist/core/mods/kernel/site-rules.d.ts +44 -16
  179. package/dist/core/mods/kernel/site-rules.js +24 -42
  180. package/dist/core/mods/spec-seats.d.ts +69 -0
  181. package/dist/core/mods/spec-seats.js +114 -0
  182. package/dist/core/mods/stations.d.ts +28 -8
  183. package/dist/core/mods/stations.js +29 -13
  184. package/dist/core/mods/tool-call.d.ts +79 -0
  185. package/dist/core/mods/tool-call.js +152 -0
  186. package/dist/core/namespaced-rule-name.d.ts +44 -24
  187. package/dist/core/namespaced-rule-name.js +50 -43
  188. package/dist/core/output-style.d.ts +1 -1
  189. package/dist/core/param-rule-reach.d.ts +15 -0
  190. package/dist/core/param-rule-reach.js +30 -0
  191. package/dist/core/parent-spec-seat.d.ts +13 -1
  192. package/dist/core/parent-spec-seat.js +6 -0
  193. package/dist/core/park-selfcheck.js +1 -0
  194. package/dist/core/pause-registry.d.ts +16 -5
  195. package/dist/core/pause-registry.js +6 -2
  196. package/dist/core/peer-channel.d.ts +70 -0
  197. package/dist/core/peer-channel.js +1 -0
  198. package/dist/core/permission-rule-consent.d.ts +30 -5
  199. package/dist/core/permission-rule-consent.js +147 -50
  200. package/dist/core/permission-rule-model.d.ts +245 -65
  201. package/dist/core/permission-rule-model.js +421 -107
  202. package/dist/core/permission-rule-org.d.ts +6 -2
  203. package/dist/core/permission-rule-org.js +7 -3
  204. package/dist/core/permission-rule-provider.d.ts +6 -2
  205. package/dist/core/permission-rule-provider.js +41 -11
  206. package/dist/core/permission-rule-store.d.ts +22 -26
  207. package/dist/core/permission-rule-store.js +12 -6
  208. package/dist/core/permission-rule-sync.d.ts +11 -2
  209. package/dist/core/permission-rule-sync.js +11 -3
  210. package/dist/core/permission-rule-syntax.d.ts +5 -4
  211. package/dist/core/permission-rule-syntax.js +2 -2
  212. package/dist/core/permission-rules.d.ts +53 -15
  213. package/dist/core/permission-rules.js +125 -100
  214. package/dist/core/persisted-rule-arms.d.ts +6 -4
  215. package/dist/core/persisted-rule-arms.js +10 -12
  216. package/dist/core/present-plan-tool.js +3 -1
  217. package/dist/core/principal-name.d.ts +20 -0
  218. package/dist/core/principal-name.js +22 -0
  219. package/dist/core/prompt-section-seat.js +4 -6
  220. package/dist/core/protocol-http-auth.d.ts +26 -5
  221. package/dist/core/protocol-http-auth.js +137 -4
  222. package/dist/core/protocol-naming.d.ts +2 -2
  223. package/dist/core/read-only-shell-table.d.ts +1 -1
  224. package/dist/core/read-only-shell.d.ts +1 -1
  225. package/dist/core/retired-keys.d.ts +16 -0
  226. package/dist/core/retired-keys.js +16 -4
  227. package/dist/core/rewrite-rejudge.d.ts +60 -0
  228. package/dist/core/rewrite-rejudge.js +36 -0
  229. package/dist/core/roles.d.ts +34 -3
  230. package/dist/core/roles.js +66 -53
  231. package/dist/core/rule-lane-reads.d.ts +20 -15
  232. package/dist/core/rule-lane-reads.js +45 -17
  233. package/dist/core/rule-offer-read.d.ts +53 -0
  234. package/dist/core/rule-offer-read.js +146 -0
  235. package/dist/core/rule-owner.d.ts +46 -0
  236. package/dist/core/rule-owner.js +29 -0
  237. package/dist/core/runner/advisor-instructions.d.ts +70 -0
  238. package/dist/core/runner/advisor-instructions.js +61 -0
  239. package/dist/core/runner/advisor-tool.d.ts +33 -0
  240. package/dist/core/runner/advisor-tool.js +112 -0
  241. package/dist/core/runner/announce-once-ledger.d.ts +18 -26
  242. package/dist/core/runner/announce-once-ledger.js +19 -46
  243. package/dist/core/runner/approval-feedback.js +6 -3
  244. package/dist/core/runner/assemble-result.d.ts +2 -1
  245. package/dist/core/runner/assemble-result.js +1 -1
  246. package/dist/core/runner/call-hook-stations.d.ts +3 -2
  247. package/dist/core/runner/caller-roster.d.ts +21 -2
  248. package/dist/core/runner/caller-roster.js +38 -0
  249. package/dist/core/runner/capability-withheld-seat.d.ts +5 -0
  250. package/dist/core/runner/capability-withheld-seat.js +24 -0
  251. package/dist/core/runner/classifier-ladder.d.ts +33 -13
  252. package/dist/core/runner/classifier-ladder.js +15 -14
  253. package/dist/core/runner/compaction-restate.d.ts +10 -6
  254. package/dist/core/runner/compaction-restate.js +9 -3
  255. package/dist/core/runner/construction-doors.js +3 -0
  256. package/dist/core/runner/contracts.d.ts +40 -33
  257. package/dist/core/runner/conversation-segment.d.ts +28 -0
  258. package/dist/core/runner/conversation-segment.js +42 -0
  259. package/dist/core/runner/cross-boundary-lane.d.ts +21 -16
  260. package/dist/core/runner/cross-boundary-lane.js +58 -34
  261. package/dist/core/runner/decide-continuation.d.ts +7 -4
  262. package/dist/core/runner/decide-continuation.js +2 -2
  263. package/dist/core/runner/denial-limit-arms.d.ts +4 -4
  264. package/dist/core/runner/denial-limit-arms.js +1 -1
  265. package/dist/core/runner/derived-route-fallback.d.ts +24 -24
  266. package/dist/core/runner/derived-route-fallback.js +9 -7
  267. package/dist/core/runner/file-history-request.d.ts +18 -0
  268. package/dist/core/runner/file-history-request.js +21 -13
  269. package/dist/core/runner/file-history-restore.d.ts +45 -0
  270. package/dist/core/runner/file-history-restore.js +46 -0
  271. package/dist/core/runner/gate-exit.d.ts +9 -3
  272. package/dist/core/runner/gate-exit.js +11 -5
  273. package/dist/core/runner/image.d.ts +7 -17
  274. package/dist/core/runner/image.js +9 -60
  275. package/dist/core/runner/initial-run-state.js +1 -1
  276. package/dist/core/runner/permission-rule-lanes.d.ts +6 -6
  277. package/dist/core/runner/permission-rule-lanes.js +38 -15
  278. package/dist/core/runner/person-path-rows.d.ts +12 -9
  279. package/dist/core/runner/person-path-rows.js +19 -8
  280. package/dist/core/runner/prepare-advisor.d.ts +63 -0
  281. package/dist/core/runner/prepare-advisor.js +77 -0
  282. package/dist/core/runner/prepare-ask-lane.d.ts +2 -2
  283. package/dist/core/runner/prepare-ask-lane.js +5 -2
  284. package/dist/core/runner/prepare-caps-and-workflow.d.ts +4 -6
  285. package/dist/core/runner/prepare-caps-and-workflow.js +5 -4
  286. package/dist/core/runner/prepare-config-doors.d.ts +31 -38
  287. package/dist/core/runner/prepare-config-doors.js +57 -34
  288. package/dist/core/runner/prepare-defer-classify.d.ts +4 -3
  289. package/dist/core/runner/prepare-defer-classify.js +7 -8
  290. package/dist/core/runner/prepare-delegation-surface.d.ts +2 -2
  291. package/dist/core/runner/prepare-delegation-surface.js +1 -1
  292. package/dist/core/runner/prepare-file-history.d.ts +48 -8
  293. package/dist/core/runner/prepare-file-history.js +41 -73
  294. package/dist/core/runner/prepare-gate-stations.d.ts +2 -5
  295. package/dist/core/runner/prepare-gate-stations.js +12 -8
  296. package/dist/core/runner/prepare-hands-readface.d.ts +2 -8
  297. package/dist/core/runner/prepare-hands-readface.js +15 -14
  298. package/dist/core/runner/prepare-inherited-gate.d.ts +11 -7
  299. package/dist/core/runner/prepare-inherited-gate.js +8 -6
  300. package/dist/core/runner/prepare-memory-engine-session.js +1 -1
  301. package/dist/core/runner/prepare-park-ask.js +12 -12
  302. package/dist/core/runner/prepare-policy-chain.d.ts +7 -4
  303. package/dist/core/runner/prepare-policy-chain.js +68 -81
  304. package/dist/core/runner/prepare-project-context.d.ts +5 -2
  305. package/dist/core/runner/prepare-project-context.js +6 -3
  306. package/dist/core/runner/prepare-prompt-assembly.d.ts +5 -7
  307. package/dist/core/runner/prepare-prompt-assembly.js +10 -8
  308. package/dist/core/runner/prepare-prompt-inputs.d.ts +11 -9
  309. package/dist/core/runner/prepare-prompt-inputs.js +4 -6
  310. package/dist/core/runner/prepare-protocol-tools.d.ts +4 -2
  311. package/dist/core/runner/prepare-protocol-tools.js +5 -4
  312. package/dist/core/runner/prepare-safety-scan.d.ts +9 -12
  313. package/dist/core/runner/prepare-safety-scan.js +8 -23
  314. package/dist/core/runner/prepare-suspend-saga.d.ts +2 -0
  315. package/dist/core/runner/prepare-suspend-saga.js +5 -6
  316. package/dist/core/runner/prepare-task.d.ts +1 -1
  317. package/dist/core/runner/prepare-task.js +41 -35
  318. package/dist/core/runner/prepare-tool-disclosure-mount.d.ts +7 -4
  319. package/dist/core/runner/prepare-tool-disclosure-mount.js +24 -18
  320. package/dist/core/runner/prepare-turn-wiring.d.ts +0 -4
  321. package/dist/core/runner/prepare-turn-wiring.js +2 -7
  322. package/dist/core/runner/prepare-wiring-manifest.d.ts +11 -4
  323. package/dist/core/runner/prepare-wiring-manifest.js +3 -3
  324. package/dist/core/runner/resume-admission.js +1 -1
  325. package/dist/core/runner/resume-apply.js +11 -12
  326. package/dist/core/runner/resume-checkpoint-screen.js +3 -0
  327. package/dist/core/runner/resume-claim.d.ts +4 -2
  328. package/dist/core/runner/resume-claim.js +15 -8
  329. package/dist/core/runner/resume-policy-outcome.js +1 -1
  330. package/dist/core/runner/retired-runner-deps.js +2 -1
  331. package/dist/core/runner/rewind-files.d.ts +15 -0
  332. package/dist/core/runner/rewind-files.js +132 -0
  333. package/dist/core/runner/run-attachment-seats.js +2 -2
  334. package/dist/core/runner/run-brain-sinks.d.ts +4 -1
  335. package/dist/core/runner/run-brain-sinks.js +4 -2
  336. package/dist/core/runner/run-compaction-machinery.d.ts +1 -1
  337. package/dist/core/runner/run-compaction-machinery.js +2 -12
  338. package/dist/core/runner/run-git-lane.d.ts +1 -0
  339. package/dist/core/runner/run-harness-handlers.js +14 -7
  340. package/dist/core/runner/run-leg.d.ts +1 -1
  341. package/dist/core/runner/run-leg.js +43 -18
  342. package/dist/core/runner/run-settle-and-teardown.js +3 -2
  343. package/dist/core/runner/run-telemetry-and-budget-seats.js +1 -1
  344. package/dist/core/runner/run-turn-boundary.d.ts +1 -0
  345. package/dist/core/runner/run-turn-boundary.js +15 -22
  346. package/dist/core/runner/runtask.d.ts +3 -0
  347. package/dist/core/runner/runtask.js +8 -9
  348. package/dist/core/runner/session-read-file-states.d.ts +15 -0
  349. package/dist/core/runner/session-read-file-states.js +28 -0
  350. package/dist/core/runner/session-rule-policy.d.ts +22 -21
  351. package/dist/core/runner/session-rule-policy.js +17 -31
  352. package/dist/core/runner/shell-env-withheld.d.ts +33 -0
  353. package/dist/core/runner/shell-env-withheld.js +51 -0
  354. package/dist/core/runner/side-call-account.d.ts +32 -8
  355. package/dist/core/runner/side-call-account.js +23 -1
  356. package/dist/core/runner/skills-seat.js +6 -2
  357. package/dist/core/runner/stream-settle-backstop.js +1 -1
  358. package/dist/core/runner/strict-output-schema.d.ts +1 -1
  359. package/dist/core/runner/sub-agent-deny-lists.js +4 -6
  360. package/dist/core/runner/synthetic-tools.d.ts +16 -13
  361. package/dist/core/runner/synthetic-tools.js +8 -3
  362. package/dist/core/runner/tool-disclosure.d.ts +10 -12
  363. package/dist/core/runner/tool-disclosure.js +3 -4
  364. package/dist/core/runner/tool-end-body.d.ts +1 -1
  365. package/dist/core/runner/tool-end-body.js +10 -9
  366. package/dist/core/runner/tool-face-overlay.d.ts +2 -1
  367. package/dist/core/runner/tool-face-overlay.js +17 -1
  368. package/dist/core/runner/tool-not-executed.d.ts +5 -0
  369. package/dist/core/runner/tool-not-executed.js +11 -0
  370. package/dist/core/runner/tool-occurrence.d.ts +8 -0
  371. package/dist/core/runner/tool-occurrence.js +7 -0
  372. package/dist/core/runner/tool-progress-lane.d.ts +2 -2
  373. package/dist/core/runner/tool-turn-repair-seat.d.ts +3 -2
  374. package/dist/core/runner/turn-attachments.d.ts +91 -80
  375. package/dist/core/runner/turn-attachments.js +62 -37
  376. package/dist/core/runner-deps.d.ts +42 -42
  377. package/dist/core/runtime-caps.d.ts +4 -4
  378. package/dist/core/safety-axis-vocab.d.ts +6 -4
  379. package/dist/core/safety-axis-vocab.js +6 -5
  380. package/dist/core/safety-merge-corpus.js +26 -2
  381. package/dist/core/same-plain-value.d.ts +40 -0
  382. package/dist/core/same-plain-value.js +49 -0
  383. package/dist/core/scheduler.d.ts +1 -1
  384. package/dist/core/secret-env.d.ts +26 -3
  385. package/dist/core/secret-env.js +44 -8
  386. package/dist/core/select-model.js +3 -3
  387. package/dist/core/sensitive-path-policy.d.ts +1 -1
  388. package/dist/core/sensitive-path-policy.js +1 -1
  389. package/dist/core/session-policy-store.d.ts +102 -35
  390. package/dist/core/session-policy-store.js +210 -48
  391. package/dist/core/session-reconcile.d.ts +2 -2
  392. package/dist/core/session-store.d.ts +106 -37
  393. package/dist/core/session-store.js +165 -91
  394. package/dist/core/session.d.ts +101 -57
  395. package/dist/core/session.js +53 -0
  396. package/dist/core/shared-memory/tools.js +3 -1
  397. package/dist/core/shared-memory/types.d.ts +1 -1
  398. package/dist/core/shell-read-silence.d.ts +11 -12
  399. package/dist/core/shell-read-silence.js +9 -5
  400. package/dist/core/shell-run-candidates.js +3 -1
  401. package/dist/core/shell-wrapper-projection.js +1 -1
  402. package/dist/core/shell-wrapper-table.d.ts +14 -7
  403. package/dist/core/shell-wrapper-table.js +5 -4
  404. package/dist/core/side-query.d.ts +10 -0
  405. package/dist/core/side-query.js +15 -1
  406. package/dist/core/skill-grant.d.ts +7 -2
  407. package/dist/core/skill-grant.js +5 -0
  408. package/dist/core/skills-directory.js +6 -2
  409. package/dist/core/store-contracts/checkpoint-store-contract.d.ts +11 -1
  410. package/dist/core/store-contracts/checkpoint-store-contract.js +168 -3
  411. package/dist/core/store-contracts/file-history-store-contract.js +74 -4
  412. package/dist/core/store-contracts/peer-directory-contract.d.ts +7 -2
  413. package/dist/core/store-contracts/peer-directory-contract.js +14 -2
  414. package/dist/core/store-contracts/session-policy-store-contract.d.ts +7 -0
  415. package/dist/core/store-contracts/session-policy-store-contract.js +130 -0
  416. package/dist/core/store-contracts/session-repo-contract.js +176 -0
  417. package/dist/core/store-contracts/session-store-contract.d.ts +6 -8
  418. package/dist/core/store-contracts/session-store-contract.js +361 -51
  419. package/dist/core/store-contracts/workflow-journal-store-contract.js +26 -1
  420. package/dist/core/stub-env.d.ts +2 -0
  421. package/dist/core/stub-env.js +1 -0
  422. package/dist/core/surrogate-safe-slice.d.ts +3 -3
  423. package/dist/core/synthetic-read-verdict.js +3 -3
  424. package/dist/core/task-event.d.ts +42 -8
  425. package/dist/core/task-notification.d.ts +19 -15
  426. package/dist/core/task-registry-agent.d.ts +4 -4
  427. package/dist/core/task-registry-shared.d.ts +4 -4
  428. package/dist/core/task-registry-shared.js +1 -0
  429. package/dist/core/task-registry.d.ts +13 -4
  430. package/dist/core/task-registry.js +14 -2
  431. package/dist/core/task-result.d.ts +21 -3
  432. package/dist/core/task-spec.d.ts +69 -64
  433. package/dist/core/task-stream.d.ts +6 -6
  434. package/dist/core/task-tool-shape.d.ts +4 -4
  435. package/dist/core/tighten-task-spec.d.ts +1 -1
  436. package/dist/core/tighten-task-spec.js +2 -1
  437. package/dist/core/tool-catalog-entries.d.ts +36 -2
  438. package/dist/core/tool-catalog-entries.js +69 -43
  439. package/dist/core/tool-check-reading.d.ts +11 -0
  440. package/dist/core/tool-check-reading.js +11 -6
  441. package/dist/core/tool-conformance.js +1 -0
  442. package/dist/core/tool-errors.d.ts +2 -2
  443. package/dist/core/tool-face-reader.js +5 -3
  444. package/dist/core/tool-face.d.ts +21 -2
  445. package/dist/core/tool-face.js +1 -1
  446. package/dist/core/tool-model-gate.d.ts +5 -5
  447. package/dist/core/tool-name-aliases.d.ts +29 -8
  448. package/dist/core/tool-name-aliases.js +22 -4
  449. package/dist/core/tool-name-readings.d.ts +10 -43
  450. package/dist/core/tool-name-readings.js +2 -11
  451. package/dist/core/tool-policy.d.ts +85 -196
  452. package/dist/core/tool-policy.js +150 -175
  453. package/dist/core/tool-registry.d.ts +14 -7
  454. package/dist/core/tool-registry.js +17 -7
  455. package/dist/core/tool-result-store.js +5 -1
  456. package/dist/core/tool-roster.d.ts +57 -33
  457. package/dist/core/tool-roster.js +56 -68
  458. package/dist/core/tool-spec-members.js +8 -3
  459. package/dist/core/tool-spec.d.ts +53 -31
  460. package/dist/core/tools.js +51 -10
  461. package/dist/core/trace.d.ts +6 -2
  462. package/dist/core/types.d.ts +1 -1
  463. package/dist/core/untrusted-egress.d.ts +1 -1
  464. package/dist/core/untrusted-text.d.ts +1 -1
  465. package/dist/core/user-attachment.d.ts +8 -1
  466. package/dist/core/user-attachment.js +64 -4
  467. package/dist/core/warm-resume.d.ts +1 -1
  468. package/dist/core/wiring-manifest.d.ts +58 -0
  469. package/dist/core/wiring-manifest.js +14 -5
  470. package/dist/core/workflow-journal-store.d.ts +62 -0
  471. package/dist/core/workflow-journal-store.js +78 -2
  472. package/dist/core/workflow-run-store.d.ts +6 -0
  473. package/dist/core/workflow-run-store.js +2 -0
  474. package/dist/engine/compaction/compaction.d.ts +9 -9
  475. package/dist/engine/compaction/compaction.js +3 -2
  476. package/dist/engine/execution-env/node-execution-env.d.ts +26 -8
  477. package/dist/engine/execution-env/node-execution-env.js +54 -24
  478. package/dist/engine/harness/agent-harness.d.ts +39 -9
  479. package/dist/engine/harness/agent-harness.js +87 -33
  480. package/dist/engine/harness/types.d.ts +58 -9
  481. package/dist/engine/harness/types.js +12 -1
  482. package/dist/engine/llm/types.d.ts +36 -19
  483. package/dist/engine/llm/validation.d.ts +4 -1
  484. package/dist/engine/llm/validation.js +13 -1
  485. package/dist/engine/loop/agent-loop.d.ts +23 -1
  486. package/dist/engine/loop/agent-loop.js +26 -34
  487. package/dist/engine/loop/types.d.ts +31 -19
  488. package/dist/engine/lsp/node-lsp-manager.d.ts +2 -2
  489. package/dist/engine/session/memory-repo.d.ts +18 -12
  490. package/dist/engine/session/memory-repo.js +24 -9
  491. package/dist/engine/session/parent-chain-guard.d.ts +3 -2
  492. package/dist/engine/session/parent-chain-guard.js +1 -1
  493. package/dist/engine/session/repo-utils.d.ts +32 -3
  494. package/dist/engine/session/repo-utils.js +50 -5
  495. package/dist/index.d.ts +47 -23
  496. package/dist/index.js +35 -17
  497. package/dist/internal/harness-types.d.ts +1 -1
  498. package/dist/internal/harness.d.ts +3 -3
  499. package/dist/internal/harness.js +2 -2
  500. package/dist/internal/llm.d.ts +2 -2
  501. package/dist/internal/llm.js +1 -1
  502. package/dist/orchestration/goal.js +2 -2
  503. package/dist/orchestration/run-workflow-tool.d.ts +8 -6
  504. package/dist/orchestration/run-workflow-tool.js +10 -6
  505. package/dist/orchestration/workflow-size-guideline.d.ts +4 -4
  506. package/dist/orchestration/workflow-types.d.ts +18 -0
  507. package/dist/orchestration/workflow-types.js +6 -0
  508. package/dist/orchestration/workflow.d.ts +5 -13
  509. package/dist/orchestration/workflow.js +57 -49
  510. package/dist/prompt-assembly/artifact.d.ts +2 -2
  511. package/dist/prompt-assembly/artifact.js +5 -3
  512. package/dist/prompt-assembly/assemble.d.ts +3 -2
  513. package/dist/prompt-assembly/assemble.js +1 -1
  514. package/dist/prompt-assembly/catalog/schema.d.ts +43 -12
  515. package/dist/prompt-assembly/catalog/schema.js +34 -2
  516. package/dist/prompt-assembly/catalog/sections.js +0 -1
  517. package/dist/prompt-assembly/composer.d.ts +3 -1
  518. package/dist/prompt-assembly/composer.js +1 -1
  519. package/dist/prompt-assembly/event-registry.js +2 -0
  520. package/dist/prompt-assembly/overlay.js +3 -3
  521. package/dist/prompt-assembly/renderers.d.ts +1 -1
  522. package/dist/prompt-assembly/renderers.js +0 -3
  523. package/dist/prompt-assembly/role-base.d.ts +15 -0
  524. package/dist/prompt-assembly/role-base.js +9 -0
  525. package/dist/prompt-assembly/select.d.ts +39 -14
  526. package/dist/prompt-assembly/select.js +47 -16
  527. package/dist/prompt-assembly/sugar.d.ts +17 -11
  528. package/dist/prompt-assembly/sugar.js +8 -3
  529. package/dist/prompt-assembly/tool-catalog.d.ts +39 -2
  530. package/dist/prompt-assembly/tool-catalog.js +117 -4
  531. package/dist/prompt-assembly/turn-snapshot.d.ts +4 -10
  532. package/dist/prompt-assembly/turn-snapshot.js +0 -3
  533. package/dist/prompt-assembly/types.d.ts +0 -7
  534. package/dist/prompts/default.d.ts +14 -14
  535. package/dist/scenarios/full-body.d.ts +15 -15
  536. package/dist/scenarios/full-body.js +4 -3
  537. package/dist/shell/lex.js +10 -1
  538. package/dist/stores/file/adoption/adopt.d.ts +4 -3
  539. package/dist/stores/file/adoption/adopt.js +27 -33
  540. package/dist/stores/file/adoption/marker.d.ts +6 -13
  541. package/dist/stores/file/adoption/marker.js +9 -17
  542. package/dist/stores/file/checkpoint-store.d.ts +24 -0
  543. package/dist/stores/file/checkpoint-store.js +45 -7
  544. package/dist/stores/file/file-history-store.d.ts +20 -19
  545. package/dist/stores/file/file-history-store.js +157 -141
  546. package/dist/stores/file/fs-atomic.d.ts +15 -0
  547. package/dist/stores/file/fs-atomic.js +89 -14
  548. package/dist/stores/file/index.d.ts +1 -1
  549. package/dist/stores/file/index.js +2 -1
  550. package/dist/stores/file/mailbox-store.d.ts +3 -0
  551. package/dist/stores/file/mailbox-store.js +3 -1
  552. package/dist/stores/file/permission-rule-adopt.d.ts +1 -1
  553. package/dist/stores/file/permission-rule-adopt.js +18 -18
  554. package/dist/stores/file/permission-rule-store.d.ts +18 -2
  555. package/dist/stores/file/permission-rule-store.js +31 -18
  556. package/dist/stores/file/session-policy-store.d.ts +3 -3
  557. package/dist/stores/file/session-store.d.ts +54 -16
  558. package/dist/stores/file/session-store.js +114 -85
  559. package/dist/stores/file/workflow-journal-store.d.ts +10 -4
  560. package/dist/stores/file/workflow-journal-store.js +28 -13
  561. package/dist/tools/artifact/artifact-text.d.ts +1 -1
  562. package/dist/tools/artifact/artifact-tool.js +5 -3
  563. package/dist/tools/fs/bash-program-position.d.ts +19 -2
  564. package/dist/tools/fs/bash-program-position.js +56 -9
  565. package/dist/tools/fs/bash-readonly-classifier.d.ts +3 -3
  566. package/dist/tools/fs/fs-bash.d.ts +2 -2
  567. package/dist/tools/fs/fs-bash.js +8 -6
  568. package/dist/tools/fs/fs-glob.d.ts +86 -0
  569. package/dist/tools/fs/fs-glob.js +226 -0
  570. package/dist/tools/fs/fs-read.js +14 -14
  571. package/dist/tools/fs/fs-search-tools.js +7 -7
  572. package/dist/tools/fs/fs-shared.d.ts +8 -8
  573. package/dist/tools/fs/gh-rate-limit.d.ts +1 -1
  574. package/dist/tools/fs/notebook.d.ts +2 -2
  575. package/dist/tools/fs/pattern-kill-guard.d.ts +22 -0
  576. package/dist/tools/fs/pattern-kill-guard.js +397 -0
  577. package/dist/tools/fs/pdf.d.ts +9 -6
  578. package/dist/tools/fs/pdf.js +3 -3
  579. package/dist/tools/fs/program-read-model.d.ts +57 -7
  580. package/dist/tools/fs/program-read-model.js +11 -1
  581. package/dist/tools/fs/program-read-model.rows.js +78 -21
  582. package/dist/tools/fs/read-deny-home.js +3 -2
  583. package/dist/tools/fs/read-deny.d.ts +29 -7
  584. package/dist/tools/fs/read-deny.js +63 -22
  585. package/dist/tools/fs/removal-targets.d.ts +18 -8
  586. package/dist/tools/fs/removal-targets.js +47 -20
  587. package/dist/tools/fs/safety.d.ts +9 -9
  588. package/dist/tools/fs/search.d.ts +16 -6
  589. package/dist/tools/fs/search.js +20 -26
  590. package/dist/tools/fs/shell-read-argv.js +89 -12
  591. package/dist/tools/fs/shell-read-bindings.d.ts +31 -0
  592. package/dist/tools/fs/shell-read-bindings.js +41 -0
  593. package/dist/tools/fs/shell-read-check.js +12 -20
  594. package/dist/tools/fs/shell-read-environment.d.ts +5 -1
  595. package/dist/tools/fs/shell-read-environment.js +3 -2
  596. package/dist/tools/fs/shell-read-establish.d.ts +15 -0
  597. package/dist/tools/fs/shell-read-establish.js +19 -20
  598. package/dist/tools/fs/shell-read-judge.d.ts +4 -0
  599. package/dist/tools/fs/shell-read-judge.js +5 -2
  600. package/dist/tools/fs/shell-read-plan.js +24 -16
  601. package/dist/tools/fs/shell-read-start.d.ts +6 -1
  602. package/dist/tools/fs/shell-read-write-targets.d.ts +5 -1
  603. package/dist/tools/fs/shell-read-write-targets.js +2 -3
  604. package/dist/tools/fs/shell-reentry-text.d.ts +9 -0
  605. package/dist/tools/fs/shell-reentry-text.js +40 -2
  606. package/dist/tools/loop-tick.d.ts +2 -2
  607. package/dist/tools/scheduler-tools.js +5 -1
  608. package/dist/tools/task-list.d.ts +7 -7
  609. package/dist/tools/task-list.js +5 -1
  610. package/dist/tools/todo.js +65 -64
  611. package/dist/tools/web.d.ts +20 -15
  612. package/dist/tools/web.js +55 -69
  613. package/dist/tools/worktree.d.ts +3 -3
  614. package/dist/tools/worktree.js +3 -1
  615. package/package.json +1 -1
  616. package/test/export-surface.snapshot.json +5894 -5638
  617. package/wire-changes/core@7.55.0.json +3318 -0
  618. package/wire-changes/core@7.56.0.json +3891 -0
  619. package/wire-changes/mods-kernel@7.56.0.json +303 -0
  620. package/dist/core/store-contracts/session-store-incarnation-contract.d.ts +0 -39
  621. package/dist/core/store-contracts/session-store-incarnation-contract.js +0 -95
@@ -1,4 +1,4 @@
1
- import { SHELL_CONTROL_PREFIXES } from "../../shell/lex.js";
1
+ import { SHELL_CONTROL_PREFIXES, argvOf, lexShellText } from "../../shell/lex.js";
2
2
  import { shellWordsOf } from "../../shell/shell-words.js";
3
3
  import { BLOCK_WORD_NAMES, LAUNCHER_NAMES, feedsArgvFromStdin, launcherOptionMovesBase, launcherOptionQueries, launcherOptionStep, launcherRunsShell, programRow, selectedOptions, streamDefaultProgram } from "./program-read-model.js";
4
4
  export const NOT_AUTO_ALLOWED = "— not auto-allowed";
@@ -31,7 +31,7 @@ function launcherRowOf(name) {
31
31
  const row = programRow(name);
32
32
  return row?.launcher !== undefined ? row : undefined;
33
33
  }
34
- function pastLauncherOptions(launcher, folded, i, moved, queried) {
34
+ function pastLauncherOptions(launcher, folded, i, moved, queried, ended) {
35
35
  const row = launcherRowOf(launcher);
36
36
  if (row === undefined)
37
37
  return i;
@@ -53,14 +53,19 @@ function pastLauncherOptions(launcher, folded, i, moved, queried) {
53
53
  if (launcherOptionQueries(row, tok))
54
54
  queried?.();
55
55
  i += step;
56
- if (tok === "--")
56
+ if (tok === "--") {
57
+ ended?.();
57
58
  return i;
59
+ }
58
60
  }
59
61
  }
60
- export const PROGRAM_POSITION_REFUSAL_KINDS = Object.freeze(["option_at_program_position", "control_syntax_at_program_position"]);
62
+ export const PROGRAM_POSITION_REFUSAL_KINDS = Object.freeze(["option_at_program_position", "control_syntax_at_program_position", "wildcard_program_word"]);
61
63
  export function readProgramPosition(words) {
62
64
  const folded = words.map((w) => w.folded);
63
65
  const controlWords = [];
66
+ const ended = { by: undefined };
67
+ const endsOptions = (name) => () => { ended.by = name; };
68
+ const optionShaped = (owner, option) => ({ kind: "option_at_program_position", owner, option, ...(ended.by !== undefined ? { endedBy: ended.by } : {}) });
64
69
  let i = 0;
65
70
  while (i < folded.length && isBareControlWord(words, i, SHELL_CONTROL_PREFIXES)) {
66
71
  const controlWord = folded[i];
@@ -68,6 +73,23 @@ export function readProgramPosition(words) {
68
73
  i = pastLauncherOptions(controlWord, folded, i + 1);
69
74
  }
70
75
  const none = (written, assignments, refusal) => ({ controlWords, written, assignments, launchers: [], argvFromStdin: false, runsDefaultProgram: false, program: undefined, refusal, launcherMovesBase: false });
76
+ const globProgramRefusal = (idx) => {
77
+ let glob = false;
78
+ for (const p of words[idx].pieces) {
79
+ const k = p.expansion?.kind;
80
+ if (k === "process" || k === "brace")
81
+ return undefined;
82
+ if (k === "glob")
83
+ glob = true;
84
+ if (p.literal !== undefined) {
85
+ if (p.quotedBy === undefined && /[{}$`]/.test(p.literal))
86
+ return undefined;
87
+ if (p.quotedBy === '"' && /[$`]/.test(p.literal))
88
+ return undefined;
89
+ }
90
+ }
91
+ return glob ? { kind: "wildcard_program_word", word: folded[idx], at: idx } : undefined;
92
+ };
71
93
  if (i >= folded.length)
72
94
  return none(undefined, []);
73
95
  const written = i;
@@ -82,9 +104,12 @@ export function readProgramPosition(words) {
82
104
  const basename = programBasename(head);
83
105
  if (basename.startsWith("-") && basename !== "-") {
84
106
  const owner = controlWords.length > 0 ? folded[controlWords[controlWords.length - 1]] : head;
85
- return none(written, assignments, { kind: "option_at_program_position", owner, option: head });
107
+ return none(written, assignments, optionShaped(owner, head));
86
108
  }
87
109
  if (!LAUNCHER_NAMES.has(basename)) {
110
+ const glob = globProgramRefusal(i);
111
+ if (glob !== undefined)
112
+ return none(written, assignments, glob);
88
113
  return { controlWords, written, assignments, launchers: [], argvFromStdin: false, runsDefaultProgram: false, program: { index: i, name: head, basename }, refusal: undefined, launcherMovesBase: false };
89
114
  }
90
115
  const launchers = [{ index: i, name: basename }];
@@ -107,7 +132,7 @@ export function readProgramPosition(words) {
107
132
  return { controlWords, written, assignments, launchers, argvFromStdin, runsDefaultProgram, ...(runsDefaultProgram && reentryDefault !== undefined ? { defaultProgram: reentryDefault } : {}), program, refusal, launcherMovesBase };
108
133
  };
109
134
  const selectsShell = (l, end) => selectedOptions(launcherRowOf(l.name), folded.slice(l.index + 1, end)).some((o) => o.mode === "interactive");
110
- const first = pastLauncherOptions(basename, folded, i + 1, moved, queried);
135
+ const first = pastLauncherOptions(basename, folded, i + 1, moved, queried, endsOptions(basename));
111
136
  if (looksUp)
112
137
  return chain(undefined);
113
138
  for (let j = first; j < folded.length; j++) {
@@ -127,6 +152,7 @@ export function readProgramPosition(words) {
127
152
  reentryDefault = streamDefaultProgram(wordBasename);
128
153
  lastRow = undefined;
129
154
  owedOperands = 0;
155
+ ended.by = undefined;
130
156
  continue;
131
157
  }
132
158
  if (LAUNCHER_NAMES.has(wordBasename)) {
@@ -135,16 +161,20 @@ export function readProgramPosition(words) {
135
161
  if (launcherRunsShell(launcherRowOf(wordBasename), folded.slice(j + 1)))
136
162
  return chain(undefined, shellRefusal(j, j + 1));
137
163
  owedOperands = lastRow?.requiredOperands ?? 0;
138
- j = pastLauncherOptions(wordBasename, folded, j + 1, moved, queried) - 1;
164
+ ended.by = undefined;
165
+ j = pastLauncherOptions(wordBasename, folded, j + 1, moved, queried, endsOptions(wordBasename)) - 1;
139
166
  if (looksUp)
140
167
  return chain(undefined);
141
168
  continue;
142
169
  }
143
170
  if (t.startsWith("-"))
144
- return chain(undefined, { kind: "option_at_program_position", owner, option: t });
171
+ return chain(undefined, optionShaped(owner, t));
145
172
  if (SHELL_CONTROL_PREFIXES.has(wordBasename) || BLOCK_WORD_NAMES.has(wordBasename)) {
146
173
  return chain(undefined, { kind: "control_syntax_at_program_position", owner, word: wordBasename });
147
174
  }
175
+ const glob = globProgramRefusal(j);
176
+ if (glob !== undefined)
177
+ return chain(undefined, glob);
148
178
  return chain({ index: j, name: t, basename: wordBasename });
149
179
  }
150
180
  const last = launchers[launchers.length - 1];
@@ -173,12 +203,29 @@ export function shellScanDeclineOf(pos, acceptsStreamTarget) {
173
203
  export function programPositionRefusalSentence(refusal) {
174
204
  switch (refusal.kind) {
175
205
  case "option_at_program_position":
176
- return `"${refusal.owner}" is given the option "${refusal.option}" where the program it runs would be — which program runs is not readable without that word's option table ${NOT_AUTO_ALLOWED}`;
206
+ return refusal.endedBy !== undefined
207
+ ? `"${refusal.endedBy} --" ends the options, and "${refusal.option}" after it is a name spelled like an option where the program it runs would be — which program runs is not read from such a word ${NOT_AUTO_ALLOWED}`
208
+ : `"${refusal.owner}" is given the option "${refusal.option}" where the program it runs would be — which program runs is not readable without that word's option table ${NOT_AUTO_ALLOWED}`;
177
209
  case "control_syntax_at_program_position":
178
210
  return `"${refusal.owner}" is given shell control syntax ("${refusal.word}") where the program it runs would be ${NOT_AUTO_ALLOWED}`;
211
+ case "wildcard_program_word":
212
+ return `the program word "${refusal.word}" carries an unquoted filename pattern, so the shell expands it against the filesystem and which program runs is not readable from the text ${NOT_AUTO_ALLOWED}`;
179
213
  default: {
180
214
  const exhaustive = refusal;
181
215
  return exhaustive;
182
216
  }
183
217
  }
184
218
  }
219
+ export function declinedProgramSentence(text) {
220
+ const lexed = lexShellText(text);
221
+ if (!("reject" in lexed) && lexed.segments[0] !== undefined) {
222
+ const pos = readProgramPosition(argvOf(lexed.segments[0]));
223
+ if (pos.refusal !== undefined)
224
+ return programPositionRefusalSentence(pos.refusal);
225
+ if (pos.argvFromStdin) {
226
+ const runs = pos.program?.basename ?? "the program it runs";
227
+ return `"${text.trim()}" hands ${runs} its operands on its standard input, which this station does not read ${NOT_AUTO_ALLOWED}`;
228
+ }
229
+ }
230
+ return `"${text.trim()}" runs a program this station cannot name ${NOT_AUTO_ALLOWED}`;
231
+ }
@@ -267,9 +267,9 @@ export declare function splitShellCompoundSegments(source: string, options?: {
267
267
  *
268
268
  * The allowlist vets `argv[0]` only, so until this face existed every listed reader could name ANY
269
269
  * path: `ls /etc` and `cat /etc/passwd` classified read-only, and a deployment whose manual-mode shell
270
- * gate auto-allows the read-only verdict served the whole filesystem with no approval prompt. CC 2.1.220
271
- * demotes exactly these shapes (its per-command path extractor + working-directory containment check,
272
- * pretty220 @457568) and renders an approval option naming the directory (@905642 (cli250.js:66007)).
270
+ * gate auto-allows the read-only verdict served the whole filesystem with no approval prompt. The reference
271
+ * demotes exactly these shapes (its per-command path extractor + working-directory containment check)
272
+ * and renders an approval option naming the directory.
273
273
  *
274
274
  * Supplying this object turns the check ON; omitting it leaves the classifier byte-identical to its
275
275
  * name-only behaviour, so a consumer pinned to an older calling convention is unaffected.
@@ -35,7 +35,7 @@ export declare function bashReversibilityProbe(allow?: readonly string[], bounda
35
35
  * fullShellReachable roster assertion (its first load-bearing consumer).
36
36
  */
37
37
  export { FULL_SHELL_CONTRACT_ID } from "../../core/tool-catalog-entries.js";
38
- /** The CC-verbatim exit-1 interpretation for `command`, or undefined when exit 1 means a real error.
38
+ /** The exit-1 interpretation for `command`, or undefined when exit 1 means a real error.
39
39
  * Read off the lexer's segments: the last one (the last `;`/`&&`/`||`/newline statement's last `|` piece) → its
40
40
  * written command word past the leading assignments bash strips, path prefix stripped;
41
41
  * `git grep`/`git diff` special-cased (CC `cLp`). Exported for its unit tests. */
@@ -110,7 +110,7 @@ export declare function createBashTool(env: ExecutionEnv, rootCanonical: string,
110
110
  * Is a PERSON's input waiting for this run's next turn boundary? Read on each liveness tick of a
111
111
  * running foreground command: `true` on an {@link autoBackgroundOnTimeout}-armed command moves that
112
112
  * command into the background (through the SAME detach verb ctrl+b fires) so the message is
113
- * delivered this turn instead of after the command. CC 2.1.259 `backgroundedToDeliverMessage`.
113
+ * delivered this turn instead of after the command. Reference field `backgroundedToDeliverMessage` (cli296.js:134207).
114
114
  *
115
115
  * The predicate is the HARNESS's own accepted-but-unserved account and deliberately counts only what
116
116
  * a PERSON sent: an engine-authored reminder is not somebody waiting, and stepping a build aside for
@@ -17,10 +17,11 @@ import { ghRateLimitHint } from "./gh-rate-limit.js";
17
17
  import { backgroundLifetimeNote } from "./fs-bash-background-text.js";
18
18
  import { resolveBashTimeoutCaps, bashTimeoutCapsSec, bashTimeoutArgRefusal, bashTimeoutParamDescription, envErrorDetail, bashMaxOutputChars, clipShellOutput, writeShellOverflowFile, shellRecoveryHint, CWD_SENTINEL, stripCwdSentinel, } from "./fs-shared.js";
19
19
  import { bashClassifyDefaultAllow, BASH_READONLY_DEFAULT_ALLOW, coarseReadonlyCheck, classifyBoundedReadonlyPollLoopDetailed, classifyCompoundReadonlyDetailed } from "./bash-readonly-classifier.js";
20
- import { toolFace } from "../../core/tool-catalog-entries.js";
20
+ import { mountRuleFace, toolFace } from "../../core/tool-catalog-entries.js";
21
21
  import { argvOf, compoundValueHidesRun, expansionHidesRun, expansionsInHeredocBody, lexShell } from "../../shell/lex.js";
22
22
  import { arithmeticAssignedNames } from "./shell-read-bindings.js";
23
23
  import { thrownText } from "../../core/thrown-value.js";
24
+ import { patternKillRefusal } from "./pattern-kill-guard.js";
24
25
  function shellCommandOf(args) {
25
26
  const command = args?.command;
26
27
  return typeof command === "string" ? command : undefined;
@@ -38,11 +39,10 @@ export function bashReversibilityProbe(allow, boundary) {
38
39
  return { reversible: false };
39
40
  const home = typeof boundary === "function" ? boundary() : boundary;
40
41
  const fold = home?.homeDir !== undefined ? { homeDir: home.homeDir } : undefined;
41
- if (classifyCompoundReadonlyDetailed(command, allowSet, fold).reason === undefined)
42
+ const reason = classifyCompoundReadonlyDetailed(command, allowSet, fold).reason;
43
+ if (reason === undefined)
42
44
  return { reversible: true };
43
- if (classifyBoundedReadonlyPollLoopDetailed(command, allowSet, fold).reason === undefined)
44
- return { reversible: true };
45
- return { reversible: false };
45
+ return classifyBoundedReadonlyPollLoopDetailed(command, allowSet, fold).reason === undefined ? { reversible: true } : { reversible: false, reason };
46
46
  };
47
47
  }
48
48
  export { FULL_SHELL_CONTRACT_ID } from "../../core/tool-catalog-entries.js";
@@ -585,7 +585,7 @@ export function createBashTool(env, rootCanonical, coAuthor = false, cwdRef = {
585
585
  const timeoutRefusal = bashTimeoutArgRefusal(timeout, timeoutCaps);
586
586
  if (timeoutRefusal !== undefined)
587
587
  return errorResult(timeoutRefusal, { type: "bash_invalid_timeout", code: "bash_invalid_timeout" });
588
- const refused = await taskOpts.shellReadAdmission?.("Bash", ctx.toolCallId, command, ctx.signal);
588
+ const refused = (await taskOpts.shellReadAdmission?.("Bash", ctx.toolCallId, command, ctx.signal)) ?? (await patternKillRefusal(command, env, cwdRef.current, ctx.signal));
589
589
  if (refused !== undefined)
590
590
  return refused;
591
591
  if (run_in_background) {
@@ -812,6 +812,7 @@ export function createEnvTaskOutputTool(env) {
812
812
  return defineTool({
813
813
  name: TASK_OUTPUT_TOOL_NAME,
814
814
  ...toolFace("task-output-hands"),
815
+ ruleFace: mountRuleFace("task-output-hands"),
815
816
  description: composeTaskOutputDescription(ENV_DIRECT_TASK_TOOL_CAPS),
816
817
  parameters: composeTaskOutputParams(ENV_DIRECT_TASK_TOOL_CAPS),
817
818
  execute: async (args) => {
@@ -849,6 +850,7 @@ export function createEnvTaskStopTool(env, registry = defaultTaskRegistry) {
849
850
  return defineTool({
850
851
  name: TASK_STOP_TOOL_NAME,
851
852
  ...toolFace("task-stop-hands"),
853
+ ruleFace: mountRuleFace("task-stop-hands"),
852
854
  description: composeTaskStopDescription(ENV_DIRECT_TASK_TOOL_CAPS),
853
855
  parameters: TASK_STOP_PARAMS,
854
856
  execute: async (args) => {
@@ -0,0 +1,86 @@
1
+ /**
2
+ * The matcher of the filesystem glob dialect: a token list is compiled to a small program, and a path is matched by walking
3
+ * it once, left to right, holding the SET of instructions that are live at the current position. An instruction is in the set
4
+ * at most once, so the cost of one test is at most the program's length times the path's length plus one, however many stars
5
+ * the pattern holds and however they are arranged — no expression is built from the pattern's text, so nothing backtracks and
6
+ * no pattern needs a cap. That product is a limit a pattern can reach on an ordinary path, when it keeps every instruction live at
7
+ * every place (a ring of empty alternatives does). The scratch it needs is two sets of the program's length, kept between tests for a
8
+ * program of up to 65 536 instructions (a longer program's is made for each test that gets past the two checks below and dropped: a
9
+ * cost of the program's length, whatever the path); a test whose threads all die at the first character costs what it touched, not
10
+ * the product of the two lengths. Two cheap checks come before the walk and only ever say "cannot match": a value that lacks a
11
+ * literal every match holds, or does not end with the literal the pattern ends on, is refused at once; inside the walk, a program
12
+ * that opens on a literal starts a thread only where that literal stands.
13
+ *
14
+ * It answers a different question from {@link wildcardMatch} (the permission-rule name glob), which is why the two are two
15
+ * engines and not one with a switch. The grammars differ:
16
+ *
17
+ * | construct | rule glob (`wildcardMatch`) | filesystem glob (this module) |
18
+ * | ------------------ | ----------------------------- | ----------------------------------------------------- |
19
+ * | `*` | any run, `/` included | any run of characters but `/` (`star`) |
20
+ * | `**` | the same as `*` | any run, `/` included (`globstar`) |
21
+ * | `?` | a literal | one character but `/` (`one`) |
22
+ * | `[abc]`, `[!a-c]` | literals | one character of the class (`class`) |
23
+ * | `{a,b}` | literals | one alternative of several (`alt`) |
24
+ * | where it may start | the whole value | the whole path, or any path segment (`anchor`) |
25
+ *
26
+ * Each site that reads such a glob (the search tools' `pattern` / `glob` arguments and `.gitignore` lines, the shell read
27
+ * station's expansion of a command word) parses its own spelling into tokens — what a spelling MEANS stays with the site — and
28
+ * this module is the one place that matches them.
29
+ *
30
+ * Lengths are counted in UTF-16 code units, the unit a RegExp without the `u` flag counts in: `?` and a class stand for one unit.
31
+ */
32
+ /** One bracket-expression's test of a single code unit, already validated: build it with {@link fsGlobClass}. */
33
+ export interface FsGlobClass {
34
+ /** Does this one code unit belong to the class? */
35
+ matches(unit: string): boolean;
36
+ }
37
+ /**
38
+ * A class from its character-class source (`[a-z]`, `[^/ab]`), or `undefined` when the source is not a class JavaScript accepts
39
+ * (a reversed range, say). A class is one character wide: its expression holds no repetition, so it cannot backtrack and the
40
+ * repetition structure of a glob stays in the program.
41
+ */
42
+ export declare function fsGlobClass(source: string): FsGlobClass | undefined;
43
+ /** A token that stands for a fixed or bounded part of the path. */
44
+ export type FsGlobUnit = {
45
+ readonly kind: "text";
46
+ readonly text: string;
47
+ } | {
48
+ readonly kind: "one";
49
+ } | {
50
+ readonly kind: "class";
51
+ readonly class: FsGlobClass;
52
+ } | {
53
+ readonly kind: "star";
54
+ };
55
+ export type FsGlobToken = FsGlobUnit | {
56
+ readonly kind: "globstar";
57
+ }
58
+ /** One of several alternatives, each a run of units (no nesting). */
59
+ | {
60
+ readonly kind: "alt";
61
+ readonly alternatives: readonly (readonly FsGlobUnit[])[];
62
+ };
63
+ /** Where a match may begin: `start` only at the first character of the value; `segment` at the first character or right after any `/`. */
64
+ export type FsGlobAnchor = "start" | "segment";
65
+ /** A compiled glob: the whole of a value must match. */
66
+ export interface FsGlob {
67
+ /** Does the whole of `value` match? */
68
+ test(value: string): boolean;
69
+ }
70
+ /**
71
+ * What the matcher has done in this process so far, for a pin to state a bound as a count instead of timing a call. `visits`: the
72
+ * (instruction, position) pairs entered — a test of a program `size` long against a path of `length` enters at most
73
+ * `size * (length + 1)`. `scratchBytes`: the bytes of the sets allocated — it moves when a program larger than any before needs
74
+ * scratch, and per test only for a program past the retained size.
75
+ */
76
+ export declare function fsGlobWorkTotals(): {
77
+ readonly visits: number;
78
+ readonly scratchBytes: number;
79
+ };
80
+ /** A compiled program (see the module header). */
81
+ export interface FsGlobProgram extends FsGlob {
82
+ /** The program's length in instructions: the factor of the visit bound that belongs to the pattern. */
83
+ readonly size: number;
84
+ }
85
+ /** Compile a token list. The match is always over the whole value; `anchor` says where it may begin. */
86
+ export declare function compileFsGlob(tokens: readonly FsGlobToken[], anchor: FsGlobAnchor): FsGlobProgram;
@@ -0,0 +1,226 @@
1
+ export function fsGlobClass(source) {
2
+ let re;
3
+ try {
4
+ re = new RegExp(source);
5
+ }
6
+ catch {
7
+ return undefined;
8
+ }
9
+ return { matches: (unit) => re.test(unit) };
10
+ }
11
+ const OP_TEXT = 0;
12
+ const OP_ONE = 1;
13
+ const OP_CLASS = 2;
14
+ const OP_ANY = 3;
15
+ const OP_SPLIT = 4;
16
+ const OP_JUMP = 5;
17
+ const OP_END = 6;
18
+ const SLASH = 47;
19
+ class LiveSet {
20
+ dense;
21
+ sparse;
22
+ count = 0;
23
+ constructor(capacity) {
24
+ this.dense = new Int32Array(capacity);
25
+ this.sparse = new Int32Array(capacity);
26
+ }
27
+ has(pc) {
28
+ const at = this.sparse[pc];
29
+ return at < this.count && this.dense[at] === pc;
30
+ }
31
+ add(pc) {
32
+ this.dense[this.count] = pc;
33
+ this.sparse[pc] = this.count++;
34
+ }
35
+ }
36
+ const MAX_RETAINED_SIZE = 1 << 16;
37
+ let retained;
38
+ let retainedCapacity = 0;
39
+ const pending = [];
40
+ let visitsTotal = 0;
41
+ let scratchBytesTotal = 0;
42
+ function scratchFor(size) {
43
+ const made = (capacity) => {
44
+ scratchBytesTotal += 16 * capacity;
45
+ return [new LiveSet(capacity), new LiveSet(capacity)];
46
+ };
47
+ if (size > MAX_RETAINED_SIZE)
48
+ return made(size);
49
+ if (retained === undefined || size > retainedCapacity) {
50
+ retainedCapacity = Math.max(size, retainedCapacity * 2, 1 << 8);
51
+ retained = made(retainedCapacity);
52
+ }
53
+ retained[0].count = 0;
54
+ retained[1].count = 0;
55
+ return retained;
56
+ }
57
+ export function fsGlobWorkTotals() {
58
+ return { visits: visitsTotal, scratchBytes: scratchBytesTotal };
59
+ }
60
+ const isStarRun = (token) => token.kind === "star" || token.kind === "globstar";
61
+ export function compileFsGlob(tokens, anchor) {
62
+ const op = [];
63
+ const arg = [];
64
+ const arg2 = [];
65
+ const classes = [];
66
+ const emit = (o, a = 0, b = 0) => {
67
+ op.push(o);
68
+ arg.push(a);
69
+ arg2.push(b);
70
+ return op.length - 1;
71
+ };
72
+ const emitLoop = (unit) => {
73
+ const loop = emit(OP_SPLIT);
74
+ emit(unit);
75
+ emit(OP_JUMP, loop);
76
+ arg[loop] = loop + 1;
77
+ arg2[loop] = op.length;
78
+ };
79
+ const emitUnit = (unit) => {
80
+ if (unit.kind === "text")
81
+ for (let i = 0; i < unit.text.length; i++)
82
+ emit(OP_TEXT, unit.text.charCodeAt(i));
83
+ else if (unit.kind === "one")
84
+ emit(OP_ONE);
85
+ else if (unit.kind === "class")
86
+ emit(OP_CLASS, classes.push(unit.class) - 1);
87
+ else
88
+ emitLoop(OP_ONE);
89
+ };
90
+ const merged = [];
91
+ for (const token of tokens) {
92
+ const previous = merged[merged.length - 1];
93
+ if (previous !== undefined && isStarRun(previous) && isStarRun(token)) {
94
+ if (token.kind === "globstar")
95
+ merged[merged.length - 1] = token;
96
+ }
97
+ else
98
+ merged.push(token);
99
+ }
100
+ for (const token of merged) {
101
+ if (token.kind === "globstar")
102
+ emitLoop(OP_ANY);
103
+ else if (token.kind === "alt") {
104
+ const exits = [];
105
+ token.alternatives.forEach((alternative, k) => {
106
+ const last = k === token.alternatives.length - 1;
107
+ const choice = last ? -1 : emit(OP_SPLIT);
108
+ if (!last)
109
+ arg[choice] = choice + 1;
110
+ for (const unit of alternative)
111
+ emitUnit(unit);
112
+ if (!last) {
113
+ exits.push(emit(OP_JUMP));
114
+ arg2[choice] = op.length;
115
+ }
116
+ });
117
+ for (const exit of exits)
118
+ arg[exit] = op.length;
119
+ }
120
+ else
121
+ emitUnit(token);
122
+ }
123
+ emit(OP_END);
124
+ let required = "";
125
+ let run = "";
126
+ for (const token of merged) {
127
+ run = token.kind === "text" ? run + token.text : "";
128
+ if (run.length > required.length)
129
+ required = run;
130
+ }
131
+ return new Program(Int32Array.from(op), Int32Array.from(arg), Int32Array.from(arg2), classes, anchor === "segment", required, run);
132
+ }
133
+ class Program {
134
+ op;
135
+ arg;
136
+ arg2;
137
+ classes;
138
+ segmentAnchored;
139
+ required;
140
+ tail;
141
+ constructor(op, arg, arg2, classes, segmentAnchored, required, tail) {
142
+ this.op = op;
143
+ this.arg = arg;
144
+ this.arg2 = arg2;
145
+ this.classes = classes;
146
+ this.segmentAnchored = segmentAnchored;
147
+ this.required = required;
148
+ this.tail = tail;
149
+ this.first = op[0] === OP_TEXT ? arg[0] : -1;
150
+ this.beginsAfter = this.first >= 0 ? `/${String.fromCharCode(this.first)}` : "/";
151
+ }
152
+ first;
153
+ beginsAfter;
154
+ get size() {
155
+ return this.op.length;
156
+ }
157
+ follow(set, from) {
158
+ const { op, arg, arg2 } = this;
159
+ let added = 0;
160
+ let pc = from;
161
+ for (;;) {
162
+ if (!set.has(pc)) {
163
+ set.add(pc);
164
+ added++;
165
+ const o = op[pc];
166
+ if (o === OP_SPLIT) {
167
+ pending.push(arg2[pc]);
168
+ pc = arg[pc];
169
+ continue;
170
+ }
171
+ if (o === OP_JUMP) {
172
+ pc = arg[pc];
173
+ continue;
174
+ }
175
+ }
176
+ if (pending.length === 0)
177
+ return added;
178
+ pc = pending.pop();
179
+ }
180
+ }
181
+ test(value) {
182
+ if (this.tail !== "" && !value.endsWith(this.tail))
183
+ return false;
184
+ if (this.required !== "" && !value.includes(this.required))
185
+ return false;
186
+ const { op, arg, classes } = this;
187
+ const length = value.length;
188
+ const [first, second] = scratchFor(op.length);
189
+ let live = first;
190
+ let ahead = second;
191
+ let entered = 0;
192
+ let found = false;
193
+ for (let pos = 0;;) {
194
+ if ((pos === 0 || (this.segmentAnchored && value.charCodeAt(pos - 1) === SLASH)) && (this.first < 0 || value.charCodeAt(pos) === this.first))
195
+ entered += this.follow(live, 0);
196
+ if (pos === length) {
197
+ found = live.has(op.length - 1);
198
+ break;
199
+ }
200
+ if (live.count === 0) {
201
+ if (!this.segmentAnchored)
202
+ break;
203
+ const slash = value.indexOf(this.beginsAfter, pos);
204
+ if (slash < 0)
205
+ break;
206
+ pos = slash + 1;
207
+ continue;
208
+ }
209
+ const unit = value.charCodeAt(pos);
210
+ ahead.count = 0;
211
+ for (let i = 0; i < live.count; i++) {
212
+ const pc = live.dense[i];
213
+ const o = op[pc];
214
+ const takes = o === OP_TEXT ? arg[pc] === unit : o === OP_ONE ? unit !== SLASH : o === OP_ANY ? true : o === OP_CLASS ? classes[arg[pc]].matches(value[pos]) : false;
215
+ if (takes)
216
+ entered += this.follow(ahead, pc + 1);
217
+ }
218
+ const spent = live;
219
+ live = ahead;
220
+ ahead = spent;
221
+ pos++;
222
+ }
223
+ visitsTotal += entered;
224
+ return found;
225
+ }
226
+ }
@@ -467,20 +467,20 @@ export function createReadFileTool(env, state, rootCanonical, cwdRef, additional
467
467
  "- Other binaries (archives, executables) are refused. A whole-file read of a text file over 256 KB is refused — read it in slices with explicit offset/limit, or Grep it instead.\n" +
468
468
  "- You must read a file before editing it.\n" +
469
469
  "- Do NOT re-read a file you just edited to verify — Edit/Write would have errored if the change failed, and the harness tracks file state for you.",
470
- descriptionClassic: "Reads a file from the local filesystem.\n" +
471
- "\n" +
472
- "Usage:\n" +
473
- "- By default, it reads the whole file (from `offset`, 1-based); a very large file is served as a partial view with an explicit marker and the next-page call\n" +
474
- "- You can optionally specify a line offset and limit (especially handy for long files), but it's recommended to read the whole file by not providing these parameters\n" +
475
- "- Results are returned using cat -n format, with each line prefixed by its line number and a tab\n" +
476
- "- This tool allows the model to read images (eg PNG, JPG, etc). When reading an image file the contents are presented visually.\n" +
477
- "- This tool can only read files, not directories. To read a directory, use Glob/Grep or an ls command via the Bash tool.\n" +
478
- "- You must read a file before editing it.\n" +
479
- "- Reads PDFs (.pdf): the document is provided to the model directly (text layer included). Use the `pages` parameter (e.g., \"1-5\") to read a page range; a PDF whose detected page count exceeds 10 requires `pages`. Maximum 20 pages per request.\n" +
480
- "- Reads Jupyter notebooks (.ipynb) as cells with outputs (offset/limit do not apply).\n" +
481
- "- Other binaries (archives, executables) are refused. A whole-file read of a text file over 256 KB is refused — read it in slices with explicit offset/limit, or Grep it instead.\n" +
482
- "- If you read a file that exists but has empty contents you will receive a system reminder warning in place of file contents.\n" +
483
- "- Do NOT re-read a file you just edited to verify — Edit/Write would have errored if the change failed, and the harness tracks file state for you.",
470
+ descriptionVariants: [{ id: "classic", traits: { noneOf: ["lean_prompt"] }, text: "Reads a file from the local filesystem.\n" +
471
+ "\n" +
472
+ "Usage:\n" +
473
+ "- By default, it reads the whole file (from `offset`, 1-based); a very large file is served as a partial view with an explicit marker and the next-page call\n" +
474
+ "- You can optionally specify a line offset and limit (especially handy for long files), but it's recommended to read the whole file by not providing these parameters\n" +
475
+ "- Results are returned using cat -n format, with each line prefixed by its line number and a tab\n" +
476
+ "- This tool allows the model to read images (eg PNG, JPG, etc). When reading an image file the contents are presented visually.\n" +
477
+ "- This tool can only read files, not directories. To read a directory, use Glob/Grep or an ls command via the Bash tool.\n" +
478
+ "- You must read a file before editing it.\n" +
479
+ "- Reads PDFs (.pdf): the document is provided to the model directly (text layer included). Use the `pages` parameter (e.g., \"1-5\") to read a page range; a PDF whose detected page count exceeds 10 requires `pages`. Maximum 20 pages per request.\n" +
480
+ "- Reads Jupyter notebooks (.ipynb) as cells with outputs (offset/limit do not apply).\n" +
481
+ "- Other binaries (archives, executables) are refused. A whole-file read of a text file over 256 KB is refused — read it in slices with explicit offset/limit, or Grep it instead.\n" +
482
+ "- If you read a file that exists but has empty contents you will receive a system reminder warning in place of file contents.\n" +
483
+ "- Do NOT re-read a file you just edited to verify — Edit/Write would have errored if the change failed, and the harness tracks file state for you." }],
484
484
  parameters: Type.Object({
485
485
  ...FILE_PATH_PARAMS,
486
486
  offset: Type.Optional(Type.Integer({ minimum: 0, description: "The line number to start reading from. Only provide if the file is too large to read at once (1-based; default 1)." })),
@@ -189,13 +189,13 @@ export function createGlobTool(env, rootCanonical, rootsSeat, denySeat, readFace
189
189
  "\n" +
190
190
  "- On environments that do not report modification times, results fall back to alphabetical order\n" +
191
191
  "- Paths are RELATIVE to the root; ignored trees (node_modules/build/.gitignore) are skipped unless your pattern names them explicitly (e.g. `dist/**`)",
192
- descriptionClassic: "- Fast file pattern matching tool that works with any codebase size\n" +
193
- '- Supports glob patterns like "**/*.js" or "src/**/*.ts"\n' +
194
- "- Returns matching file paths sorted by modification time\n" +
195
- "- On environments that do not report modification times, results fall back to alphabetical order\n" +
196
- "- Paths are RELATIVE to the root; ignored trees (node_modules/build/.gitignore) are skipped unless your pattern names them explicitly (e.g. `dist/**`)\n" +
197
- "- Use this tool when you need to find files by name patterns; use `path` to scope to a sub-directory\n" +
198
- "- When you are doing an open ended search that may require multiple rounds of globbing and grepping, use the Agent tool instead (if available)",
192
+ descriptionVariants: [{ id: "classic", traits: { noneOf: ["lean_prompt"] }, text: "- Fast file pattern matching tool that works with any codebase size\n" +
193
+ '- Supports glob patterns like "**/*.js" or "src/**/*.ts"\n' +
194
+ "- Returns matching file paths sorted by modification time\n" +
195
+ "- On environments that do not report modification times, results fall back to alphabetical order\n" +
196
+ "- Paths are RELATIVE to the root; ignored trees (node_modules/build/.gitignore) are skipped unless your pattern names them explicitly (e.g. `dist/**`)\n" +
197
+ "- Use this tool when you need to find files by name patterns; use `path` to scope to a sub-directory\n" +
198
+ "- When you are doing an open ended search that may require multiple rounds of globbing and grepping, use the Agent tool instead (if available)" }],
199
199
  parameters: Type.Object({
200
200
  pattern: Type.String({ description: "Glob pattern (`*`, `**`, `?`)." }),
201
201
  path: Type.Optional(Type.String({