@namzu/sdk 30.2.0 → 31.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 (712) hide show
  1. package/CHANGELOG.md +556 -0
  2. package/README.md +43 -2
  3. package/dist/advisory/executor.d.ts +2 -1
  4. package/dist/advisory/executor.d.ts.map +1 -1
  5. package/dist/advisory/executor.js +4 -1
  6. package/dist/advisory/executor.js.map +1 -1
  7. package/dist/agents/ReactiveAgent.d.ts.map +1 -1
  8. package/dist/agents/ReactiveAgent.js +12 -0
  9. package/dist/agents/ReactiveAgent.js.map +1 -1
  10. package/dist/agents/RouterAgent.d.ts.map +1 -1
  11. package/dist/agents/RouterAgent.js +21 -3
  12. package/dist/agents/RouterAgent.js.map +1 -1
  13. package/dist/agents/SupervisorAgent.d.ts.map +1 -1
  14. package/dist/agents/SupervisorAgent.js +34 -11
  15. package/dist/agents/SupervisorAgent.js.map +1 -1
  16. package/dist/agents/runAgent.d.ts +12 -0
  17. package/dist/agents/runAgent.d.ts.map +1 -1
  18. package/dist/agents/runAgent.js +26 -2
  19. package/dist/agents/runAgent.js.map +1 -1
  20. package/dist/authorization/command-line.d.ts +81 -0
  21. package/dist/authorization/command-line.d.ts.map +1 -0
  22. package/dist/authorization/command-line.js +347 -0
  23. package/dist/authorization/command-line.js.map +1 -0
  24. package/dist/authorization/rules.d.ts.map +1 -1
  25. package/dist/authorization/rules.js +22 -1
  26. package/dist/authorization/rules.js.map +1 -1
  27. package/dist/bridge/a2a/client.d.ts +23 -5
  28. package/dist/bridge/a2a/client.d.ts.map +1 -1
  29. package/dist/bridge/a2a/client.js +320 -73
  30. package/dist/bridge/a2a/client.js.map +1 -1
  31. package/dist/bridge/a2a/mapper.d.ts.map +1 -1
  32. package/dist/bridge/a2a/mapper.js +4 -0
  33. package/dist/bridge/a2a/mapper.js.map +1 -1
  34. package/dist/bridge/acp/server.d.ts +13 -1
  35. package/dist/bridge/acp/server.d.ts.map +1 -1
  36. package/dist/bridge/acp/server.js +150 -44
  37. package/dist/bridge/acp/server.js.map +1 -1
  38. package/dist/bridge/mcp/connector/adapter.d.ts +3 -2
  39. package/dist/bridge/mcp/connector/adapter.d.ts.map +1 -1
  40. package/dist/bridge/mcp/connector/adapter.js +17 -21
  41. package/dist/bridge/mcp/connector/adapter.js.map +1 -1
  42. package/dist/bridge/sse/mapper.d.ts.map +1 -1
  43. package/dist/bridge/sse/mapper.js +3 -0
  44. package/dist/bridge/sse/mapper.js.map +1 -1
  45. package/dist/compaction/dangling.d.ts +29 -2
  46. package/dist/compaction/dangling.d.ts.map +1 -1
  47. package/dist/compaction/dangling.js +172 -35
  48. package/dist/compaction/dangling.js.map +1 -1
  49. package/dist/compaction/index.d.ts +3 -2
  50. package/dist/compaction/index.d.ts.map +1 -1
  51. package/dist/compaction/index.js +1 -1
  52. package/dist/compaction/index.js.map +1 -1
  53. package/dist/compaction/manual.d.ts +11 -1
  54. package/dist/compaction/manual.d.ts.map +1 -1
  55. package/dist/compaction/manual.js +89 -14
  56. package/dist/compaction/manual.js.map +1 -1
  57. package/dist/compaction/plan.d.ts +19 -6
  58. package/dist/compaction/plan.d.ts.map +1 -1
  59. package/dist/compaction/plan.js +18 -4
  60. package/dist/compaction/plan.js.map +1 -1
  61. package/dist/compaction/retention.d.ts +10 -7
  62. package/dist/compaction/retention.d.ts.map +1 -1
  63. package/dist/compaction/retention.js +26 -8
  64. package/dist/compaction/retention.js.map +1 -1
  65. package/dist/compaction/summary.d.ts +4 -4
  66. package/dist/compaction/summary.js +4 -4
  67. package/dist/compaction/verifier.d.ts +19 -1
  68. package/dist/compaction/verifier.d.ts.map +1 -1
  69. package/dist/compaction/verifier.js +20 -1
  70. package/dist/compaction/verifier.js.map +1 -1
  71. package/dist/config/runtime.d.ts +6 -6
  72. package/dist/connector/BaseConnector.d.ts +6 -4
  73. package/dist/connector/BaseConnector.d.ts.map +1 -1
  74. package/dist/connector/BaseConnector.js +8 -2
  75. package/dist/connector/BaseConnector.js.map +1 -1
  76. package/dist/connector/builtins/http.d.ts +16 -4
  77. package/dist/connector/builtins/http.d.ts.map +1 -1
  78. package/dist/connector/builtins/http.js +177 -44
  79. package/dist/connector/builtins/http.js.map +1 -1
  80. package/dist/connector/builtins/webhook.d.ts +15 -4
  81. package/dist/connector/builtins/webhook.d.ts.map +1 -1
  82. package/dist/connector/builtins/webhook.js +165 -45
  83. package/dist/connector/builtins/webhook.js.map +1 -1
  84. package/dist/connector/execution-contract.d.ts +11 -0
  85. package/dist/connector/execution-contract.d.ts.map +1 -0
  86. package/dist/connector/execution-contract.js +14 -0
  87. package/dist/connector/execution-contract.js.map +1 -0
  88. package/dist/connector/http-operation.d.ts +48 -0
  89. package/dist/connector/http-operation.d.ts.map +1 -0
  90. package/dist/connector/http-operation.js +205 -0
  91. package/dist/connector/http-operation.js.map +1 -0
  92. package/dist/connector/mcp/adapter.d.ts.map +1 -1
  93. package/dist/connector/mcp/adapter.js +8 -3
  94. package/dist/connector/mcp/adapter.js.map +1 -1
  95. package/dist/connector/mcp/client.d.ts +14 -8
  96. package/dist/connector/mcp/client.d.ts.map +1 -1
  97. package/dist/connector/mcp/client.js +160 -44
  98. package/dist/connector/mcp/client.js.map +1 -1
  99. package/dist/connector/mcp/http-sse.d.ts +8 -2
  100. package/dist/connector/mcp/http-sse.d.ts.map +1 -1
  101. package/dist/connector/mcp/http-sse.js +70 -17
  102. package/dist/connector/mcp/http-sse.js.map +1 -1
  103. package/dist/connector/mcp/prompt-adapter.d.ts.map +1 -1
  104. package/dist/connector/mcp/prompt-adapter.js +9 -2
  105. package/dist/connector/mcp/prompt-adapter.js.map +1 -1
  106. package/dist/connector/mcp/stdio.d.ts +2 -2
  107. package/dist/connector/mcp/stdio.d.ts.map +1 -1
  108. package/dist/connector/mcp/stdio.js +14 -50
  109. package/dist/connector/mcp/stdio.js.map +1 -1
  110. package/dist/connector/mcp/streamable-http.d.ts +7 -2
  111. package/dist/connector/mcp/streamable-http.d.ts.map +1 -1
  112. package/dist/connector/mcp/streamable-http.js +66 -18
  113. package/dist/connector/mcp/streamable-http.js.map +1 -1
  114. package/dist/connector/tools/adapter.d.ts +2 -2
  115. package/dist/connector/tools/adapter.d.ts.map +1 -1
  116. package/dist/connector/tools/adapter.js +23 -14
  117. package/dist/connector/tools/adapter.js.map +1 -1
  118. package/dist/connector/tools/definitions.d.ts.map +1 -1
  119. package/dist/connector/tools/definitions.js +5 -2
  120. package/dist/connector/tools/definitions.js.map +1 -1
  121. package/dist/connector/tools/result.d.ts +4 -0
  122. package/dist/connector/tools/result.d.ts.map +1 -0
  123. package/dist/connector/tools/result.js +20 -0
  124. package/dist/connector/tools/result.js.map +1 -0
  125. package/dist/connector/web/guarded-fetch.d.ts +4 -2
  126. package/dist/connector/web/guarded-fetch.d.ts.map +1 -1
  127. package/dist/connector/web/guarded-fetch.js +157 -43
  128. package/dist/connector/web/guarded-fetch.js.map +1 -1
  129. package/dist/constants/sandbox/index.d.ts +3 -2
  130. package/dist/constants/sandbox/index.d.ts.map +1 -1
  131. package/dist/constants/sandbox/index.js +3 -2
  132. package/dist/constants/sandbox/index.js.map +1 -1
  133. package/dist/contracts/api.d.ts +2 -0
  134. package/dist/contracts/api.d.ts.map +1 -1
  135. package/dist/contracts/schemas.d.ts +38 -12
  136. package/dist/contracts/schemas.d.ts.map +1 -1
  137. package/dist/contracts/schemas.js +7 -0
  138. package/dist/contracts/schemas.js.map +1 -1
  139. package/dist/directory/derive-supervisor.d.ts.map +1 -1
  140. package/dist/directory/derive-supervisor.js +8 -0
  141. package/dist/directory/derive-supervisor.js.map +1 -1
  142. package/dist/directory/derive.d.ts.map +1 -1
  143. package/dist/directory/derive.js +8 -0
  144. package/dist/directory/derive.js.map +1 -1
  145. package/dist/directory/load.d.ts.map +1 -1
  146. package/dist/directory/load.js +2 -0
  147. package/dist/directory/load.js.map +1 -1
  148. package/dist/directory/types.d.ts +4 -0
  149. package/dist/directory/types.d.ts.map +1 -1
  150. package/dist/eval/experiment.d.ts +10 -10
  151. package/dist/eval/experiment.d.ts.map +1 -1
  152. package/dist/eval/experiment.js +121 -91
  153. package/dist/eval/experiment.js.map +1 -1
  154. package/dist/eval/judge.d.ts +6 -0
  155. package/dist/eval/judge.d.ts.map +1 -1
  156. package/dist/eval/judge.js +7 -2
  157. package/dist/eval/judge.js.map +1 -1
  158. package/dist/eval/types.d.ts +7 -1
  159. package/dist/eval/types.d.ts.map +1 -1
  160. package/dist/manager/agent/lifecycle.d.ts +12 -10
  161. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  162. package/dist/manager/agent/lifecycle.js +16 -3
  163. package/dist/manager/agent/lifecycle.js.map +1 -1
  164. package/dist/manager/connector/environment.d.ts +2 -2
  165. package/dist/manager/connector/environment.d.ts.map +1 -1
  166. package/dist/manager/connector/environment.js +2 -2
  167. package/dist/manager/connector/environment.js.map +1 -1
  168. package/dist/manager/connector/lifecycle.d.ts +10 -2
  169. package/dist/manager/connector/lifecycle.d.ts.map +1 -1
  170. package/dist/manager/connector/lifecycle.js +273 -24
  171. package/dist/manager/connector/lifecycle.js.map +1 -1
  172. package/dist/manager/connector/tenant.d.ts +5 -4
  173. package/dist/manager/connector/tenant.d.ts.map +1 -1
  174. package/dist/manager/connector/tenant.js +47 -22
  175. package/dist/manager/connector/tenant.js.map +1 -1
  176. package/dist/manager/goal/activation.d.ts +23 -0
  177. package/dist/manager/goal/activation.d.ts.map +1 -0
  178. package/dist/manager/goal/activation.js +41 -0
  179. package/dist/manager/goal/activation.js.map +1 -0
  180. package/dist/manager/index.d.ts +3 -2
  181. package/dist/manager/index.d.ts.map +1 -1
  182. package/dist/manager/index.js.map +1 -1
  183. package/dist/manager/run/persistence.d.ts +2 -0
  184. package/dist/manager/run/persistence.d.ts.map +1 -1
  185. package/dist/manager/run/persistence.js +5 -1
  186. package/dist/manager/run/persistence.js.map +1 -1
  187. package/dist/manager/topic/dependency.d.ts +24 -0
  188. package/dist/manager/topic/dependency.d.ts.map +1 -0
  189. package/dist/manager/topic/dependency.js +13 -0
  190. package/dist/manager/topic/dependency.js.map +1 -0
  191. package/dist/manager/topic/lifecycle.d.ts +9 -21
  192. package/dist/manager/topic/lifecycle.d.ts.map +1 -1
  193. package/dist/manager/topic/lifecycle.js +17 -29
  194. package/dist/manager/topic/lifecycle.js.map +1 -1
  195. package/dist/plugin/index.d.ts +1 -0
  196. package/dist/plugin/index.d.ts.map +1 -1
  197. package/dist/plugin/index.js.map +1 -1
  198. package/dist/plugin/lifecycle.d.ts +15 -0
  199. package/dist/plugin/lifecycle.d.ts.map +1 -1
  200. package/dist/plugin/lifecycle.js +144 -38
  201. package/dist/plugin/lifecycle.js.map +1 -1
  202. package/dist/plugin/loader.d.ts +3 -3
  203. package/dist/plugin/loader.d.ts.map +1 -1
  204. package/dist/plugin/loader.js +58 -12
  205. package/dist/plugin/loader.js.map +1 -1
  206. package/dist/provider/collect-chat-completion.d.ts.map +1 -1
  207. package/dist/provider/collect-chat-completion.js +4 -0
  208. package/dist/provider/collect-chat-completion.js.map +1 -1
  209. package/dist/provider/fallback.d.ts +3 -1
  210. package/dist/provider/fallback.d.ts.map +1 -1
  211. package/dist/provider/fallback.js +62 -10
  212. package/dist/provider/fallback.js.map +1 -1
  213. package/dist/provider/idle-timeout.d.ts +4 -0
  214. package/dist/provider/idle-timeout.d.ts.map +1 -1
  215. package/dist/provider/idle-timeout.js +131 -15
  216. package/dist/provider/idle-timeout.js.map +1 -1
  217. package/dist/provider/index.d.ts +2 -0
  218. package/dist/provider/index.d.ts.map +1 -1
  219. package/dist/provider/index.js +1 -0
  220. package/dist/provider/index.js.map +1 -1
  221. package/dist/provider/instrumentation.d.ts.map +1 -1
  222. package/dist/provider/instrumentation.js +1 -0
  223. package/dist/provider/instrumentation.js.map +1 -1
  224. package/dist/provider/retry.d.ts.map +1 -1
  225. package/dist/provider/retry.js +13 -1
  226. package/dist/provider/retry.js.map +1 -1
  227. package/dist/public-runtime.d.ts +57 -24
  228. package/dist/public-runtime.d.ts.map +1 -1
  229. package/dist/public-runtime.js +42 -35
  230. package/dist/public-runtime.js.map +1 -1
  231. package/dist/public-tools.d.ts +1 -0
  232. package/dist/public-tools.d.ts.map +1 -1
  233. package/dist/public-tools.js +5 -0
  234. package/dist/public-tools.js.map +1 -1
  235. package/dist/public-types.d.ts +33 -12
  236. package/dist/public-types.d.ts.map +1 -1
  237. package/dist/rag/embedding.d.ts +8 -3
  238. package/dist/rag/embedding.d.ts.map +1 -1
  239. package/dist/rag/embedding.js +120 -9
  240. package/dist/rag/embedding.js.map +1 -1
  241. package/dist/rag/index.d.ts +1 -1
  242. package/dist/rag/index.d.ts.map +1 -1
  243. package/dist/rag/index.js +1 -1
  244. package/dist/rag/index.js.map +1 -1
  245. package/dist/rag/ingestion.d.ts +2 -2
  246. package/dist/rag/ingestion.d.ts.map +1 -1
  247. package/dist/rag/ingestion.js +15 -3
  248. package/dist/rag/ingestion.js.map +1 -1
  249. package/dist/rag/knowledge-base.d.ts +3 -3
  250. package/dist/rag/knowledge-base.d.ts.map +1 -1
  251. package/dist/rag/knowledge-base.js +8 -4
  252. package/dist/rag/knowledge-base.js.map +1 -1
  253. package/dist/rag/operation.d.ts +10 -0
  254. package/dist/rag/operation.d.ts.map +1 -0
  255. package/dist/rag/operation.js +26 -0
  256. package/dist/rag/operation.js.map +1 -0
  257. package/dist/rag/rag-tool.d.ts.map +1 -1
  258. package/dist/rag/rag-tool.js +6 -3
  259. package/dist/rag/rag-tool.js.map +1 -1
  260. package/dist/rag/retriever.d.ts +2 -2
  261. package/dist/rag/retriever.d.ts.map +1 -1
  262. package/dist/rag/retriever.js +31 -15
  263. package/dist/rag/retriever.js.map +1 -1
  264. package/dist/rag/vector-store.d.ts +3 -3
  265. package/dist/rag/vector-store.d.ts.map +1 -1
  266. package/dist/rag/vector-store.js +4 -2
  267. package/dist/rag/vector-store.js.map +1 -1
  268. package/dist/registry/command/kernel-commands.d.ts +16 -4
  269. package/dist/registry/command/kernel-commands.d.ts.map +1 -1
  270. package/dist/registry/command/kernel-commands.js +171 -0
  271. package/dist/registry/command/kernel-commands.js.map +1 -1
  272. package/dist/run/reporter.d.ts.map +1 -1
  273. package/dist/run/reporter.js +9 -0
  274. package/dist/run/reporter.js.map +1 -1
  275. package/dist/run-query/index.d.ts +15 -1
  276. package/dist/run-query/index.d.ts.map +1 -1
  277. package/dist/run-query/index.js +69 -15
  278. package/dist/run-query/index.js.map +1 -1
  279. package/dist/runtime/query/context.d.ts.map +1 -1
  280. package/dist/runtime/query/context.js +10 -3
  281. package/dist/runtime/query/context.js.map +1 -1
  282. package/dist/runtime/query/executor.d.ts +3 -0
  283. package/dist/runtime/query/executor.d.ts.map +1 -1
  284. package/dist/runtime/query/executor.js +80 -18
  285. package/dist/runtime/query/executor.js.map +1 -1
  286. package/dist/runtime/query/guard.d.ts +9 -0
  287. package/dist/runtime/query/guard.d.ts.map +1 -1
  288. package/dist/runtime/query/guard.js +11 -0
  289. package/dist/runtime/query/guard.js.map +1 -1
  290. package/dist/runtime/query/index.d.ts +30 -1
  291. package/dist/runtime/query/index.d.ts.map +1 -1
  292. package/dist/runtime/query/index.js +548 -95
  293. package/dist/runtime/query/index.js.map +1 -1
  294. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  295. package/dist/runtime/query/iteration/index.js +74 -14
  296. package/dist/runtime/query/iteration/index.js.map +1 -1
  297. package/dist/runtime/query/iteration/phases/compaction.d.ts.map +1 -1
  298. package/dist/runtime/query/iteration/phases/compaction.js +94 -53
  299. package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
  300. package/dist/runtime/query/iteration/phases/context.d.ts +3 -0
  301. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  302. package/dist/runtime/query/iteration/phases/context.js.map +1 -1
  303. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  304. package/dist/runtime/query/iteration/phases/tool-review.js +21 -0
  305. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  306. package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
  307. package/dist/runtime/query/iteration/stream-turn.js +4 -0
  308. package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
  309. package/dist/runtime/query/project-instructions.d.ts +69 -0
  310. package/dist/runtime/query/project-instructions.d.ts.map +1 -0
  311. package/dist/runtime/query/project-instructions.js +137 -0
  312. package/dist/runtime/query/project-instructions.js.map +1 -0
  313. package/dist/runtime/query/request-rich-content.d.ts +22 -0
  314. package/dist/runtime/query/request-rich-content.d.ts.map +1 -0
  315. package/dist/runtime/query/request-rich-content.js +122 -0
  316. package/dist/runtime/query/request-rich-content.js.map +1 -0
  317. package/dist/runtime/query/result.d.ts.map +1 -1
  318. package/dist/runtime/query/result.js +12 -1
  319. package/dist/runtime/query/result.js.map +1 -1
  320. package/dist/runtime/query/resume-pending.d.ts.map +1 -1
  321. package/dist/runtime/query/resume-pending.js +19 -20
  322. package/dist/runtime/query/resume-pending.js.map +1 -1
  323. package/dist/runtime/query/resume-run.d.ts.map +1 -1
  324. package/dist/runtime/query/resume-run.js +54 -8
  325. package/dist/runtime/query/resume-run.js.map +1 -1
  326. package/dist/runtime/query/run-state.d.ts +5 -0
  327. package/dist/runtime/query/run-state.d.ts.map +1 -1
  328. package/dist/runtime/query/run-state.js +6 -1
  329. package/dist/runtime/query/run-state.js.map +1 -1
  330. package/dist/runtime/query/sandbox-lifecycle.d.ts +54 -0
  331. package/dist/runtime/query/sandbox-lifecycle.d.ts.map +1 -0
  332. package/dist/runtime/query/sandbox-lifecycle.js +167 -0
  333. package/dist/runtime/query/sandbox-lifecycle.js.map +1 -0
  334. package/dist/sandbox/isolation.d.ts.map +1 -1
  335. package/dist/sandbox/isolation.js +9 -0
  336. package/dist/sandbox/isolation.js.map +1 -1
  337. package/dist/sandbox/provider/local.d.ts +56 -6
  338. package/dist/sandbox/provider/local.d.ts.map +1 -1
  339. package/dist/sandbox/provider/local.js +181 -76
  340. package/dist/sandbox/provider/local.js.map +1 -1
  341. package/dist/sandbox/terminal.d.ts +13 -5
  342. package/dist/sandbox/terminal.d.ts.map +1 -1
  343. package/dist/sandbox/terminal.js +11 -3
  344. package/dist/sandbox/terminal.js.map +1 -1
  345. package/dist/session/errors.d.ts +28 -29
  346. package/dist/session/errors.d.ts.map +1 -1
  347. package/dist/session/errors.js +28 -29
  348. package/dist/session/errors.js.map +1 -1
  349. package/dist/session/handoff/broadcast.d.ts +5 -8
  350. package/dist/session/handoff/broadcast.d.ts.map +1 -1
  351. package/dist/session/handoff/broadcast.js +16 -6
  352. package/dist/session/handoff/broadcast.js.map +1 -1
  353. package/dist/session/handoff/single.d.ts +5 -8
  354. package/dist/session/handoff/single.d.ts.map +1 -1
  355. package/dist/session/handoff/single.js +7 -4
  356. package/dist/session/handoff/single.js.map +1 -1
  357. package/dist/store/attachment/index.d.ts +11 -3
  358. package/dist/store/attachment/index.d.ts.map +1 -1
  359. package/dist/store/attachment/index.js +49 -4
  360. package/dist/store/attachment/index.js.map +1 -1
  361. package/dist/store/feedback/conformance.d.ts.map +1 -1
  362. package/dist/store/feedback/conformance.js +32 -0
  363. package/dist/store/feedback/conformance.js.map +1 -1
  364. package/dist/store/feedback/disk.d.ts +8 -6
  365. package/dist/store/feedback/disk.d.ts.map +1 -1
  366. package/dist/store/feedback/disk.js +111 -76
  367. package/dist/store/feedback/disk.js.map +1 -1
  368. package/dist/store/goal/index.d.ts +111 -0
  369. package/dist/store/goal/index.d.ts.map +1 -0
  370. package/dist/store/goal/index.js +436 -0
  371. package/dist/store/goal/index.js.map +1 -0
  372. package/dist/store/index.d.ts +1 -1
  373. package/dist/store/index.d.ts.map +1 -1
  374. package/dist/store/index.js +1 -1
  375. package/dist/store/index.js.map +1 -1
  376. package/dist/store/kv/revision-record-store.d.ts +70 -0
  377. package/dist/store/kv/revision-record-store.d.ts.map +1 -0
  378. package/dist/store/kv/revision-record-store.js +290 -0
  379. package/dist/store/kv/revision-record-store.js.map +1 -0
  380. package/dist/store/memory/disk.d.ts +9 -7
  381. package/dist/store/memory/disk.d.ts.map +1 -1
  382. package/dist/store/memory/disk.js +256 -98
  383. package/dist/store/memory/disk.js.map +1 -1
  384. package/dist/store/run/disk.d.ts +10 -2
  385. package/dist/store/run/disk.d.ts.map +1 -1
  386. package/dist/store/run/disk.js +70 -4
  387. package/dist/store/run/disk.js.map +1 -1
  388. package/dist/store/run/memory.d.ts +4 -2
  389. package/dist/store/run/memory.d.ts.map +1 -1
  390. package/dist/store/run/memory.js +15 -1
  391. package/dist/store/run/memory.js.map +1 -1
  392. package/dist/store/session/disk.d.ts +9 -0
  393. package/dist/store/session/disk.d.ts.map +1 -1
  394. package/dist/store/session/disk.js +57 -5
  395. package/dist/store/session/disk.js.map +1 -1
  396. package/dist/store/session/memory.d.ts +1 -0
  397. package/dist/store/session/memory.d.ts.map +1 -1
  398. package/dist/store/session/memory.js +14 -0
  399. package/dist/store/session/memory.js.map +1 -1
  400. package/dist/store/topic/memory.d.ts +1 -2
  401. package/dist/store/topic/memory.d.ts.map +1 -1
  402. package/dist/store/topic/memory.js +4 -5
  403. package/dist/store/topic/memory.js.map +1 -1
  404. package/dist/store/topic/objective.d.ts +8 -4
  405. package/dist/store/topic/objective.d.ts.map +1 -1
  406. package/dist/store/topic/objective.js +185 -100
  407. package/dist/store/topic/objective.js.map +1 -1
  408. package/dist/store/topic/state.d.ts +1 -2
  409. package/dist/store/topic/state.d.ts.map +1 -1
  410. package/dist/store/topic/state.js +50 -62
  411. package/dist/store/topic/state.js.map +1 -1
  412. package/dist/tools/builtins/bash.d.ts.map +1 -1
  413. package/dist/tools/builtins/bash.js +20 -0
  414. package/dist/tools/builtins/bash.js.map +1 -1
  415. package/dist/tools/builtins/computer-use.d.ts +9 -1
  416. package/dist/tools/builtins/computer-use.d.ts.map +1 -1
  417. package/dist/tools/builtins/computer-use.js.map +1 -1
  418. package/dist/tools/builtins/content-fingerprint.d.ts +8 -7
  419. package/dist/tools/builtins/content-fingerprint.d.ts.map +1 -1
  420. package/dist/tools/builtins/content-fingerprint.js +9 -10
  421. package/dist/tools/builtins/content-fingerprint.js.map +1 -1
  422. package/dist/tools/builtins/edit.d.ts +6 -1
  423. package/dist/tools/builtins/edit.d.ts.map +1 -1
  424. package/dist/tools/builtins/edit.js +166 -27
  425. package/dist/tools/builtins/edit.js.map +1 -1
  426. package/dist/tools/builtins/write-file.d.ts.map +1 -1
  427. package/dist/tools/builtins/write-file.js +45 -19
  428. package/dist/tools/builtins/write-file.js.map +1 -1
  429. package/dist/tools/command-arguments.d.ts +43 -0
  430. package/dist/tools/command-arguments.d.ts.map +1 -0
  431. package/dist/tools/command-arguments.js +52 -0
  432. package/dist/tools/command-arguments.js.map +1 -0
  433. package/dist/tools/coordinator/index.d.ts +2 -0
  434. package/dist/tools/coordinator/index.d.ts.map +1 -1
  435. package/dist/tools/coordinator/index.js +3 -1
  436. package/dist/tools/coordinator/index.js.map +1 -1
  437. package/dist/tools/defineTool.d.ts +10 -0
  438. package/dist/tools/defineTool.d.ts.map +1 -1
  439. package/dist/tools/defineTool.js +1 -0
  440. package/dist/tools/defineTool.js.map +1 -1
  441. package/dist/tools/env-scrub.d.ts +7 -5
  442. package/dist/tools/env-scrub.d.ts.map +1 -1
  443. package/dist/tools/env-scrub.js +7 -5
  444. package/dist/tools/env-scrub.js.map +1 -1
  445. package/dist/tools/goal/index.d.ts +20 -0
  446. package/dist/tools/goal/index.d.ts.map +1 -0
  447. package/dist/tools/goal/index.js +104 -0
  448. package/dist/tools/goal/index.js.map +1 -0
  449. package/dist/tools/memory/index.d.ts +16 -0
  450. package/dist/tools/memory/index.d.ts.map +1 -1
  451. package/dist/tools/memory/index.js +6 -2
  452. package/dist/tools/memory/index.js.map +1 -1
  453. package/dist/tools/memory/search.d.ts +4 -1
  454. package/dist/tools/memory/search.d.ts.map +1 -1
  455. package/dist/tools/memory/search.js +10 -2
  456. package/dist/tools/memory/search.js.map +1 -1
  457. package/dist/types/agent/base.d.ts +11 -3
  458. package/dist/types/agent/base.d.ts.map +1 -1
  459. package/dist/types/agent/factory.d.ts +2 -0
  460. package/dist/types/agent/factory.d.ts.map +1 -1
  461. package/dist/types/agent/reactive.d.ts +2 -0
  462. package/dist/types/agent/reactive.d.ts.map +1 -1
  463. package/dist/types/agent/supervisor.d.ts +6 -0
  464. package/dist/types/agent/supervisor.d.ts.map +1 -1
  465. package/dist/types/agent/task.d.ts +6 -2
  466. package/dist/types/agent/task.d.ts.map +1 -1
  467. package/dist/types/connector/core.d.ts +13 -8
  468. package/dist/types/connector/core.d.ts.map +1 -1
  469. package/dist/types/connector/definition.d.ts +37 -18
  470. package/dist/types/connector/definition.d.ts.map +1 -1
  471. package/dist/types/connector/http.d.ts +6 -0
  472. package/dist/types/connector/http.d.ts.map +1 -1
  473. package/dist/types/connector/mcp.d.ts +24 -6
  474. package/dist/types/connector/mcp.d.ts.map +1 -1
  475. package/dist/types/connector/tenant.d.ts +17 -7
  476. package/dist/types/connector/tenant.d.ts.map +1 -1
  477. package/dist/types/connector/webhook.d.ts +6 -0
  478. package/dist/types/connector/webhook.d.ts.map +1 -1
  479. package/dist/types/goal/index.d.ts +46 -0
  480. package/dist/types/goal/index.d.ts.map +1 -0
  481. package/dist/types/goal/index.js +2 -0
  482. package/dist/types/goal/index.js.map +1 -0
  483. package/dist/types/ids/index.d.ts +2 -0
  484. package/dist/types/ids/index.d.ts.map +1 -1
  485. package/dist/types/ids/index.js.map +1 -1
  486. package/dist/types/message/index.d.ts +75 -10
  487. package/dist/types/message/index.d.ts.map +1 -1
  488. package/dist/types/message/index.js +49 -3
  489. package/dist/types/message/index.js.map +1 -1
  490. package/dist/types/plugin/index.d.ts +7 -5
  491. package/dist/types/plugin/index.d.ts.map +1 -1
  492. package/dist/types/plugin/index.js.map +1 -1
  493. package/dist/types/provider/chat.d.ts +27 -4
  494. package/dist/types/provider/chat.d.ts.map +1 -1
  495. package/dist/types/provider/interface.d.ts +18 -7
  496. package/dist/types/provider/interface.d.ts.map +1 -1
  497. package/dist/types/provider/stream.d.ts +6 -0
  498. package/dist/types/provider/stream.d.ts.map +1 -1
  499. package/dist/types/rag/embedding.d.ts +15 -2
  500. package/dist/types/rag/embedding.d.ts.map +1 -1
  501. package/dist/types/rag/ingestion.d.ts +2 -2
  502. package/dist/types/rag/ingestion.d.ts.map +1 -1
  503. package/dist/types/rag/knowledge-base.d.ts +3 -3
  504. package/dist/types/rag/knowledge-base.d.ts.map +1 -1
  505. package/dist/types/rag/retrieval.d.ts +2 -2
  506. package/dist/types/rag/retrieval.d.ts.map +1 -1
  507. package/dist/types/rag/scope.d.ts +4 -0
  508. package/dist/types/rag/scope.d.ts.map +1 -1
  509. package/dist/types/rag/vector.d.ts +5 -2
  510. package/dist/types/rag/vector.d.ts.map +1 -1
  511. package/dist/types/run/config.d.ts +20 -0
  512. package/dist/types/run/config.d.ts.map +1 -1
  513. package/dist/types/run/events.d.ts +25 -1
  514. package/dist/types/run/events.d.ts.map +1 -1
  515. package/dist/types/run/events.js.map +1 -1
  516. package/dist/types/run/metadata.d.ts +2 -0
  517. package/dist/types/run/metadata.d.ts.map +1 -1
  518. package/dist/types/run/step.d.ts +2 -6
  519. package/dist/types/run/step.d.ts.map +1 -1
  520. package/dist/types/run/step.js.map +1 -1
  521. package/dist/types/run/store.d.ts +55 -2
  522. package/dist/types/run/store.d.ts.map +1 -1
  523. package/dist/types/sandbox/index.d.ts +47 -6
  524. package/dist/types/sandbox/index.d.ts.map +1 -1
  525. package/dist/types/sandbox/index.js +23 -10
  526. package/dist/types/sandbox/index.js.map +1 -1
  527. package/dist/types/session/store.d.ts +13 -0
  528. package/dist/types/session/store.d.ts.map +1 -1
  529. package/dist/types/tool/index.d.ts +33 -11
  530. package/dist/types/tool/index.d.ts.map +1 -1
  531. package/dist/types/tool/index.js.map +1 -1
  532. package/dist/types/topic/entity.d.ts +3 -4
  533. package/dist/types/topic/entity.d.ts.map +1 -1
  534. package/dist/types/topic/store.d.ts +3 -3
  535. package/dist/utils/id.d.ts +3 -1
  536. package/dist/utils/id.d.ts.map +1 -1
  537. package/dist/utils/id.js +4 -0
  538. package/dist/utils/id.js.map +1 -1
  539. package/dist/utils/process-environment.d.ts +26 -0
  540. package/dist/utils/process-environment.d.ts.map +1 -0
  541. package/dist/utils/process-environment.js +78 -0
  542. package/dist/utils/process-environment.js.map +1 -0
  543. package/dist/vault/InMemoryCredentialVault.d.ts +2 -0
  544. package/dist/vault/InMemoryCredentialVault.d.ts.map +1 -1
  545. package/dist/vault/InMemoryCredentialVault.js +24 -4
  546. package/dist/vault/InMemoryCredentialVault.js.map +1 -1
  547. package/dist/vault/instrumentation.d.ts.map +1 -1
  548. package/dist/vault/instrumentation.js +15 -0
  549. package/dist/vault/instrumentation.js.map +1 -1
  550. package/package.json +1 -1
  551. package/src/advisory/executor.ts +4 -1
  552. package/src/agents/ReactiveAgent.ts +12 -0
  553. package/src/agents/RouterAgent.ts +25 -3
  554. package/src/agents/SupervisorAgent.ts +33 -11
  555. package/src/agents/runAgent.ts +38 -2
  556. package/src/authorization/command-line.ts +390 -0
  557. package/src/authorization/rules.ts +22 -1
  558. package/src/bridge/a2a/client.ts +384 -97
  559. package/src/bridge/a2a/mapper.ts +5 -0
  560. package/src/bridge/acp/server.ts +184 -42
  561. package/src/bridge/mcp/connector/adapter.ts +28 -20
  562. package/src/bridge/sse/mapper.ts +3 -0
  563. package/src/compaction/dangling.ts +203 -38
  564. package/src/compaction/index.ts +9 -2
  565. package/src/compaction/manual.ts +125 -18
  566. package/src/compaction/plan.ts +42 -11
  567. package/src/compaction/retention.ts +23 -8
  568. package/src/compaction/summary.ts +4 -4
  569. package/src/compaction/verifier.ts +66 -0
  570. package/src/connector/BaseConnector.ts +19 -4
  571. package/src/connector/builtins/http.ts +236 -46
  572. package/src/connector/builtins/webhook.ts +207 -47
  573. package/src/connector/execution-contract.ts +27 -0
  574. package/src/connector/http-operation.ts +238 -0
  575. package/src/connector/mcp/adapter.ts +8 -3
  576. package/src/connector/mcp/client.ts +207 -58
  577. package/src/connector/mcp/http-sse.ts +91 -23
  578. package/src/connector/mcp/prompt-adapter.ts +8 -2
  579. package/src/connector/mcp/stdio.ts +21 -46
  580. package/src/connector/mcp/streamable-http.ts +86 -22
  581. package/src/connector/tools/adapter.ts +23 -14
  582. package/src/connector/tools/definitions.ts +5 -2
  583. package/src/connector/tools/result.ts +21 -0
  584. package/src/connector/web/guarded-fetch.ts +188 -48
  585. package/src/constants/sandbox/index.ts +3 -2
  586. package/src/contracts/api.ts +2 -0
  587. package/src/contracts/schemas.ts +7 -0
  588. package/src/directory/derive-supervisor.ts +8 -0
  589. package/src/directory/derive.ts +8 -0
  590. package/src/directory/load.ts +2 -0
  591. package/src/directory/types.ts +4 -0
  592. package/src/eval/experiment.ts +160 -111
  593. package/src/eval/judge.ts +13 -2
  594. package/src/eval/types.ts +7 -1
  595. package/src/manager/agent/lifecycle.ts +28 -12
  596. package/src/manager/connector/environment.ts +3 -1
  597. package/src/manager/connector/lifecycle.ts +364 -24
  598. package/src/manager/connector/tenant.ts +56 -23
  599. package/src/manager/goal/activation.ts +52 -0
  600. package/src/manager/index.ts +10 -2
  601. package/src/manager/run/persistence.ts +6 -1
  602. package/src/manager/topic/dependency.ts +39 -0
  603. package/src/manager/topic/lifecycle.ts +19 -31
  604. package/src/plugin/index.ts +1 -0
  605. package/src/plugin/lifecycle.ts +180 -39
  606. package/src/plugin/loader.ts +70 -13
  607. package/src/provider/collect-chat-completion.ts +3 -0
  608. package/src/provider/fallback.ts +79 -11
  609. package/src/provider/idle-timeout.ts +143 -17
  610. package/src/provider/index.ts +2 -0
  611. package/src/provider/instrumentation.ts +1 -0
  612. package/src/provider/retry.ts +16 -1
  613. package/src/public-runtime.ts +190 -32
  614. package/src/public-tools.ts +5 -0
  615. package/src/public-types.ts +85 -11
  616. package/src/rag/embedding.ts +147 -19
  617. package/src/rag/index.ts +1 -1
  618. package/src/rag/ingestion.ts +16 -2
  619. package/src/rag/knowledge-base.ts +13 -4
  620. package/src/rag/operation.ts +28 -0
  621. package/src/rag/rag-tool.ts +6 -3
  622. package/src/rag/retriever.ts +62 -11
  623. package/src/rag/vector-store.ts +8 -2
  624. package/src/registry/command/kernel-commands.ts +223 -4
  625. package/src/run/reporter.ts +10 -0
  626. package/src/run-query/index.ts +84 -15
  627. package/src/runtime/query/context.ts +13 -3
  628. package/src/runtime/query/executor.ts +90 -17
  629. package/src/runtime/query/guard.ts +12 -0
  630. package/src/runtime/query/index.ts +652 -103
  631. package/src/runtime/query/iteration/index.ts +89 -13
  632. package/src/runtime/query/iteration/phases/compaction.ts +120 -55
  633. package/src/runtime/query/iteration/phases/context.ts +4 -0
  634. package/src/runtime/query/iteration/phases/tool-review.ts +28 -0
  635. package/src/runtime/query/iteration/stream-turn.ts +3 -0
  636. package/src/runtime/query/project-instructions.ts +212 -0
  637. package/src/runtime/query/request-rich-content.ts +153 -0
  638. package/src/runtime/query/result.ts +12 -1
  639. package/src/runtime/query/resume-pending.ts +20 -18
  640. package/src/runtime/query/resume-run.ts +52 -8
  641. package/src/runtime/query/run-state.ts +11 -1
  642. package/src/runtime/query/sandbox-lifecycle.ts +210 -0
  643. package/src/sandbox/isolation.ts +9 -0
  644. package/src/sandbox/provider/local.ts +255 -90
  645. package/src/sandbox/terminal.ts +13 -5
  646. package/src/session/errors.ts +68 -42
  647. package/src/session/handoff/broadcast.ts +20 -14
  648. package/src/session/handoff/single.ts +14 -13
  649. package/src/store/attachment/index.ts +65 -3
  650. package/src/store/feedback/conformance.ts +39 -0
  651. package/src/store/feedback/disk.ts +128 -82
  652. package/src/store/goal/index.ts +594 -0
  653. package/src/store/index.ts +1 -1
  654. package/src/store/kv/revision-record-store.ts +346 -0
  655. package/src/store/memory/disk.ts +288 -113
  656. package/src/store/run/disk.ts +96 -5
  657. package/src/store/run/memory.ts +22 -2
  658. package/src/store/session/disk.ts +93 -6
  659. package/src/store/session/memory.ts +22 -0
  660. package/src/store/topic/memory.ts +4 -5
  661. package/src/store/topic/objective.ts +215 -100
  662. package/src/store/topic/state.ts +100 -63
  663. package/src/tools/builtins/bash.ts +21 -0
  664. package/src/tools/builtins/computer-use.ts +9 -1
  665. package/src/tools/builtins/content-fingerprint.ts +9 -12
  666. package/src/tools/builtins/edit.ts +190 -27
  667. package/src/tools/builtins/write-file.ts +55 -19
  668. package/src/tools/command-arguments.ts +54 -0
  669. package/src/tools/coordinator/index.ts +4 -1
  670. package/src/tools/defineTool.ts +11 -0
  671. package/src/tools/env-scrub.ts +7 -5
  672. package/src/tools/goal/index.ts +129 -0
  673. package/src/tools/memory/index.ts +26 -3
  674. package/src/tools/memory/search.ts +20 -3
  675. package/src/types/agent/base.ts +12 -3
  676. package/src/types/agent/factory.ts +2 -0
  677. package/src/types/agent/reactive.ts +2 -0
  678. package/src/types/agent/supervisor.ts +6 -0
  679. package/src/types/agent/task.ts +6 -2
  680. package/src/types/connector/core.ts +13 -8
  681. package/src/types/connector/definition.ts +54 -20
  682. package/src/types/connector/http.ts +7 -0
  683. package/src/types/connector/mcp.ts +27 -6
  684. package/src/types/connector/tenant.ts +21 -7
  685. package/src/types/connector/webhook.ts +7 -0
  686. package/src/types/goal/index.ts +50 -0
  687. package/src/types/ids/index.ts +2 -0
  688. package/src/types/message/index.ts +143 -9
  689. package/src/types/plugin/index.ts +7 -5
  690. package/src/types/provider/chat.ts +35 -4
  691. package/src/types/provider/interface.ts +22 -7
  692. package/src/types/provider/stream.ts +6 -0
  693. package/src/types/rag/embedding.ts +16 -2
  694. package/src/types/rag/ingestion.ts +2 -1
  695. package/src/types/rag/knowledge-base.ts +7 -3
  696. package/src/types/rag/retrieval.ts +2 -1
  697. package/src/types/rag/scope.ts +5 -0
  698. package/src/types/rag/vector.ts +5 -2
  699. package/src/types/run/config.ts +20 -0
  700. package/src/types/run/events.ts +28 -3
  701. package/src/types/run/metadata.ts +2 -0
  702. package/src/types/run/step.ts +2 -7
  703. package/src/types/run/store.ts +60 -2
  704. package/src/types/sandbox/index.ts +57 -14
  705. package/src/types/session/store.ts +18 -0
  706. package/src/types/tool/index.ts +33 -11
  707. package/src/types/topic/entity.ts +3 -4
  708. package/src/types/topic/store.ts +3 -3
  709. package/src/utils/id.ts +6 -0
  710. package/src/utils/process-environment.ts +101 -0
  711. package/src/vault/InMemoryCredentialVault.ts +29 -4
  712. package/src/vault/instrumentation.ts +24 -0
