@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.
- package/CHANGELOG.md +677 -0
- package/dist/agents/ReactiveAgent.d.ts.map +1 -1
- package/dist/agents/ReactiveAgent.js +5 -0
- package/dist/agents/ReactiveAgent.js.map +1 -1
- package/dist/agents/SupervisorAgent.d.ts.map +1 -1
- package/dist/agents/SupervisorAgent.js +172 -158
- package/dist/agents/SupervisorAgent.js.map +1 -1
- package/dist/agents/__tests__/supervisor-inbox-scope.test.d.ts +2 -0
- package/dist/agents/__tests__/supervisor-inbox-scope.test.d.ts.map +1 -0
- package/dist/agents/__tests__/supervisor-inbox-scope.test.js +125 -0
- package/dist/agents/__tests__/supervisor-inbox-scope.test.js.map +1 -0
- package/dist/agents/runAgent.d.ts +19 -1
- package/dist/agents/runAgent.d.ts.map +1 -1
- package/dist/agents/runAgent.js +2 -0
- package/dist/agents/runAgent.js.map +1 -1
- package/dist/bridge/a2a/mapper.d.ts.map +1 -1
- package/dist/bridge/a2a/mapper.js +4 -0
- package/dist/bridge/a2a/mapper.js.map +1 -1
- package/dist/bridge/sse/mapper.d.ts.map +1 -1
- package/dist/bridge/sse/mapper.js +24 -0
- package/dist/bridge/sse/mapper.js.map +1 -1
- package/dist/connector/mcp/__tests__/positional-arrays.test.d.ts +2 -0
- package/dist/connector/mcp/__tests__/positional-arrays.test.d.ts.map +1 -0
- package/dist/connector/mcp/__tests__/positional-arrays.test.js +142 -0
- package/dist/connector/mcp/__tests__/positional-arrays.test.js.map +1 -0
- package/dist/connector/mcp/adapter.d.ts.map +1 -1
- package/dist/connector/mcp/adapter.js +123 -8
- package/dist/connector/mcp/adapter.js.map +1 -1
- package/dist/constants/agent/index.d.ts +5 -0
- package/dist/constants/agent/index.d.ts.map +1 -1
- package/dist/constants/agent/index.js +5 -0
- package/dist/constants/agent/index.js.map +1 -1
- package/dist/constants/plugin/index.d.ts +15 -0
- package/dist/constants/plugin/index.d.ts.map +1 -1
- package/dist/constants/plugin/index.js +15 -0
- package/dist/constants/plugin/index.js.map +1 -1
- package/dist/contracts/api.d.ts +1 -1
- package/dist/contracts/api.d.ts.map +1 -1
- package/dist/gateway/__tests__/completion-inbox.test.js +292 -2
- package/dist/gateway/__tests__/completion-inbox.test.js.map +1 -1
- package/dist/gateway/completion-inbox.d.ts +94 -6
- package/dist/gateway/completion-inbox.d.ts.map +1 -1
- package/dist/gateway/completion-inbox.js +235 -15
- package/dist/gateway/completion-inbox.js.map +1 -1
- package/dist/gateway/local.d.ts +11 -0
- package/dist/gateway/local.d.ts.map +1 -1
- package/dist/gateway/local.js +27 -1
- package/dist/gateway/local.js.map +1 -1
- package/dist/manager/agent/lifecycle.d.ts.map +1 -1
- package/dist/manager/agent/lifecycle.js +6 -0
- package/dist/manager/agent/lifecycle.js.map +1 -1
- package/dist/manager/run/persistence.d.ts +8 -0
- package/dist/manager/run/persistence.d.ts.map +1 -1
- package/dist/manager/run/persistence.js +12 -0
- package/dist/manager/run/persistence.js.map +1 -1
- package/dist/provider/thinking-support.d.ts +2 -1
- package/dist/provider/thinking-support.d.ts.map +1 -1
- package/dist/provider/thinking-support.js +14 -0
- package/dist/provider/thinking-support.js.map +1 -1
- package/dist/public-runtime.d.ts +1 -1
- package/dist/public-runtime.d.ts.map +1 -1
- package/dist/public-runtime.js +9 -1
- package/dist/public-runtime.js.map +1 -1
- package/dist/run/reporter.d.ts.map +1 -1
- package/dist/run/reporter.js +11 -0
- package/dist/run/reporter.js.map +1 -1
- package/dist/runtime/query/__tests__/completion-does-not-erase-the-answer.test.d.ts +2 -0
- package/dist/runtime/query/__tests__/completion-does-not-erase-the-answer.test.d.ts.map +1 -0
- package/dist/runtime/query/__tests__/completion-does-not-erase-the-answer.test.js +142 -0
- package/dist/runtime/query/__tests__/completion-does-not-erase-the-answer.test.js.map +1 -0
- package/dist/runtime/query/__tests__/completion-notification.test.js +414 -32
- package/dist/runtime/query/__tests__/completion-notification.test.js.map +1 -1
- package/dist/runtime/query/__tests__/context-size-on-the-wire.test.d.ts +2 -0
- package/dist/runtime/query/__tests__/context-size-on-the-wire.test.d.ts.map +1 -0
- package/dist/runtime/query/__tests__/context-size-on-the-wire.test.js +100 -0
- package/dist/runtime/query/__tests__/context-size-on-the-wire.test.js.map +1 -0
- package/dist/runtime/query/__tests__/context.test.js +18 -0
- package/dist/runtime/query/__tests__/context.test.js.map +1 -1
- package/dist/runtime/query/__tests__/effort-reaches-the-wire.test.d.ts +2 -0
- package/dist/runtime/query/__tests__/effort-reaches-the-wire.test.d.ts.map +1 -0
- package/dist/runtime/query/__tests__/effort-reaches-the-wire.test.js +118 -0
- package/dist/runtime/query/__tests__/effort-reaches-the-wire.test.js.map +1 -0
- package/dist/runtime/query/__tests__/tool-timeout.test.js +34 -0
- package/dist/runtime/query/__tests__/tool-timeout.test.js.map +1 -1
- package/dist/runtime/query/context.d.ts.map +1 -1
- package/dist/runtime/query/context.js +16 -1
- package/dist/runtime/query/context.js.map +1 -1
- package/dist/runtime/query/executor.d.ts.map +1 -1
- package/dist/runtime/query/executor.js +11 -1
- package/dist/runtime/query/executor.js.map +1 -1
- package/dist/runtime/query/guard.d.ts +28 -0
- package/dist/runtime/query/guard.d.ts.map +1 -1
- package/dist/runtime/query/guard.js +31 -0
- package/dist/runtime/query/guard.js.map +1 -1
- package/dist/runtime/query/iteration/__tests__/settle-grace.test.d.ts +2 -0
- package/dist/runtime/query/iteration/__tests__/settle-grace.test.d.ts.map +1 -0
- package/dist/runtime/query/iteration/__tests__/settle-grace.test.js +226 -0
- package/dist/runtime/query/iteration/__tests__/settle-grace.test.js.map +1 -0
- package/dist/runtime/query/iteration/index.d.ts +92 -0
- package/dist/runtime/query/iteration/index.d.ts.map +1 -1
- package/dist/runtime/query/iteration/index.js +818 -565
- package/dist/runtime/query/iteration/index.js.map +1 -1
- package/dist/runtime/query/iteration/phases/__tests__/compaction-declined.test.d.ts +2 -0
- package/dist/runtime/query/iteration/phases/__tests__/compaction-declined.test.d.ts.map +1 -0
- package/dist/runtime/query/iteration/phases/__tests__/compaction-declined.test.js +95 -0
- package/dist/runtime/query/iteration/phases/__tests__/compaction-declined.test.js.map +1 -0
- package/dist/runtime/query/iteration/phases/compaction.d.ts +34 -0
- package/dist/runtime/query/iteration/phases/compaction.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/compaction.js +61 -4
- package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
- package/dist/telemetry/__tests__/model-call-span.test.js +22 -4
- package/dist/telemetry/__tests__/model-call-span.test.js.map +1 -1
- package/dist/telemetry/__tests__/span-closure.test.js +12 -5
- package/dist/telemetry/__tests__/span-closure.test.js.map +1 -1
- package/dist/tools/__tests__/untrusted-envelope.test.js +16 -0
- package/dist/tools/__tests__/untrusted-envelope.test.js.map +1 -1
- package/dist/tools/coordinator/__tests__/completion-delivery.test.js +117 -0
- package/dist/tools/coordinator/__tests__/completion-delivery.test.js.map +1 -1
- package/dist/tools/coordinator/__tests__/task-list.test.js +57 -0
- package/dist/tools/coordinator/__tests__/task-list.test.js.map +1 -1
- package/dist/tools/coordinator/__tests__/wait-with-idle-bound.test.d.ts +2 -0
- package/dist/tools/coordinator/__tests__/wait-with-idle-bound.test.d.ts.map +1 -0
- package/dist/tools/coordinator/__tests__/wait-with-idle-bound.test.js +193 -0
- package/dist/tools/coordinator/__tests__/wait-with-idle-bound.test.js.map +1 -0
- package/dist/tools/coordinator/index.d.ts +19 -0
- package/dist/tools/coordinator/index.d.ts.map +1 -1
- package/dist/tools/coordinator/index.js +191 -71
- package/dist/tools/coordinator/index.js.map +1 -1
- package/dist/tools/coordinator/wait-with-idle-bound.d.ts +66 -0
- package/dist/tools/coordinator/wait-with-idle-bound.d.ts.map +1 -0
- package/dist/tools/coordinator/wait-with-idle-bound.js +78 -0
- package/dist/tools/coordinator/wait-with-idle-bound.js.map +1 -0
- package/dist/tools/untrusted-envelope.d.ts.map +1 -1
- package/dist/tools/untrusted-envelope.js +9 -1
- package/dist/tools/untrusted-envelope.js.map +1 -1
- package/dist/types/agent/base.d.ts +16 -0
- package/dist/types/agent/base.d.ts.map +1 -1
- package/dist/types/agent/gateway.d.ts +41 -0
- package/dist/types/agent/gateway.d.ts.map +1 -1
- package/dist/types/agent/lifecycle-event.d.ts +9 -1
- package/dist/types/agent/lifecycle-event.d.ts.map +1 -1
- package/dist/types/agent/task.d.ts +5 -0
- package/dist/types/agent/task.d.ts.map +1 -1
- package/dist/types/hitl/index.d.ts +10 -0
- package/dist/types/hitl/index.d.ts.map +1 -1
- package/dist/types/hitl/index.js.map +1 -1
- package/dist/types/probe/registry.d.ts +6 -0
- package/dist/types/probe/registry.d.ts.map +1 -1
- package/dist/types/provider/interface.d.ts +35 -0
- package/dist/types/provider/interface.d.ts.map +1 -1
- package/dist/types/run/config.d.ts +25 -0
- package/dist/types/run/config.d.ts.map +1 -1
- package/dist/types/run/entity.d.ts +16 -0
- package/dist/types/run/entity.d.ts.map +1 -1
- package/dist/types/run/events.d.ts +75 -0
- package/dist/types/run/events.d.ts.map +1 -1
- package/dist/types/run/events.js.map +1 -1
- package/dist/types/run/prepare-step.d.ts +17 -2
- package/dist/types/run/prepare-step.d.ts.map +1 -1
- package/dist/types/verification/index.d.ts +98 -0
- package/dist/types/verification/index.d.ts.map +1 -1
- package/dist/types/verification/index.js +10 -0
- package/dist/types/verification/index.js.map +1 -1
- package/dist/utils/__tests__/abort-reason.test.d.ts +2 -0
- package/dist/utils/__tests__/abort-reason.test.d.ts.map +1 -0
- package/dist/utils/__tests__/abort-reason.test.js +48 -0
- package/dist/utils/__tests__/abort-reason.test.js.map +1 -0
- package/dist/utils/abort.d.ts +26 -0
- package/dist/utils/abort.d.ts.map +1 -1
- package/dist/utils/abort.js +34 -0
- package/dist/utils/abort.js.map +1 -1
- package/dist/verification/__tests__/argument-pattern.test.d.ts +2 -0
- package/dist/verification/__tests__/argument-pattern.test.d.ts.map +1 -0
- package/dist/verification/__tests__/argument-pattern.test.js +122 -0
- package/dist/verification/__tests__/argument-pattern.test.js.map +1 -0
- package/dist/verification/__tests__/rule-order-and-reason.test.d.ts +2 -0
- package/dist/verification/__tests__/rule-order-and-reason.test.d.ts.map +1 -0
- package/dist/verification/__tests__/rule-order-and-reason.test.js +126 -0
- package/dist/verification/__tests__/rule-order-and-reason.test.js.map +1 -0
- package/dist/verification/gate.d.ts +17 -1
- package/dist/verification/gate.d.ts.map +1 -1
- package/dist/verification/gate.js +102 -2
- package/dist/verification/gate.js.map +1 -1
- package/dist/verification/index.d.ts +1 -1
- package/dist/verification/index.d.ts.map +1 -1
- package/dist/verification/index.js +1 -1
- package/dist/verification/index.js.map +1 -1
- package/dist/verification/rules.d.ts.map +1 -1
- package/dist/verification/rules.js +27 -0
- package/dist/verification/rules.js.map +1 -1
- package/package.json +1 -1
- package/src/agents/ReactiveAgent.ts +5 -0
- package/src/agents/SupervisorAgent.ts +175 -162
- package/src/agents/__tests__/supervisor-inbox-scope.test.ts +149 -0
- package/src/agents/runAgent.ts +22 -1
- package/src/bridge/a2a/mapper.ts +4 -0
- package/src/bridge/sse/mapper.ts +25 -0
- package/src/connector/mcp/__tests__/positional-arrays.test.ts +183 -0
- package/src/connector/mcp/adapter.ts +131 -7
- package/src/constants/agent/index.ts +5 -0
- package/src/constants/plugin/index.ts +15 -0
- package/src/contracts/api.ts +1 -0
- package/src/gateway/__tests__/completion-inbox.test.ts +348 -2
- package/src/gateway/completion-inbox.ts +248 -16
- package/src/gateway/local.ts +26 -1
- package/src/manager/agent/lifecycle.ts +6 -0
- package/src/manager/run/persistence.ts +12 -0
- package/src/provider/thinking-support.ts +19 -2
- package/src/public-runtime.ts +9 -0
- package/src/run/reporter.ts +12 -0
- package/src/runtime/query/__tests__/completion-does-not-erase-the-answer.test.ts +163 -0
- package/src/runtime/query/__tests__/completion-notification.test.ts +486 -34
- package/src/runtime/query/__tests__/context-size-on-the-wire.test.ts +122 -0
- package/src/runtime/query/__tests__/context.test.ts +24 -0
- package/src/runtime/query/__tests__/effort-reaches-the-wire.test.ts +135 -0
- package/src/runtime/query/__tests__/tool-timeout.test.ts +38 -0
- package/src/runtime/query/context.ts +16 -1
- package/src/runtime/query/executor.ts +11 -1
- package/src/runtime/query/guard.ts +32 -0
- package/src/runtime/query/iteration/__tests__/settle-grace.test.ts +265 -0
- package/src/runtime/query/iteration/index.ts +906 -635
- package/src/runtime/query/iteration/phases/__tests__/compaction-declined.test.ts +124 -0
- package/src/runtime/query/iteration/phases/compaction.ts +83 -10
- package/src/telemetry/__tests__/model-call-span.test.ts +22 -5
- package/src/telemetry/__tests__/span-closure.test.ts +12 -5
- package/src/tools/__tests__/untrusted-envelope.test.ts +23 -0
- package/src/tools/coordinator/__tests__/completion-delivery.test.ts +147 -0
- package/src/tools/coordinator/__tests__/task-list.test.ts +72 -0
- package/src/tools/coordinator/__tests__/wait-with-idle-bound.test.ts +247 -0
- package/src/tools/coordinator/index.ts +205 -78
- package/src/tools/coordinator/wait-with-idle-bound.ts +142 -0
- package/src/tools/untrusted-envelope.ts +9 -1
- package/src/types/agent/base.ts +17 -0
- package/src/types/agent/gateway.ts +42 -0
- package/src/types/agent/lifecycle-event.ts +7 -0
- package/src/types/agent/task.ts +5 -0
- package/src/types/hitl/index.ts +10 -0
- package/src/types/probe/registry.ts +6 -0
- package/src/types/provider/interface.ts +39 -0
- package/src/types/run/config.ts +26 -0
- package/src/types/run/entity.ts +17 -0
- package/src/types/run/events.ts +75 -0
- package/src/types/run/prepare-step.ts +17 -2
- package/src/types/verification/index.ts +61 -0
- package/src/utils/__tests__/abort-reason.test.ts +56 -0
- package/src/utils/abort.ts +34 -0
- package/src/verification/__tests__/argument-pattern.test.ts +158 -0
- package/src/verification/__tests__/rule-order-and-reason.test.ts +149 -0
- package/src/verification/gate.ts +106 -3
- package/src/verification/index.ts +1 -1
- 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
|
-
|
|
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
|
|
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
|
|
116
|
-
|
|
117
|
-
|
|
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 =
|
|
122
|
-
|
|
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 =
|
|
138
|
-
inbox
|
|
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 =
|
|
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":"AAAA,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACxD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAA;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AAGzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAGnE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC;;;;;;;;;;GAUG;AAEH,MAAM,UAAU,GAAG;IAClB,YAAY,EAAE,CAAC;IACf,gBAAgB,EAAE,CAAC;IACnB,WAAW,EAAE,CAAC;IACd,YAAY,EAAE,CAAC;IACf,gBAAgB,EAAE,CAAC;CACnB,CAAA;AAED,yEAAyE;AACzE,MAAM,sBAAsB;IAClB,EAAE,GAAG,kBAAkB,CAAA;IACvB,IAAI,GAAG,2BAA2B,CAAA;IAC3C,KAAK,GAAG,CAAC,CAAA;IAET,KAAK,CAAC,CAAC,UAAU;QAChB,IAAI,CAAC,KAAK,IAAI,CAAC,CAAA;QAEf,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM;gBACL,EAAE,EAAE,OAAO;gBACX,KAAK,EAAE;oBACN,SAAS,EAAE;wBACV;4BACC,KAAK,EAAE,CAAC;4BACR,EAAE,EAAE,cAAc;4BAClB,IAAI,EAAE,UAAU;4BAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE;yBAC3C;qBACD;iBACD;aACD,CAAA;YACD,MAAM;gBACL,EAAE,EAAE,OAAO;gBACX,KAAK,EAAE,EAAE;gBACT,YAAY,EAAE,YAAY;gBAC1B,KAAK,EAAE,UAAU;aACjB,CAAA;YACD,OAAM;QACP,CAAC;QAED,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAA;QAClD,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;IAC1E,CAAC;CACD;AAED,MAAM,IAAI,GAAG,UAAU,CAAC;IACvB,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,cAAc;IAC3B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACzB,QAAQ,EAAE,UAAU;IACpB,WAAW,EAAE,EAAE;IACf,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE,KAAK;IAClB,eAAe,EAAE,IAAI;IACrB,KAAK,CAAC,OAAO;QACZ,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;IACvC,CAAC;CACD,CAAC,CAAA;AAEF,SAAS,SAAS,CAAC,MAAc,EAAE,MAAc;IAChD,OAAO;QACN,MAAM,EAAE,MAAgB;QACxB,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,WAAW;QAClB,SAAS,EAAE,KAAK;QAChB,WAAW,EAAE,KAAK;QAClB,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAA0B;KAC/D,CAAA;AACF,CAAC;AAED,MAAM,QAAQ,GAAa,EAAE,CAAA;AAC7B,SAAS,CAAC,KAAK,IAAI,EAAE;IACpB,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;IACnF,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAA;AACpB,CAAC,CAAC,CAAA;AAEF,KAAK,UAAU,OAAO,CAAC,KAAkC;IACxD,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAA;IAC3E,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;IAE/B,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAA;IAChC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAEpB,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC;QAC5B,QAAQ,EAAE,IAAI,sBAAsB,EAAE;QACtC,KAAK;QACL,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,OAAO,EAAE,YAAY;QACrB,SAAS,EAAE,YAAY;QACvB,QAAQ,EAAE,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,CAAC;QACpD,gBAAgB;QAChB,SAAS,EAAE;YACV,KAAK,EAAE,YAAY;YACnB,SAAS,EAAE,MAAM;YACjB,WAAW,EAAE,OAAO;YACpB,aAAa,EAAE,CAAC;YAChB,iBAAiB,EAAE,GAAG;SACtB;QACD,SAAS,EAAE,gBAA6B;QACxC,QAAQ,EAAE,gBAA4B;QACtC,SAAS,EAAE,gBAA6B;QACxC,QAAQ,EAAE,gBAA4B;KACtC,CAAC,CAAA;IAEF,OAAO,GAAG,CAAC,QAAQ;SACjB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;SAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;AACtF,CAAC;AAED,QAAQ,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC/D,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;QACnC,sEAAsE;QACtE,kCAAkC;QAClC,KAAK,CAAC,MAAM,CAAC;YACZ,eAAe,EAAE,CAAC,EAA2B,EAAE,EAAE;gBAChD,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,kDAAkD,CAAC,CAAC,CAAA;gBAC7E,OAAO,GAAG,EAAE,GAAE,CAAC,CAAA;YAChB,CAAC;SACQ,CAAC,CAAA;QAEX,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,CAAA;QACzC,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAA;QAE9E,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAA;QAClC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QAC1C,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,kDAAkD,CAAC,CAAA;IACnF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;QACnC,KAAK,CAAC,MAAM,CAAC;YACZ,eAAe,EAAE,CAAC,EAA2B,EAAE,EAAE;gBAChD,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAA;gBACtC,OAAO,GAAG,EAAE,GAAE,CAAC,CAAA;YAChB,CAAC;SACQ,CAAC,CAAA;QAEX,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,CAAA;QAEzC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IACpF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACzE,uEAAuE;QACvE,gEAAgE;QAChE,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;QACnC,KAAK,CAAC,MAAM,CAAC;YACZ,eAAe,EAAE,CAAC,EAA2B,EAAE,EAAE;gBAChD,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,4BAA4B,CAAC,CAAC,CAAA;gBAC1D,OAAO,GAAG,EAAE,GAAE,CAAC,CAAA;YAChB,CAAC;SACQ,CAAC,CAAA;QACX,KAAK,CAAC,KAAK,CAAC,aAAuB,CAAC,CAAA;QAEpC,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,CAAA;QAEzC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC9E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACpD,kEAAkE;QAClE,4DAA4D;QAC5D,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAA;QAE7C,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC9E,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"completion-notification.test.js","sourceRoot":"","sources":["../../../../src/runtime/query/__tests__/completion-notification.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACxD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAA;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AAGzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAQnE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC;;;;;;;;;;GAUG;AAEH,MAAM,UAAU,GAAG;IAClB,YAAY,EAAE,CAAC;IACf,gBAAgB,EAAE,CAAC;IACnB,WAAW,EAAE,CAAC;IACd,YAAY,EAAE,CAAC;IACf,gBAAgB,EAAE,CAAC;CACnB,CAAA;AAED,yEAAyE;AACzE,MAAM,sBAAsB;IAClB,EAAE,GAAG,kBAAkB,CAAA;IACvB,IAAI,GAAG,2BAA2B,CAAA;IAC3C,KAAK,GAAG,CAAC,CAAA;IACT;;;;;;;OAOG;IACM,QAAQ,GAAgB,EAAE,CAAA;IAEnC,KAAK,CAAC,CAAC,UAAU,CAAC,MAA4B;QAC7C,IAAI,CAAC,KAAK,IAAI,CAAC,CAAA;QACf,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;QAExC,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM;gBACL,EAAE,EAAE,OAAO;gBACX,KAAK,EAAE;oBACN,SAAS,EAAE;wBACV;4BACC,KAAK,EAAE,CAAC;4BACR,EAAE,EAAE,cAAc;4BAClB,IAAI,EAAE,UAAU;4BAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE;yBAC3C;qBACD;iBACD;aACD,CAAA;YACD,MAAM;gBACL,EAAE,EAAE,OAAO;gBACX,KAAK,EAAE,EAAE;gBACT,YAAY,EAAE,YAAY;gBAC1B,KAAK,EAAE,UAAU;aACjB,CAAA;YACD,OAAM;QACP,CAAC;QAED,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAA;QAClD,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;IAC1E,CAAC;CACD;AAED,qEAAqE;AACrE,MAAM,qBAAqB;IACjB,EAAE,GAAG,gBAAgB,CAAA;IACrB,IAAI,GAAG,yBAAyB,CAAA;IACzC,KAAK,GAAG,CAAC,CAAA;IAET,KAAK,CAAC,CAAC,UAAU;QAChB,IAAI,CAAC,KAAK,IAAI,CAAC,CAAA;QAEf,IAAI,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM;gBACL,EAAE,EAAE,OAAO;gBACX,KAAK,EAAE;oBACN,SAAS,EAAE;wBACV;4BACC,KAAK,EAAE,CAAC;4BACR,EAAE,EAAE,kBAAkB;4BACtB,IAAI,EAAE,UAAU;4BAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE;yBAC/C;qBACD;iBACD;aACD,CAAA;YACD,MAAM;gBACL,EAAE,EAAE,OAAO;gBACX,KAAK,EAAE,EAAE;gBACT,YAAY,EAAE,YAAY;gBAC1B,KAAK,EAAE,UAAU;aACjB,CAAA;YACD,OAAM;QACP,CAAC;QAED,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAA;QAClD,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;IAC1E,CAAC;CACD;AAED,MAAM,IAAI,GAAG,UAAU,CAAC;IACvB,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,cAAc;IAC3B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACzB,QAAQ,EAAE,UAAU;IACpB,WAAW,EAAE,EAAE;IACf,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE,KAAK;IAClB,eAAe,EAAE,IAAI;IACrB,KAAK,CAAC,OAAO;QACZ,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;IACvC,CAAC;CACD,CAAC,CAAA;AAEF,SAAS,SAAS,CAAC,MAAc,EAAE,MAAc;IAChD,OAAO;QACN,MAAM,EAAE,MAAgB;QACxB,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,WAAW;QAClB,SAAS,EAAE,KAAK;QAChB,WAAW,EAAE,KAAK;QAClB,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAA0B;KAC/D,CAAA;AACF,CAAC;AAED,MAAM,QAAQ,GAAa,EAAE,CAAA;AAC7B,SAAS,CAAC,KAAK,IAAI,EAAE;IACpB,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;IACnF,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAA;AACpB,CAAC,CAAC,CAAA;AAEF,KAAK,UAAU,OAAO,CACrB,KAAkC;IAElC,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAA;IAC3E,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;IAE/B,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAA;IAChC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAEpB,MAAM,QAAQ,GAAG,IAAI,sBAAsB,EAAE,CAAA;IAC7C,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC;QAC5B,QAAQ;QACR,KAAK;QACL,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,OAAO,EAAE,YAAY;QACrB,SAAS,EAAE,YAAY;QACvB,QAAQ,EAAE,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,CAAC;QACpD,gBAAgB;QAChB,SAAS,EAAE;YACV,KAAK,EAAE,YAAY;YACnB,SAAS,EAAE,MAAM;YACjB,WAAW,EAAE,OAAO;YACpB,aAAa,EAAE,CAAC;YAChB,iBAAiB,EAAE,GAAG;SACtB;QACD,SAAS,EAAE,gBAA6B;QACxC,QAAQ,EAAE,gBAA4B;QACtC,SAAS,EAAE,gBAA6B;QACxC,QAAQ,EAAE,gBAA4B;KACtC,CAAC,CAAA;IAEF,OAAO;QACN,YAAY,EAAE,GAAG,CAAC,QAAQ;aACxB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;aAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACrF,QAAQ;KACR,CAAA;AACF,CAAC;AAED,iEAAiE;AACjE,SAAS,YAAY,CAAC,MAAc,EAAE,MAAc;IACnD,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;IACnC,sEAAsE;IACtE,oEAAoE;IACpE,+DAA+D;IAC/D,KAAK,CAAC,QAAQ,CAAC,MAAgB,CAAC,CAAA;IAChC,KAAK,CAAC,MAAM,CAAC;QACZ,eAAe,EAAE,CAAC,EAA2B,EAAE,EAAE;YAChD,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;YAC7B,OAAO,GAAG,EAAE,GAAE,CAAC,CAAA;QAChB,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS;KACf,CAAC,CAAA;IACX,OAAO,KAAK,CAAA;AACb,CAAC;AAED,QAAQ,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC/D,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,KAAK,GAAG,YAAY,CAAC,UAAU,EAAE,kDAAkD,CAAC,CAAA;QAE1F,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,CAAA;QAC7C,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAA;QAE9E,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAA;QAClC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QAC1C,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,kDAAkD,CAAC,CAAA;IACnF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC5E,wEAAwE;QACxE,sEAAsE;QACtE,wEAAwE;QACxE,wEAAwE;QACxE,kDAAkD;QAClD,EAAE;QACF,oEAAoE;QACpE,mEAAmE;QACnE,sEAAsE;QACtE,sEAAsE;QACtE,iEAAiE;QACjE,sCAAsC;QACtC,MAAM,KAAK,GAAG,YAAY,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAA;QAE9D,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,CAAA;QAEzC,MAAM,qBAAqB,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QACxD,MAAM,CACL,qBAAqB,CAAC,IAAI,CACzB,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAClF,EACD,yEAAyE,CACzE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACb,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,KAAK,GAAG,YAAY,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;QAEnD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,CAAA;QAE7C,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IACpF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACzE,uEAAuE;QACvE,gEAAgE;QAChE,MAAM,KAAK,GAAG,YAAY,CAAC,aAAa,EAAE,4BAA4B,CAAC,CAAA;QACvE,KAAK,CAAC,KAAK,CAAC,aAAuB,CAAC,CAAA;QAEpC,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,CAAA;QAE7C,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC9E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACpD,kEAAkE;QAClE,4DAA4D;QAC5D,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAA;QAEjD,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC9E,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF;;;;;;;;;;;;;GAaG;AACH,QAAQ,CAAC,+DAA+D,EAAE,GAAG,EAAE;IAC9E,KAAK,UAAU,aAAa,CAAC,OAG5B;QACA,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,wBAAwB,CAAC,CAAC,CAAA;QAChF,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QAE/B,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;QACnC,KAAK,CAAC,QAAQ,CAAC,QAAkB,CAAC,CAAA;QAClC,IAAI,QAA+C,CAAA;QACnD,KAAK,CAAC,MAAM,CAAC;YACZ,eAAe,EAAE,CAAC,EAA2B,EAAE,EAAE;gBAChD,QAAQ,GAAG,EAAE,CAAA;gBACb,OAAO,GAAG,EAAE;oBACX,QAAQ,GAAG,SAAS,CAAA;gBACrB,CAAC,CAAA;YACF,CAAC;YACD,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS;SACf,CAAC,CAAA;QAEX,kEAAkE;QAClE,qEAAqE;QACrE,4CAA4C;QAC5C,MAAM,QAAQ,GAAG,UAAU,CAAC;YAC3B,IAAI,EAAE,UAAU;YAChB,WAAW,EAAE,qCAAqC;YAClD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,QAAQ,EAAE,UAAU;YACpB,WAAW,EAAE,EAAE;YACf,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,IAAI;YACrB,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/C,KAAK,CAAC,OAAO;gBACZ,QAAQ,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,8BAA8B,CAAC,CAAC,CAAA;gBAC/D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAA;YAC5D,CAAC;SACD,CAAC,CAAA;QAEF,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAA;QAChC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAExB,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC;YAC5B,QAAQ,EAAE,IAAI,qBAAqB,EAAE;YACrC,KAAK;YACL,eAAe,EAAE,KAAK;YACtB,OAAO,EAAE,YAAY;YACrB,SAAS,EAAE,YAAY;YACvB,QAAQ,EAAE,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,CAAC;YACpD,gBAAgB;YAChB,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,SAAS,EAAE;gBACV,KAAK,EAAE,YAAY;gBACnB,SAAS,EAAE,MAAM;gBACjB,WAAW,EAAE,OAAO;gBACpB,aAAa,EAAE,CAAC;gBAChB,iBAAiB,EAAE,GAAG;aACtB;YACD,SAAS,EAAE,gBAA6B;YACxC,QAAQ,EAAE,gBAA4B;YACtC,SAAS,EAAE,gBAA6B;YACxC,QAAQ,EAAE,gBAA4B;SACtC,CAAC,CAAA;QAEF,OAAO;YACN,YAAY,EAAE,GAAG,CAAC,QAAQ;iBACxB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;iBAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACrF,GAAG;SACH,CAAA;IACF,CAAC;IAED,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,aAAa,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;QAEhE,MAAM,CACL,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC,EACpE,sDAAsD,CACtD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACb,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,aAAa,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;QAEhE,MAAM,CACL,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC,EACpE,iDAAiD,CACjD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACb,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;QAC7F,gEAAgE;QAChE,uEAAuE;QACvE,uEAAuE;QACvE,wEAAwE;QACxE,iEAAiE;QACjE,sEAAsE;QACtE,uBAAuB;QACvB,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,sBAAsB,CAAC,CAAC,CAAA;QAC9E,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QAE/B,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;QACnC,IAAI,QAA+C,CAAA;QACnD,KAAK,CAAC,MAAM,CAAC;YACZ,eAAe,EAAE,CAAC,EAA2B,EAAE,EAAE;gBAChD,QAAQ,GAAG,EAAE,CAAA;gBACb,OAAO,GAAG,EAAE;oBACX,QAAQ,GAAG,SAAS,CAAA;gBACrB,CAAC,CAAA;YACF,CAAC;YACD,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS;SACf,CAAC,CAAA;QACX,uEAAuE;QACvE,gDAAgD;QAChD,KAAK,CAAC,MAAM,CAAC,UAAoB,CAAC,CAAA;QAElC,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAA;QAChC,KAAK,CAAC,QAAQ,CACb,UAAU,CAAC;YACV,IAAI,EAAE,UAAU;YAChB,WAAW,EAAE,6CAA6C;YAC1D,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,QAAQ,EAAE,UAAU;YACpB,WAAW,EAAE,EAAE;YACf,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,IAAI;YACrB,KAAK,CAAC,OAAO;gBACZ,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,CAAA;gBACvF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAA;YAC7C,CAAC;SACD,CAAC,CACF,CAAA;QAED,MAAM,QAAQ,GAAG,IAAI,qBAAqB,EAAE,CAAA;QAC5C,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC;YAC5B,QAAQ;YACR,KAAK;YACL,eAAe,EAAE,KAAK;YACtB,OAAO,EAAE,YAAY;YACrB,SAAS,EAAE,YAAY;YACvB,QAAQ,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACnC,gBAAgB;YAChB,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI;YACpB,SAAS,EAAE;gBACV,KAAK,EAAE,YAAY;gBACnB,SAAS,EAAE,MAAM;gBACjB,WAAW,EAAE,OAAO;gBACpB,aAAa,EAAE,CAAC;gBAChB,iBAAiB,EAAE,GAAG;aACtB;YACD,SAAS,EAAE,gBAA6B;YACxC,QAAQ,EAAE,gBAA4B;YACtC,SAAS,EAAE,gBAA6B;YACxC,QAAQ,EAAE,gBAA4B;SAC7B,CAAC,CAAA;QAEX,MAAM,QAAQ,GAAI,GAAG,CAAC,QAAiD;aACrE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;aAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAE9D,MAAM,CACL,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,EACtD,+DAA+D,CAC/D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACZ,gEAAgE;QAChE,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,8CAA8C,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAE9E,gEAAgE;QAChE,uEAAuE;QACvE,wEAAwE;QACxE,kEAAkE;QAClE,wEAAwE;QACxE,mEAAmE;QACnE,sEAAsE;QACtE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;IAC9C,CAAC,EAAE,MAAM,CAAC,CAAA;IAEV,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC3E,wEAAwE;QACxE,wEAAwE;QACxE,uEAAuE;QACvE,sEAAsE;QACtE,uEAAuE;QACvE,gDAAgD;QAChD,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC,CAAA;QAC3E,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QAE/B,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;QACnC,IAAI,QAA+C,CAAA;QACnD,KAAK,CAAC,MAAM,CAAC;YACZ,eAAe,EAAE,CAAC,EAA2B,EAAE,EAAE;gBAChD,QAAQ,GAAG,EAAE,CAAA;gBACb,OAAO,GAAG,EAAE;oBACX,QAAQ,GAAG,SAAS,CAAA;gBACrB,CAAC,CAAA;YACF,CAAC;YACD,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS;SACf,CAAC,CAAA;QACX,KAAK,CAAC,MAAM,CAAC,UAAoB,CAAC,CAAA;QAElC,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAA;QAChC,KAAK,CAAC,QAAQ,CACb,UAAU,CAAC;YACV,IAAI,EAAE,UAAU;YAChB,WAAW,EAAE,6BAA6B;YAC1C,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,QAAQ,EAAE,UAAU;YACpB,WAAW,EAAE,EAAE;YACf,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,IAAI;YACrB,KAAK,CAAC,OAAO;gBACZ,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,CAAA;gBAChF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;YACvC,CAAC;SACD,CAAC,CACF,CAAA;QAED,2DAA2D;QAC3D,MAAM,aAAa;YACT,EAAE,GAAG,iBAAiB,CAAA;YACtB,IAAI,GAAG,iBAAiB,CAAA;YACjC,KAAK,GAAG,CAAC,CAAA;YACT,KAAK,CAAC,CAAC,UAAU;gBAChB,IAAI,CAAC,KAAK,IAAI,CAAC,CAAA;gBACf,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;oBACrB,MAAM;wBACL,EAAE,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE;wBACpB,KAAK,EAAE;4BACN,SAAS,EAAE;gCACV;oCACC,KAAK,EAAE,CAAC;oCACR,EAAE,EAAE,SAAS,IAAI,CAAC,KAAK,EAAE;oCACzB,IAAI,EAAE,UAAU;oCAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE;iCAC/C;6BACD;yBACD;qBACD,CAAA;oBACD,MAAM,EAAE,EAAE,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;oBACxF,OAAM;gBACP,CAAC;gBACD,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAA;gBAC/C,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;YACvE,CAAC;SACD;QAED,+CAA+C;QAC/C,IAAI,KAAK,GAAG,CAAC,CAAA;QACb,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC;YAC5B,QAAQ,EAAE,IAAI,aAAa,EAAE;YAC7B,KAAK;YACL,eAAe,EAAE,KAAK;YACtB,OAAO,EAAE,YAAY;YACrB,SAAS,EAAE,YAAY;YACvB,QAAQ,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACnC,gBAAgB;YAChB,QAAQ,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,KAAK,CAAC;YAC7B,SAAS,EAAE;gBACV,KAAK,EAAE,YAAY;gBACnB,SAAS,EAAE,MAAM;gBACjB,WAAW,EAAE,OAAO;gBACpB,aAAa,EAAE,CAAC;gBAChB,iBAAiB,EAAE,GAAG;aACtB;YACD,SAAS,EAAE,gBAA6B;YACxC,QAAQ,EAAE,gBAA4B;YACtC,SAAS,EAAE,gBAA6B;YACxC,QAAQ,EAAE,gBAA4B;SAC7B,CAAC,CAAA;QAEX,MAAM,CAAC,KAAK,EAAE,6CAA6C,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAC/E,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,+CAA+C,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACzF,CAAC,EAAE,MAAM,CAAC,CAAA;IAEV,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QAC1E,sEAAsE;QACtE,sEAAsE;QACtE,sEAAsE;QACtE,sEAAsE;QACtE,uEAAuE;QACvE,6BAA6B;QAC7B,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAA;QAC1E,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QAE/B,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;QACnC,KAAK,CAAC,MAAM,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,EAAW,CAAC,CAAA;QACpF,uEAAuE;QACvE,KAAK,CAAC,MAAM,CAAC,mBAA6B,CAAC,CAAA;QAE3C,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAA;QAChC,KAAK,CAAC,QAAQ,CACb,UAAU,CAAC;YACV,IAAI,EAAE,UAAU;YAChB,WAAW,EAAE,cAAc;YAC3B,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,QAAQ,EAAE,UAAU;YACpB,WAAW,EAAE,EAAE;YACf,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,IAAI;YACrB,QAAQ,EAAE,IAAI;YACd,KAAK,CAAC,OAAO;gBACZ,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAA;YAC5D,CAAC;SACQ,CAAC,CACX,CAAA;QAED,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC;YAC5B,QAAQ,EAAE,IAAI,qBAAqB,EAAE;YACrC,KAAK;YACL,eAAe,EAAE,KAAK;YACtB,OAAO,EAAE,YAAY;YACrB,SAAS,EAAE,YAAY;YACvB,QAAQ,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACnC,gBAAgB;YAChB,SAAS,EAAE;gBACV,KAAK,EAAE,YAAY;gBACnB,SAAS,EAAE,MAAM;gBACjB,WAAW,EAAE,OAAO;gBACpB,aAAa,EAAE,CAAC;gBAChB,iBAAiB,EAAE,GAAG;aACtB;YACD,SAAS,EAAE,gBAA6B;YACxC,QAAQ,EAAE,gBAA4B;YACtC,SAAS,EAAE,gBAA6B;YACxC,QAAQ,EAAE,gBAA4B;SAC7B,CAAC,CAAA;QAEX,MAAM,CAAC,GAAG,CAAC,gBAAgB,EAAE,uDAAuD,CAAC,CAAC,OAAO,CAAC;YAC7F,mBAAmB;SACnB,CAAC,CAAA;QACF,oEAAoE;QACpE,gDAAgD;QAChD,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC9E,qEAAqE;QACrE,sEAAsE;QACtE,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,aAAa,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;QAEvD,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,aAAa,EAAE,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC9E,mEAAmE;QACnE,oEAAoE;QACpE,8DAA8D;QAC9D,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,aAAa,CAAC,EAAE,CAAC,CAAA;QAEhD,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IAC/F,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
|
|
@@ -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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"}
|