@namzu/sdk 1.0.0 → 1.2.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 (330) hide show
  1. package/CHANGELOG.md +253 -0
  2. package/dist/agents/ReactiveAgent.d.ts.map +1 -1
  3. package/dist/agents/ReactiveAgent.js +5 -0
  4. package/dist/agents/ReactiveAgent.js.map +1 -1
  5. package/dist/agents/SupervisorAgent.d.ts +22 -1
  6. package/dist/agents/SupervisorAgent.d.ts.map +1 -1
  7. package/dist/agents/SupervisorAgent.js +47 -14
  8. package/dist/agents/SupervisorAgent.js.map +1 -1
  9. package/dist/agents/__tests__/supervisor-ledger.test.d.ts +2 -0
  10. package/dist/agents/__tests__/supervisor-ledger.test.d.ts.map +1 -0
  11. package/dist/agents/__tests__/supervisor-ledger.test.js +131 -0
  12. package/dist/agents/__tests__/supervisor-ledger.test.js.map +1 -0
  13. package/dist/bridge/a2a/mapper.d.ts.map +1 -1
  14. package/dist/bridge/a2a/mapper.js +2 -0
  15. package/dist/bridge/a2a/mapper.js.map +1 -1
  16. package/dist/bridge/sse/mapper.d.ts.map +1 -1
  17. package/dist/bridge/sse/mapper.js +4 -0
  18. package/dist/bridge/sse/mapper.js.map +1 -1
  19. package/dist/config/runtime.d.ts +24 -0
  20. package/dist/config/runtime.d.ts.map +1 -1
  21. package/dist/config/runtime.js +9 -0
  22. package/dist/config/runtime.js.map +1 -1
  23. package/dist/connector/builtins/webhook.test.js +17 -0
  24. package/dist/connector/builtins/webhook.test.js.map +1 -1
  25. package/dist/connector/index.d.ts +1 -0
  26. package/dist/connector/index.d.ts.map +1 -1
  27. package/dist/connector/index.js +1 -0
  28. package/dist/connector/index.js.map +1 -1
  29. package/dist/connector/mcp/client.d.ts.map +1 -1
  30. package/dist/connector/mcp/client.js +4 -0
  31. package/dist/connector/mcp/client.js.map +1 -1
  32. package/dist/connector/mcp/index.d.ts +1 -0
  33. package/dist/connector/mcp/index.d.ts.map +1 -1
  34. package/dist/connector/mcp/index.js +1 -0
  35. package/dist/connector/mcp/index.js.map +1 -1
  36. package/dist/connector/mcp/streamable-http.d.ts +22 -0
  37. package/dist/connector/mcp/streamable-http.d.ts.map +1 -0
  38. package/dist/connector/mcp/streamable-http.js +128 -0
  39. package/dist/connector/mcp/streamable-http.js.map +1 -0
  40. package/dist/connector/mcp/streamable-http.test.d.ts +2 -0
  41. package/dist/connector/mcp/streamable-http.test.d.ts.map +1 -0
  42. package/dist/connector/mcp/streamable-http.test.js +132 -0
  43. package/dist/connector/mcp/streamable-http.test.js.map +1 -0
  44. package/dist/{runtime/query → constants}/continuation.d.ts +5 -0
  45. package/dist/constants/continuation.d.ts.map +1 -0
  46. package/dist/{runtime/query → constants}/continuation.js +5 -0
  47. package/dist/constants/continuation.js.map +1 -0
  48. package/dist/constants/index.d.ts +1 -0
  49. package/dist/constants/index.d.ts.map +1 -1
  50. package/dist/constants/index.js +1 -0
  51. package/dist/constants/index.js.map +1 -1
  52. package/dist/manager/run/persistence.d.ts +11 -0
  53. package/dist/manager/run/persistence.d.ts.map +1 -1
  54. package/dist/manager/run/persistence.js +30 -1
  55. package/dist/manager/run/persistence.js.map +1 -1
  56. package/dist/persona/assembler.d.ts.map +1 -1
  57. package/dist/persona/assembler.js +18 -9
  58. package/dist/persona/assembler.js.map +1 -1
  59. package/dist/provider/capabilities.d.ts +27 -0
  60. package/dist/provider/capabilities.d.ts.map +1 -0
  61. package/dist/provider/capabilities.js +29 -0
  62. package/dist/provider/capabilities.js.map +1 -0
  63. package/dist/provider/collect.d.ts.map +1 -1
  64. package/dist/provider/collect.js +4 -1
  65. package/dist/provider/collect.js.map +1 -1
  66. package/dist/provider/index.d.ts +2 -0
  67. package/dist/provider/index.d.ts.map +1 -1
  68. package/dist/provider/index.js +1 -0
  69. package/dist/provider/index.js.map +1 -1
  70. package/dist/public-runtime.d.ts +4 -3
  71. package/dist/public-runtime.d.ts.map +1 -1
  72. package/dist/public-runtime.js +3 -3
  73. package/dist/public-runtime.js.map +1 -1
  74. package/dist/registry/tool/execute.d.ts +27 -0
  75. package/dist/registry/tool/execute.d.ts.map +1 -1
  76. package/dist/registry/tool/execute.js +124 -21
  77. package/dist/registry/tool/execute.js.map +1 -1
  78. package/dist/registry/tool/execute.test.d.ts +9 -6
  79. package/dist/registry/tool/execute.test.d.ts.map +1 -1
  80. package/dist/registry/tool/execute.test.js +72 -10
  81. package/dist/registry/tool/execute.test.js.map +1 -1
  82. package/dist/registry/toolset/catalog.test.js +62 -0
  83. package/dist/registry/toolset/catalog.test.js.map +1 -1
  84. package/dist/run/reporter.d.ts.map +1 -1
  85. package/dist/run/reporter.js +8 -0
  86. package/dist/run/reporter.js.map +1 -1
  87. package/dist/runtime/query/__tests__/capability-negotiation.test.d.ts +2 -0
  88. package/dist/runtime/query/__tests__/capability-negotiation.test.d.ts.map +1 -0
  89. package/dist/runtime/query/__tests__/capability-negotiation.test.js +184 -0
  90. package/dist/runtime/query/__tests__/capability-negotiation.test.js.map +1 -0
  91. package/dist/runtime/query/__tests__/checkpoint-store.test.d.ts +2 -0
  92. package/dist/runtime/query/__tests__/checkpoint-store.test.d.ts.map +1 -0
  93. package/dist/runtime/query/__tests__/checkpoint-store.test.js +259 -0
  94. package/dist/runtime/query/__tests__/checkpoint-store.test.js.map +1 -0
  95. package/dist/runtime/query/__tests__/checkpoint.test.js +9 -3
  96. package/dist/runtime/query/__tests__/checkpoint.test.js.map +1 -1
  97. package/dist/runtime/query/__tests__/deferred-tools.test.js +43 -5
  98. package/dist/runtime/query/__tests__/deferred-tools.test.js.map +1 -1
  99. package/dist/runtime/query/__tests__/long-document-flow.test.d.ts +2 -0
  100. package/dist/runtime/query/__tests__/long-document-flow.test.d.ts.map +1 -0
  101. package/dist/runtime/query/__tests__/long-document-flow.test.js +154 -0
  102. package/dist/runtime/query/__tests__/long-document-flow.test.js.map +1 -0
  103. package/dist/runtime/query/__tests__/orphan-task-turn-end.test.d.ts +2 -0
  104. package/dist/runtime/query/__tests__/orphan-task-turn-end.test.d.ts.map +1 -0
  105. package/dist/runtime/query/__tests__/orphan-task-turn-end.test.js +110 -0
  106. package/dist/runtime/query/__tests__/orphan-task-turn-end.test.js.map +1 -0
  107. package/dist/runtime/query/__tests__/prompt.test.js +15 -11
  108. package/dist/runtime/query/__tests__/prompt.test.js.map +1 -1
  109. package/dist/runtime/query/checkpoint.d.ts +16 -2
  110. package/dist/runtime/query/checkpoint.d.ts.map +1 -1
  111. package/dist/runtime/query/checkpoint.js +21 -7
  112. package/dist/runtime/query/checkpoint.js.map +1 -1
  113. package/dist/runtime/query/context.d.ts +7 -0
  114. package/dist/runtime/query/context.d.ts.map +1 -1
  115. package/dist/runtime/query/context.js +1 -0
  116. package/dist/runtime/query/context.js.map +1 -1
  117. package/dist/runtime/query/index.d.ts +29 -0
  118. package/dist/runtime/query/index.d.ts.map +1 -1
  119. package/dist/runtime/query/index.js +98 -8
  120. package/dist/runtime/query/index.js.map +1 -1
  121. package/dist/runtime/query/iteration/index.d.ts +3 -55
  122. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  123. package/dist/runtime/query/iteration/index.js +260 -656
  124. package/dist/runtime/query/iteration/index.js.map +1 -1
  125. package/dist/runtime/query/iteration/phases/checkpoint.d.ts.map +1 -1
  126. package/dist/runtime/query/iteration/phases/checkpoint.js +24 -2
  127. package/dist/runtime/query/iteration/phases/checkpoint.js.map +1 -1
  128. package/dist/runtime/query/iteration/phases/compaction.d.ts +8 -0
  129. package/dist/runtime/query/iteration/phases/compaction.d.ts.map +1 -1
  130. package/dist/runtime/query/iteration/phases/compaction.js +84 -3
  131. package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
  132. package/dist/runtime/query/iteration/phases/context.d.ts +13 -2
  133. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  134. package/dist/runtime/query/iteration/phases/context.js +53 -0
  135. package/dist/runtime/query/iteration/phases/context.js.map +1 -1
  136. package/dist/runtime/query/iteration/phases/hitl-abort-race.test.d.ts +2 -0
  137. package/dist/runtime/query/iteration/phases/hitl-abort-race.test.d.ts.map +1 -0
  138. package/dist/runtime/query/iteration/phases/hitl-abort-race.test.js +73 -0
  139. package/dist/runtime/query/iteration/phases/hitl-abort-race.test.js.map +1 -0
  140. package/dist/runtime/query/iteration/phases/hitl-answer-question.test.d.ts +2 -0
  141. package/dist/runtime/query/iteration/phases/hitl-answer-question.test.d.ts.map +1 -0
  142. package/dist/runtime/query/iteration/phases/hitl-answer-question.test.js +120 -0
  143. package/dist/runtime/query/iteration/phases/hitl-answer-question.test.js.map +1 -0
  144. package/dist/runtime/query/iteration/phases/tool-review.d.ts +1 -1
  145. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  146. package/dist/runtime/query/iteration/phases/tool-review.js +7 -2
  147. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  148. package/dist/runtime/query/iteration/phases/working-memory-compaction.test.d.ts +19 -0
  149. package/dist/runtime/query/iteration/phases/working-memory-compaction.test.d.ts.map +1 -0
  150. package/dist/runtime/query/iteration/phases/working-memory-compaction.test.js +177 -0
  151. package/dist/runtime/query/iteration/phases/working-memory-compaction.test.js.map +1 -0
  152. package/dist/runtime/query/iteration/phases/working-memory.d.ts +31 -0
  153. package/dist/runtime/query/iteration/phases/working-memory.d.ts.map +1 -0
  154. package/dist/runtime/query/iteration/phases/working-memory.js +81 -0
  155. package/dist/runtime/query/iteration/phases/working-memory.js.map +1 -0
  156. package/dist/runtime/query/iteration/stream-turn.d.ts +35 -0
  157. package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -0
  158. package/dist/runtime/query/iteration/stream-turn.js +341 -0
  159. package/dist/runtime/query/iteration/stream-turn.js.map +1 -0
  160. package/dist/runtime/query/replay/list.d.ts +17 -1
  161. package/dist/runtime/query/replay/list.d.ts.map +1 -1
  162. package/dist/runtime/query/replay/list.js +21 -4
  163. package/dist/runtime/query/replay/list.js.map +1 -1
  164. package/dist/runtime/query/replay/prepare.d.ts +10 -0
  165. package/dist/runtime/query/replay/prepare.d.ts.map +1 -1
  166. package/dist/runtime/query/replay/prepare.js +20 -4
  167. package/dist/runtime/query/replay/prepare.js.map +1 -1
  168. package/dist/session/workspace/__tests__/shared-run.test.js +1 -1
  169. package/dist/session/workspace/__tests__/shared-run.test.js.map +1 -1
  170. package/dist/session/workspace/shared-run.js +1 -0
  171. package/dist/session/workspace/shared-run.js.map +1 -1
  172. package/dist/skills/loader.test.js +8 -8
  173. package/dist/skills/loader.test.js.map +1 -1
  174. package/dist/store/index.d.ts +1 -0
  175. package/dist/store/index.d.ts.map +1 -1
  176. package/dist/store/index.js +1 -0
  177. package/dist/store/index.js.map +1 -1
  178. package/dist/store/run/checkpoint-disk.d.ts +28 -0
  179. package/dist/store/run/checkpoint-disk.d.ts.map +1 -0
  180. package/dist/store/run/checkpoint-disk.js +55 -0
  181. package/dist/store/run/checkpoint-disk.js.map +1 -0
  182. package/dist/streaming/coalesce.test.js.map +1 -1
  183. package/dist/tools/builtins/__tests__/payload-budget.test.js +48 -0
  184. package/dist/tools/builtins/__tests__/payload-budget.test.js.map +1 -1
  185. package/dist/tools/builtins/__tests__/read-file.test.js +9 -0
  186. package/dist/tools/builtins/__tests__/read-file.test.js.map +1 -1
  187. package/dist/tools/builtins/read-file.d.ts.map +1 -1
  188. package/dist/tools/builtins/read-file.js +50 -2
  189. package/dist/tools/builtins/read-file.js.map +1 -1
  190. package/dist/tools/builtins/search-tools.d.ts.map +1 -1
  191. package/dist/tools/builtins/search-tools.js +32 -7
  192. package/dist/tools/builtins/search-tools.js.map +1 -1
  193. package/dist/tools/coordinator/__tests__/approve-plan.test.d.ts +2 -0
  194. package/dist/tools/coordinator/__tests__/approve-plan.test.d.ts.map +1 -0
  195. package/dist/tools/coordinator/__tests__/approve-plan.test.js +114 -0
  196. package/dist/tools/coordinator/__tests__/approve-plan.test.js.map +1 -0
  197. package/dist/tools/coordinator/__tests__/ask-user-question.test.d.ts +2 -0
  198. package/dist/tools/coordinator/__tests__/ask-user-question.test.d.ts.map +1 -0
  199. package/dist/tools/coordinator/__tests__/ask-user-question.test.js +309 -0
  200. package/dist/tools/coordinator/__tests__/ask-user-question.test.js.map +1 -0
  201. package/dist/tools/coordinator/index.d.ts +8 -0
  202. package/dist/tools/coordinator/index.d.ts.map +1 -1
  203. package/dist/tools/coordinator/index.js +195 -15
  204. package/dist/tools/coordinator/index.js.map +1 -1
  205. package/dist/types/agent/index.d.ts +1 -0
  206. package/dist/types/agent/index.d.ts.map +1 -1
  207. package/dist/types/agent/index.js +1 -0
  208. package/dist/types/agent/index.js.map +1 -1
  209. package/dist/types/agent/reactive.d.ts +15 -0
  210. package/dist/types/agent/reactive.d.ts.map +1 -1
  211. package/dist/types/agent/supervisor.d.ts +18 -0
  212. package/dist/types/agent/supervisor.d.ts.map +1 -1
  213. package/dist/types/agent/working-memory.d.ts +29 -0
  214. package/dist/types/agent/working-memory.d.ts.map +1 -0
  215. package/dist/types/agent/working-memory.js +2 -0
  216. package/dist/types/agent/working-memory.js.map +1 -0
  217. package/dist/types/common/index.d.ts +10 -0
  218. package/dist/types/common/index.d.ts.map +1 -1
  219. package/dist/types/common/index.js +18 -0
  220. package/dist/types/common/index.js.map +1 -1
  221. package/dist/types/common/usage-merge.test.d.ts +2 -0
  222. package/dist/types/common/usage-merge.test.d.ts.map +1 -0
  223. package/dist/types/common/usage-merge.test.js +48 -0
  224. package/dist/types/common/usage-merge.test.js.map +1 -0
  225. package/dist/types/connector/mcp.d.ts +9 -2
  226. package/dist/types/connector/mcp.d.ts.map +1 -1
  227. package/dist/types/hitl/index.d.ts +42 -0
  228. package/dist/types/hitl/index.d.ts.map +1 -1
  229. package/dist/types/hitl/index.js +11 -0
  230. package/dist/types/hitl/index.js.map +1 -1
  231. package/dist/types/provider/chat.d.ts +9 -0
  232. package/dist/types/provider/chat.d.ts.map +1 -1
  233. package/dist/types/provider/config.d.ts +18 -0
  234. package/dist/types/provider/config.d.ts.map +1 -1
  235. package/dist/types/provider/interface.d.ts +10 -0
  236. package/dist/types/provider/interface.d.ts.map +1 -1
  237. package/dist/types/run/checkpoint-store.d.ts +64 -0
  238. package/dist/types/run/checkpoint-store.d.ts.map +1 -0
  239. package/dist/types/run/checkpoint-store.js +12 -0
  240. package/dist/types/run/checkpoint-store.js.map +1 -0
  241. package/dist/types/run/config.d.ts +27 -0
  242. package/dist/types/run/config.d.ts.map +1 -1
  243. package/dist/types/run/events.d.ts +6 -0
  244. package/dist/types/run/events.d.ts.map +1 -1
  245. package/dist/types/run/events.js.map +1 -1
  246. package/dist/types/run/index.d.ts +1 -0
  247. package/dist/types/run/index.d.ts.map +1 -1
  248. package/dist/types/run/index.js +1 -0
  249. package/dist/types/run/index.js.map +1 -1
  250. package/dist/version.d.ts.map +1 -1
  251. package/dist/version.js +25 -4
  252. package/dist/version.js.map +1 -1
  253. package/package.json +1 -1
  254. package/src/agents/ReactiveAgent.ts +5 -0
  255. package/src/agents/SupervisorAgent.ts +56 -16
  256. package/src/agents/__tests__/supervisor-ledger.test.ts +185 -0
  257. package/src/bridge/a2a/mapper.ts +3 -0
  258. package/src/bridge/sse/mapper.ts +5 -0
  259. package/src/config/runtime.ts +9 -0
  260. package/src/connector/builtins/webhook.test.ts +21 -0
  261. package/src/connector/index.ts +1 -0
  262. package/src/connector/mcp/client.ts +4 -0
  263. package/src/connector/mcp/index.ts +1 -0
  264. package/src/connector/mcp/streamable-http.test.ts +169 -0
  265. package/src/connector/mcp/streamable-http.ts +152 -0
  266. package/src/{runtime/query → constants}/continuation.ts +5 -0
  267. package/src/constants/index.ts +1 -0
  268. package/src/manager/run/persistence.ts +34 -1
  269. package/src/persona/assembler.ts +18 -6
  270. package/src/provider/capabilities.ts +47 -0
  271. package/src/provider/collect.ts +4 -1
  272. package/src/provider/index.ts +5 -0
  273. package/src/public-runtime.ts +5 -0
  274. package/src/registry/tool/execute.test.ts +85 -10
  275. package/src/registry/tool/execute.ts +124 -21
  276. package/src/registry/toolset/catalog.test.ts +68 -0
  277. package/src/run/reporter.ts +9 -0
  278. package/src/runtime/query/__tests__/capability-negotiation.test.ts +248 -0
  279. package/src/runtime/query/__tests__/checkpoint-store.test.ts +322 -0
  280. package/src/runtime/query/__tests__/checkpoint.test.ts +15 -6
  281. package/src/runtime/query/__tests__/deferred-tools.test.ts +52 -5
  282. package/src/runtime/query/__tests__/long-document-flow.test.ts +180 -0
  283. package/src/runtime/query/__tests__/orphan-task-turn-end.test.ts +127 -0
  284. package/src/runtime/query/__tests__/prompt.test.ts +15 -11
  285. package/src/runtime/query/checkpoint.ts +23 -9
  286. package/src/runtime/query/context.ts +9 -0
  287. package/src/runtime/query/index.ts +148 -29
  288. package/src/runtime/query/iteration/index.ts +316 -831
  289. package/src/runtime/query/iteration/phases/checkpoint.ts +32 -2
  290. package/src/runtime/query/iteration/phases/compaction.ts +89 -3
  291. package/src/runtime/query/iteration/phases/context.ts +59 -3
  292. package/src/runtime/query/iteration/phases/hitl-abort-race.test.ts +86 -0
  293. package/src/runtime/query/iteration/phases/hitl-answer-question.test.ts +139 -0
  294. package/src/runtime/query/iteration/phases/tool-review.ts +7 -3
  295. package/src/runtime/query/iteration/phases/working-memory-compaction.test.ts +215 -0
  296. package/src/runtime/query/iteration/phases/working-memory.ts +86 -0
  297. package/src/runtime/query/iteration/stream-turn.ts +396 -0
  298. package/src/runtime/query/replay/list.ts +38 -4
  299. package/src/runtime/query/replay/prepare.ts +37 -4
  300. package/src/session/workspace/__tests__/shared-run.test.ts +1 -1
  301. package/src/session/workspace/shared-run.ts +1 -0
  302. package/src/skills/loader.test.ts +8 -8
  303. package/src/store/index.ts +1 -0
  304. package/src/store/run/checkpoint-disk.ts +67 -0
  305. package/src/streaming/coalesce.test.ts +3 -3
  306. package/src/tools/builtins/__tests__/payload-budget.test.ts +63 -0
  307. package/src/tools/builtins/__tests__/read-file.test.ts +12 -0
  308. package/src/tools/builtins/read-file.ts +50 -2
  309. package/src/tools/builtins/search-tools.ts +38 -7
  310. package/src/tools/coordinator/__tests__/approve-plan.test.ts +139 -0
  311. package/src/tools/coordinator/__tests__/ask-user-question.test.ts +370 -0
  312. package/src/tools/coordinator/index.ts +227 -17
  313. package/src/types/agent/index.ts +1 -0
  314. package/src/types/agent/reactive.ts +17 -0
  315. package/src/types/agent/supervisor.ts +20 -0
  316. package/src/types/agent/working-memory.ts +29 -0
  317. package/src/types/common/index.ts +19 -0
  318. package/src/types/common/usage-merge.test.ts +53 -0
  319. package/src/types/connector/mcp.ts +14 -2
  320. package/src/types/hitl/index.ts +52 -1
  321. package/src/types/provider/chat.ts +10 -0
  322. package/src/types/provider/config.ts +18 -0
  323. package/src/types/provider/interface.ts +11 -0
  324. package/src/types/run/checkpoint-store.ts +72 -0
  325. package/src/types/run/config.ts +30 -0
  326. package/src/types/run/events.ts +13 -0
  327. package/src/types/run/index.ts +1 -0
  328. package/src/version.ts +26 -4
  329. package/dist/runtime/query/continuation.d.ts.map +0 -1
  330. package/dist/runtime/query/continuation.js.map +0 -1