@@ -1,4 +1,15 @@
1
+ import type { SessionGoalActivation } from '../../manager/goal/activation.js'
2
+ import {
3
+ GoalExistsError,
4
+ GoalNotFoundError,
5
+ GoalSessionNotFoundError,
6
+ GoalTransitionError,
7
+ type SessionGoalStore,
8
+ StaleGoalError,
9
+ } from '../../store/goal/index.js'
1
10
  import type { HostCommandDescriptor } from '../../types/command/index.js'
11
+ import type { GoalRef, SessionGoal } from '../../types/goal/index.js'
12
+ import type { SessionId, TenantId } from '../../types/ids/index.js'
2
13
  import type { Skill } from '../../types/skills/index.js'
3
14
  import { isInvocableBy, skillInvocation } from '../../types/skills/index.js'
4
15
  import type { TaskStore } from '../../types/task/index.js'
@@ -7,10 +18,10 @@ import type { TaskStore } from '../../types/task/index.js'
7
18
  * The commands whose facts the kernel already owns.
8
19
  *
9
20
  * A registry with nothing in it is a declaration, and this repo has a rule
10
- * about those. These two are the ones a host currently has to reach into
11
- * kernel internals to answer: what work is tracked, and who this run may
12
- * delegate to. Both were already computed here and had no way out that did
13
- * not go through a specific host's UI code.
21
+ * about those. These are facts a host would otherwise have to reach into
22
+ * kernel internals to answer: the current Session goal, tracked work,
23
+ * operator-invocable skills, and the agents this run may delegate to. Each is
24
+ * computed or owned here and should not acquire a second host-specific source.
14
25
  *
