@namzu/sdk 34.2.0 → 36.0.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 (669) hide show
  1. package/CHANGELOG.md +171 -0
  2. package/README.md +2 -6
  3. package/dist/agents/PipelineAgent.d.ts.map +1 -1
  4. package/dist/agents/PipelineAgent.js +118 -100
  5. package/dist/agents/PipelineAgent.js.map +1 -1
  6. package/dist/agents/ReactiveAgent.d.ts.map +1 -1
  7. package/dist/agents/ReactiveAgent.js +2 -0
  8. package/dist/agents/ReactiveAgent.js.map +1 -1
  9. package/dist/agents/RouterAgent.d.ts.map +1 -1
  10. package/dist/agents/RouterAgent.js +105 -61
  11. package/dist/agents/RouterAgent.js.map +1 -1
  12. package/dist/agents/SupervisorAgent.d.ts.map +1 -1
  13. package/dist/agents/SupervisorAgent.js +8 -4
  14. package/dist/agents/SupervisorAgent.js.map +1 -1
  15. package/dist/agents/budget.d.ts +6 -0
  16. package/dist/agents/budget.d.ts.map +1 -0
  17. package/dist/agents/budget.js +33 -0
  18. package/dist/agents/budget.js.map +1 -0
  19. package/dist/agents/explore.d.ts +20 -0
  20. package/dist/agents/explore.d.ts.map +1 -0
  21. package/dist/agents/explore.js +26 -0
  22. package/dist/agents/explore.js.map +1 -0
  23. package/dist/agents/file-definitions.d.ts +80 -0
  24. package/dist/agents/file-definitions.d.ts.map +1 -0
  25. package/dist/agents/file-definitions.js +179 -0
  26. package/dist/agents/file-definitions.js.map +1 -0
  27. package/dist/agents/index.d.ts +3 -0
  28. package/dist/agents/index.d.ts.map +1 -1
  29. package/dist/agents/index.js +2 -0
  30. package/dist/agents/index.js.map +1 -1
  31. package/dist/bridge/a2a/mapper.d.ts.map +1 -1
  32. package/dist/bridge/a2a/mapper.js +6 -0
  33. package/dist/bridge/a2a/mapper.js.map +1 -1
  34. package/dist/bridge/sse/mapper.d.ts.map +1 -1
  35. package/dist/bridge/sse/mapper.js +22 -0
  36. package/dist/bridge/sse/mapper.js.map +1 -1
  37. package/dist/bus/lock.d.ts.map +1 -1
  38. package/dist/bus/lock.js +1 -10
  39. package/dist/bus/lock.js.map +1 -1
  40. package/dist/compaction/consolidation.d.ts +31 -0
  41. package/dist/compaction/consolidation.d.ts.map +1 -0
  42. package/dist/compaction/consolidation.js +63 -0
  43. package/dist/compaction/consolidation.js.map +1 -0
  44. package/dist/compaction/factory.d.ts.map +1 -1
  45. package/dist/compaction/factory.js +3 -0
  46. package/dist/compaction/factory.js.map +1 -1
  47. package/dist/compaction/index.d.ts +6 -1
  48. package/dist/compaction/index.d.ts.map +1 -1
  49. package/dist/compaction/index.js +6 -0
  50. package/dist/compaction/index.js.map +1 -1
  51. package/dist/compaction/manager.d.ts +7 -0
  52. package/dist/compaction/manager.d.ts.map +1 -1
  53. package/dist/compaction/manager.js +31 -0
  54. package/dist/compaction/manager.js.map +1 -1
  55. package/dist/compaction/plan.d.ts +23 -0
  56. package/dist/compaction/plan.d.ts.map +1 -1
  57. package/dist/compaction/plan.js +41 -24
  58. package/dist/compaction/plan.js.map +1 -1
  59. package/dist/compaction/salience/bm25.d.ts +26 -0
  60. package/dist/compaction/salience/bm25.d.ts.map +1 -0
  61. package/dist/compaction/salience/bm25.js +56 -0
  62. package/dist/compaction/salience/bm25.js.map +1 -0
  63. package/dist/compaction/salience/goal.d.ts +21 -0
  64. package/dist/compaction/salience/goal.d.ts.map +1 -0
  65. package/dist/compaction/salience/goal.js +32 -0
  66. package/dist/compaction/salience/goal.js.map +1 -0
  67. package/dist/compaction/salience/index.d.ts +4 -0
  68. package/dist/compaction/salience/index.d.ts.map +1 -0
  69. package/dist/compaction/salience/index.js +4 -0
  70. package/dist/compaction/salience/index.js.map +1 -0
  71. package/dist/compaction/salience/minhash.d.ts +17 -0
  72. package/dist/compaction/salience/minhash.d.ts.map +1 -0
  73. package/dist/compaction/salience/minhash.js +54 -0
  74. package/dist/compaction/salience/minhash.js.map +1 -0
  75. package/dist/compaction/salience/score.d.ts +64 -0
  76. package/dist/compaction/salience/score.d.ts.map +1 -0
  77. package/dist/compaction/salience/score.js +256 -0
  78. package/dist/compaction/salience/score.js.map +1 -0
  79. package/dist/compaction/salience/tokenize.d.ts +20 -0
  80. package/dist/compaction/salience/tokenize.d.ts.map +1 -0
  81. package/dist/compaction/salience/tokenize.js +92 -0
  82. package/dist/compaction/salience/tokenize.js.map +1 -0
  83. package/dist/compaction/salience/working-set.d.ts +59 -0
  84. package/dist/compaction/salience/working-set.d.ts.map +1 -0
  85. package/dist/compaction/salience/working-set.js +137 -0
  86. package/dist/compaction/salience/working-set.js.map +1 -0
  87. package/dist/compaction/serializer.d.ts +2 -0
  88. package/dist/compaction/serializer.d.ts.map +1 -1
  89. package/dist/compaction/serializer.js +15 -0
  90. package/dist/compaction/serializer.js.map +1 -1
  91. package/dist/compaction/token-estimate.d.ts +13 -0
  92. package/dist/compaction/token-estimate.d.ts.map +1 -0
  93. package/dist/compaction/token-estimate.js +58 -0
  94. package/dist/compaction/token-estimate.js.map +1 -0
  95. package/dist/compaction/tool-result-editing.d.ts +10 -2
  96. package/dist/compaction/tool-result-editing.d.ts.map +1 -1
  97. package/dist/compaction/tool-result-editing.js +22 -24
  98. package/dist/compaction/tool-result-editing.js.map +1 -1
  99. package/dist/compaction/types.d.ts +22 -1
  100. package/dist/compaction/types.d.ts.map +1 -1
  101. package/dist/compaction/wire.d.ts +3 -1
  102. package/dist/compaction/wire.d.ts.map +1 -1
  103. package/dist/compaction/wire.js +2 -0
  104. package/dist/compaction/wire.js.map +1 -1
  105. package/dist/config/runtime.d.ts +58 -28
  106. package/dist/config/runtime.d.ts.map +1 -1
  107. package/dist/config/runtime.js +13 -1
  108. package/dist/config/runtime.js.map +1 -1
  109. package/dist/connector/builtins/http.d.ts.map +1 -1
  110. package/dist/connector/builtins/http.js +2 -8
  111. package/dist/connector/builtins/http.js.map +1 -1
  112. package/dist/connector/builtins/webhook.js +2 -2
  113. package/dist/connector/builtins/webhook.js.map +1 -1
  114. package/dist/connector/mcp/adapter.d.ts +2 -0
  115. package/dist/connector/mcp/adapter.d.ts.map +1 -1
  116. package/dist/connector/mcp/adapter.js +30 -0
  117. package/dist/connector/mcp/adapter.js.map +1 -1
  118. package/dist/connector/tools/adapter.js +2 -2
  119. package/dist/connector/tools/adapter.js.map +1 -1
  120. package/dist/connector/tools/definitions.js +2 -2
  121. package/dist/connector/tools/definitions.js.map +1 -1
  122. package/dist/constants/compaction/index.d.ts +1 -0
  123. package/dist/constants/compaction/index.d.ts.map +1 -1
  124. package/dist/constants/compaction/index.js +1 -0
  125. package/dist/constants/compaction/index.js.map +1 -1
  126. package/dist/constants/telemetry/index.d.ts +0 -1
  127. package/dist/constants/telemetry/index.d.ts.map +1 -1
  128. package/dist/constants/telemetry/index.js +0 -1
  129. package/dist/constants/telemetry/index.js.map +1 -1
  130. package/dist/contracts/a2a.d.ts +5 -5
  131. package/dist/contracts/api.d.ts +4 -2
  132. package/dist/contracts/api.d.ts.map +1 -1
  133. package/dist/contracts/schemas.d.ts +1 -15
  134. package/dist/contracts/schemas.d.ts.map +1 -1
  135. package/dist/contracts/schemas.js +5 -20
  136. package/dist/contracts/schemas.js.map +1 -1
  137. package/dist/invariants/index.d.ts +1 -1
  138. package/dist/manager/agent/lifecycle.d.ts +2 -18
  139. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  140. package/dist/manager/agent/lifecycle.js +373 -340
  141. package/dist/manager/agent/lifecycle.js.map +1 -1
  142. package/dist/manager/run/persistence.d.ts +3 -0
  143. package/dist/manager/run/persistence.d.ts.map +1 -1
  144. package/dist/manager/run/persistence.js +35 -5
  145. package/dist/manager/run/persistence.js.map +1 -1
  146. package/dist/plugin/index.d.ts +2 -0
  147. package/dist/plugin/index.d.ts.map +1 -1
  148. package/dist/plugin/index.js +1 -0
  149. package/dist/plugin/index.js.map +1 -1
  150. package/dist/plugin/shell-hook.d.ts +128 -0
  151. package/dist/plugin/shell-hook.d.ts.map +1 -0
  152. package/dist/plugin/shell-hook.js +299 -0
  153. package/dist/plugin/shell-hook.js.map +1 -0
  154. package/dist/prompt/coding-agent-doctrine.d.ts +63 -0
  155. package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -0
  156. package/dist/prompt/coding-agent-doctrine.js +100 -0
  157. package/dist/prompt/coding-agent-doctrine.js.map +1 -0
  158. package/dist/prompt/index.d.ts +2 -0
  159. package/dist/prompt/index.d.ts.map +1 -1
  160. package/dist/prompt/index.js +1 -0
  161. package/dist/prompt/index.js.map +1 -1
  162. package/dist/provider/errors.d.ts +1 -1
  163. package/dist/provider/errors.js +1 -1
  164. package/dist/provider/fallback.d.ts +2 -0
  165. package/dist/provider/fallback.d.ts.map +1 -1
  166. package/dist/provider/fallback.js +3 -1
  167. package/dist/provider/fallback.js.map +1 -1
  168. package/dist/provider/retry.d.ts +2 -0
  169. package/dist/provider/retry.d.ts.map +1 -1
  170. package/dist/provider/retry.js +3 -1
  171. package/dist/provider/retry.js.map +1 -1
  172. package/dist/provider/token-budget.d.ts +13 -0
  173. package/dist/provider/token-budget.d.ts.map +1 -0
  174. package/dist/provider/token-budget.js +150 -0
  175. package/dist/provider/token-budget.js.map +1 -0
  176. package/dist/public-runtime.d.ts +14 -14
  177. package/dist/public-runtime.d.ts.map +1 -1
  178. package/dist/public-runtime.js +15 -10
  179. package/dist/public-runtime.js.map +1 -1
  180. package/dist/public-tools.d.ts +2 -0
  181. package/dist/public-tools.d.ts.map +1 -1
  182. package/dist/public-tools.js +2 -0
  183. package/dist/public-tools.js.map +1 -1
  184. package/dist/public-types.d.ts +12 -2
  185. package/dist/public-types.d.ts.map +1 -1
  186. package/dist/registry/command/kernel-commands.d.ts.map +1 -1
  187. package/dist/registry/command/kernel-commands.js +18 -6
  188. package/dist/registry/command/kernel-commands.js.map +1 -1
  189. package/dist/registry/tool/execute.d.ts.map +1 -1
  190. package/dist/registry/tool/execute.js +4 -1
  191. package/dist/registry/tool/execute.js.map +1 -1
  192. package/dist/run/LimitChecker.js +1 -1
  193. package/dist/run/LimitChecker.js.map +1 -1
  194. package/dist/run/drain.js +1 -1
  195. package/dist/run/reporter.d.ts.map +1 -1
  196. package/dist/run/reporter.js +15 -0
  197. package/dist/run/reporter.js.map +1 -1
  198. package/dist/run/token-budget.d.ts +108 -0
  199. package/dist/run/token-budget.d.ts.map +1 -0
  200. package/dist/run/token-budget.js +591 -0
  201. package/dist/run/token-budget.js.map +1 -0
  202. package/dist/runtime/jobs/registry.d.ts +29 -0
  203. package/dist/runtime/jobs/registry.d.ts.map +1 -1
  204. package/dist/runtime/jobs/registry.js +98 -18
  205. package/dist/runtime/jobs/registry.js.map +1 -1
  206. package/dist/runtime/query/checkpoint.d.ts.map +1 -1
  207. package/dist/runtime/query/checkpoint.js +10 -3
  208. package/dist/runtime/query/checkpoint.js.map +1 -1
  209. package/dist/runtime/query/context.d.ts +2 -26
  210. package/dist/runtime/query/context.d.ts.map +1 -1
  211. package/dist/runtime/query/context.js +1 -29
  212. package/dist/runtime/query/context.js.map +1 -1
  213. package/dist/runtime/query/executor.d.ts +13 -9
  214. package/dist/runtime/query/executor.d.ts.map +1 -1
  215. package/dist/runtime/query/executor.js +144 -55
  216. package/dist/runtime/query/executor.js.map +1 -1
  217. package/dist/runtime/query/guard.d.ts.map +1 -1
  218. package/dist/runtime/query/guard.js +8 -0
  219. package/dist/runtime/query/guard.js.map +1 -1
  220. package/dist/runtime/query/index.d.ts +42 -4
  221. package/dist/runtime/query/index.d.ts.map +1 -1
  222. package/dist/runtime/query/index.js +153 -52
  223. package/dist/runtime/query/index.js.map +1 -1
  224. package/dist/runtime/query/iteration/index.d.ts +3 -3
  225. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  226. package/dist/runtime/query/iteration/index.js +47 -11
  227. package/dist/runtime/query/iteration/index.js.map +1 -1
  228. package/dist/runtime/query/iteration/phases/compaction.d.ts.map +1 -1
  229. package/dist/runtime/query/iteration/phases/compaction.js +98 -30
  230. package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
  231. package/dist/runtime/query/iteration/phases/context.d.ts +4 -0
  232. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  233. package/dist/runtime/query/iteration/phases/context.js.map +1 -1
  234. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  235. package/dist/runtime/query/iteration/phases/tool-review.js +29 -7
  236. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  237. package/dist/runtime/query/iteration/phases/working-memory.d.ts.map +1 -1
  238. package/dist/runtime/query/iteration/phases/working-memory.js +25 -15
  239. package/dist/runtime/query/iteration/phases/working-memory.js.map +1 -1
  240. package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
  241. package/dist/runtime/query/iteration/stream-turn.js +10 -5
  242. package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
  243. package/dist/runtime/query/plugin-hooks.d.ts +1 -1
  244. package/dist/runtime/query/plugin-hooks.d.ts.map +1 -1
  245. package/dist/runtime/query/plugin-hooks.js +20 -1
  246. package/dist/runtime/query/plugin-hooks.js.map +1 -1
  247. package/dist/runtime/query/prompt.d.ts.map +1 -1
  248. package/dist/runtime/query/prompt.js +14 -4
  249. package/dist/runtime/query/prompt.js.map +1 -1
  250. package/dist/runtime/query/repeat-call.d.ts +20 -2
  251. package/dist/runtime/query/repeat-call.d.ts.map +1 -1
  252. package/dist/runtime/query/repeat-call.js +35 -7
  253. package/dist/runtime/query/repeat-call.js.map +1 -1
  254. package/dist/runtime/query/result.d.ts.map +1 -1
  255. package/dist/runtime/query/result.js +9 -0
  256. package/dist/runtime/query/result.js.map +1 -1
  257. package/dist/runtime/query/review-policy.d.ts +142 -0
  258. package/dist/runtime/query/review-policy.d.ts.map +1 -0
  259. package/dist/runtime/query/review-policy.js +144 -0
  260. package/dist/runtime/query/review-policy.js.map +1 -0
  261. package/dist/runtime/query/run-state.d.ts.map +1 -1
  262. package/dist/runtime/query/run-state.js +4 -0
  263. package/dist/runtime/query/run-state.js.map +1 -1
  264. package/dist/runtime/query/steering.d.ts +4 -0
  265. package/dist/runtime/query/steering.d.ts.map +1 -1
  266. package/dist/runtime/query/steering.js +29 -0
  267. package/dist/runtime/query/steering.js.map +1 -1
  268. package/dist/runtime/query/token-budget.d.ts +7 -0
  269. package/dist/runtime/query/token-budget.d.ts.map +1 -0
  270. package/dist/runtime/query/token-budget.js +101 -0
  271. package/dist/runtime/query/token-budget.js.map +1 -0
  272. package/dist/runtime/query/tool-output-budget.d.ts +2 -0
  273. package/dist/runtime/query/tool-output-budget.d.ts.map +1 -1
  274. package/dist/runtime/query/tool-output-budget.js +29 -11
  275. package/dist/runtime/query/tool-output-budget.js.map +1 -1
  276. package/dist/runtime/query/tool-pause.d.ts.map +1 -1
  277. package/dist/runtime/query/tool-pause.js +4 -2
  278. package/dist/runtime/query/tool-pause.js.map +1 -1
  279. package/dist/runtime/query/tooling.d.ts +4 -0
  280. package/dist/runtime/query/tooling.d.ts.map +1 -1
  281. package/dist/runtime/query/tooling.js +4 -0
  282. package/dist/runtime/query/tooling.js.map +1 -1
  283. package/dist/sandbox/file-walk-program.d.ts +3 -0
  284. package/dist/sandbox/file-walk-program.d.ts.map +1 -0
  285. package/dist/sandbox/file-walk-program.js +94 -0
  286. package/dist/sandbox/file-walk-program.js.map +1 -0
  287. package/dist/sandbox/file-walk.d.ts +12 -0
  288. package/dist/sandbox/file-walk.d.ts.map +1 -0
  289. package/dist/sandbox/file-walk.js +429 -0
  290. package/dist/sandbox/file-walk.js.map +1 -0
  291. package/dist/sandbox/index.d.ts +2 -0
  292. package/dist/sandbox/index.d.ts.map +1 -1
  293. package/dist/sandbox/index.js +1 -0
  294. package/dist/sandbox/index.js.map +1 -1
  295. package/dist/sandbox/provider/local.d.ts +3 -1
  296. package/dist/sandbox/provider/local.d.ts.map +1 -1
  297. package/dist/sandbox/provider/local.js +121 -12
  298. package/dist/sandbox/provider/local.js.map +1 -1
  299. package/dist/scheduler/completion-inbox.d.ts +3 -2
  300. package/dist/scheduler/completion-inbox.d.ts.map +1 -1
  301. package/dist/scheduler/completion-inbox.js +29 -15
  302. package/dist/scheduler/completion-inbox.js.map +1 -1
  303. package/dist/scheduler/delegating.d.ts +1 -0
  304. package/dist/scheduler/delegating.d.ts.map +1 -1
  305. package/dist/scheduler/delegating.js +29 -12
  306. package/dist/scheduler/delegating.js.map +1 -1
  307. package/dist/scheduler/local.d.ts +1 -0
  308. package/dist/scheduler/local.d.ts.map +1 -1
  309. package/dist/scheduler/local.js +4 -7
  310. package/dist/scheduler/local.js.map +1 -1
  311. package/dist/session/index.d.ts +0 -1
  312. package/dist/session/index.d.ts.map +1 -1
  313. package/dist/session/index.js +0 -1
  314. package/dist/session/index.js.map +1 -1
  315. package/dist/session/workspace/path-builder.d.ts.map +1 -1
  316. package/dist/session/workspace/path-builder.js +5 -4
  317. package/dist/session/workspace/path-builder.js.map +1 -1
  318. package/dist/store/feedback/disk.d.ts.map +1 -1
  319. package/dist/store/feedback/disk.js +4 -6
  320. package/dist/store/feedback/disk.js.map +1 -1
  321. package/dist/store/index.d.ts +2 -0
  322. package/dist/store/index.d.ts.map +1 -1
  323. package/dist/store/index.js +1 -0
  324. package/dist/store/index.js.map +1 -1
  325. package/dist/store/memory/disk.d.ts.map +1 -1
  326. package/dist/store/memory/disk.js +3 -12
  327. package/dist/store/memory/disk.js.map +1 -1
  328. package/dist/store/run/checkpoint-disk.d.ts +3 -3
  329. package/dist/store/run/checkpoint-disk.d.ts.map +1 -1
  330. package/dist/store/run/checkpoint-disk.js +14 -26
  331. package/dist/store/run/checkpoint-disk.js.map +1 -1
  332. package/dist/store/run/claim-disk.js +1 -1
  333. package/dist/store/run/conformance.d.ts +1 -1
  334. package/dist/store/run/conformance.d.ts.map +1 -1
  335. package/dist/store/run/conformance.js +41 -33
  336. package/dist/store/run/conformance.js.map +1 -1
  337. package/dist/store/run/disk.d.ts.map +1 -1
  338. package/dist/store/run/disk.js +20 -4
  339. package/dist/store/run/disk.js.map +1 -1
  340. package/dist/store/run/token-budget-disk.d.ts +37 -0
  341. package/dist/store/run/token-budget-disk.d.ts.map +1 -0
  342. package/dist/store/run/token-budget-disk.js +208 -0
  343. package/dist/store/run/token-budget-disk.js.map +1 -0
  344. package/dist/store/session/disk.d.ts +4 -13
  345. package/dist/store/session/disk.d.ts.map +1 -1
  346. package/dist/store/session/disk.js +34 -31
  347. package/dist/store/session/disk.js.map +1 -1
  348. package/dist/store/session/memory.d.ts +2 -0
  349. package/dist/store/session/memory.d.ts.map +1 -1
  350. package/dist/store/session/memory.js +41 -2
  351. package/dist/store/session/memory.js.map +1 -1
  352. package/dist/store/task/disk.d.ts.map +1 -1
  353. package/dist/store/task/disk.js +7 -8
  354. package/dist/store/task/disk.js.map +1 -1
  355. package/dist/store/topic/memory.d.ts +2 -0
  356. package/dist/store/topic/memory.d.ts.map +1 -1
  357. package/dist/store/topic/memory.js +13 -1
  358. package/dist/store/topic/memory.js.map +1 -1
  359. package/dist/test-support/ids.d.ts +4 -19
  360. package/dist/test-support/ids.d.ts.map +1 -1
  361. package/dist/test-support/ids.js +51 -59
  362. package/dist/test-support/ids.js.map +1 -1
  363. package/dist/tools/advisory/index.d.ts.map +1 -1
  364. package/dist/tools/advisory/index.js +3 -1
  365. package/dist/tools/advisory/index.js.map +1 -1
  366. package/dist/tools/builtins/bash.d.ts +2 -0
  367. package/dist/tools/builtins/bash.d.ts.map +1 -1
  368. package/dist/tools/builtins/bash.js +224 -70
  369. package/dist/tools/builtins/bash.js.map +1 -1
  370. package/dist/tools/builtins/computer-use.d.ts +2 -2
  371. package/dist/tools/builtins/computer-use.d.ts.map +1 -1
  372. package/dist/tools/builtins/computer-use.js +4 -2
  373. package/dist/tools/builtins/computer-use.js.map +1 -1
  374. package/dist/tools/builtins/edit.js +2 -2
  375. package/dist/tools/builtins/edit.js.map +1 -1
  376. package/dist/tools/builtins/glob.d.ts +2 -1
  377. package/dist/tools/builtins/glob.d.ts.map +1 -1
  378. package/dist/tools/builtins/glob.js +95 -103
  379. package/dist/tools/builtins/glob.js.map +1 -1
  380. package/dist/tools/builtins/grep.d.ts.map +1 -1
  381. package/dist/tools/builtins/grep.js +155 -111
  382. package/dist/tools/builtins/grep.js.map +1 -1
  383. package/dist/tools/builtins/ls.js +4 -4
  384. package/dist/tools/builtins/ls.js.map +1 -1
  385. package/dist/tools/builtins/lsp.js +2 -2
  386. package/dist/tools/builtins/lsp.js.map +1 -1
  387. package/dist/tools/builtins/read-file.js +2 -2
  388. package/dist/tools/builtins/read-file.js.map +1 -1
  389. package/dist/tools/builtins/write-file.js +2 -2
  390. package/dist/tools/builtins/write-file.js.map +1 -1
  391. package/dist/tools/coordinator/ask-user-question.d.ts +33 -0
  392. package/dist/tools/coordinator/ask-user-question.d.ts.map +1 -0
  393. package/dist/tools/coordinator/ask-user-question.js +237 -0
  394. package/dist/tools/coordinator/ask-user-question.js.map +1 -0
  395. package/dist/tools/coordinator/index.d.ts +1 -2
  396. package/dist/tools/coordinator/index.d.ts.map +1 -1
  397. package/dist/tools/coordinator/index.js +4 -220
  398. package/dist/tools/coordinator/index.js.map +1 -1
  399. package/dist/tools/memory/read.d.ts.map +1 -1
  400. package/dist/tools/memory/read.js +2 -4
  401. package/dist/tools/memory/read.js.map +1 -1
  402. package/dist/tools/paths.d.ts +13 -0
  403. package/dist/tools/paths.d.ts.map +1 -1
  404. package/dist/tools/paths.js +53 -0
  405. package/dist/tools/paths.js.map +1 -1
  406. package/dist/tools/roster.d.ts +27 -0
  407. package/dist/tools/roster.d.ts.map +1 -0
  408. package/dist/tools/roster.js +42 -0
  409. package/dist/tools/roster.js.map +1 -0
  410. package/dist/types/agent/base.d.ts +5 -0
  411. package/dist/types/agent/base.d.ts.map +1 -1
  412. package/dist/types/agent/pipeline.d.ts +3 -0
  413. package/dist/types/agent/pipeline.d.ts.map +1 -1
  414. package/dist/types/agent/router.d.ts +2 -3
  415. package/dist/types/agent/router.d.ts.map +1 -1
  416. package/dist/types/agent/scheduler.d.ts +3 -0
  417. package/dist/types/agent/scheduler.d.ts.map +1 -1
  418. package/dist/types/agent/task.d.ts +5 -16
  419. package/dist/types/agent/task.d.ts.map +1 -1
  420. package/dist/types/agent/task.js.map +1 -1
  421. package/dist/types/common/index.d.ts.map +1 -1
  422. package/dist/types/common/index.js +3 -0
  423. package/dist/types/common/index.js.map +1 -1
  424. package/dist/types/computer-use/index.d.ts +8 -0
  425. package/dist/types/computer-use/index.d.ts.map +1 -1
  426. package/dist/types/computer-use/index.js.map +1 -1
  427. package/dist/types/hitl/index.d.ts +5 -0
  428. package/dist/types/hitl/index.d.ts.map +1 -1
  429. package/dist/types/hitl/index.js.map +1 -1
  430. package/dist/types/ids/brand.d.ts +5 -47
  431. package/dist/types/ids/brand.d.ts.map +1 -1
  432. package/dist/types/ids/brand.js +2 -39
  433. package/dist/types/ids/brand.js.map +1 -1
  434. package/dist/types/ids/index.d.ts +59 -69
  435. package/dist/types/ids/index.d.ts.map +1 -1
  436. package/dist/types/ids/index.js +12 -10
  437. package/dist/types/ids/index.js.map +1 -1
  438. package/dist/types/permission/index.d.ts +9 -0
  439. package/dist/types/permission/index.d.ts.map +1 -1
  440. package/dist/types/permission/index.js +9 -1
  441. package/dist/types/permission/index.js.map +1 -1
  442. package/dist/types/plugin/index.d.ts +45 -4
  443. package/dist/types/plugin/index.d.ts.map +1 -1
  444. package/dist/types/plugin/index.js +7 -0
  445. package/dist/types/plugin/index.js.map +1 -1
  446. package/dist/types/run/config.d.ts +3 -0
  447. package/dist/types/run/config.d.ts.map +1 -1
  448. package/dist/types/run/emergency.d.ts +5 -0
  449. package/dist/types/run/emergency.d.ts.map +1 -1
  450. package/dist/types/run/emergency.js.map +1 -1
  451. package/dist/types/run/entity.d.ts +6 -2
  452. package/dist/types/run/entity.d.ts.map +1 -1
  453. package/dist/types/run/events.d.ts +35 -0
  454. package/dist/types/run/events.d.ts.map +1 -1
  455. package/dist/types/run/events.js.map +1 -1
  456. package/dist/types/run/index.d.ts +1 -0
  457. package/dist/types/run/index.d.ts.map +1 -1
  458. package/dist/types/run/index.js +1 -0
  459. package/dist/types/run/index.js.map +1 -1
  460. package/dist/types/run/state.d.ts +16 -15
  461. package/dist/types/run/state.d.ts.map +1 -1
  462. package/dist/types/run/state.js +41 -22
  463. package/dist/types/run/state.js.map +1 -1
  464. package/dist/types/run/stop-reason.d.ts +3 -14
  465. package/dist/types/run/stop-reason.d.ts.map +1 -1
  466. package/dist/types/run/token-budget-store.d.ts +29 -0
  467. package/dist/types/run/token-budget-store.d.ts.map +1 -0
  468. package/dist/types/run/token-budget-store.js +25 -0
  469. package/dist/types/run/token-budget-store.js.map +1 -0
  470. package/dist/types/sandbox/index.d.ts +47 -2
  471. package/dist/types/sandbox/index.d.ts.map +1 -1
  472. package/dist/types/sandbox/index.js.map +1 -1
  473. package/dist/types/session/store.d.ts +8 -0
  474. package/dist/types/session/store.d.ts.map +1 -1
  475. package/dist/types/tool/index.d.ts +15 -0
  476. package/dist/types/tool/index.d.ts.map +1 -1
  477. package/dist/types/tool/index.js.map +1 -1
  478. package/dist/utils/frontmatter.d.ts +1 -1
  479. package/dist/utils/frontmatter.js +1 -1
  480. package/dist/utils/id-format.d.ts +3 -0
  481. package/dist/utils/id-format.d.ts.map +1 -0
  482. package/dist/utils/id-format.js +9 -0
  483. package/dist/utils/id-format.js.map +1 -0
  484. package/dist/utils/id.d.ts +65 -32
  485. package/dist/utils/id.d.ts.map +1 -1
  486. package/dist/utils/id.js +168 -148
  487. package/dist/utils/id.js.map +1 -1
  488. package/dist/utils/log/exception.js +1 -1
  489. package/dist/utils/log/exception.js.map +1 -1
  490. package/dist/utils/log/index.d.ts.map +1 -1
  491. package/dist/utils/log/index.js +1 -2
  492. package/dist/utils/log/index.js.map +1 -1
  493. package/dist/utils/log/templates.d.ts.map +1 -1
  494. package/dist/utils/log/templates.js +0 -1
  495. package/dist/utils/log/templates.js.map +1 -1
  496. package/package.json +6 -1
  497. package/src/agents/AGENTS.md +1 -1
  498. package/src/agents/PipelineAgent.ts +129 -109
  499. package/src/agents/ReactiveAgent.ts +2 -0
  500. package/src/agents/RouterAgent.ts +120 -73
  501. package/src/agents/SupervisorAgent.ts +12 -4
  502. package/src/agents/budget.ts +42 -0
  503. package/src/agents/explore.ts +29 -0
  504. package/src/agents/file-definitions.ts +237 -0
  505. package/src/agents/index.ts +15 -0
  506. package/src/bridge/a2a/mapper.ts +6 -0
  507. package/src/bridge/sse/mapper.ts +22 -0
  508. package/src/bus/lock.ts +1 -10
  509. package/src/compaction/consolidation.ts +79 -0
  510. package/src/compaction/factory.ts +3 -0
  511. package/src/compaction/index.ts +34 -4
  512. package/src/compaction/manager.ts +39 -1
  513. package/src/compaction/plan.ts +52 -21
  514. package/src/compaction/salience/bm25.ts +72 -0
  515. package/src/compaction/salience/goal.ts +44 -0
  516. package/src/compaction/salience/index.ts +19 -0
  517. package/src/compaction/salience/minhash.ts +53 -0
  518. package/src/compaction/salience/score.ts +305 -0
  519. package/src/compaction/salience/tokenize.ts +89 -0
  520. package/src/compaction/salience/working-set.ts +187 -0
  521. package/src/compaction/serializer.ts +16 -0
  522. package/src/compaction/token-estimate.ts +57 -0
  523. package/src/compaction/tool-result-editing.ts +28 -26
  524. package/src/compaction/types.ts +24 -1
  525. package/src/compaction/wire.ts +5 -1
  526. package/src/config/runtime.ts +13 -1
  527. package/src/connector/builtins/http.ts +2 -8
  528. package/src/connector/builtins/webhook.ts +2 -2
  529. package/src/connector/mcp/adapter.ts +32 -0
  530. package/src/connector/tools/adapter.ts +2 -2
  531. package/src/connector/tools/definitions.ts +2 -2
  532. package/src/constants/compaction/index.ts +1 -0
  533. package/src/constants/telemetry/index.ts +0 -1
  534. package/src/contracts/api.ts +5 -1
  535. package/src/contracts/schemas.ts +6 -20
  536. package/src/invariants/index.ts +1 -1
  537. package/src/manager/agent/lifecycle.ts +380 -352
  538. package/src/manager/run/persistence.ts +35 -5
  539. package/src/plugin/index.ts +19 -0
  540. package/src/plugin/shell-hook.ts +403 -0
  541. package/src/prompt/coding-agent-doctrine.ts +118 -0
  542. package/src/prompt/index.ts +8 -0
  543. package/src/provider/errors.ts +1 -1
  544. package/src/provider/fallback.ts +4 -1
  545. package/src/provider/retry.ts +4 -1
  546. package/src/provider/token-budget.ts +158 -0
  547. package/src/public-runtime.ts +56 -28
  548. package/src/public-tools.ts +5 -0
  549. package/src/public-types.ts +65 -0
  550. package/src/registry/command/kernel-commands.ts +16 -6
  551. package/src/registry/tool/execute.ts +4 -1
  552. package/src/run/LimitChecker.ts +1 -1
  553. package/src/run/drain.ts +1 -1
  554. package/src/run/reporter.ts +15 -0
  555. package/src/run/token-budget.ts +692 -0
  556. package/src/runtime/jobs/registry.ts +123 -17
  557. package/src/runtime/query/checkpoint.ts +10 -3
  558. package/src/runtime/query/context.ts +3 -57
  559. package/src/runtime/query/executor.ts +181 -71
  560. package/src/runtime/query/guard.ts +8 -0
  561. package/src/runtime/query/index.ts +209 -62
  562. package/src/runtime/query/iteration/index.ts +53 -15
  563. package/src/runtime/query/iteration/phases/compaction.ts +130 -31
  564. package/src/runtime/query/iteration/phases/context.ts +4 -0
  565. package/src/runtime/query/iteration/phases/tool-review.ts +39 -7
  566. package/src/runtime/query/iteration/phases/working-memory.ts +23 -14
  567. package/src/runtime/query/iteration/stream-turn.ts +9 -5
  568. package/src/runtime/query/plugin-hooks.ts +24 -2
  569. package/src/runtime/query/prompt.ts +21 -4
  570. package/src/runtime/query/repeat-call.ts +42 -7
  571. package/src/runtime/query/result.ts +9 -0
  572. package/src/runtime/query/review-policy.ts +231 -0
  573. package/src/runtime/query/run-state.ts +4 -0
  574. package/src/runtime/query/steering.ts +32 -0
  575. package/src/runtime/query/token-budget.ts +127 -0
  576. package/src/runtime/query/tool-output-budget.ts +33 -10
  577. package/src/runtime/query/tool-pause.ts +4 -2
  578. package/src/runtime/query/tooling.ts +8 -0
  579. package/src/sandbox/file-walk-program.ts +93 -0
  580. package/src/sandbox/file-walk.ts +463 -0
  581. package/src/sandbox/index.ts +2 -0
  582. package/src/sandbox/provider/local.ts +136 -13
  583. package/src/scheduler/completion-inbox.ts +29 -19
  584. package/src/scheduler/delegating.ts +35 -13
  585. package/src/scheduler/local.ts +5 -7
  586. package/src/session/index.ts +0 -1
  587. package/src/session/workspace/path-builder.ts +5 -4
  588. package/src/store/feedback/disk.ts +4 -6
  589. package/src/store/index.ts +2 -0
  590. package/src/store/memory/disk.ts +3 -11
  591. package/src/store/run/checkpoint-disk.ts +14 -27
  592. package/src/store/run/claim-disk.ts +1 -1
  593. package/src/store/run/conformance.ts +55 -39
  594. package/src/store/run/disk.ts +19 -4
  595. package/src/store/run/token-budget-disk.ts +247 -0
  596. package/src/store/session/disk.ts +36 -29
  597. package/src/store/session/memory.ts +38 -1
  598. package/src/store/task/disk.ts +7 -8
  599. package/src/store/topic/memory.ts +13 -1
  600. package/src/test-support/ids.ts +62 -59
  601. package/src/tools/advisory/index.ts +3 -1
  602. package/src/tools/builtins/bash.ts +241 -70
  603. package/src/tools/builtins/computer-use.ts +6 -2
  604. package/src/tools/builtins/edit.ts +2 -2
  605. package/src/tools/builtins/glob.ts +104 -122
  606. package/src/tools/builtins/grep.ts +166 -132
  607. package/src/tools/builtins/ls.ts +4 -4
  608. package/src/tools/builtins/lsp.ts +2 -2
  609. package/src/tools/builtins/read-file.ts +2 -2
  610. package/src/tools/builtins/write-file.ts +2 -2
  611. package/src/tools/coordinator/ask-user-question.ts +284 -0
  612. package/src/tools/coordinator/index.ts +5 -248
  613. package/src/tools/memory/read.ts +2 -4
  614. package/src/tools/paths.ts +64 -0
  615. package/src/tools/roster.ts +46 -0
  616. package/src/types/agent/base.ts +6 -0
  617. package/src/types/agent/pipeline.ts +3 -0
  618. package/src/types/agent/router.ts +2 -3
  619. package/src/types/agent/scheduler.ts +4 -0
  620. package/src/types/agent/task.ts +5 -18
  621. package/src/types/common/index.ts +3 -0
  622. package/src/types/computer-use/index.ts +8 -0
  623. package/src/types/hitl/index.ts +5 -0
  624. package/src/types/ids/brand.ts +5 -48
  625. package/src/types/ids/index.ts +66 -75
  626. package/src/types/permission/index.ts +11 -0
  627. package/src/types/plugin/index.ts +49 -1
  628. package/src/types/run/config.ts +3 -0
  629. package/src/types/run/emergency.ts +5 -0
  630. package/src/types/run/entity.ts +6 -2
  631. package/src/types/run/events.ts +37 -0
  632. package/src/types/run/index.ts +1 -0
  633. package/src/types/run/state.ts +58 -30
  634. package/src/types/run/stop-reason.ts +3 -14
  635. package/src/types/run/token-budget-store.ts +54 -0
  636. package/src/types/sandbox/index.ts +53 -0
  637. package/src/types/session/store.ts +8 -0
  638. package/src/types/tool/index.ts +15 -0
  639. package/src/utils/frontmatter.ts +1 -1
  640. package/src/utils/id-format.ts +9 -0
  641. package/src/utils/id.ts +222 -181
  642. package/src/utils/log/exception.ts +1 -1
  643. package/src/utils/log/index.ts +1 -2
  644. package/src/utils/log/templates.ts +0 -1
  645. package/dist/session/migration/errors.d.ts +0 -26
  646. package/dist/session/migration/errors.d.ts.map +0 -1
  647. package/dist/session/migration/errors.js +0 -22
  648. package/dist/session/migration/errors.js.map +0 -1
  649. package/dist/session/migration/filesystem.d.ts +0 -122
  650. package/dist/session/migration/filesystem.d.ts.map +0 -1
  651. package/dist/session/migration/filesystem.js +0 -379
  652. package/dist/session/migration/filesystem.js.map +0 -1
  653. package/dist/session/migration/id-prefix.d.ts +0 -113
  654. package/dist/session/migration/id-prefix.d.ts.map +0 -1
  655. package/dist/session/migration/id-prefix.js +0 -132
  656. package/dist/session/migration/id-prefix.js.map +0 -1
  657. package/dist/session/migration/index.d.ts +0 -12
  658. package/dist/session/migration/index.d.ts.map +0 -1
  659. package/dist/session/migration/index.js +0 -12
  660. package/dist/session/migration/index.js.map +0 -1
  661. package/dist/session/migration/marker.d.ts +0 -57
  662. package/dist/session/migration/marker.d.ts.map +0 -1
  663. package/dist/session/migration/marker.js +0 -123
  664. package/dist/session/migration/marker.js.map +0 -1
  665. package/src/session/migration/errors.ts +0 -23
  666. package/src/session/migration/filesystem.ts +0 -468
  667. package/src/session/migration/id-prefix.ts +0 -166
  668. package/src/session/migration/index.ts +0 -41
  669. package/src/session/migration/marker.ts +0 -142