@@ -0,0 +1,120 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { autoApproveHandler } from '../../../../types/hitl/index.js';
3
+ import { handleHITLDecision } from './context.js';
4
+ import { runToolReview } from './tool-review.js';
5
+ async function drainGenerator(gen) {
6
+ const events = [];
7
+ let next = await gen.next();
8
+ while (!next.done) {
9
+ events.push(next.value);
10
+ next = await gen.next();
11
+ }
12
+ return { events, value: next.value };
13
+ }
14
+ describe('autoApproveHandler user_question case', () => {
15
+ it('returns the non-fabricating no-answer sentinel with the questionId echoed', async () => {
16
+ const decision = await autoApproveHandler({
17
+ type: 'user_question',
18
+ runId: 'run_headless_test',
19
+ checkpointId: 'cp_question_toolu_1',
20
+ question: {
21
+ questionId: 'toolu_1',
22
+ question: 'Pick one?',
23
+ options: [
24
+ { id: 'opt_1', label: 'A' },
25
+ { id: 'opt_2', label: 'B' },
26
+ ],
27
+ multiSelect: false,
28
+ allowFreeText: true,
29
+ },
30
+ });
31
+ expect(decision).toEqual({
32
+ action: 'answer_question',
33
+ selectedOptionIds: [],
34
+ freeText: 'No user is available to answer. Proceed using your best judgment.',
35
+ questionId: 'toolu_1',
36
+ });
37
+ });
38
+ });
39
+ describe('handleHITLDecision answer_question case', () => {
40
+ it("treats a misdirected 'answer_question' at an iteration checkpoint as continue", async () => {
41
+ // The branch returns without touching the context — answers are
42
+ // consumed inside the ask_user_question tool's own park, so an
43
+ // answer arriving here can only be misdirected.
44
+ const ctx = {};
45
+ const { events, value } = await drainGenerator(handleHITLDecision(ctx, { action: 'answer_question', selectedOptionIds: ['opt_1'] }, 'cp_checkpoint_1', 'iteration checkpoint'));
46
+ expect(value).toBe('continue');
47
+ expect(events).toEqual([]);
48
+ });
49
+ });
50
+ describe('runToolReview answer_question case', () => {
51
+ function reviewContext(decision) {
52
+ const warns = [];
53
+ const pushed = [];
54
+ let batches = 0;
55
+ const ctx = {
56
+ tools: { get: () => undefined },
57
+ checkpointMgr: {
58
+ create: async () => ({ id: 'cp_review_1' }),
59
+ },
60
+ emitEvent: async () => { },
61
+ drainPending: () => [][Symbol.iterator](),
62
+ resumeHandler: async () => decision,
63
+ log: {
64
+ debug: () => { },
65
+ info: () => { },
66
+ warn: (message) => {
67
+ warns.push(message);
68
+ },
69
+ error: () => { },
70
+ },
71
+ runMgr: {
72
+ id: 'run_tool_review_test',
73
+ pushMessage: (message) => {
74
+ pushed.push(message);
75
+ },
76
+ },
77
+ toolExecutor: {
78
+ executeBatch: async () => {
79
+ batches += 1;
80
+ return { messages: [], results: [] };
81
+ },
82
+ },
83
+ };
84
+ return { ctx, warns, pushed, batchCount: () => batches };
85
+ }
86
+ const response = {
87
+ id: 'resp_1',
88
+ model: 'test-model',
89
+ message: {
90
+ role: 'assistant',
91
+ content: null,
92
+ toolCalls: [
93
+ {
94
+ id: 'toolu_review_1',
95
+ type: 'function',
96
+ function: { name: 'ask_user_question', arguments: '{}' },
97
+ },
98
+ ],
99
+ },
100
+ finishReason: 'tool_calls',
101
+ usage: {
102
+ promptTokens: 0,
103
+ completionTokens: 0,
104
+ totalTokens: 0,
105
+ cachedTokens: 0,
106
+ cacheWriteTokens: 0,
107
+ },
108
+ };
109
+ it("warns and executes the batch on a misdirected 'answer_question' instead of stalling", async () => {
110
+ const { ctx, warns, batchCount } = reviewContext({
111
+ action: 'answer_question',
112
+ selectedOptionIds: [],
113
+ });
114
+ const { value } = await drainGenerator(runToolReview(ctx, response, 1));
115
+ expect(value).toBe('executed');
116
+ expect(batchCount()).toBe(1);
117
+ expect(warns).toHaveLength(1);
118
+ });
119
+ });
120
+ //# sourceMappingURL=hitl-answer-question.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hitl-answer-question.test.js","sourceRoot":"","sources":["../../../../../src/runtime/query/iteration/phases/hitl-answer-question.test.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type { ChatCompletionResponse } from '../../../../types/provider/index.js';
2
2
  import type { RunEvent } from '../../../../types/run/index.js';