15
26
  * Deliberately NOT here: anything that would need a decision the kernel
16
27
  * cannot make. `/clear` is about a transcript a host owns, `/login` about
@@ -30,10 +41,218 @@ export interface KernelCommandOptions {
30
41
  * is different from having none registered.
31
42
  */
32
43
  readonly skills?: readonly Skill[]
44
+ /** Exact durable conversation scope behind the direct-human `/goal` command. */
45
+ readonly goal?: GoalCommandScope
46
+ }
47
+
48
+ export interface GoalCommandScope {
49
+ readonly store: SessionGoalStore
50
+ readonly sessionId: SessionId
51
+ readonly tenantId: TenantId
52
+ /** Process-local permission for automatic continuation. */
53
+ readonly activation?: SessionGoalActivation
54
+ }
55
+
56
+ const GOAL_USAGE = 'Usage: /goal [<objective>|clear|edit <objective>|pause|resume]'
57
+
58
+ type ParsedGoalCommand =
59
+ | { readonly kind: 'show' }
60
+ | { readonly kind: 'create'; readonly objective: string }
61
+ | { readonly kind: 'edit'; readonly objective: string }
62
+ | { readonly kind: 'invalid-edit' }
63
+ | { readonly kind: 'pause' }
64
+ | { readonly kind: 'resume' }
65
+ | { readonly kind: 'clear' }
66
+
67
+ function parseGoalCommand(args: readonly string[]): ParsedGoalCommand {
68
+ const input = args.join(' ').trim()
69
+ if (input.length === 0) return { kind: 'show' }
70
+ const control = input.toLowerCase()
71
+ if (control === 'clear') return { kind: 'clear' }
72
+ if (control === 'pause') return { kind: 'pause' }
73
+ if (control === 'resume') return { kind: 'resume' }
74
+ if (control === 'edit') return { kind: 'invalid-edit' }
75
+ if (/^edit(?=\s)/iu.test(input)) return { kind: 'edit', objective: input.slice(4).trim() }
76
+ return { kind: 'create', objective: input }
77
+ }
78
+
79
+ function goalRef(goal: SessionGoal): GoalRef {
80
+ return { id: goal.id, revision: goal.revision }
81
+ }
82
+
83
+ function goalCommands(goal: SessionGoal, armed: boolean): string {
84
+ if (goal.phase === 'active') {
85
+ return `${armed ? '' : '/goal resume, '}/goal edit <objective>, /goal pause, /goal clear`
86
+ }
87
+ if (goal.phase === 'paused' || goal.phase === 'blocked') {
88
+ return '/goal edit <objective>, /goal resume, /goal clear'
89
+ }
90
+ return '/goal <objective>, /goal clear'
91
+ }
92
+
93
+ function renderGoal(title: string, goal: SessionGoal, armed: boolean): string {
94
+ return [
95
+ title,
96
+ `Status: ${goal.phase}`,
97
+ `Automatic continuation: ${armed ? 'armed' : 'disarmed'}`,
98
+ `Rounds admitted: ${goal.roundsAdmitted} / ${goal.maxGoalRounds}`,
99
+ ...(goal.blockedReason
100
+ ? [`Blocker: ${goal.blockedReason.code}: ${goal.blockedReason.message}`]
101
+ : []),
102
+ `Objective: ${goal.objective}`,
103
+ '',
104
+ `Commands: ${goalCommands(goal, armed)}`,
105
+ ].join('\n')
106
+ }
107
+
108
+ function renderScopedGoal(title: string, goal: SessionGoal, scope: GoalCommandScope): string {
109
+ return renderGoal(title, goal, scope.activation?.isArmed(scope.sessionId, goal) ?? false)
110
+ }
111
+
112
+ function missingGoal(action: string) {
113
+ return {
114
+ kind: 'refused' as const,
115
+ reason: `No goal is currently set; /goal ${action} requires one. ${GOAL_USAGE}`,
116
+ }
117
+ }
118
+
119
+ async function runGoalCommand(scope: GoalCommandScope | undefined, args: readonly string[]) {
120
+ if (!scope) {
121
+ return {
122
+ kind: 'refused' as const,
123
+ reason: 'Goals need a durable session. This host did not supply one for the current command.',
124
+ }
125
+ }
126
+ const command = parseGoalCommand(args)
127
+ try {
128
+ const current = await scope.store.getGoal(scope.sessionId, scope.tenantId)
129
+ switch (command.kind) {
130
+ case 'show':
131
+ return current
132
+ ? { kind: 'ack' as const, message: renderScopedGoal('Goal', current, scope) }
133
+ : {
134
+ kind: 'ack' as const,
135
+ message: `No goal is currently set.\n${GOAL_USAGE}`,
136
+ }
137
+ case 'invalid-edit':
138
+ return {
139
+ kind: 'refused' as const,
140
+ reason: `Goal editing requires a replacement objective.\n${GOAL_USAGE}`,
141
+ }
142
+ case 'create': {
143
+ if (current && current.phase !== 'complete') {
144
+ return {
145
+ kind: 'refused' as const,
146
+ reason: `A goal is already ${current.phase}. Use /goal edit <objective> to change it or /goal clear before replacing it.`,
147
+ }
148
+ }
149
+ const created = await scope.store.createGoal(
150
+ { sessionId: scope.sessionId, objective: command.objective },
151
+ scope.tenantId,
152
+ )
153
+ scope.activation?.arm(created)
154
+ return {
155
+ kind: 'ack' as const,
156
+ message: renderScopedGoal('Goal created', created, scope),
157
+ }
158
+ }
159
+ case 'edit': {
160
+ if (!current) return missingGoal('edit')
161
+ if (current.phase === 'complete') {
162
+ const replacement = await scope.store.createGoal(
163
+ { sessionId: scope.sessionId, objective: command.objective },
164
+ scope.tenantId,
165
+ )
166
+ scope.activation?.arm(replacement)
167
+ return {
168
+ kind: 'ack' as const,
169
+ message: renderScopedGoal('Goal created', replacement, scope),
170
+ }
171
+ }
172
+ const wasArmed = scope.activation?.isArmed(scope.sessionId, current) ?? false
173
+ const edited = await scope.store.editGoal(
174
+ scope.sessionId,
175
+ scope.tenantId,
176
+ goalRef(current),
177
+ { objective: command.objective },
178
+ )
179
+ if (wasArmed) scope.activation?.arm(edited)
180
+ return {
181
+ kind: 'ack' as const,
182
+ message: renderScopedGoal('Goal updated', edited, scope),
183
+ }
184
+ }
185
+ case 'pause': {
186
+ if (!current) return missingGoal('pause')
187
+ const paused = await scope.store.pauseGoal(
188
+ scope.sessionId,
189
+ scope.tenantId,
190
+ goalRef(current),
191
+ )
192
+ scope.activation?.disarm(scope.sessionId)
193
+ return {
194
+ kind: 'ack' as const,
195
+ message: renderScopedGoal('Goal paused', paused, scope),
196
+ }
197
+ }
198
+ case 'resume': {
199
+ if (!current) return missingGoal('resume')
200
+ if (current.phase === 'active') {
201
+ scope.activation?.arm(current)
202
+ return {
203
+ kind: 'ack' as const,
204
+ message: renderScopedGoal('Goal armed', current, scope),
205
+ }
206
+ }
207
+ const resumed = await scope.store.resumeGoal(
208
+ scope.sessionId,
209
+ scope.tenantId,
210
+ goalRef(current),
211
+ )
212
+ scope.activation?.arm(resumed)
213
+ return {
214
+ kind: 'ack' as const,
215
+ message: renderScopedGoal('Goal resumed', resumed, scope),
216
+ }
217
+ }
218
+ case 'clear': {
219
+ if (!current) {
220
+ scope.activation?.disarm(scope.sessionId)
221
+ return { kind: 'ack' as const, message: 'No goal to clear.' }
222
+ }
223
+ await scope.store.clearGoal(scope.sessionId, scope.tenantId, goalRef(current))
224
+ scope.activation?.disarm(scope.sessionId)
225
+ return { kind: 'ack' as const, message: 'Goal cleared.' }
226
+ }
227
+ }
228
+ } catch (error) {
229
+ if (
230
+ error instanceof GoalExistsError ||
231
+ error instanceof GoalNotFoundError ||
232
+ error instanceof GoalTransitionError ||
233
+ error instanceof StaleGoalError
234
+ ) {
235
+ return {
236
+ kind: 'refused' as const,
237
+ reason:
238
+ 'The goal command is not valid for the current state. Run /goal to view available commands.',
239
+ }
240
+ }
241
+ if (error instanceof GoalSessionNotFoundError) {
242
+ return { kind: 'refused' as const, reason: error.message }
243
+ }
244
+ throw error
245
+ }
33
246
  }