@@ -0,0 +1,33 @@
1
+ /**
2
+ * The one tool that turns a run around to face the human.
3
+ *
4
+ * It used to be built inside `buildCoordinatorTools`, which needs a gateway,
5
+ * a scheduler and a roster the question has no use for — so a host that
6
+ * wanted only this tool (an interactive terminal with no delegation) had to
7
+ * assemble the whole coordinator set and fish the question out of it, and
8
+ * had to invent a run id at build time because the builder demanded one.
9
+ * This builder needs the park handler and nothing else; the run id is read
10
+ * from the calling `ToolContext` unless the host pins one.
11
+ */
12
+ import type { PendingAnswers, QuestionParkRecorder } from '../../runtime/query/question-park.js';
13
+ import type { ResumeHandler } from '../../types/hitl/index.js';
14
+ import type { RunId } from '../../types/ids/index.js';
15
+ import type { ToolDefinition } from '../../types/tool/index.js';
16
+ /** Internal identity shared by the builder and the agent authority boundary. */
17
+ export declare const ASK_USER_QUESTION_TOOL_NAME: "ask_user_question";
18
+ export interface AskUserQuestionToolOptions {
19
+ /** Where the question goes; the run parks on it until an answer comes back. */
20
+ resumeHandler: ResumeHandler;
21
+ /**
22
+ * The run the park is recorded against. Omit it and the tool uses the
23
+ * `runId` of the call that asked, which is the right run in every case
24
+ * but a host that answers questions for a run other than the one it drives.
25
+ */
26
+ runId?: RunId;
27
+ /** See the same field on `CoordinatorToolsOptions`. */
28
+ questionParks?: QuestionParkRecorder;
29
+ /** See the same field on `CoordinatorToolsOptions`. */
30
+ pendingAnswers?: PendingAnswers;
31
+ }
32
+ export declare function buildAskUserQuestionTool(config: AskUserQuestionToolOptions): ToolDefinition;
33
+ //# sourceMappingURL=ask-user-question.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-user-question.d.ts","sourceRoot":"","sources":["../../../src/tools/coordinator/ask-user-question.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAA;AAChG,OAAO,KAAK,EAAE,aAAa,EAAsB,MAAM,2BAA2B,CAAA;AAClF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAI/D,gFAAgF;AAChF,eAAO,MAAM,2BAA2B,EAAG,mBAA4B,CAAA;AAuDvE,MAAM,WAAW,0BAA0B;IAC1C,+EAA+E;IAC/E,aAAa,EAAE,aAAa,CAAA;IAC5B;;;;OAIG;IACH,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,uDAAuD;IACvD,aAAa,CAAC,EAAE,oBAAoB,CAAA;IACpC,uDAAuD;IACvD,cAAc,CAAC,EAAE,cAAc,CAAA;CAC/B;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,0BAA0B,GAAG,cAAc,CAgM3F"}
@@ -0,0 +1,237 @@
1
+ /**
2
+ * The one tool that turns a run around to face the human.
3
+ *
4
+ * It used to be built inside `buildCoordinatorTools`, which needs a gateway,
5
+ * a scheduler and a roster the question has no use for — so a host that
6
+ * wanted only this tool (an interactive terminal with no delegation) had to
7
+ * assemble the whole coordinator set and fish the question out of it, and
8
+ * had to invent a run id at build time because the builder demanded one.
9
+ * This builder needs the park handler and nothing else; the run id is read
10
+ * from the calling `ToolContext` unless the host pins one.
11
+ */
12
+ import { z } from 'zod';
13
+ import { generateCheckpointId } from '../../utils/id.js';
14
+ import { defineTool } from '../defineTool.js';
15
+ /** Internal identity shared by the builder and the agent authority boundary. */
16
+ export const ASK_USER_QUESTION_TOOL_NAME = 'ask_user_question';
17
+ /**
18
+ * The single closed shape a capable provider constrains this call to.
19
+ *
20
+ * `options` arriving as a STRING is the failure this exists for: a model that
21
+ * serializes the array once tends to keep doing it, and the parse error it
22
+ * gets back never says the array was the problem.
23
+ * `additionalProperties: false` turns that into a refusal at generation time
24
+ * rather than a rejection after the fact.
25
+ */
26
+ const askUserQuestionModelInputSchema = {
27
+ type: 'object',
28
+ properties: {
29
+ question: {
30
+ type: 'string',
31
+ description: 'Full question text — clear, specific, and ending with a question mark.',
32
+ },
33
+ header: {
34
+ type: 'string',
35
+ description: 'Optional very short topic label, no more than 24 characters.',
36
+ },
37
+ options: {
38
+ type: 'array',
39
+ description: 'A JSON array of 2-4 genuinely distinct, context-derived option objects.',
40
+ items: {
41
+ type: 'object',
42
+ properties: {
43
+ label: {
44
+ type: 'string',
45
+ description: 'Concise option label. Put the recommended option first and append " (Recommended)".',
46
+ },
47
+ description: {
48
+ type: 'string',
49
+ description: 'Optional one-line explanation of what changes if selected.',
50
+ },
51
+ },
52
+ required: ['label'],
53
+ additionalProperties: false,
54
+ },
55
+ },
56
+ multiSelect: {
57
+ type: 'boolean',
58
+ description: 'True only when several options can apply at once.',
59
+ },
60
+ allowFreeText: {
61
+ type: 'boolean',
62
+ description: 'Whether the user may answer in their own words.',
63
+ },
64
+ },
65
+ required: ['question', 'options'],
66
+ additionalProperties: false,
67
+ };
68
+ export function buildAskUserQuestionTool(config) {
69
+ const parkHandler = config.resumeHandler;
70
+ const { questionParks, pendingAnswers } = config;
71
+ return defineTool({
72
+ name: ASK_USER_QUESTION_TOOL_NAME,
73
+ description: 'Ask the user ONE question ONLY when you are blocked on a decision that is genuinely theirs to make — one you cannot resolve from their request, your tools, the files you can read, or sensible defaults. The question must be the genuinely undecidable thing in THIS task. Never ask for information a tool can discover (do not ask what you can read, list, or search), never re-ask what the conversation already answers, and never ask meta-questions like "Shall I proceed?" — plan ratification goes through approve_plan. Provide 2-4 genuinely distinct options derived from the actual context — concrete paths, never generic placeholders (for example, asked to prepare a presentation, ask "Who is the audience?" with options like Board / Engineering team / Customer); keep labels short (1-5 words) and give each option a one-line description of what practically changes if it is chosen. Put your recommended option FIRST and append " (Recommended)" to its label. Set multiSelect: true only when several options can apply at once. A free-text "Something else" escape hatch is always shown automatically — do not add your own "Other" option. Ask ONE question per call and prefer at most one question per assistant turn; if several decisions block you, ask only the ones that materially change your next actions, in sequence — most work needs at most 2-3 questions, so prefer proceeding on stated defaults over interrogating the user. Never invent answers or synthetic content on the user\'s behalf unless they explicitly asked for a random/test scenario. The answer arrives as this tool\'s result; if the result says the user did not answer, do not ask this or any other question again — proceed on your best judgment without assuming consent.',
74
+ inputSchema: z
75
+ .object({
76
+ question: z
77
+ .string()
78
+ .min(1)
79
+ .describe('Full question text — clear, specific, ends with a question mark.'),
80
+ header: z
81
+ .string()
82
+ .max(24)
83
+ .optional()
84
+ .describe('Very short topic label for the question (e.g. "Audience", "Auth method").'),
85
+ options: z
86
+ .array(z
87
+ .object({
88
+ label: z
89
+ .string()
90
+ .min(1)
91
+ .max(80)
92
+ .describe('Concise option label (1-5 words). Recommended option goes first with " (Recommended)" appended.'),
93
+ description: z
94
+ .string()
95
+ .max(300)
96
+ .optional()
97
+ .describe('One line on what practically changes if this option is chosen.'),
98
+ })
99
+ .strict())
100
+ .min(2)
101
+ .max(4)
102
+ .describe('2-4 genuinely distinct, context-derived options.'),
103
+ multiSelect: z
104
+ .boolean()
105
+ .optional()
106
+ .default(false)
107
+ .describe('True only when several options can apply at once.'),
108
+ allowFreeText: z
109
+ .boolean()
110
+ .optional()
111
+ .default(true)
112
+ .describe('Whether the user may answer in their own words.'),
113
+ })
114
+ .strict(),
115
+ modelInputSchema: structuredClone(askUserQuestionModelInputSchema),
116
+ enforceModelInput: true,
117
+ validationErrorHint: 'Required shape: {"question":"...?","options":[{"label":"First (Recommended)","description":"What changes"},{"label":"Second","description":"What changes"}]}. "options" must be a JSON array of 2-4 objects, never a string.',
118
+ category: 'custom',
119
+ permissions: [],
120
+ readOnly: true,
121
+ destructive: false,
122
+ // MUST stay false: the executor serializes non-concurrency-safe
123
+ // tools in a single chain, so N question blocks in one assistant
124
+ // turn park strictly one-at-a-time. Hosts key their park/resolve
125
+ // registries by runId — concurrent parks on one run clobber each
126
+ // other and the first promise never resolves (run hangs to TTL).
127
+ concurrencySafe: false,
128
+ async execute({ question, header, options, multiSelect, allowFreeText }, context) {
129
+ const toolUseId = context.toolUseId;
130
+ if (!toolUseId) {
131
+ // Without the executing tool_use_id the question has no
132
+ // stable identity: the host could never merge the awaiting
133
+ // card with its resolution, and answers could not be matched
134
+ // back. Hard-fail instead of parking an unmergeable id.
135
+ return {
136
+ success: false,
137
+ output: '',
138
+ error: 'ask_user_question requires an executor that threads ToolContext.toolUseId; the question cannot be tracked without it.',
139
+ };
140
+ }
141
+ const questionOptions = options.map((opt, i) => ({
142
+ id: `opt_${i + 1}`,
143
+ label: opt.label,
144
+ ...(opt.description !== undefined ? { description: opt.description } : {}),
145
+ }));
146
+ const questionData = {
147
+ questionId: toolUseId,
148
+ question,
149
+ ...(header !== undefined ? { header } : {}),
150
+ options: questionOptions,
151
+ multiSelect,
152
+ allowFreeText,
153
+ };
154
+ // An answer carried in from a resumed run. Checked before the
155
+ // park, because re-entering this tool is HOW the answer gets
156
+ // delivered: the batch is re-executed, and without this the
157
+ // re-execution would ask the user something they already
158
+ // answered — or, headless, auto-answer with the no-consent
159
+ // sentinel and throw the real answer away.
160
+ const carried = pendingAnswers?.take(toolUseId);
161
+ // A real checkpoint, not a synthetic id nothing ever wrote.
162
+ // Skipped when an answer is already in hand: parking a
163
+ // question that is answered would leave an outstanding record
164
+ // for a decision that has been made.
165
+ const parkedAt = carried === undefined && questionParks ? await questionParks.record(questionData) : null;
166
+ const decision = carried ??
167
+ (await parkHandler({
168
+ type: 'user_question',
169
+ runId: config.runId ?? context.runId,
170
+ // Provider correlation ids remain verbatim in questionData;
171
+ // an unpersisted park gets its own safe checkpoint identifier.
172
+ checkpointId: parkedAt ?? generateCheckpointId(),
173
+ question: questionData,
174
+ }));
175
+ // Clear the park once the answer is in, so an approval queue
176
+ // stops serving a question that has been answered.
177
+ if (parkedAt !== null && questionParks) {
178
+ await questionParks.resolve(parkedAt, decision);
179
+ }
180
+ // The no-answer sentinel (explicitly NOT consent — fixes the
181
+ // "empty answer reads as approval" ambiguity): used for empty
182
+ // answers, misdirected legacy decisions (e.g. a stale replica
183
+ // resolving with approve/continue verbs), and answers that
184
+ // carry a different question's id.
185
+ const noAnswer = {
186
+ success: true,
187
+ output: 'The user did not answer this question. Do not assume a choice or consent; proceed on your best judgment or continue without this information.',
188
+ data: { question, answered: false },
189
+ };
190
+ if (decision.action === 'abort') {
191
+ return {
192
+ success: false,
193
+ output: 'The user declined to answer and asked to stop. Acknowledge briefly and end your turn.',
194
+ data: { question, answered: false, declined: true },
195
+ };
196
+ }
197
+ if (decision.action !== 'answer_question')
198
+ return noAnswer;
199
+ if (decision.questionId !== undefined && decision.questionId !== toolUseId) {
200
+ // Misdirection guard: this answer was meant for a different
201
+ // question parked under the same run (stale client). Never
202
+ // fabricate a selection against the wrong question.
203
+ return noAnswer;
204
+ }
205
+ const stripRecommended = (label) => label.replace(/\s*\(recommended\)\s*$/i, '').trim();
206
+ const selected = decision.selectedOptionIds
207
+ .map((id) => questionOptions.find((opt) => opt.id === id))
208
+ .filter((opt) => opt !== undefined)
209
+ .map((opt) => ({ id: opt.id, label: stripRecommended(opt.label) }));
210
+ const freeText = decision.freeText?.trim() ?? '';
211
+ if (selected.length === 0 && !freeText)
212
+ return noAnswer;
213
+ let output;
214
+ if (selected.length > 0) {
215
+ const joined = selected.map((s) => `"${s.label}"`).join(', ');
216
+ output = `User answered "${question}": ${joined}`;
217
+ if (freeText) {
218
+ output += `\nAdditional note from the user: "${freeText}"`;
219
+ }
220
+ }
221
+ else {
222
+ output = `User answered "${question}" in their own words: "${freeText}"`;
223
+ }
224
+ return {
225
+ success: true,
226
+ output,
227
+ data: {
228
+ question,
229
+ selected,
230
+ ...(freeText ? { freeText } : {}),
231
+ answered: true,
232
+ },
233
+ };
234
+ },
235
+ });
236
+ }
237
+ //# sourceMappingURL=ask-user-question.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-user-question.js","sourceRoot":"","sources":["../../../src/tools/coordinator/ask-user-question.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ import type { ResumeHandler } from '../../types/hitl/index.js';
7
7
  import type { RunId, TaskId } from '../../types/ids/index.js';
