@namzu/sdk 6.2.0 → 8.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 (251) hide show
  1. package/CHANGELOG.md +677 -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.map +1 -1
  6. package/dist/agents/SupervisorAgent.js +172 -158
  7. package/dist/agents/SupervisorAgent.js.map +1 -1
  8. package/dist/agents/__tests__/supervisor-inbox-scope.test.d.ts +2 -0
  9. package/dist/agents/__tests__/supervisor-inbox-scope.test.d.ts.map +1 -0
  10. package/dist/agents/__tests__/supervisor-inbox-scope.test.js +125 -0
  11. package/dist/agents/__tests__/supervisor-inbox-scope.test.js.map +1 -0
  12. package/dist/agents/runAgent.d.ts +19 -1
  13. package/dist/agents/runAgent.d.ts.map +1 -1
  14. package/dist/agents/runAgent.js +2 -0
  15. package/dist/agents/runAgent.js.map +1 -1
  16. package/dist/bridge/a2a/mapper.d.ts.map +1 -1
  17. package/dist/bridge/a2a/mapper.js +4 -0
  18. package/dist/bridge/a2a/mapper.js.map +1 -1
  19. package/dist/bridge/sse/mapper.d.ts.map +1 -1
  20. package/dist/bridge/sse/mapper.js +24 -0
  21. package/dist/bridge/sse/mapper.js.map +1 -1
  22. package/dist/connector/mcp/__tests__/positional-arrays.test.d.ts +2 -0
  23. package/dist/connector/mcp/__tests__/positional-arrays.test.d.ts.map +1 -0
  24. package/dist/connector/mcp/__tests__/positional-arrays.test.js +142 -0
  25. package/dist/connector/mcp/__tests__/positional-arrays.test.js.map +1 -0
  26. package/dist/connector/mcp/adapter.d.ts.map +1 -1
  27. package/dist/connector/mcp/adapter.js +123 -8
  28. package/dist/connector/mcp/adapter.js.map +1 -1
  29. package/dist/constants/agent/index.d.ts +5 -0
  30. package/dist/constants/agent/index.d.ts.map +1 -1
  31. package/dist/constants/agent/index.js +5 -0
  32. package/dist/constants/agent/index.js.map +1 -1
  33. package/dist/constants/plugin/index.d.ts +15 -0
  34. package/dist/constants/plugin/index.d.ts.map +1 -1
  35. package/dist/constants/plugin/index.js +15 -0
  36. package/dist/constants/plugin/index.js.map +1 -1
  37. package/dist/contracts/api.d.ts +1 -1
  38. package/dist/contracts/api.d.ts.map +1 -1
  39. package/dist/gateway/__tests__/completion-inbox.test.js +292 -2
  40. package/dist/gateway/__tests__/completion-inbox.test.js.map +1 -1
  41. package/dist/gateway/completion-inbox.d.ts +94 -6
  42. package/dist/gateway/completion-inbox.d.ts.map +1 -1
  43. package/dist/gateway/completion-inbox.js +235 -15
  44. package/dist/gateway/completion-inbox.js.map +1 -1
  45. package/dist/gateway/local.d.ts +11 -0
  46. package/dist/gateway/local.d.ts.map +1 -1
  47. package/dist/gateway/local.js +27 -1
  48. package/dist/gateway/local.js.map +1 -1
  49. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  50. package/dist/manager/agent/lifecycle.js +6 -0
  51. package/dist/manager/agent/lifecycle.js.map +1 -1
  52. package/dist/manager/run/persistence.d.ts +8 -0
  53. package/dist/manager/run/persistence.d.ts.map +1 -1
  54. package/dist/manager/run/persistence.js +12 -0
  55. package/dist/manager/run/persistence.js.map +1 -1
  56. package/dist/provider/thinking-support.d.ts +2 -1
  57. package/dist/provider/thinking-support.d.ts.map +1 -1
  58. package/dist/provider/thinking-support.js +14 -0
  59. package/dist/provider/thinking-support.js.map +1 -1
  60. package/dist/public-runtime.d.ts +1 -1
  61. package/dist/public-runtime.d.ts.map +1 -1
  62. package/dist/public-runtime.js +9 -1
  63. package/dist/public-runtime.js.map +1 -1
  64. package/dist/run/reporter.d.ts.map +1 -1
  65. package/dist/run/reporter.js +11 -0
  66. package/dist/run/reporter.js.map +1 -1
  67. package/dist/runtime/query/__tests__/completion-does-not-erase-the-answer.test.d.ts +2 -0
  68. package/dist/runtime/query/__tests__/completion-does-not-erase-the-answer.test.d.ts.map +1 -0
  69. package/dist/runtime/query/__tests__/completion-does-not-erase-the-answer.test.js +142 -0
  70. package/dist/runtime/query/__tests__/completion-does-not-erase-the-answer.test.js.map +1 -0
  71. package/dist/runtime/query/__tests__/completion-notification.test.js +414 -32
  72. package/dist/runtime/query/__tests__/completion-notification.test.js.map +1 -1
  73. package/dist/runtime/query/__tests__/context-size-on-the-wire.test.d.ts +2 -0
  74. package/dist/runtime/query/__tests__/context-size-on-the-wire.test.d.ts.map +1 -0
  75. package/dist/runtime/query/__tests__/context-size-on-the-wire.test.js +100 -0
  76. package/dist/runtime/query/__tests__/context-size-on-the-wire.test.js.map +1 -0
  77. package/dist/runtime/query/__tests__/context.test.js +18 -0
  78. package/dist/runtime/query/__tests__/context.test.js.map +1 -1
  79. package/dist/runtime/query/__tests__/effort-reaches-the-wire.test.d.ts +2 -0
  80. package/dist/runtime/query/__tests__/effort-reaches-the-wire.test.d.ts.map +1 -0
  81. package/dist/runtime/query/__tests__/effort-reaches-the-wire.test.js +118 -0
  82. package/dist/runtime/query/__tests__/effort-reaches-the-wire.test.js.map +1 -0
  83. package/dist/runtime/query/__tests__/tool-timeout.test.js +34 -0
  84. package/dist/runtime/query/__tests__/tool-timeout.test.js.map +1 -1
  85. package/dist/runtime/query/context.d.ts.map +1 -1
  86. package/dist/runtime/query/context.js +16 -1
  87. package/dist/runtime/query/context.js.map +1 -1
  88. package/dist/runtime/query/executor.d.ts.map +1 -1
  89. package/dist/runtime/query/executor.js +11 -1
  90. package/dist/runtime/query/executor.js.map +1 -1
  91. package/dist/runtime/query/guard.d.ts +28 -0
  92. package/dist/runtime/query/guard.d.ts.map +1 -1
  93. package/dist/runtime/query/guard.js +31 -0
  94. package/dist/runtime/query/guard.js.map +1 -1
  95. package/dist/runtime/query/iteration/__tests__/settle-grace.test.d.ts +2 -0
  96. package/dist/runtime/query/iteration/__tests__/settle-grace.test.d.ts.map +1 -0
  97. package/dist/runtime/query/iteration/__tests__/settle-grace.test.js +226 -0
  98. package/dist/runtime/query/iteration/__tests__/settle-grace.test.js.map +1 -0
  99. package/dist/runtime/query/iteration/index.d.ts +92 -0
  100. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  101. package/dist/runtime/query/iteration/index.js +818 -565
  102. package/dist/runtime/query/iteration/index.js.map +1 -1
  103. package/dist/runtime/query/iteration/phases/__tests__/compaction-declined.test.d.ts +2 -0
  104. package/dist/runtime/query/iteration/phases/__tests__/compaction-declined.test.d.ts.map +1 -0
  105. package/dist/runtime/query/iteration/phases/__tests__/compaction-declined.test.js +95 -0
  106. package/dist/runtime/query/iteration/phases/__tests__/compaction-declined.test.js.map +1 -0
  107. package/dist/runtime/query/iteration/phases/compaction.d.ts +34 -0
  108. package/dist/runtime/query/iteration/phases/compaction.d.ts.map +1 -1
  109. package/dist/runtime/query/iteration/phases/compaction.js +61 -4
  110. package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
  111. package/dist/telemetry/__tests__/model-call-span.test.js +22 -4
  112. package/dist/telemetry/__tests__/model-call-span.test.js.map +1 -1
  113. package/dist/telemetry/__tests__/span-closure.test.js +12 -5
  114. package/dist/telemetry/__tests__/span-closure.test.js.map +1 -1
  115. package/dist/tools/__tests__/untrusted-envelope.test.js +16 -0
  116. package/dist/tools/__tests__/untrusted-envelope.test.js.map +1 -1
  117. package/dist/tools/coordinator/__tests__/completion-delivery.test.js +117 -0
  118. package/dist/tools/coordinator/__tests__/completion-delivery.test.js.map +1 -1
  119. package/dist/tools/coordinator/__tests__/task-list.test.js +57 -0
  120. package/dist/tools/coordinator/__tests__/task-list.test.js.map +1 -1
  121. package/dist/tools/coordinator/__tests__/wait-with-idle-bound.test.d.ts +2 -0
  122. package/dist/tools/coordinator/__tests__/wait-with-idle-bound.test.d.ts.map +1 -0
  123. package/dist/tools/coordinator/__tests__/wait-with-idle-bound.test.js +193 -0
  124. package/dist/tools/coordinator/__tests__/wait-with-idle-bound.test.js.map +1 -0
  125. package/dist/tools/coordinator/index.d.ts +19 -0
  126. package/dist/tools/coordinator/index.d.ts.map +1 -1
  127. package/dist/tools/coordinator/index.js +191 -71
  128. package/dist/tools/coordinator/index.js.map +1 -1
  129. package/dist/tools/coordinator/wait-with-idle-bound.d.ts +66 -0
  130. package/dist/tools/coordinator/wait-with-idle-bound.d.ts.map +1 -0
  131. package/dist/tools/coordinator/wait-with-idle-bound.js +78 -0
  132. package/dist/tools/coordinator/wait-with-idle-bound.js.map +1 -0
  133. package/dist/tools/untrusted-envelope.d.ts.map +1 -1
  134. package/dist/tools/untrusted-envelope.js +9 -1
  135. package/dist/tools/untrusted-envelope.js.map +1 -1
  136. package/dist/types/agent/base.d.ts +16 -0
  137. package/dist/types/agent/base.d.ts.map +1 -1
  138. package/dist/types/agent/gateway.d.ts +41 -0
  139. package/dist/types/agent/gateway.d.ts.map +1 -1
  140. package/dist/types/agent/lifecycle-event.d.ts +9 -1
  141. package/dist/types/agent/lifecycle-event.d.ts.map +1 -1
  142. package/dist/types/agent/task.d.ts +5 -0
  143. package/dist/types/agent/task.d.ts.map +1 -1
  144. package/dist/types/hitl/index.d.ts +10 -0
  145. package/dist/types/hitl/index.d.ts.map +1 -1
  146. package/dist/types/hitl/index.js.map +1 -1
  147. package/dist/types/probe/registry.d.ts +6 -0
  148. package/dist/types/probe/registry.d.ts.map +1 -1
  149. package/dist/types/provider/interface.d.ts +35 -0
  150. package/dist/types/provider/interface.d.ts.map +1 -1
  151. package/dist/types/run/config.d.ts +25 -0
  152. package/dist/types/run/config.d.ts.map +1 -1
  153. package/dist/types/run/entity.d.ts +16 -0
  154. package/dist/types/run/entity.d.ts.map +1 -1
  155. package/dist/types/run/events.d.ts +75 -0
  156. package/dist/types/run/events.d.ts.map +1 -1
  157. package/dist/types/run/events.js.map +1 -1
  158. package/dist/types/run/prepare-step.d.ts +17 -2
  159. package/dist/types/run/prepare-step.d.ts.map +1 -1
  160. package/dist/types/verification/index.d.ts +98 -0
  161. package/dist/types/verification/index.d.ts.map +1 -1
  162. package/dist/types/verification/index.js +10 -0
  163. package/dist/types/verification/index.js.map +1 -1
  164. package/dist/utils/__tests__/abort-reason.test.d.ts +2 -0
  165. package/dist/utils/__tests__/abort-reason.test.d.ts.map +1 -0
  166. package/dist/utils/__tests__/abort-reason.test.js +48 -0
  167. package/dist/utils/__tests__/abort-reason.test.js.map +1 -0
  168. package/dist/utils/abort.d.ts +26 -0
  169. package/dist/utils/abort.d.ts.map +1 -1
  170. package/dist/utils/abort.js +34 -0
  171. package/dist/utils/abort.js.map +1 -1
  172. package/dist/verification/__tests__/argument-pattern.test.d.ts +2 -0
  173. package/dist/verification/__tests__/argument-pattern.test.d.ts.map +1 -0
  174. package/dist/verification/__tests__/argument-pattern.test.js +122 -0
  175. package/dist/verification/__tests__/argument-pattern.test.js.map +1 -0
  176. package/dist/verification/__tests__/rule-order-and-reason.test.d.ts +2 -0
  177. package/dist/verification/__tests__/rule-order-and-reason.test.d.ts.map +1 -0
  178. package/dist/verification/__tests__/rule-order-and-reason.test.js +126 -0
  179. package/dist/verification/__tests__/rule-order-and-reason.test.js.map +1 -0
  180. package/dist/verification/gate.d.ts +17 -1
  181. package/dist/verification/gate.d.ts.map +1 -1
  182. package/dist/verification/gate.js +102 -2
  183. package/dist/verification/gate.js.map +1 -1
  184. package/dist/verification/index.d.ts +1 -1
  185. package/dist/verification/index.d.ts.map +1 -1
  186. package/dist/verification/index.js +1 -1
  187. package/dist/verification/index.js.map +1 -1
  188. package/dist/verification/rules.d.ts.map +1 -1
  189. package/dist/verification/rules.js +27 -0
  190. package/dist/verification/rules.js.map +1 -1
  191. package/package.json +1 -1
  192. package/src/agents/ReactiveAgent.ts +5 -0
  193. package/src/agents/SupervisorAgent.ts +175 -162
  194. package/src/agents/__tests__/supervisor-inbox-scope.test.ts +149 -0
  195. package/src/agents/runAgent.ts +22 -1
  196. package/src/bridge/a2a/mapper.ts +4 -0
  197. package/src/bridge/sse/mapper.ts +25 -0
  198. package/src/connector/mcp/__tests__/positional-arrays.test.ts +183 -0
  199. package/src/connector/mcp/adapter.ts +131 -7
  200. package/src/constants/agent/index.ts +5 -0
  201. package/src/constants/plugin/index.ts +15 -0
  202. package/src/contracts/api.ts +1 -0
  203. package/src/gateway/__tests__/completion-inbox.test.ts +348 -2
  204. package/src/gateway/completion-inbox.ts +248 -16
  205. package/src/gateway/local.ts +26 -1
  206. package/src/manager/agent/lifecycle.ts +6 -0
  207. package/src/manager/run/persistence.ts +12 -0
  208. package/src/provider/thinking-support.ts +19 -2
  209. package/src/public-runtime.ts +9 -0
  210. package/src/run/reporter.ts +12 -0
  211. package/src/runtime/query/__tests__/completion-does-not-erase-the-answer.test.ts +163 -0
  212. package/src/runtime/query/__tests__/completion-notification.test.ts +486 -34
  213. package/src/runtime/query/__tests__/context-size-on-the-wire.test.ts +122 -0
  214. package/src/runtime/query/__tests__/context.test.ts +24 -0
  215. package/src/runtime/query/__tests__/effort-reaches-the-wire.test.ts +135 -0
  216. package/src/runtime/query/__tests__/tool-timeout.test.ts +38 -0
  217. package/src/runtime/query/context.ts +16 -1
  218. package/src/runtime/query/executor.ts +11 -1
  219. package/src/runtime/query/guard.ts +32 -0
  220. package/src/runtime/query/iteration/__tests__/settle-grace.test.ts +265 -0
  221. package/src/runtime/query/iteration/index.ts +906 -635
  222. package/src/runtime/query/iteration/phases/__tests__/compaction-declined.test.ts +124 -0
  223. package/src/runtime/query/iteration/phases/compaction.ts +83 -10
  224. package/src/telemetry/__tests__/model-call-span.test.ts +22 -5
  225. package/src/telemetry/__tests__/span-closure.test.ts +12 -5
  226. package/src/tools/__tests__/untrusted-envelope.test.ts +23 -0
  227. package/src/tools/coordinator/__tests__/completion-delivery.test.ts +147 -0
  228. package/src/tools/coordinator/__tests__/task-list.test.ts +72 -0
  229. package/src/tools/coordinator/__tests__/wait-with-idle-bound.test.ts +247 -0
  230. package/src/tools/coordinator/index.ts +205 -78
  231. package/src/tools/coordinator/wait-with-idle-bound.ts +142 -0
  232. package/src/tools/untrusted-envelope.ts +9 -1
  233. package/src/types/agent/base.ts +17 -0
  234. package/src/types/agent/gateway.ts +42 -0
  235. package/src/types/agent/lifecycle-event.ts +7 -0
  236. package/src/types/agent/task.ts +5 -0
  237. package/src/types/hitl/index.ts +10 -0
  238. package/src/types/probe/registry.ts +6 -0
  239. package/src/types/provider/interface.ts +39 -0
  240. package/src/types/run/config.ts +26 -0
  241. package/src/types/run/entity.ts +17 -0
  242. package/src/types/run/events.ts +75 -0
  243. package/src/types/run/prepare-step.ts +17 -2
  244. package/src/types/verification/index.ts +61 -0
  245. package/src/utils/__tests__/abort-reason.test.ts +56 -0
  246. package/src/utils/abort.ts +34 -0
  247. package/src/verification/__tests__/argument-pattern.test.ts +158 -0
  248. package/src/verification/__tests__/rule-order-and-reason.test.ts +149 -0
  249. package/src/verification/gate.ts +106 -3
  250. package/src/verification/index.ts +1 -1
  251. package/src/verification/rules.ts +28 -0