34
247
 
35
248
  export function kernelHostCommands(options: KernelCommandOptions): HostCommandDescriptor[] {
36
249
  return [
250
+ {
251
+ name: 'goal',
252
+ description: 'Persist or inspect a completion goal for this conversation.',
253
+ hint: '[<objective>|clear|edit <objective>|pause|resume]',
254
+ handler: async ({ args }) => await runGoalCommand(options.goal, args),
255
+ },
37
256
  {
38
257
  name: 'tasks',
39
258
  description: 'List the work this run is tracking.',
@@ -343,6 +343,16 @@ export function createRunReporter(parentLogger?: Logger): RunReporter {
343
343
  })
344
344
  break
345
345
 
346
+ case 'message_history_repaired':
347
+ log.warn('Repaired provider-invalid tool history', {
348
+ [NAMZU.RUN_ID]: event.runId,
349
+ 'namzu.history.source': event.source,
350
+ 'namzu.history.duplicate_tool_results_removed': event.duplicateToolResultsRemoved,
351
+ 'namzu.history.orphaned_tool_results_removed': event.orphanedToolResultsRemoved,
352
+ 'namzu.history.synthetic_tool_results_inserted': event.syntheticToolResultsInserted,
353
+ })
354
+ break
355
+
346
356
  case 'tool_progress':
347
357
  // Debug, not info: a long tool can emit many of these and they
348
358
  // are a live-view signal, not a run milestone.
@@ -27,6 +27,38 @@ export interface RunQueryOptions {
27
27
  readonly now?: () => number
28
28
  }
29
29
 
30
+ export type RunTranscriptUnavailableReason =
31
+ | 'message-snapshot-not-persisted'
32
+ | 'message-snapshot-unverified'
33
+ | 'message-snapshot-out-of-sync'
34
+
35
+ /**
36
+ * Refusal to call a partial or unverifiable reconstruction "complete".
37
+ */
38
+ export class RunTranscriptUnavailableError extends Error {
39
+ readonly reason: RunTranscriptUnavailableReason
40
+ readonly eventHeadSeq: number | undefined
41
+ readonly snapshotThroughEventSeq: number | undefined
42
+
43
+ constructor(input: {
44
+ reason: RunTranscriptUnavailableReason
45
+ eventHeadSeq?: number
46
+ snapshotThroughEventSeq?: number
47
+ }) {
48
+ const detail =
49
+ input.reason === 'message-snapshot-not-persisted'
50
+ ? 'the surviving message snapshot was never persisted or its publication was interrupted'
51
+ : input.reason === 'message-snapshot-unverified'
52
+ ? 'the surviving messages use the legacy format and carry no event-log boundary'
53
+ : `the surviving message snapshot ends at event ${input.snapshotThroughEventSeq ?? 'unknown'}, but the durable log ends at event ${input.eventHeadSeq ?? 'unknown'}`
54
+ super(`Complete run transcript unavailable: ${detail}.`)
55
+ this.name = 'RunTranscriptUnavailableError'
56
+ this.reason = input.reason
57
+ this.eventHeadSeq = input.eventHeadSeq
58
+ this.snapshotThroughEventSeq = input.snapshotThroughEventSeq
59
+ }
60
+ }
61
+
30
62
  /** What one compaction pass removed. */
31
63
  export interface ShedPass {
32
64
  readonly iteration: number
@@ -53,17 +85,7 @@ export class RunQuery {
53
85
  * was reading during an incident.
54
86
  */
55
87
  async shedHistory(): Promise<readonly ShedPass[]> {
56
- const passes: ShedPass[] = []
57
- for (const event of await this.events()) {
58
- if (event.type !== 'compaction_shed') continue
59
- passes.push({
60
- iteration: event.iteration,
61
- reason: event.reason,
62
- messages: event.messages,
63
- seq: event.seq,
64
- })
65
- }
66
- return passes
88
+ return shedPassesFrom(await this.events())
67
89
  }
68
90
 
69
91
  /**
@@ -80,10 +102,43 @@ export class RunQuery {
80
102
  * the conversation is missing from this list, which is the question
81
103
  * somebody reconstructing an incident is actually asking.
82
104
  */
83
- async fullTranscript(messages: readonly Message[]): Promise<readonly Message[]> {
84
- const shed = await this.shedHistory()
85
- if (shed.length === 0) return messages
86
- return [...shed.flatMap((pass) => pass.messages), ...messages]
105
+ async fullTranscript(messages?: readonly Message[]): Promise<readonly Message[]> {
106
+ if (messages !== undefined) {
107
+ const shed = await this.shedHistory()
108
+ if (shed.length === 0) return messages
109
+ return [...shed.flatMap((pass) => pass.messages), ...messages]
110
+ }
111
+
112
+ // Read the log first and compare the snapshot to that exact head. A
113
+ // previous pause may have left a perfectly valid messages file under the
114
+ // same run id; only the boundary says whether it belongs to THIS head.
115
+ const events = await this.events()
116
+ const eventHeadSeq = events.at(-1)?.seq ?? 0
117
+ const snapshot = await this.options.store.readMessages()
118
+
119
+ if (snapshot.kind === 'unavailable') {
120
+ throw new RunTranscriptUnavailableError({
121
+ reason: 'message-snapshot-not-persisted',
122
+ eventHeadSeq,
123
+ })
124
+ }
125
+ if (snapshot.kind === 'legacy-unverified') {
126
+ throw new RunTranscriptUnavailableError({
127
+ reason: 'message-snapshot-unverified',
128
+ eventHeadSeq,
129
+ })
130
+ }
131
+ if (snapshot.throughEventSeq !== eventHeadSeq) {
132
+ throw new RunTranscriptUnavailableError({
133
+ reason: 'message-snapshot-out-of-sync',
134
+ eventHeadSeq,
135
+ snapshotThroughEventSeq: snapshot.throughEventSeq,
136
+ })
137
+ }
138
+
139
+ const shed = shedPassesFrom(events)
140
+ if (shed.length === 0) return snapshot.messages
141
+ return [...shed.flatMap((pass) => pass.messages), ...snapshot.messages]
87
142
  }
88
143
 
89
144
  /**
@@ -106,3 +161,17 @@ export class RunQuery {
106
161
  return registry.get<RunStatusState>(RUN_STATUS_READ_MODEL_ID)
107
162
  }
108
163
  }
164
+
165
+ function shedPassesFrom(events: readonly PersistedRunEvent[]): ShedPass[] {
166
+ const passes: ShedPass[] = []
167
+ for (const event of events) {
168
+ if (event.type !== 'compaction_shed') continue
169
+ passes.push({
170
+ iteration: event.iteration,
171
+ reason: event.reason,
172
+ messages: event.messages,
173
+ seq: event.seq,
174
+ })
175
+ }
176
+ return passes
177
+ }
@@ -235,9 +235,19 @@ export class RunContextFactory {
235
235
  // takes an AbortController and what arrives here is a bare
236
236
  // AbortSignal, so the reason is forwarded by hand rather than by
237
237
  // reaching for a helper that does not fit.
238
- config.signal.addEventListener('abort', () => abortController.abort(config.signal?.reason), {
239
- once: true,
240
- })
238
+ // AbortSignal does not replay an event that happened before a
239
+ // listener was installed. Mirror that state synchronously or a caller
240
+ // that withdrew authority before `query()` began receives a live run
241
+ // controller, allowing provider and tool work to start anyway.
242
+ if (config.signal.aborted) {
243
+ abortController.abort(config.signal.reason)
244
+ } else {
245
+ config.signal.addEventListener(
246
+ 'abort',
247
+ () => abortController.abort(config.signal?.reason),
248
+ { once: true },
249
+ )
250
+ }
241
251
  }
242
252
 
243
253
  const cwd = config.workingDirectory ?? process.cwd()
@@ -44,6 +44,7 @@ import { generateToolCallId } from '../../utils/id.js'
44
44
  import type { Logger } from '../../utils/logger.js'
45
45
  import { compressShellOutput } from '../../utils/shell-compress.js'
46
46
  import { type BackgroundJobRegistry, bindOwner } from '../jobs/registry.js'
47
+ import type { ToolResultObservation } from './project-instructions.js'
47
48
  import {
48
49
  DEFAULT_MAX_TOOL_OUTPUT_CHARS,
49
50
  applyToolOutputBudget,
@@ -256,6 +257,8 @@ export interface ToolCallOutcome {
256
257
  export interface ToolExecutionBatch {
257
258
  messages: Message[]
258
259
  results: ToolCallOutcome[]
260
+ /** Actual registry executions, including calls dispatched by another tool. */
261
+ observations: ToolResultObservation[]
259
262
  }
260
263
 
261
264
  /**
@@ -418,7 +421,11 @@ export class ToolExecutor {
418
421
  * a scope its first half installed. That is precisely the incoherent
419
422
  * batch this line exists to make impossible.
420
423
  */
421
- private skillScope?: { skill: string; allowedTools: readonly string[]; adoptedInBatch: number }
424
+ private skillScope?: {
425
+ skill: string
426
+ allowedTools: readonly string[]
427
+ adoptedInBatch: number
428
+ }
422
429
  private batchCounter = 0
423
430
 
424
431
  /**
@@ -455,7 +462,7 @@ export class ToolExecutor {
455
462
  ): Promise<ToolExecutionBatch> {
456
463
  const toolCalls = response.message.toolCalls
457
464
  if (!toolCalls) {
458
- return { messages: [], results: [] }
465
+ return { messages: [], results: [], observations: [] }
459
466
  }
460
467
 
461
468
  this.batchCounter += 1
@@ -488,7 +495,11 @@ export class ToolExecutor {
488
495
  // One context per call so each execution can see its own
489
496
  // `toolUseId`. The base context is built once; we spread + add
490
497
  // per-call to keep allocations cheap.
491
- const baseContext = this.buildToolContext()
498
+ const observations: ToolResultObservation[] = []
499
+ const recordObservation = (observation: ToolResultObservation): void => {
500
+ observations.push(observation)
501
+ }
502
+ const baseContext = this.buildToolContext(recordObservation)
492
503
 
493
504
  // Respect each tool's `concurrencySafe` flag. Read-only tools
494
505
  // (ls/grep/glob/…) run in parallel; tools that mutate shared state
@@ -544,7 +555,7 @@ export class ToolExecutor {
544
555
  // that made it. The base context has no `toolUseId`, and a
545
556
  // closure built there would report every nested call as
546
557
  // parentless.
547
- dispatchTool: (name, input) => this.dispatchNested(name, input, ctx),
558
+ dispatchTool: (name, input) => this.dispatchNested(name, input, ctx, recordObservation),
548
559
  // Per-call for the same reason: a pause has to be routed back
549
560
  // to the call that raised it, and a batch can raise several.
550
561
  ...(this.config.toolPause ? { requestPause: this.config.toolPause(toolCall.id) } : {}),
@@ -563,7 +574,7 @@ export class ToolExecutor {
563
574
  },
564
575
  }
565
576
  const run = async () => {
566
- results[i] = await this.executeSingle(toolCall, ctx)
577
+ results[i] = await this.executeSingle(toolCall, ctx, recordObservation)
567
578
  }
568
579
  const gated = async () => {
569
580
  await gate.acquire()
@@ -594,7 +605,12 @@ export class ToolExecutor {
594
605
  const toolCall = toolCalls[i] as ToolCall
595
606
  const toolName = toolCall.function.name
596
607
  const message = `Error: Tool "${toolName}" did not complete — the batch failed before it produced a result.`
597
- results[i] = { toolCallId: toolCall.id, toolName, output: message, isError: true }
608
+ results[i] = {
609
+ toolCallId: toolCall.id,
610
+ toolName,
611
+ output: message,
612
+ isError: true,
613
+ }
598
614
  await this.emitEvent({
599
615
  type: 'tool_completed',
600
616
  runId: this.config.runId,
@@ -613,7 +629,7 @@ export class ToolExecutor {
613
629
  createToolMessage(r.content ?? r.output, r.toolCallId, r.isError),
614
630
  )
615
631
 
616
- return { messages, results }
632
+ return { messages, results, observations }
617
633
  }
618
634
 
619
635
  /**
@@ -634,6 +650,7 @@ export class ToolExecutor {
634
650
  name: string,
635
651
  input: unknown,
636
652
  context: ToolContext,
653
+ recordObservation: (observation: ToolResultObservation) => void,
637
654
  ): Promise<ToolResult> {
638
655
  const parent = context.toolUseId
639
656
  const via = parent ? { tool: name, toolUseId: parent as ToolUseId } : undefined
@@ -665,11 +682,21 @@ export class ToolExecutor {
665
682
  durationMs: Date.now() - startedAt,
666
683
  ...(via ? { via } : {}),
667
684
  })
685
+ recordObservation({
686
+ runId: this.config.runId,
687
+ toolUseId: nestedId,
688
+ toolName: name,
689
+ input,
690
+ result,
691
+ ...(parent ? { parentToolUseId: parent } : {}),
692
+ })
668
693
 
669
694
  return result
670
695
  }
671
696
 
672
- private buildToolContext(): ToolContext {
697
+ private buildToolContext(
698
+ recordObservation: (observation: ToolResultObservation) => void = () => {},
699
+ ): ToolContext {
673
700
  const context: ToolContext = {
674
701
  runId: this.config.runId,
675
702
  workingDirectory: this.config.workingDirectory,
@@ -702,13 +729,20 @@ export class ToolExecutor {
702
729
  // dispatching outside a batch has no parent call to name. The
703
730
  // per-call context below overrides it with one that does; see
704
731
  // `dispatchNested`.
705
- dispatchTool: (name, input) => this.dispatchNested(name, input, context),
732
+ dispatchTool: (name, input) => this.dispatchNested(name, input, context, recordObservation),
706
733
  sandbox: this.config.sandbox,
707
734
  fileReadTracker: this.fileReadTracker,
708
735
  // Bound to this run, once. Binding here rather than passing the
709
736
  // owner from the tool is what makes the scoping structural: there
710
737
  // is no argument a tool could pass to reach another run's jobs.
711
- ...(this.config.backgroundJobs
738
+ //
739
+ // The registry's process substrate is the HOST. It must not coexist
740
+ // with a Sandbox in one tool context: handing both to every tool lets
741
+ // any of them call `backgroundJobs.start()` and escape the boundary
742
+ // that its foreground work would use. A sandbox-aware persistent
743
+ // process capability needs its own execution seam; until one exists,
744
+ // the safe composition is to withhold this host capability entirely.
745
+ ...(this.config.backgroundJobs && !this.config.sandbox
712
746
  ? {
713
747
  backgroundJobs: bindOwner(this.config.backgroundJobs, this.config.runId, {
714
748
  workingDirectory: this.config.workingDirectory,
@@ -724,6 +758,7 @@ export class ToolExecutor {
724
758
  private async executeSingle(
725
759
  toolCall: ToolCall,
726
760
  toolContext: ToolContext,
761
+ recordObservation: (observation: ToolResultObservation) => void,
727
762
  ): Promise<ToolCallOutcome> {
728
763
  let toolName = toolCall.function.name
729
764
 
@@ -754,7 +789,12 @@ export class ToolExecutor {
754
789
  result: message,
755
790
  isError: true,
756
791
  })
757
- return { toolCallId: toolCall.id, toolName, output: message, isError: true }
792
+ return {
793
+ toolCallId: toolCall.id,
794
+ toolName,
795
+ output: message,
796
+ isError: true,
797
+ }
758
798
  }
759
799
 
760
800
  // A malformed call used to cost a full model round trip to fix: the
@@ -797,7 +837,12 @@ export class ToolExecutor {
797
837
  result: message,
798
838
  isError: true,
799
839
  })
800
- return { toolCallId: toolCall.id, toolName, output: message, isError: true }
840
+ return {
841
+ toolCallId: toolCall.id,
842
+ toolName,
843
+ output: message,
844
+ isError: true,
845
+ }
801
846
  }
802
847
 
803
848
  let input: unknown = resolved.input
@@ -1064,6 +1109,13 @@ export class ToolExecutor {
1064
1109
  ...(budgeted.truncated ? { outputTruncated: true } : {}),
1065
1110
  ...(budgeted.spillPath ? { outputSpillPath: budgeted.spillPath } : {}),
1066
1111
  })
1112
+ recordObservation({
1113
+ runId: this.config.runId,
1114
+ toolUseId: toolCall.id,
1115
+ toolName,
1116
+ input,
1117
+ result,
1118
+ })
1067
1119
 
1068
1120
  const resolveContent = (): { content?: ToolResultContent } => {
1069
1121
  if (postOverride?.content !== undefined) {
@@ -1210,7 +1262,12 @@ export class ToolExecutor {
1210
1262
  if (!this.config.pluginManager) return { kind: 'continue', input }
1211
1263
  const results = await this.config.pluginManager.executeHooks(
1212
1264
  'pre_tool_use',
1213
- { runId: this.config.runId, toolName, toolInput: input },
1265
+ {
1266
+ runId: this.config.runId,
1267
+ toolName,
1268
+ toolInput: input,
1269
+ signal: this.config.abortSignal,
1270
+ },
1214
1271
  this.emitEvent,
1215
1272
  )
1216
1273
  return this.interpretPreToolResults(toolName, input, results)
@@ -1363,7 +1420,10 @@ export class ToolExecutor {
1363
1420
  // Either the model named a tool that does not exist, or this
1364
1421
  // registry does not implement `get`. Both are the registry's to
1365
1422
  // answer; a repairer still gets offered the `unknown_tool` case.
1366
- return { reason: 'unknown_tool', message: `Error: Unknown tool "${toolName}"` }
1423
+ return {
1424
+ reason: 'unknown_tool',
1425
+ message: `Error: Unknown tool "${toolName}"`,
1426
+ }
1367
1427
  }
1368
1428
 
1369
1429
  // A registry that hands back a tool with no schema has nothing to
@@ -1396,7 +1456,9 @@ export class ToolExecutor {
1396
1456
  toolCall,
1397
1457
  reason: failure.reason,
1398
1458
  message: failure.message,
1399
- ...(tool ? { tool, jsonSchema: renderToolSchema(tool.inputSchema) } : {}),
1459
+ ...(tool
1460
+ ? { tool, jsonSchema: tool.modelInputSchema ?? renderToolSchema(tool.inputSchema) }
1461
+ : {}),
1400
1462
  availableTools: this.config.tools.listNames(),
1401
1463
  })
1402
1464
  } catch (err) {
@@ -1454,7 +1516,13 @@ export class ToolExecutor {
1454
1516
  if (!this.config.pluginManager) return { override: null, retry: false }
1455
1517
  const results = await this.config.pluginManager.executeHooks(
1456
1518
  'post_tool_use',
1457
- { runId: this.config.runId, toolName, toolInput: input, toolResult },
1519
+ {
1520
+ runId: this.config.runId,
1521
+ toolName,
1522
+ toolInput: input,
1523
+ toolResult,
1524
+ signal: this.config.abortSignal,
1525
+ },
1458
1526
  this.emitEvent,
1459
1527
  )
1460
1528
  let override: PostToolOverride | null = null
@@ -1590,7 +1658,12 @@ export class ToolExecutor {
1590
1658
  result: outcome.output,
1591
1659
  isError: outcome.kind === 'error',
1592
1660
  })
1593
- return { toolCallId, toolName, output: outcome.output, isError: outcome.kind === 'error' }
1661
+ return {
1662
+ toolCallId,
1663
+ toolName,
1664
+ output: outcome.output,
1665
+ isError: outcome.kind === 'error',
1666
+ }
1594
1667
  }
1595
1668
 
1596
1669
  /**
@@ -87,6 +87,18 @@ export class GuardCoordinator {
87
87
  return Math.max(0, finalizeAt - (Date.now() - this.startTime))
88
88
  }
89
89
 
90
+ /**
91
+ * Wall-clock left before the run's hard timeout.
92
+ *
93
+ * Setup work that happens before the first iteration cannot rely on
94
+ * {@link beforeIteration}: there is no iteration boundary to sample while
95
+ * that work is pending. Callers use this value to put the same run-owned
96
+ * deadline around such work instead of inventing a second clock.
97
+ */
98
+ remainingUntilTimeoutMs(): number {
99
+ return Math.max(0, this.limitConfig.timeoutMs - (Date.now() - this.startTime))
100
+ }
101
+
90
102
  beforeIteration(runMgr: RunPersistence, abortSignal: AbortSignal): GuardCheckResult {
91
103
  const limitState = {
92
104
  aborted: abortSignal.aborted,