8
8
  import type { TaskStore } from '../../types/task/index.js';
9
9
  import type { ToolDefinition } from '../../types/tool/index.js';
10
+ export { ASK_USER_QUESTION_TOOL_NAME } from './ask-user-question.js';
10
11
  export type TaskLaunchedCallback = (agentTaskId: TaskId, meta: {
11
12
  agentId: string;
12
13
  description: string;
@@ -83,8 +84,6 @@ export interface CoordinatorToolsOptions {
83
84
  */
84
85
  pendingAnswers?: PendingAnswers;
85
86
  }
86
- /** Internal identity shared by the builder and the agent authority boundary. */
87
- export declare const ASK_USER_QUESTION_TOOL_NAME: "ask_user_question";
88
87
  /**
89
88
  * How long a coordinator tool may wait on a delegated agent.
90
89
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/coordinator/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAA;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAA;AAChG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAA;AAC1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AACnE,OAAO,KAAK,EAAE,aAAa,EAAsB,MAAM,2BAA2B,CAAA;AAClF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAS/D,MAAM,MAAM,oBAAoB,GAAG,CAClC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;IACL,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC1B,KACG,IAAI,CAAA;AAET,MAAM,WAAW,uBAAuB;IACvC,OAAO,EAAE,aAAa,CAAA;IACtB,gBAAgB,EAAE,MAAM,CAAA;IACxB,cAAc,CAAC,EAAE,mBAAmB,CAAA;IACpC,eAAe,EAAE,MAAM,EAAE,CAAA;IAEzB;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IAEzB,SAAS,CAAC,EAAE,SAAS,CAAA;IAErB;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAE3C,KAAK,CAAC,EAAE,KAAK,CAAA;IAEb,cAAc,CAAC,EAAE,MAAM,WAAW,GAAG,SAAS,CAAA;IAE9C,cAAc,CAAC,EAAE,oBAAoB,CAAA;IAErC;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,eAAe,CAAA;IAEjC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,aAAa,CAAA;IAE7B;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,oBAAoB,CAAA;IAEpC;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,cAAc,CAAA;CAC/B;AAED,gFAAgF;AAChF,eAAO,MAAM,2BAA2B,EAAG,mBAA4B,CAAA;AAmRvE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,qBAAqB,QAAiB,CAAA;AAEnD;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,kBAAkB,QAAgE,CAAA;AA6B/F,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,uBAAuB,GAAG,cAAc,EAAE,CA0rCrF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/coordinator/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAA;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAA;AAChG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAA;AAC1E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAO/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAA;AAIpE,MAAM,MAAM,oBAAoB,GAAG,CAClC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE;IACL,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC1B,KACG,IAAI,CAAA;AAET,MAAM,WAAW,uBAAuB;IACvC,OAAO,EAAE,aAAa,CAAA;IACtB,gBAAgB,EAAE,MAAM,CAAA;IACxB,cAAc,CAAC,EAAE,mBAAmB,CAAA;IACpC,eAAe,EAAE,MAAM,EAAE,CAAA;IAEzB;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IAEzB,SAAS,CAAC,EAAE,SAAS,CAAA;IAErB;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IAE3C,KAAK,CAAC,EAAE,KAAK,CAAA;IAEb,cAAc,CAAC,EAAE,MAAM,WAAW,GAAG,SAAS,CAAA;IAE9C,cAAc,CAAC,EAAE,oBAAoB,CAAA;IAErC;;;;;;;;OAQG;IACH,eAAe,CAAC,EAAE,eAAe,CAAA;IAEjC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,aAAa,CAAA;IAE7B;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,oBAAoB,CAAA;IAEpC;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,cAAc,CAAA;CAC/B;AA8ND;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,qBAAqB,QAAiB,CAAA;AAEnD;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,kBAAkB,QAAgE,CAAA;AA6B/F,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,uBAAuB,GAAG,cAAc,EAAE,CA6/BrF"}
@@ -1,13 +1,13 @@
1
1
  import { z } from 'zod';
2
2
  import { toErrorMessage } from '../../utils/error.js';
3
- import { asCheckpointId, asTaskId } from '../../utils/id.js';
3
+ import { asTaskId } from '../../utils/id.js';
4
4
  import { defineTool } from '../defineTool.js';
5
5
  import { wrapUntrusted } from '../untrusted-envelope.js';
6
+ import { buildAskUserQuestionTool } from './ask-user-question.js';
6
7
  import { failureLabel, taskSucceeded } from './outcome.js';
8
+ export { ASK_USER_QUESTION_TOOL_NAME } from './ask-user-question.js';
7
9
  import { resolvePlanDependencies } from './plan-dependencies.js';
8
10
  import { describeWaitTimeout, waitForTaskWithBounds } from './wait-with-idle-bound.js';
9
- /** Internal identity shared by the builder and the agent authority boundary. */
10
- export const ASK_USER_QUESTION_TOOL_NAME = 'ask_user_question';
11
11
  const approvePlanStepSchema = z.object({
12
12
  description: z.string().describe('What this step does'),
13
13
  agent_id: z
@@ -16,57 +16,6 @@ const approvePlanStepSchema = z.object({
16
16
  .describe('Which agent handles this (omit for orchestrator-owned steps)'),
17
17
  depends_on: z.array(z.string()).optional().describe('Step descriptions this depends on'),
18
18
  });
19
- /**
20
- * The single closed shape a capable provider constrains this call to.
21
- *
22
- * `options` arriving as a STRING is the failure this exists for: a model that
23
- * serializes the array once tends to keep doing it, and the parse error it
24
- * gets back never says the array was the problem.
25
- * `additionalProperties: false` turns that into a refusal at generation time
26
- * rather than a rejection after the fact.
27
- */
28
- const askUserQuestionModelInputSchema = {
29
- type: 'object',
30
- properties: {
31
- question: {
32
- type: 'string',
33
- description: 'Full question text — clear, specific, and ending with a question mark.',
34
- },
35
- header: {
36
- type: 'string',
37
- description: 'Optional very short topic label, no more than 24 characters.',
38
- },
39
- options: {
40
- type: 'array',
41
- description: 'A JSON array of 2-4 genuinely distinct, context-derived option objects.',
42
- items: {
43
- type: 'object',
44
- properties: {
45
- label: {
46
- type: 'string',
47
- description: 'Concise option label. Put the recommended option first and append " (Recommended)".',
48
- },
49
- description: {
50
- type: 'string',
51
- description: 'Optional one-line explanation of what changes if selected.',
52
- },
53
- },
54
- required: ['label'],
55
- additionalProperties: false,
56
- },
57
- },
58
- multiSelect: {
59
- type: 'boolean',
60
- description: 'True only when several options can apply at once.',
61
- },
62
- allowFreeText: {
63
- type: 'boolean',
64
- description: 'Whether the user may answer in their own words.',
65
- },
66
- },
67
- required: ['question', 'options'],
68
- additionalProperties: false,
69
- };
70
19
  /** One well-formed tag token: `<step>`, `</step>`, `<a href="…">`, `<br/>`. */
71
20
  const TAG_TOKEN = /<\/?[A-Za-z][\w-]*(?:\s[^<>]*)?\/?>/g;
72
21
  const DESCRIPTION_BLOCK = /<description>([\s\S]*?)<\/description>/gi;
@@ -1259,172 +1208,7 @@ export function buildCoordinatorTools(opts) {
1259
1208
  tools.push(updatePlanStep);
1260
1209
  }
1261
1210
  if (resumeHandler && runId) {
1262
- const parkRunId = runId;
1263
- const parkHandler = resumeHandler;
1264
- const askUserQuestion = defineTool({
1265
- name: ASK_USER_QUESTION_TOOL_NAME,
1266
- description: 'Ask the user ONE question ONLY when you are blocked on a decision that is genuinely theirs to make — one you cannot resolve from their request, your tools, the files you can read, or sensible defaults. The question must be the genuinely undecidable thing in THIS task. Never ask for information a tool can discover (do not ask what you can read, list, or search), never re-ask what the conversation already answers, and never ask meta-questions like "Shall I proceed?" — plan ratification goes through approve_plan. Provide 2-4 genuinely distinct options derived from the actual context — concrete paths, never generic placeholders (for example, asked to prepare a presentation, ask "Who is the audience?" with options like Board / Engineering team / Customer); keep labels short (1-5 words) and give each option a one-line description of what practically changes if it is chosen. Put your recommended option FIRST and append " (Recommended)" to its label. Set multiSelect: true only when several options can apply at once. A free-text "Something else" escape hatch is always shown automatically — do not add your own "Other" option. Ask ONE question per call and prefer at most one question per assistant turn; if several decisions block you, ask only the ones that materially change your next actions, in sequence — most work needs at most 2-3 questions, so prefer proceeding on stated defaults over interrogating the user. Never invent answers or synthetic content on the user\'s behalf unless they explicitly asked for a random/test scenario. The answer arrives as this tool\'s result; if the result says the user did not answer, do not ask this or any other question again — proceed on your best judgment without assuming consent.',
1267
- inputSchema: z
1268
- .object({
1269
- question: z
1270
- .string()
1271
- .min(1)
1272
- .describe('Full question text — clear, specific, ends with a question mark.'),
1273
- header: z
1274
- .string()
1275
- .max(24)
1276
- .optional()
1277
- .describe('Very short topic label for the question (e.g. "Audience", "Auth method").'),
1278
- options: z
1279
- .array(z
1280
- .object({
1281
- label: z
1282
- .string()
1283
- .min(1)
1284
- .max(80)
1285
- .describe('Concise option label (1-5 words). Recommended option goes first with " (Recommended)" appended.'),
1286
- description: z
1287
- .string()
1288
- .max(300)
1289
- .optional()
1290
- .describe('One line on what practically changes if this option is chosen.'),
1291
- })
1292
- .strict())
1293
- .min(2)
1294
- .max(4)
1295
- .describe('2-4 genuinely distinct, context-derived options.'),
1296
- multiSelect: z
1297
- .boolean()
1298
- .optional()
1299
- .default(false)
1300
- .describe('True only when several options can apply at once.'),
1301
- allowFreeText: z
1302
- .boolean()
1303
- .optional()
1304
- .default(true)
1305
- .describe('Whether the user may answer in their own words.'),
1306
- })
1307
- .strict(),
1308
- modelInputSchema: structuredClone(askUserQuestionModelInputSchema),
1309
- enforceModelInput: true,
1310
- validationErrorHint: 'Required shape: {"question":"...?","options":[{"label":"First (Recommended)","description":"What changes"},{"label":"Second","description":"What changes"}]}. "options" must be a JSON array of 2-4 objects, never a string.',
1311
- category: 'custom',
1312
- permissions: [],
1313
- readOnly: true,
1314
- destructive: false,
1315
- // MUST stay false: the executor serializes non-concurrency-safe
1316
- // tools in a single chain, so N question blocks in one assistant
1317
- // turn park strictly one-at-a-time. Hosts key their park/resolve
1318
- // registries by runId — concurrent parks on one run clobber each
1319
- // other and the first promise never resolves (run hangs to TTL).
1320
- concurrencySafe: false,
1321
- async execute({ question, header, options, multiSelect, allowFreeText }, context) {
1322
- const toolUseId = context.toolUseId;
1323
- if (!toolUseId) {
1324
- // Without the executing tool_use_id the question has no
1325
- // stable identity: the host could never merge the awaiting
1326
- // card with its resolution, and answers could not be matched
1327
- // back. Hard-fail instead of parking an unmergeable id.
1328
- return {
1329
- success: false,
1330
- output: '',
1331
- error: 'ask_user_question requires an executor that threads ToolContext.toolUseId; the question cannot be tracked without it.',
1332
- };
1333
- }
1334
- const questionOptions = options.map((opt, i) => ({
1335
- id: `opt_${i + 1}`,
1336
- label: opt.label,
1337
- ...(opt.description !== undefined ? { description: opt.description } : {}),
1338
- }));
1339
- const questionData = {
1340
- questionId: toolUseId,
1341
- question,
1342
- ...(header !== undefined ? { header } : {}),
1343
- options: questionOptions,
1344
- multiSelect,
1345
- allowFreeText,
1346
- };
1347
- // An answer carried in from a resumed run. Checked before the
1348
- // park, because re-entering this tool is HOW the answer gets
1349
- // delivered: the batch is re-executed, and without this the
1350
- // re-execution would ask the user something they already
1351
- // answered — or, headless, auto-answer with the no-consent
1352
- // sentinel and throw the real answer away.
1353
- const carried = pendingAnswers?.take(toolUseId);
1354
- // A real checkpoint, not a synthetic id nothing ever wrote.
1355
- // Skipped when an answer is already in hand: parking a
1356
- // question that is answered would leave an outstanding record
1357
- // for a decision that has been made.
1358
- const parkedAt = carried === undefined && questionParks ? await questionParks.record(questionData) : null;
1359
- const decision = carried ??
1360
- (await parkHandler({
1361
- type: 'user_question',
1362
- runId: parkRunId,
1363
- checkpointId: parkedAt ?? asCheckpointId(`cp_question_${toolUseId}`),
1364
- question: questionData,
1365
- }));
1366
- // Clear the park once the answer is in, so an approval queue
1367
- // stops serving a question that has been answered.
1368
- if (parkedAt !== null && questionParks) {
1369
- await questionParks.resolve(parkedAt, decision);
1370
- }
1371
- // The no-answer sentinel (explicitly NOT consent — fixes the
1372
- // "empty answer reads as approval" ambiguity): used for empty
1373
- // answers, misdirected legacy decisions (e.g. a stale replica
1374
- // resolving with approve/continue verbs), and answers that
1375
- // carry a different question's id.
1376
- const noAnswer = {
1377
- success: true,
1378
- output: 'The user did not answer this question. Do not assume a choice or consent; proceed on your best judgment or continue without this information.',
1379
- data: { question, answered: false },
1380
- };
1381
- if (decision.action === 'abort') {
1382
- return {
1383
- success: false,
1384
- output: 'The user declined to answer and asked to stop. Acknowledge briefly and end your turn.',
1385
- data: { question, answered: false, declined: true },
1386
- };
1387
- }
1388
- if (decision.action !== 'answer_question')
1389
- return noAnswer;
1390
- if (decision.questionId !== undefined && decision.questionId !== toolUseId) {
1391
- // Misdirection guard: this answer was meant for a different
1392
- // question parked under the same run (stale client). Never
1393
- // fabricate a selection against the wrong question.
1394
- return noAnswer;
1395
- }
1396
- const stripRecommended = (label) => label.replace(/\s*\(recommended\)\s*$/i, '').trim();
1397
- const selected = decision.selectedOptionIds
1398
- .map((id) => questionOptions.find((opt) => opt.id === id))
1399
- .filter((opt) => opt !== undefined)
1400
- .map((opt) => ({ id: opt.id, label: stripRecommended(opt.label) }));
1401
- const freeText = decision.freeText?.trim() ?? '';
1402
- if (selected.length === 0 && !freeText)
1403
- return noAnswer;
1404
- let output;
1405
- if (selected.length > 0) {
1406
- const joined = selected.map((s) => `"${s.label}"`).join(', ');
1407
- output = `User answered "${question}": ${joined}`;
1408
- if (freeText) {
1409
- output += `\nAdditional note from the user: "${freeText}"`;
1410
- }
1411
- }
1412
- else {
1413
- output = `User answered "${question}" in their own words: "${freeText}"`;
1414
- }
1415
- return {
1416
- success: true,
1417
- output,
1418
- data: {
1419
- question,
1420
- selected,
1421
- ...(freeText ? { freeText } : {}),
1422
- answered: true,
1423
- },
1424
- };
1425
- },
1426
- });
1427
- tools.push(askUserQuestion);
1211
+ tools.push(buildAskUserQuestionTool({ resumeHandler, runId, questionParks, pendingAnswers }));
1428
1212
  }
1429
1213
  return tools;
1430
1214
  }