3
3
  import type { VerificationGate } from '../../../../verification/index.js';
4
- import type { IterationContext } from './context.js';
4
+ import { type IterationContext } from './context.js';
5
5
  interface VerificationAwareContext extends IterationContext {
6
6
  readonly verificationGate?: VerificationGate;
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tool-review.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/query/iteration/phases/tool-review.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAA;AACjF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAEpD,UAAU,wBAAyB,SAAQ,gBAAgB;IAC1D,QAAQ,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;CAC5C;AAED,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAAA;AAEhE,wBAAuB,aAAa,CACnC,GAAG,EAAE,wBAAwB,EAC7B,QAAQ,EAAE,sBAAsB,EAChC,YAAY,EAAE,MAAM,GAClB,cAAc,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CA0M7C"}
1
+ {"version":3,"file":"tool-review.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/query/iteration/phases/tool-review.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAA;AACjF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AACzE,OAAO,EAAE,KAAK,gBAAgB,EAAwB,MAAM,cAAc,CAAA;AAE1E,UAAU,wBAAyB,SAAQ,gBAAgB;IAC1D,QAAQ,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;CAC5C;AAED,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAAA;AAEhE,wBAAuB,aAAa,CACnC,GAAG,EAAE,wBAAwB,EAC7B,QAAQ,EAAE,sBAAsB,EAChC,YAAY,EAAE,MAAM,GAClB,cAAc,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CA8M7C"}
@@ -1,4 +1,5 @@
1
1
  import { createUserMessage } from '../../../../types/message/index.js';
2
+ import { awaitDecisionOrAbort } from './context.js';
2
3
  export async function* runToolReview(ctx, response, iterationNum) {
3
4
  const toolCalls = response.message.toolCalls;
4
5
  if (!toolCalls || toolCalls.length === 0) {
@@ -68,7 +69,7 @@ export async function* runToolReview(ctx, response, iterationNum) {
68
69
  iteration: iterationNum,
69
70
  });
70
71
  yield* ctx.drainPending();
71
- const reviewDecision = await ctx.resumeHandler({
72
+ const reviewDecision = await awaitDecisionOrAbort(ctx, {
72
73
  type: 'tool_review',
73
74
  runId: ctx.runMgr.id,
74
75
  checkpointId: reviewCheckpoint.id,
@@ -158,7 +159,11 @@ export async function* runToolReview(ctx, response, iterationNum) {
158
159
  return 'executed';
159
160
  }
160
161
  case 'approve_plan':
161
- case 'reject_plan': {
162
+ case 'reject_plan':
163
+ // 'answer_question' belongs to an ask_user_question park, not a
164
+ // tool review — like the misdirected plan decisions above, warn
165
+ // and proceed with execution rather than stalling the run.
166
+ case 'answer_question': {
162
167
  ctx.log.warn('Unexpected plan decision during tool review', {
163
168
  action: reviewDecision.action,
164
169
  });
@@ -1 +1 @@
1
- {"version":3,"file":"tool-review.js","sourceRoot":"","sources":["../../../../../src/runtime/query/iteration/phases/tool-review.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool-review.js","sourceRoot":"","sources":["../../../../../src/runtime/query/iteration/phases/tool-review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Regression test for the ses_055 Layer-B SDK seam (#104):
3
+ *
4
+ * 1. **Compaction FIRES** under a small `contextWindowTokens` even with the
5
+ * run-level `tokenBudget = 0` (UNLIMITED) — proving the F1 fix repointed
6
+ * BOTH the `<= 0` guard AND the divisor, closing the silent-no-op trap.
7
+ * 2. **The pinned working-memory slot SURVIVES** the compaction pass (it is a
8
+ * leading system message → preserved by header identity).
9
+ * 3. **No premature stop** from `tokenBudget = 0` alone: with NO
10
+ * `contextWindowTokens`, the same overflowing run does NOT compact (the
11
+ * legacy fallback), so consumers that never set the new field are
12
+ * byte-identical.
13
+ *
14
+ * The test drives `refreshWorkingMemory` (to pin the slot) then
15
+ * `runCompactionCheck` directly against a mock `IterationContext`, which is the
16
+ * exact sequence the iteration loop runs each turn.
17
+ */
18
+ export {};
19
+ //# sourceMappingURL=working-memory-compaction.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"working-memory-compaction.test.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/query/iteration/phases/working-memory-compaction.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Regression test for the ses_055 Layer-B SDK seam (#104):
3
+ *
4
+ * 1. **Compaction FIRES** under a small `contextWindowTokens` even with the
5
+ * run-level `tokenBudget = 0` (UNLIMITED) — proving the F1 fix repointed
6
+ * BOTH the `<= 0` guard AND the divisor, closing the silent-no-op trap.
7
+ * 2. **The pinned working-memory slot SURVIVES** the compaction pass (it is a
8
+ * leading system message → preserved by header identity).
9
+ * 3. **No premature stop** from `tokenBudget = 0` alone: with NO
10
+ * `contextWindowTokens`, the same overflowing run does NOT compact (the
11
+ * legacy fallback), so consumers that never set the new field are
12
+ * byte-identical.
13
+ *
14
+ * The test drives `refreshWorkingMemory` (to pin the slot) then
15
+ * `runCompactionCheck` directly against a mock `IterationContext`, which is the
16
+ * exact sequence the iteration loop runs each turn.
17
+ */
18
+ import { describe, expect, it, vi } from 'vitest';
19
+ import { findDanglingMessages } from '../../../../compaction/dangling.js';
20
+ import { WorkingStateManager } from '../../../../compaction/manager.js';
21
+ import { CompactionConfigSchema } from '../../../../config/runtime.js';
22
+ import { createAssistantMessage, createSystemMessage, createToolMessage, createUserMessage, } from '../../../../types/message/index.js';
23
+ import { runCompactionCheck } from './compaction.js';
24
+ import { WORKING_MEMORY_HEADER, refreshWorkingMemory } from './working-memory.js';
25
+ function makeLogger() {
26
+ const self = {
27
+ info: vi.fn(),
28
+ warn: vi.fn(),
29
+ error: vi.fn(),
30
+ debug: vi.fn(),
31
+ child: vi.fn(),
32
+ };
33
+ self.child = vi.fn(() => self);
34
+ return self;
35
+ }
36
+ /** A long string so a handful of messages overflow a small context window. */
37
+ const FILLER = 'x'.repeat(200);
38
+ function buildOverflowingMessages() {
39
+ const msgs = [createSystemMessage(`STATIC SYSTEM PROMPT ${FILLER}`, 'cache')];
40
+ for (let i = 0; i < 8; i++) {
41
+ msgs.push(createUserMessage(`user turn ${i} ${FILLER}`));
42
+ msgs.push(createAssistantMessage(`assistant turn ${i} ${FILLER}`));
43
+ }
44
+ return msgs;
45
+ }
46
+ function makeCtx(opts) {
47
+ const config = CompactionConfigSchema.parse({
48
+ strategy: 'structured',
49
+ llmVerification: false,
50
+ ...(opts.contextWindowTokens !== undefined
51
+ ? { contextWindowTokens: opts.contextWindowTokens }
52
+ : {}),
53
+ });
54
+ const manager = new WorkingStateManager(config);
55
+ // Seed a couple of slots so serializeState produces non-trivial output.
56
+ manager.addDecision('built the report as .docx');
57
+ return {
58
+ runConfig: { tokenBudget: 0 }, // UNLIMITED cumulative cost cap
59
+ compactionConfig: config,
60
+ workingStateManager: manager,
61
+ workingMemoryProvider: opts.workingMemoryProvider,
62
+ log: makeLogger(),
63
+ runMgr: {
64
+ id: 'run_1',
65
+ currentIteration: 3,
66
+ messages: opts.messages,
67
+ },
68
+ };
69
+ }
70
+ const WM_BLOCK = 'ARTIFACTS\n • report.docx · Word document · 48.2 KB · imp:H\n path: /mnt/user-data/outputs/report.docx';
71
+ describe('Layer-B compaction seam (ses_055 #104)', () => {
72
+ it('FIRES on small contextWindowTokens with tokenBudget=0 AND preserves the pinned WM slot', async () => {
73
+ const messages = buildOverflowingMessages();
74
+ const ctx = makeCtx({
75
+ messages,
76
+ contextWindowTokens: 100,
77
+ workingMemoryProvider: () => WM_BLOCK,
78
+ });
79
+ await refreshWorkingMemory(ctx);
80
+ // The slot is pinned as the last leading system message (index 1).
81
+ expect(messages[1]?.role).toBe('system');
82
+ expect(messages[1]?.content?.startsWith(WORKING_MEMORY_HEADER)).toBe(true);
83
+ const before = messages.length;
84
+ await runCompactionCheck(ctx);
85
+ // (1) compaction fired: a [COMPACTED CONTEXT] message appeared and the
86
+ // transcript shrank.
87
+ expect(messages.length).toBeLessThan(before);
88
+ expect(messages.some((m) => m.content?.includes('[COMPACTED CONTEXT]'))).toBe(true);
89
+ // (2) the pinned working-memory slot survived by header identity.
90
+ const wm = messages.filter((m) => m.role === 'system' && m.content?.startsWith(WORKING_MEMORY_HEADER));
91
+ expect(wm).toHaveLength(1);
92
+ expect(wm[0]?.content).toContain('report.docx');
93
+ });
94
+ it('does NOT compact when contextWindowTokens is absent and tokenBudget=0 (byte-identical fallback)', async () => {
95
+ const messages = buildOverflowingMessages();
96
+ const ctx = makeCtx({ messages });
97
+ const before = messages.length;
98
+ await runCompactionCheck(ctx);
99
+ // budget = tokenBudget = 0 → guard returns; no compaction, no mutation.
100
+ expect(messages.length).toBe(before);
101
+ expect(messages.some((m) => m.content?.includes('[COMPACTED CONTEXT]'))).toBe(false);
102
+ });
103
+ it('removes the slot when the provider returns an empty block', async () => {
104
+ const messages = buildOverflowingMessages();
105
+ const ctx = makeCtx({
106
+ messages,
107
+ contextWindowTokens: 100,
108
+ workingMemoryProvider: () => WM_BLOCK,
109
+ });
110
+ await refreshWorkingMemory(ctx);
111
+ expect(messages.some((m) => m.content?.startsWith(WORKING_MEMORY_HEADER))).toBe(true);
112
+ // Same transcript, provider now returns blank ⇒ the slot is removed.
113
+ const blankCtx = makeCtx({
114
+ messages,
115
+ contextWindowTokens: 100,
116
+ workingMemoryProvider: () => ' ',
117
+ });
118
+ await refreshWorkingMemory(blankCtx);
119
+ expect(messages.some((m) => m.content?.startsWith(WORKING_MEMORY_HEADER))).toBe(false);
120
+ });
121
+ it('keeps the prior slot when the provider throws (failure-isolated)', async () => {
122
+ const messages = buildOverflowingMessages();
123
+ const ctx = makeCtx({
124
+ messages,
125
+ contextWindowTokens: 100,
126
+ workingMemoryProvider: () => WM_BLOCK,
127
+ });
128
+ await refreshWorkingMemory(ctx);
129
+ const throwingCtx = makeCtx({
130
+ messages,
131
+ contextWindowTokens: 100,
132
+ workingMemoryProvider: () => {
133
+ throw new Error('provider boom');
134
+ },
135
+ });
136
+ await refreshWorkingMemory(throwingCtx);
137
+ // Prior slot retained; run not broken.
138
+ expect(messages.some((m) => m.content?.startsWith(WORKING_MEMORY_HEADER))).toBe(true);
139
+ });
140
+ it('does NOT orphan a tool_result when the recent-window cut splits a tool pair (C1)', async () => {
141
+ // keepRecentMessages defaults to 4. Lay the transcript out so the NAIVE
142
+ // cut (length - 4 = index 5) lands right AFTER the assistant-with-toolCall
143
+ // (index 4) but BEFORE... no — exactly ON its tool result (index 5), which
144
+ // a naive slice would keep in the recent window while dropping the
145
+ // assistant into the summarized older set → an orphaned tool_result at the
146
+ // head of the recent window → Anthropic 400. The fix snaps keepStart
147
+ // forward past the complete pair.
148
+ const toolCall = {
149
+ id: 't1',
150
+ type: 'function',
151
+ function: { name: 'read', arguments: '{}' },
152
+ };
153
+ const messages = [
154
+ createSystemMessage(`STATIC SYSTEM PROMPT ${FILLER}`, 'cache'),
155
+ createUserMessage(`user 0 ${FILLER}`),
156
+ createAssistantMessage(`assistant 0 ${FILLER}`),
157
+ createUserMessage(`user 1 ${FILLER}`),
158
+ createAssistantMessage(`calling a tool ${FILLER}`, [toolCall]), // idx 4
159
+ createToolMessage(`tool result ${FILLER}`, 't1'), // idx 5 — naive recent[0]
160
+ createAssistantMessage(`assistant 2 ${FILLER}`),
161
+ createUserMessage(`user 3 ${FILLER}`),
162
+ createAssistantMessage(`assistant 3 ${FILLER}`),
163
+ ];
164
+ const ctx = makeCtx({ messages, contextWindowTokens: 100 });
165
+ await runCompactionCheck(ctx);
166
+ // Compaction fired.
167
+ expect(messages.some((m) => m.content?.includes('[COMPACTED CONTEXT]'))).toBe(true);
168
+ // The surviving transcript has NO dangling tool pair — the tool result
169
+ // whose assistant was summarized away was moved into the older set too,
170
+ // so no orphaned tool_result remains to 400 the next provider turn.
171
+ expect(findDanglingMessages(messages).isValid).toBe(true);
172
+ // And a `tool` message never leads the recent window.
173
+ const firstNonSystem = messages.find((m) => m.role !== 'system');
174
+ expect(firstNonSystem?.role).not.toBe('tool');
175
+ });
176
+ });
177
+ //# sourceMappingURL=working-memory-compaction.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"working-memory-compaction.test.js","sourceRoot":"","sources":["../../../../../src/runtime/query/iteration/phases/working-memory-compaction.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { IterationContext } from './context.js';
2
+ /**
3
+ * Sentinel header identifying the single PINNED working-memory system message.
4
+ *
5
+ * The SDK finds + replaces the slot by this header every turn and uses the same
6
+ * identity to re-pin it if compaction ever drops it (the OPAQUE survival guard
7
+ * in `compaction.ts` — no host-format knowledge required). The host's rendered
8
+ * block is stored verbatim AFTER this header; the SDK never parses it.
9
+ */
10
+ export declare const WORKING_MEMORY_HEADER = "[WORKING MEMORY] Authoritative state for this conversation \u2014 you produced these.";
11
+ /**
12
+ * True when `content` is the pinned working-memory slot (header identity only).
13
+ * Shared with `compaction.ts` so the survival guard re-pins by the SAME rule.
14
+ */
15
+ export declare function isWorkingMemoryMessage(content: string | null | undefined): boolean;
16
+ /**
17
+ * Resolve the host's working-memory string and rewrite a single PINNED leading
18
+ * system message in place. Insert-or-replace keyed by {@link WORKING_MEMORY_HEADER};
19
+ * an empty/blank string removes the slot.
20
+ *
21
+ * The slot is an EPHEMERAL system message placed as the LAST leading system
22
+ * message (after the cached static + dynamic system messages), so it never
23
+ * busts the prompt-cache prefix yet still rides inside the compaction-preserved
24
+ * leading-system run (the primacy edge Lost-in-the-Middle / Context-Rot need).
25
+ *
26
+ * Failure-isolated (the `web-search` seam rule): a throwing/slow provider
27
+ * degrades to "no refresh this turn" (keeps the prior slot), never breaks the
28
+ * run. Early-returns when no provider is configured ⇒ byte-identical run path.
29
+ */
30
+ export declare function refreshWorkingMemory(ctx: IterationContext): Promise<void>;
31
+ //# sourceMappingURL=working-memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"working-memory.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/query/iteration/phases/working-memory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAEpD;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,0FACiD,CAAA;AAEnF;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAElF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiD/E"}
@@ -0,0 +1,81 @@
1
+ import { createSystemMessage } from '../../../../types/message/index.js';
2
+ /**
3
+ * Sentinel header identifying the single PINNED working-memory system message.
4
+ *
5
+ * The SDK finds + replaces the slot by this header every turn and uses the same
6
+ * identity to re-pin it if compaction ever drops it (the OPAQUE survival guard
7
+ * in `compaction.ts` — no host-format knowledge required). The host's rendered
8
+ * block is stored verbatim AFTER this header; the SDK never parses it.
9
+ */
10
+ export const WORKING_MEMORY_HEADER = '[WORKING MEMORY] Authoritative state for this conversation — you produced these.';
11
+ /**
12
+ * True when `content` is the pinned working-memory slot (header identity only).
13
+ * Shared with `compaction.ts` so the survival guard re-pins by the SAME rule.
14
+ */
15
+ export function isWorkingMemoryMessage(content) {
16
+ return typeof content === 'string' && content.startsWith(WORKING_MEMORY_HEADER);
17
+ }
18
+ /**
19
+ * Resolve the host's working-memory string and rewrite a single PINNED leading
20
+ * system message in place. Insert-or-replace keyed by {@link WORKING_MEMORY_HEADER};
21
+ * an empty/blank string removes the slot.
22
+ *
23
+ * The slot is an EPHEMERAL system message placed as the LAST leading system
24
+ * message (after the cached static + dynamic system messages), so it never
25
+ * busts the prompt-cache prefix yet still rides inside the compaction-preserved
26
+ * leading-system run (the primacy edge Lost-in-the-Middle / Context-Rot need).
27
+ *
28
+ * Failure-isolated (the `web-search` seam rule): a throwing/slow provider
29
+ * degrades to "no refresh this turn" (keeps the prior slot), never breaks the
30
+ * run. Early-returns when no provider is configured ⇒ byte-identical run path.
31
+ */
32
+ export async function refreshWorkingMemory(ctx) {
33
+ const provider = ctx.workingMemoryProvider;
34
+ if (!provider)
35
+ return;
36
+ let block;
37
+ try {
38
+ block =
39
+ (await provider({
40
+ runId: ctx.runMgr.id,
41
+ iteration: ctx.runMgr.currentIteration,
42
+ })) ?? '';
43
+ }
44
+ catch (err) {
45
+ ctx.log.warn('workingMemoryProvider failed; keeping prior slot', {
46
+ runId: ctx.runMgr.id,
47
+ error: err instanceof Error ? err.message : String(err),
48
+ });
49
+ return;
50
+ }
51
+ const msgs = ctx.runMgr.messages;
52
+ // Bound the search to the LEADING system run (the compaction-preserved
53
+ // region). A working-memory header appearing later in the transcript (e.g.
54
+ // echoed by a tool result) must not be mistaken for the pinned slot.
55
+ let leadEnd = 0;
56
+ while (leadEnd < msgs.length && msgs[leadEnd]?.role === 'system')
57
+ leadEnd++;
58
+ let idx = -1;
59
+ for (let i = 0; i < leadEnd; i++) {
60
+ const m = msgs[i];
61
+ if (m && m.role === 'system' && isWorkingMemoryMessage(m.content)) {
62
+ idx = i;
63
+ break;
64
+ }
65
+ }
66
+ if (!block.trim()) {
67
+ // Empty block ⇒ remove the slot (byte-identical-when-empty).
68
+ if (idx >= 0)
69
+ msgs.splice(idx, 1);
70
+ return;
71
+ }
72
+ const wm = createSystemMessage(`${WORKING_MEMORY_HEADER}\n\n${block}`, 'ephemeral');
73
+ if (idx >= 0) {
74
+ msgs[idx] = wm;
75
+ }
76
+ else {
77
+ // Insert as the LAST leading system message (after static + dynamic).
78
+ msgs.splice(leadEnd, 0, wm);
79
+ }
80
+ }
81
+ //# sourceMappingURL=working-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"working-memory.js","sourceRoot":"","sources":["../../../../../src/runtime/query/iteration/phases/working-memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAA;AAGxE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,qBAAqB,GACjC,kFAAkF,CAAA;AAEnF;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAkC;IACxE,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAA;AAChF,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAqB;IAC/D,MAAM,QAAQ,GAAG,GAAG,CAAC,qBAAqB,CAAA;IAC1C,IAAI,CAAC,QAAQ;QAAE,OAAM;IAErB,IAAI,KAAa,CAAA;IACjB,IAAI,CAAC;QACJ,KAAK;YACJ,CAAC,MAAM,QAAQ,CAAC;gBACf,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE;gBACpB,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,gBAAgB;aACtC,CAAC,CAAC,IAAI,EAAE,CAAA;IACX,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,kDAAkD,EAAE;YAChE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE;YACpB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACvD,CAAC,CAAA;QACF,OAAM;IACP,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAA;IAEhC,uEAAuE;IACvE,2EAA2E;IAC3E,qEAAqE;IACrE,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,OAAO,OAAO,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAA;IAE3E,IAAI,GAAG,GAAG,CAAC,CAAC,CAAA;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,sBAAsB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;YACnE,GAAG,GAAG,CAAC,CAAA;YACP,MAAK;QACN,CAAC;IACF,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QACnB,6DAA6D;QAC7D,IAAI,GAAG,IAAI,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QACjC,OAAM;IACP,CAAC;IAED,MAAM,EAAE,GAAG,mBAAmB,CAAC,GAAG,qBAAqB,OAAO,KAAK,EAAE,EAAE,WAAW,CAAC,CAAA;IACnF,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;QACd,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAA;IACf,CAAC;SAAM,CAAC;QACP,sEAAsE;QACtE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IAC5B,CAAC;AACF,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { ChatCompletionResponse, LLMProvider } from '../../../types/provider/index.js';
2
+ import type { RunEvent } from '../../../types/run/index.js';
3
+ import type { Logger } from '../../../utils/logger.js';
4
+ import type { EmitEvent } from '../events.js';
5
+ export interface StreamingTurnResult {
6
+ response: ChatCompletionResponse;
7
+ messageId: import('../../../types/ids/index.js').MessageId;
8
+ }
9
+ /**
10
+ * Consume a provider's streaming response and emit the v3 RunEvent
11
+ * lifecycle natively (message_started → text_delta* + tool_input_*
12
+ * → message_completed). Returns the aggregated `ChatCompletionResponse`
13
+ * for downstream code that still expects the legacy shape (assistant
14
+ * message construction, working-state extraction, telemetry attribute
15
+ * stamping).
16
+ *
17
+ * Per-delta `emitEvent` calls are followed by a `drainPending()`
18
+ * yield so SSE consumers see live progress instead of a burst at
19
+ * end-of-message. The bus's ephemeral filter (D1) ensures these
20
+ * deltas never hit transcript.jsonl.
21
+ *
22
+ * Edge cases (codex A3, A4, A5):
23
+ * - Stream ends without `finishReason` (anthropic-sdk-typescript#842
24
+ * dropped message_stop): we still emit `message_completed` from a
25
+ * finally-style fall-through path with `stopReason: 'refusal'`.
26
+ * - `tool_input_delta` with no `toolUseId` registered yet: we drop
27
+ * the fragment and log a warning (proxies seen to misorder events).
28
+ * - `chunk.error`: when no tool input is recoverable, we surface as
29
+ * a thrown error after emitting the message_completed terminator so
30
+ * consumer cards still close. If a tool-use block was already open,
31
+ * we instead synthesize a tool call with runtime truncation metadata
32
+ * so the executor can return a model-readable retry hint.
33
+ */
34
+ export declare function streamProviderTurn(provider: LLMProvider, params: import('../../../types/provider/index.js').ChatCompletionParams, emitEvent: EmitEvent, drainPending: () => Generator<RunEvent>, runId: import('../../../types/ids/index.js').RunId, iteration: number, forceFinalize: boolean, log: Logger): AsyncGenerator<RunEvent, StreamingTurnResult>;
35
+ //# sourceMappingURL=stream-turn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-turn.d.ts","sourceRoot":"","sources":["../../../../src/runtime/query/iteration/stream-turn.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,sBAAsB,EACtB,WAAW,EAEX,MAAM,kCAAkC,CAAA;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAG3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAwB7C,MAAM,WAAW,mBAAmB;IACnC,QAAQ,EAAE,sBAAsB,CAAA;IAChC,SAAS,EAAE,OAAO,6BAA6B,EAAE,SAAS,CAAA;CAC1D;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAuB,kBAAkB,CACxC,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,OAAO,kCAAkC,EAAE,oBAAoB,EACvE,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,MAAM,SAAS,CAAC,QAAQ,CAAC,EACvC,KAAK,EAAE,OAAO,6BAA6B,EAAE,KAAK,EAClD,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,OAAO,EACtB,GAAG,EAAE,MAAM,GACT,cAAc,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAiU/C"}