@@ -31,8 +31,18 @@ class ToolThenAnswerProvider {
31
31
  id = 'tool-then-answer';
32
32
  name = 'Tool Then Answer Provider';
33
33
  calls = 0;
34
- async *chatStream() {
34
+ /**
35
+ * What the model was actually SHOWN, turn by turn.
36
+ *
37
+ * `run.messages` proves a notification exists somewhere in the transcript.
38
+ * It does not prove the model ever saw it — a delivery that only happens on
39
+ * the way out satisfies the transcript and leaves the model with nothing to
40
+ * act on, which is the whole point of injecting mid-run.
41
+ */
42
+ requests = [];
43
+ async *chatStream(params) {
35
44
  this.calls += 1;
45
+ this.requests.push([...params.messages]);
36
46
  if (this.calls === 1) {
37
47
  yield {
38
48
  id: 'msg_1',
@@ -59,6 +69,39 @@ class ToolThenAnswerProvider {
59
69
  yield { id: 'msg_2', delta: {}, finishReason: 'stop', usage: ZERO_USAGE };
60
70
  }
61
71
  }
72
+ /** The same two turns, aimed at the tool the exit tests register. */
73
+ class CallsFinisherProvider {
74
+ id = 'calls-finisher';
75
+ name = 'Calls Finisher Provider';
76
+ calls = 0;
77
+ async *chatStream() {
78
+ this.calls += 1;
79
+ if (this.calls === 1) {
80
+ yield {
81
+ id: 'msg_1',
82
+ delta: {
83
+ toolCalls: [
84
+ {
85
+ index: 0,
86
+ id: 'toolu_finisher_1',
87
+ type: 'function',
88
+ function: { name: 'finisher', arguments: '{}' },
89
+ },
90
+ ],
91
+ },
92
+ };
93
+ yield {
94
+ id: 'msg_1',
95
+ delta: {},
96
+ finishReason: 'tool_calls',
97
+ usage: ZERO_USAGE,
98
+ };
99
+ return;
100
+ }
101
+ yield { id: 'msg_2', delta: { content: 'Done.' } };
102
+ yield { id: 'msg_2', delta: {}, finishReason: 'stop', usage: ZERO_USAGE };
103
+ }
104
+ }
62
105
  const noop = defineTool({
63
106
  name: 'noop',
64
107
  description: 'does nothing',
@@ -92,8 +135,9 @@ async function runWith(inbox) {
92
135
  workdirs.push(workingDirectory);
93
136
  const tools = new ToolRegistry();
94
137
  tools.register(noop);
138
+ const provider = new ToolThenAnswerProvider();
95
139
  const run = await drainQuery({
96
- provider: new ToolThenAnswerProvider(),
140
+ provider,
97
141
  tools,
98
142
  ...(inbox ? { completionInbox: inbox } : {}),
99
143
  agentId: 'agent_test',
@@ -112,57 +156,395 @@ async function runWith(inbox) {
112
156
  projectId: 'prj_completion',
113
157
  tenantId: 'tnt_completion',
114
158
  });
115
- return run.messages
116
- .filter((m) => m.role === 'user')
117
- .map((m) => (typeof m.content === 'string' ? m.content : JSON.stringify(m.content)));
159
+ return {
160
+ userMessages: run.messages
161
+ .filter((m) => m.role === 'user')
162
+ .map((m) => (typeof m.content === 'string' ? m.content : JSON.stringify(m.content))),
163
+ provider,
164
+ };
165
+ }
166
+ /** Settled before the turn ended, with nothing waiting on it. */
167
+ function inboxHolding(taskId, result) {
168
+ const inbox = new CompletionInbox();
169
+ // Said before the announcement because `create_task` says it on every
170
+ // launch: an inbox only hears about tasks its own run started, so a
171
+ // gateway shared between two supervisors cannot cross-deliver.
172
+ inbox.launched(taskId);
173
+ inbox.attach({
174
+ onTaskCompleted: (cb) => {
175
+ cb(completed(taskId, result));
176
+ return () => { };
177
+ },
178
+ getTask: () => undefined,
179
+ });
180
+ return inbox;
118
181
  }
119
182
  describe('an unclaimed completion reaches the transcript', () => {
120
183
  it('injects the notification as a user message the next turn can read', async () => {
121
- const inbox = new CompletionInbox();
122
- // Settled by a gateway before the turn ended, with nothing waiting on
123
- // it — the abandoned-launch case.
124
- inbox.attach({
125
- onTaskCompleted: (cb) => {
126
- cb(completed('tsk_late', 'the worker finished after the wait was abandoned'));
127
- return () => { };
128
- },
129
- });
130
- const userMessages = await runWith(inbox);
184
+ const inbox = inboxHolding('tsk_late', 'the worker finished after the wait was abandoned');
185
+ const { userMessages } = await runWith(inbox);
131
186
  const notification = userMessages.find((m) => m.includes('task-notification'));
132
187
  expect(notification).toBeDefined();
133
188
  expect(notification).toContain('tsk_late');
134
189
  expect(notification).toContain('the worker finished after the wait was abandoned');
135
190
  });
191
+ it('shows it to the model on the very next turn, not eventually', async () => {
192
+ // Three sites now drain this inbox — the post-tool-batch injection, the
193
+ // bounded hold on the final-answer turn, and the exit-time delivery —
194
+ // and all three put the same text in `run.messages`. So an assertion on
195
+ // the transcript, or on the LAST model request, passes whichever of the
196
+ // three did the work, and none of them is pinned.
197
+ //
198
+ // The one that matters is the injection right after the tool batch,
199
+ // because it is the only one that reaches the model while there is
200
+ // still work to redirect. Hence the SECOND request specifically: with
201
+ // that injection gone the notification still arrives, one turn later,
202
+ // via the hold — later is a different behaviour, and this is the
203
+ // assertion that can tell them apart.
204
+ const inbox = inboxHolding('tsk_late', 'THE WORKER SAID THIS');
205
+ const { provider } = await runWith(inbox);
206
+ const turnAfterTheToolBatch = provider.requests[1] ?? [];
207
+ expect(turnAfterTheToolBatch.some((m) => typeof m.content === 'string' && m.content.includes('THE WORKER SAID THIS')), 'the model was not shown the completion on the turn after the tool batch').toBe(true);
208
+ });
136
209
  it('drains it exactly once, however many turns follow', async () => {
137
- const inbox = new CompletionInbox();
138
- inbox.attach({
139
- onTaskCompleted: (cb) => {
140
- cb(completed('tsk_late', 'only once'));
141
- return () => { };
142
- },
143
- });
144
- const userMessages = await runWith(inbox);
210
+ const inbox = inboxHolding('tsk_late', 'only once');
211
+ const { userMessages } = await runWith(inbox);
145
212
  expect(userMessages.filter((m) => m.includes('task-notification'))).toHaveLength(1);
146
213
  });
147
214
  it('says nothing when every completion was already delivered', async () => {
148
215
  // The `dc16d58` regression at the loop level: a blocking `create_task`
149
216
  // claims its own completion, so the transcript must stay clean.
150
- const inbox = new CompletionInbox();
151
- inbox.attach({
152
- onTaskCompleted: (cb) => {
153
- cb(completed('tsk_awaited', 'delivered as a tool_result'));
154
- return () => { };
155
- },
156
- });
217
+ const inbox = inboxHolding('tsk_awaited', 'delivered as a tool_result');
157
218
  inbox.claim('tsk_awaited');
158
- const userMessages = await runWith(inbox);
219
+ const { userMessages } = await runWith(inbox);
159
220
  expect(userMessages.some((m) => m.includes('task-notification'))).toBe(false);
160
221
  });
161
222
  it('runs unchanged with no inbox at all', async () => {
162
223
  // The kernel must not require one: a host on the old wiring keeps
163
224
  // working, it just never hears about abandoned completions.
164
- const userMessages = await runWith(undefined);
225
+ const { userMessages } = await runWith(undefined);
165
226
  expect(userMessages.some((m) => m.includes('task-notification'))).toBe(false);
166
227
  });
167
228
  });
229
+ /**
230
+ * The exits that are not the ordinary final answer.
231
+ *
232
+ * The inbox was consulted at exactly one site, inside the no-tool-calls branch.
233
+ * The loop leaves by eight other routes, and three of them are ways a run
234
+ * legitimately ENDS: a tool the author declared terminal, a captured structured
235
+ * output, and the host's `stopWhen`. A worker that finished while any of those
236
+ * was deciding had its output dropped on the floor — the gateway held the
237
+ * result, the run closed, and nothing ever read it.
238
+ *
239
+ * These drive `drainQuery` rather than the helper directly, and that is the
240
+ * point: the delivery happens in the loop, so a unit test on the inbox proves
241
+ * nothing about whether the loop reaches it.
242
+ */
243
+ describe('a run that ends some other way still hands over what finished', () => {
244
+ async function runEndingWith(options) {
245
+ const workingDirectory = await mkdtemp(join(tmpdir(), 'namzu-completion-exit-'));
246
+ workdirs.push(workingDirectory);
247
+ const inbox = new CompletionInbox();
248
+ inbox.launched('tsk_bg');
249
+ let announce;
250
+ inbox.attach({
251
+ onTaskCompleted: (cb) => {
252
+ announce = cb;
253
+ return () => {
254
+ announce = undefined;
255
+ };
256
+ },
257
+ getTask: () => undefined,
258
+ });
259
+ // Settles from inside the tool call, so the completion is in hand
260
+ // BEFORE the exit is decided. The question under test is which exits
261
+ // hand it over, not whether the wait works.
262
+ const finisher = defineTool({
263
+ name: 'finisher',
264
+ description: 'the worker finishes while this runs',
265
+ inputSchema: z.object({}),
266
+ category: 'analysis',
267
+ permissions: [],
268
+ readOnly: true,
269
+ destructive: false,
270
+ concurrencySafe: true,
271
+ ...(options.terminal ? { terminal: true } : {}),
272
+ async execute() {
273
+ announce?.(completed('tsk_bg', 'THE BACKGROUND WORKER RESULT'));
274
+ return { success: true, output: 'this call is the answer' };
275
+ },
276
+ });
277
+ const tools = new ToolRegistry();
278
+ tools.register(finisher);
279
+ const run = await drainQuery({
280
+ provider: new CallsFinisherProvider(),
281
+ tools,
282
+ completionInbox: inbox,
283
+ agentId: 'agent_test',
284
+ agentName: 'Test Agent',
285
+ messages: [createUserMessage('delegate and report')],
286
+ workingDirectory,
287
+ ...(options.stopWhen ? { stopWhen: () => true } : {}),
288
+ runConfig: {
289
+ model: 'mock-model',
290
+ timeoutMs: 10_000,
291
+ tokenBudget: 100_000,
292
+ maxIterations: 4,
293
+ maxResponseTokens: 256,
294
+ },
295
+ sessionId: 'ses_completion',
296
+ threadId: 'thd_completion',
297
+ projectId: 'prj_completion',
298
+ tenantId: 'tnt_completion',
299
+ });
300
+ return {
301
+ userMessages: run.messages
302
+ .filter((m) => m.role === 'user')
303
+ .map((m) => (typeof m.content === 'string' ? m.content : JSON.stringify(m.content))),
304
+ run,
305
+ };
306
+ }
307
+ it('a terminal tool settles the run without discarding the worker', async () => {
308
+ const { userMessages } = await runEndingWith({ terminal: true });
309
+ expect(userMessages.some((m) => m.includes('THE BACKGROUND WORKER RESULT')), 'the terminal-tool exit dropped a finished completion').toBe(true);
310
+ });
311
+ it("the host's stopWhen ends the run without discarding it either", async () => {
312
+ const { userMessages } = await runEndingWith({ stopWhen: true });
313
+ expect(userMessages.some((m) => m.includes('THE BACKGROUND WORKER RESULT')), 'the stopWhen exit dropped a finished completion').toBe(true);
314
+ });
315
+ it('lets a worker that has not arrived yet outrank the host stop predicate, once', async () => {
316
+ // A chosen precedence, not something `stopWhen` implies. A stop
317
+ // predicate is a programmable halt that says nothing about whether the
318
+ // answer is complete — unlike a terminal tool or a captured structured
319
+ // output, which decide the result and leave no turn to use anything in.
320
+ // So this one waits, delivers, and gives the model the turn; the
321
+ // predicate fires again next turn with nothing pending and stops. One
322
+ // extra turn, bounded.
323
+ const workingDirectory = await mkdtemp(join(tmpdir(), 'namzu-stopwhen-hold-'));
324
+ workdirs.push(workingDirectory);
325
+ const inbox = new CompletionInbox();
326
+ let announce;
327
+ inbox.attach({
328
+ onTaskCompleted: (cb) => {
329
+ announce = cb;
330
+ return () => {
331
+ announce = undefined;
332
+ };
333
+ },
334
+ getTask: () => undefined,
335
+ });
336
+ // OUTSTANDING, not arrived: the exit-time delivery has nothing to hand
337
+ // over, so only a hold can produce this result.
338
+ inbox.expect('tsk_slow');
339
+ const tools = new ToolRegistry();
340
+ tools.register(defineTool({
341
+ name: 'finisher',
342
+ description: 'the worker is still going when this returns',
343
+ inputSchema: z.object({}),
344
+ category: 'analysis',
345
+ permissions: [],
346
+ readOnly: true,
347
+ destructive: false,
348
+ concurrencySafe: true,
349
+ async execute() {
350
+ setTimeout(() => announce?.(completed('tsk_slow', 'LATE WORKER RESULT')), 20).unref?.();
351
+ return { success: true, output: 'launched' };
352
+ },
353
+ }));
354
+ const provider = new CallsFinisherProvider();
355
+ const run = await drainQuery({
356
+ provider,
357
+ tools,
358
+ completionInbox: inbox,
359
+ agentId: 'agent_test',
360
+ agentName: 'Test Agent',
361
+ messages: [createUserMessage('go')],
362
+ workingDirectory,
363
+ stopWhen: () => true,
364
+ runConfig: {
365
+ model: 'mock-model',
366
+ timeoutMs: 20_000,
367
+ tokenBudget: 100_000,
368
+ maxIterations: 4,
369
+ maxResponseTokens: 256,
370
+ },
371
+ sessionId: 'ses_completion',
372
+ threadId: 'thd_completion',
373
+ projectId: 'prj_completion',
374
+ tenantId: 'tnt_completion',
375
+ });
376
+ const userText = run.messages
377
+ .filter((m) => m.role === 'user')
378
+ .map((m) => (typeof m.content === 'string' ? m.content : ''));
379
+ expect(userText.some((m) => m.includes('LATE WORKER RESULT')), 'the stop predicate discarded a worker that had not landed yet').toBe(true);
380
+ // The extra turn is the point: the model was asked again, once.
381
+ expect(provider.calls, 'the model never got a turn to use the result').toBe(2);
382
+ // And the run says WHY it is over. The extra turn is prose, and
383
+ // `stopWhen` is consulted only after a tool batch — deliberately, so a
384
+ // predicate can see what the tools returned — so the predicate is never
385
+ // asked again and the run leaves by the ordinary route. Reporting
386
+ // `end_turn` there would name the shape of the last message rather than
387
+ // the host's decision, and this repo carries thirteen `StopReason`
388
+ // values precisely so a run that ends for a nameable reason names it.
389
+ expect(run.stopReason).toBe('stop_condition');
390
+ }, 60_000);
391
+ it('forgets the deferral if the extra turn did not end the run', async () => {
392
+ // The lifetime is the whole safety of the flag. It is set at the end of
393
+ // one iteration and read by the next, and the next clears it whether or
394
+ // not anything read it — so a deferral cannot colour a stop reason two
395
+ // turns later, when the predicate has since been asked again and said
396
+ // no. A flag that outlived its continuation would put `stop_condition`
397
+ // on a run the host had stopped asking to stop.
398
+ const workingDirectory = await mkdtemp(join(tmpdir(), 'namzu-defer-life-'));
399
+ workdirs.push(workingDirectory);
400
+ const inbox = new CompletionInbox();
401
+ let announce;
402
+ inbox.attach({
403
+ onTaskCompleted: (cb) => {
404
+ announce = cb;
405
+ return () => {
406
+ announce = undefined;
407
+ };
408
+ },
409
+ getTask: () => undefined,
410
+ });
411
+ inbox.expect('tsk_slow');
412
+ const tools = new ToolRegistry();
413
+ tools.register(defineTool({
414
+ name: 'finisher',
415
+ description: 'launches, then does nothing',
416
+ inputSchema: z.object({}),
417
+ category: 'analysis',
418
+ permissions: [],
419
+ readOnly: true,
420
+ destructive: false,
421
+ concurrencySafe: true,
422
+ async execute() {
423
+ setTimeout(() => announce?.(completed('tsk_slow', 'LATE RESULT')), 20).unref?.();
424
+ return { success: true, output: 'ok' };
425
+ },
426
+ }));
427
+ /** Tool, tool, prose — so the predicate is asked twice. */
428
+ class ToolToolProse {
429
+ id = 'tool-tool-prose';
430
+ name = 'Tool Tool Prose';
431
+ calls = 0;
432
+ async *chatStream() {
433
+ this.calls += 1;
434
+ if (this.calls <= 2) {
435
+ yield {
436
+ id: `m${this.calls}`,
437
+ delta: {
438
+ toolCalls: [
439
+ {
440
+ index: 0,
441
+ id: `toolu_${this.calls}`,
442
+ type: 'function',
443
+ function: { name: 'finisher', arguments: '{}' },
444
+ },
445
+ ],
446
+ },
447
+ };
448
+ yield { id: `m${this.calls}`, delta: {}, finishReason: 'tool_calls', usage: ZERO_USAGE };
449
+ return;
450
+ }
451
+ yield { id: 'm3', delta: { content: 'Done.' } };
452
+ yield { id: 'm3', delta: {}, finishReason: 'stop', usage: ZERO_USAGE };
453
+ }
454
+ }
455
+ // True once — the deferral — then never again.
456
+ let asked = 0;
457
+ const run = await drainQuery({
458
+ provider: new ToolToolProse(),
459
+ tools,
460
+ completionInbox: inbox,
461
+ agentId: 'agent_test',
462
+ agentName: 'Test Agent',
463
+ messages: [createUserMessage('go')],
464
+ workingDirectory,
465
+ stopWhen: () => ++asked === 1,
466
+ runConfig: {
467
+ model: 'mock-model',
468
+ timeoutMs: 20_000,
469
+ tokenBudget: 100_000,
470
+ maxIterations: 6,
471
+ maxResponseTokens: 256,
472
+ },
473
+ sessionId: 'ses_completion',
474
+ threadId: 'thd_completion',
475
+ projectId: 'prj_completion',
476
+ tenantId: 'tnt_completion',
477
+ });
478
+ expect(asked, 'the predicate was never asked a second time').toBeGreaterThan(1);
479
+ expect(run.stopReason, 'a spent deferral coloured a later stop reason').toBe('end_turn');
480
+ }, 60_000);
481
+ it('names the work it walked away from, without cancelling it', async () => {
482
+ // The other half of the principle. Delivering what arrived is honest;
483
+ // staying silent about what did not is the false impression the whole
484
+ // mechanism exists to prevent. Naming rather than cancelling, because
485
+ // "the parent answered early" is a weaker warrant for killing a child
486
+ // than "the clock ran out" — and this subsystem already ruled that the
487
+ // clock does not license it.
488
+ const workingDirectory = await mkdtemp(join(tmpdir(), 'namzu-abandoned-'));
489
+ workdirs.push(workingDirectory);
490
+ const inbox = new CompletionInbox();
491
+ inbox.attach({ onTaskCompleted: () => () => { }, getTask: () => undefined });
492
+ // Launched, never settles, and the terminal tool ends the run over it.
493
+ inbox.expect('tsk_still_running');
494
+ const tools = new ToolRegistry();
495
+ tools.register(defineTool({
496
+ name: 'finisher',
497
+ description: 'ends the run',
498
+ inputSchema: z.object({}),
499
+ category: 'analysis',
500
+ permissions: [],
501
+ readOnly: true,
502
+ destructive: false,
503
+ concurrencySafe: true,
504
+ terminal: true,
505
+ async execute() {
506
+ return { success: true, output: 'this call is the answer' };
507
+ },
508
+ }));
509
+ const run = await drainQuery({
510
+ provider: new CallsFinisherProvider(),
511
+ tools,
512
+ completionInbox: inbox,
513
+ agentId: 'agent_test',
514
+ agentName: 'Test Agent',
515
+ messages: [createUserMessage('go')],
516
+ workingDirectory,
517
+ runConfig: {
518
+ model: 'mock-model',
519
+ timeoutMs: 10_000,
520
+ tokenBudget: 100_000,
521
+ maxIterations: 4,
522
+ maxResponseTokens: 256,
523
+ },
524
+ sessionId: 'ses_completion',
525
+ threadId: 'thd_completion',
526
+ projectId: 'prj_completion',
527
+ tenantId: 'tnt_completion',
528
+ });
529
+ expect(run.abandonedTaskIds, 'the run said nothing about the worker it left running').toEqual([
530
+ 'tsk_still_running',
531
+ ]);
532
+ // Named, not stopped: the inbox still counts it as outstanding, and
533
+ // nothing asked the gateway to cancel anything.
534
+ expect(inbox.outstandingTaskIds).toEqual(['tsk_still_running']);
535
+ });
536
+ it('leaves the field absent when the run walked away from nothing', async () => {
537
+ // A field that is always present says nothing; one that appears only
538
+ // when there is something to report is a signal a host can branch on.
539
+ const { run } = await runEndingWith({ terminal: true });
540
+ expect(run.abandonedTaskIds).toBeUndefined();
541
+ });
542
+ it('hands it over exactly once when the ordinary exit already did', async () => {
543
+ // The `dc16d58` failure in a new place: an exit-time delivery that
544
+ // re-sends what the in-loop drain already sent is the duplicate bug
545
+ // again. `drain()` empties, so the second call finds nothing.
546
+ const { userMessages } = await runEndingWith({});
547
+ expect(userMessages.filter((m) => m.includes('THE BACKGROUND WORKER RESULT'))).toHaveLength(1);
548
+ });
549
+ });
168
550
  //# sourceMappingURL=completion-notification.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"completion-notification.test.js","sourceRoot":"","sources":["../../../../src/runtime/query/__tests__/completion-notification.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"completion-notification.test.js","sourceRoot":"","sources":["../../../../src/runtime/query/__tests__/completion-notification.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=context-size-on-the-wire.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-size-on-the-wire.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime/query/__tests__/context-size-on-the-wire.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,100 @@
1
+ import { mkdtemp, rm } from 'node:fs/promises';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { afterEach, describe, expect, it } from 'vitest';
5
+ import { MockLLMProvider } from '../../../provider/mock.js';
6
+ import { ToolRegistry } from '../../../registry/tool/execute.js';
7
+ import { createUserMessage } from '../../../types/message/index.js';
8
+ import { drainQuery } from '../index.js';
9
+ /**
10
+ * Cumulative spend and current context size are different quantities, and a
11
+ * host divided the first by a context window and shipped it.
12
+ *
13
+ * That indicator climbed toward full on any long run no matter how much room
14
+ * the conversation actually had — most wrong exactly when someone needed it —
15
+ * because `usage` is summed over every turn and never falls, while the context
16
+ * is what is being sent right now and falls whenever a compaction sheds.
17
+ *
18
+ * The host had no better option: the correct numerator needs internals it
19
+ * cannot see, and the correct denominator was a two-branch guess on a model
20
+ * name. So both numbers are on the event, named so that reaching for the wrong
21
+ * one is a visible mistake rather than a plausible guess.
22
+ */
23
+ let workdirs = [];
24
+ afterEach(async () => {
25
+ await Promise.all(workdirs.map((d) => rm(d, { recursive: true, force: true })));
26
+ workdirs = [];
27
+ });
28
+ async function run(compaction, turns) {
29
+ const seen = [];
30
+ const dir = await mkdtemp(join(tmpdir(), 'namzu-ctxsize-'));
31
+ workdirs.push(dir);
32
+ await drainQuery({
33
+ provider: new MockLLMProvider({ turns: turns }),
34
+ tools: new ToolRegistry(),
35
+ runConfig: { model: 'mock-model', timeoutMs: 30_000, tokenBudget: 100_000, maxIterations: 3 },
36
+ ...(compaction ? { compactionConfig: compaction } : {}),
37
+ agentId: 'agent_ctx',
38
+ agentName: 'Context Agent',
39
+ workingDirectory: dir,
40
+ sessionId: 'ses_ctx',
41
+ threadId: 'thd_ctx',
42
+ projectId: 'prj_ctx',
43
+ tenantId: 'tnt_ctx',
44
+ messages: [createUserMessage('go')],
45
+ }, (event) => {
46
+ if (event.type === 'token_usage_updated')
47
+ seen.push(event);
48
+ });
49
+ return seen;
50
+ }
51
+ const COMPACTION = {
52
+ strategy: 'sliding-window',
53
+ triggerThreshold: 0.9,
54
+ contextWindowTokens: 50_000,
55
+ keepRecentMessages: 4,
56
+ };
57
+ describe('a run reports how much room its context has', () => {
58
+ it('carries the context size and the window together', async () => {
59
+ const events = await run(COMPACTION, [{ text: 'done' }]);
60
+ expect(events.length).toBeGreaterThan(0);
61
+ const event = events[0];
62
+ expect(event.contextTokens).toBeGreaterThan(0);
63
+ expect(event.contextWindowTokens).toBe(50_000);
64
+ });
65
+ it('says whether each number was measured or guessed', async () => {
66
+ // A fraction is only as honest as the weaker of its two terms, so a
67
+ // surface rendering these owes a reader the distinction. It cannot
68
+ // pass it on if it never receives it.
69
+ const event = (await run(COMPACTION, [{ text: 'done' }]))[0];
70
+ expect(['provider', 'estimate']).toContain(event.contextMeasuredBy);
71
+ // The window was stated in config here, so its provenance is not a guess.
72
+ expect(event.windowSource).toBe('config');
73
+ });
74
+ it('keeps the context size distinct from cumulative spend', async () => {
75
+ // The whole defect in one assertion, and this driver demonstrates it
76
+ // more sharply than a real one would: it reports no usage at all, so
77
+ // cumulative spend stays at zero while the context genuinely fills.
78
+ //
79
+ // A surface dividing spend by a window would show 0% here, for a
80
+ // conversation that is really there. The same surface on a long run
81
+ // shows 100% for a conversation that was compacted down to nothing.
82
+ // Both directions, same category error — which is why the two numbers
83
+ // are reported separately rather than left to be inferred from each
84
+ // other.
85
+ const events = await run(COMPACTION, [{ text: 'one' }, { text: 'two' }]);
86
+ const last = events[events.length - 1];
87
+ expect(last.contextTokens).toBeGreaterThan(0);
88
+ expect(last.contextTokens).not.toBe(last.usage.totalTokens);
89
+ });
90
+ it('reports nothing rather than a guess when no window is configured', async () => {
91
+ // Without a compaction config nothing resolves a window, and inventing
92
+ // one would be the guess this replaces. Absent is a fact a surface can
93
+ // act on; a fabricated default is not.
94
+ const event = (await run(undefined, [{ text: 'done' }]))[0];
95
+ expect(event.contextTokens).toBeUndefined();
96
+ expect(event.contextWindowTokens).toBeUndefined();
97
+ expect(event.windowSource).toBeUndefined();
98
+ });
99
+ });
100
+ //# sourceMappingURL=context-size-on-the-wire.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-size-on-the-wire.test.js","sourceRoot":"","sources":["../../../../src/runtime/query/__tests__/context-size-on-the-wire.test.ts"],"names":[],"mappings":"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"}