@namzu/sdk 6.0.0 → 6.1.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 (76) hide show
  1. package/CHANGELOG.md +133 -0
  2. package/dist/agents/SupervisorAgent.d.ts.map +1 -1
  3. package/dist/agents/SupervisorAgent.js +13 -0
  4. package/dist/agents/SupervisorAgent.js.map +1 -1
  5. package/dist/gateway/__tests__/completion-inbox.test.d.ts +2 -0
  6. package/dist/gateway/__tests__/completion-inbox.test.d.ts.map +1 -0
  7. package/dist/gateway/__tests__/completion-inbox.test.js +258 -0
  8. package/dist/gateway/__tests__/completion-inbox.test.js.map +1 -0
  9. package/dist/gateway/completion-inbox.d.ts +113 -0
  10. package/dist/gateway/completion-inbox.d.ts.map +1 -0
  11. package/dist/gateway/completion-inbox.js +211 -0
  12. package/dist/gateway/completion-inbox.js.map +1 -0
  13. package/dist/public-runtime.d.ts +1 -0
  14. package/dist/public-runtime.d.ts.map +1 -1
  15. package/dist/public-runtime.js +4 -0
  16. package/dist/public-runtime.js.map +1 -1
  17. package/dist/registry/tool/__tests__/dialect.test.js +8 -5
  18. package/dist/registry/tool/__tests__/dialect.test.js.map +1 -1
  19. package/dist/registry/tool/dialect.js +11 -4
  20. package/dist/registry/tool/dialect.js.map +1 -1
  21. package/dist/registry/tool/execute.d.ts.map +1 -1
  22. package/dist/registry/tool/execute.js +34 -0
  23. package/dist/registry/tool/execute.js.map +1 -1
  24. package/dist/runtime/query/__tests__/completion-notification.test.d.ts +2 -0
  25. package/dist/runtime/query/__tests__/completion-notification.test.d.ts.map +1 -0
  26. package/dist/runtime/query/__tests__/completion-notification.test.js +168 -0
  27. package/dist/runtime/query/__tests__/completion-notification.test.js.map +1 -0
  28. package/dist/runtime/query/__tests__/step-allow-list.test.d.ts +2 -0
  29. package/dist/runtime/query/__tests__/step-allow-list.test.d.ts.map +1 -0
  30. package/dist/runtime/query/__tests__/step-allow-list.test.js +171 -0
  31. package/dist/runtime/query/__tests__/step-allow-list.test.js.map +1 -0
  32. package/dist/runtime/query/executor.d.ts +14 -0
  33. package/dist/runtime/query/executor.d.ts.map +1 -1
  34. package/dist/runtime/query/executor.js +20 -1
  35. package/dist/runtime/query/executor.js.map +1 -1
  36. package/dist/runtime/query/index.d.ts +9 -0
  37. package/dist/runtime/query/index.d.ts.map +1 -1
  38. package/dist/runtime/query/index.js +1 -0
  39. package/dist/runtime/query/index.js.map +1 -1
  40. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  41. package/dist/runtime/query/iteration/index.js +74 -1
  42. package/dist/runtime/query/iteration/index.js.map +1 -1
  43. package/dist/runtime/query/iteration/phases/context.d.ts +9 -0
  44. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  45. package/dist/runtime/query/iteration/phases/context.js.map +1 -1
  46. package/dist/tools/coordinator/__tests__/completion-delivery.test.d.ts +2 -0
  47. package/dist/tools/coordinator/__tests__/completion-delivery.test.d.ts.map +1 -0
  48. package/dist/tools/coordinator/__tests__/completion-delivery.test.js +255 -0
  49. package/dist/tools/coordinator/__tests__/completion-delivery.test.js.map +1 -0
  50. package/dist/tools/coordinator/__tests__/task-list.test.js +13 -7
  51. package/dist/tools/coordinator/__tests__/task-list.test.js.map +1 -1
  52. package/dist/tools/coordinator/index.d.ts +35 -0
  53. package/dist/tools/coordinator/index.d.ts.map +1 -1
  54. package/dist/tools/coordinator/index.js +222 -16
  55. package/dist/tools/coordinator/index.js.map +1 -1
  56. package/dist/types/tool/index.d.ts +13 -0
  57. package/dist/types/tool/index.d.ts.map +1 -1
  58. package/dist/types/tool/index.js.map +1 -1
  59. package/package.json +1 -1
  60. package/src/agents/SupervisorAgent.ts +14 -0
  61. package/src/gateway/__tests__/completion-inbox.test.ts +320 -0
  62. package/src/gateway/completion-inbox.ts +227 -0
  63. package/src/public-runtime.ts +4 -0
  64. package/src/registry/tool/__tests__/dialect.test.ts +8 -5
  65. package/src/registry/tool/dialect.ts +11 -4
  66. package/src/registry/tool/execute.ts +35 -0
  67. package/src/runtime/query/__tests__/completion-notification.test.ts +196 -0
  68. package/src/runtime/query/__tests__/step-allow-list.test.ts +205 -0
  69. package/src/runtime/query/executor.ts +21 -1
  70. package/src/runtime/query/index.ts +11 -0
  71. package/src/runtime/query/iteration/index.ts +77 -1
  72. package/src/runtime/query/iteration/phases/context.ts +10 -0
  73. package/src/tools/coordinator/__tests__/completion-delivery.test.ts +347 -0
  74. package/src/tools/coordinator/__tests__/task-list.test.ts +13 -7
  75. package/src/tools/coordinator/index.ts +250 -20
  76. package/src/types/tool/index.ts +13 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,138 @@
1
1
  # Changelog
2
2
 
3
+ ## 6.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - ab0bb30: a worker that finishes now reaches the supervisor, without polling for it
8
+
9
+ A delegated worker's output reaches the supervisor as the `tool_result` of
10
+ the `create_task` that launched it. That works while the launching call is
11
+ still the live path — and there are two situations where it is not:
12
+
13
+ - the call hit the executor's deadline. The model was told _"timed out… it
14
+ may still be running"_, with no task id, and the worker then finished
15
+ normally holding a result nothing would ever read.
16
+ - there was never a call waiting, because the launch was meant to run
17
+ alongside the turn.
18
+
19
+ In both cases the completion existed, the gateway remembered it, and the
20
+ supervisor was never told. The one tool left to it, `agent_task_list`,
21
+ reported id, state and duration — and dropped the worker's output, reading
22
+ `result.status` and `result.lastError` off the handle while stepping over
23
+ `result.result` between them. So a supervisor could learn that a task had
24
+ definitely finished and still have no way to read what it said.
25
+ `agent_task_list` in a sleep loop was not the model misbehaving; it was the
26
+ only move on the board.
27
+
28
+ **Completions are now delivered rather than polled for.** A run subscribes
29
+ once through `onTaskCompleted` — which every `TaskGateway` already has, so
30
+ no gateway changes — and anything a tool did not hand over inline arrives in
31
+ the transcript as a task notification carrying the id, the agent, the state
32
+ and the output.
33
+
34
+ The distinction is the whole design. An earlier version of this channel was
35
+ removed because it fired for completions the blocking tool had _already_
36
+ delivered, so the supervisor saw each result twice. Tools now claim what they
37
+ deliver, and only unclaimed completions are announced. A blocking
38
+ `create_task` behaves exactly as it did.
39
+
40
+ Three additions come with it:
41
+
42
+ - `create_task` takes `background: true`, returning a `task_id` immediately
43
+ so the supervisor can keep working.
44
+ - `wait_for_task` joins a running task and returns its output. `continue_task`
45
+ blocked, but only as a side effect of sending a message, so a supervisor
46
+ that merely wanted to wait had to invent something to say.
47
+ - `cancel_task` is mounted again. It was dropped on the reasoning that a
48
+ blocking launch leaves every worker terminal before its id is known — true
49
+ then, and untrue now that a background launch hands back a live one.
50
+
51
+ `agent_task_list` also carries the worker's output, in the rendered text
52
+ rather than only in `data`: the executor builds the model-facing tool result
53
+ from `output` alone, so a field added to `data` would have been added
54
+ somewhere the model cannot see.
55
+
56
+ A run no longer settles while a background worker it launched is still
57
+ running — it would have discarded the very result the launch existed to
58
+ produce. The wait is bounded, so a worker that never finishes cannot hold a
59
+ run open.
60
+
61
+ `CompletionInbox` and `formatCompletionNotification` are exported for hosts
62
+ that build the coordinator surface themselves.
63
+
64
+ - 529d10f: a narrowed step now narrows what can RUN, not only what the model is shown
65
+
66
+ `prepareStep.activeTools` documents itself as _"restrict which tools the model
67
+ may call this step, by name"_, and run-level `allowedTools` makes the same
68
+ promise for a whole run. Neither restricted anything.
69
+
70
+ The list decided which schemas went into the request. It was then copied into
71
+ the tool context and read by nothing on the execution path — the registry gated
72
+ on availability and plan mode, and never on the allow-list. So the narrowing was
73
+ a statement about the menu rather than about the kitchen: a model that named a
74
+ withheld tool had it run.
75
+
76
+ That is not a hypothetical. A model names a tool it was not offered whenever it
77
+ repeats a call from earlier in the context, whenever a gateway carries its own
78
+ tool list, and whenever a cached prompt prefix is replayed. A host using this to
79
+ fence a step — the obvious use, and the one the type invites — was fenced by
80
+ nothing.
81
+
82
+ The check now sits where the call is made. A tool outside the list is answered
83
+ with a refusal that names what IS available, so the model can route around it
84
+ rather than guessing.
85
+
86
+ Two details worth stating:
87
+
88
+ - **Absent is not empty.** No list means no restriction; an empty list means the
89
+ step may call nothing. Reading an empty allow-list as "unrestricted" is the
90
+ fail-open this repository has already been bitten by once, in the delegate
91
+ roster.
92
+ - **A step's list beats the run's,** matching the precedence the request already
93
+ used, so the two can no longer disagree.
94
+
95
+ **If you pass `allowedTools` or `activeTools` today, calls that previously ran
96
+ may now be refused.** That is the point of the change, but it is a real
97
+ behavioural difference: a run that quietly depended on the leak will start
98
+ seeing refusals. The refusal is a normal `tool_result`, so the turn continues.
99
+
100
+ ### Patch Changes
101
+
102
+ - 529d10f: a delegated child is no longer strangled by a file-read deadline, and a closed tuple stays closed
103
+
104
+ **The deadline.** `create_task` runs an entire agent and inherited the tool
105
+ executor's generic two-minute default — the one whose own docstring says _"a
106
+ tool that legitimately runs longer declares its own `timeoutMs`"_. It did not.
107
+
108
+ Measured on real traffic: three delegated children finished in 4m21s, 5m58s and
109
+ 8m04s while all three parents timed out at 120s. The children were never killed
110
+ — only the parent's wait was — so the blocking path was not occasionally missed,
111
+ it was structurally unreachable, and the supervisor was left calling
112
+ `agent_task_list` in a sleep loop because nothing else was available to it.
113
+
114
+ `DELEGATION_TIMEOUT_MS` is now one hour, exported so it is greppable, and
115
+ applied to `create_task`, `wait_for_task` and `continue_task`. An hour rather
116
+ than "a bit more than eight minutes" because a generic stopwatch is the wrong
117
+ instrument for a child that is making progress: a failure should come from what
118
+ the child is doing. A wedged child is still caught, and the run budget and
119
+ iteration ceiling both still apply above this.
120
+
121
+ **The instruction to poll was ours.** `agent_task_list` described itself as the
122
+ way to _"confirm every launched task reached `completed`"_ and as _"safe to call
123
+ repeatedly"_ — an order to burn a turn on a listing whose answer a blocking
124
+ `create_task` had already delivered. It now says the opposite, and points at the
125
+ cases the listing is actually for. `create_task` gained the matching clause in
126
+ the other direction: until a worker's result arrives, do not fabricate,
127
+ summarise or predict it.
128
+
129
+ **The tuple.** `toSchemaDialect` translated draft-07's `additionalItems: false`
130
+ by dropping it, on the reasoning that 2020-12 closes a tuple by default. It does
131
+ not — with `prefixItems` set and no `items`, elements past the tuple are
132
+ unconstrained — so every closed tuple was silently widened into an open one. A
133
+ schema written to forbid a third element began to allow any number. It now
134
+ emits `items: false`, which the wire accepts.
135
+
3
136
  ## 6.0.0
4
137
 
5
138
  ### Major Changes
@@ -1 +1 @@
1
- {"version":3,"file":"SupervisorAgent.d.ts","sourceRoot":"","sources":["../../src/agents/SupervisorAgent.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAe,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACxE,OAAO,KAAK,EACX,UAAU,EACV,aAAa,EACb,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,KAAK,EAAW,KAAK,EAAU,MAAM,uBAAuB,CAAA;AAEnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAG7D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CACpC,WAAW,EAAE,SAAS,UAAU,EAAE,EAClC,KAAK,EAAE,KAAK,EACZ,GAAG,GAAE,MAAmB,GACtB,eAAe,EAAE,CAcnB;AAED,4DAA4D;AAC5D,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,SAAS,eAAe,EAAE,GAAG,MAAM,CAEnF;AAED,qBAAa,eAAgB,SAAQ,aAAa,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;IAC/F,QAAQ,CAAC,IAAI,EAAG,YAAY,CAAS;gBAEzB,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,cAAc,CAAC;IAalE;;;;;;;;OAQG;IACG,GAAG,CACR,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,qBAAqB,EAC7B,QAAQ,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,qBAAqB,CAAC;YAMnB,YAAY;CAkP1B"}
1
+ {"version":3,"file":"SupervisorAgent.d.ts","sourceRoot":"","sources":["../../src/agents/SupervisorAgent.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAe,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACxE,OAAO,KAAK,EACX,UAAU,EACV,aAAa,EACb,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,MAAM,yBAAyB,CAAA;AAEhC,OAAO,KAAK,EAAW,KAAK,EAAU,MAAM,uBAAuB,CAAA;AAEnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAG7D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CACpC,WAAW,EAAE,SAAS,UAAU,EAAE,EAClC,KAAK,EAAE,KAAK,EACZ,GAAG,GAAE,MAAmB,GACtB,eAAe,EAAE,CAcnB;AAED,4DAA4D;AAC5D,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,SAAS,eAAe,EAAE,GAAG,MAAM,CAEnF;AAED,qBAAa,eAAgB,SAAQ,aAAa,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;IAC/F,QAAQ,CAAC,IAAI,EAAG,YAAY,CAAS;gBAEzB,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,cAAc,CAAC;IAalE;;;;;;;;OAQG;IACG,GAAG,CACR,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,qBAAqB,EAC7B,QAAQ,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,qBAAqB,CAAC;YAMnB,YAAY;CA+P1B"}
@@ -1,4 +1,5 @@
1
1
  import { EMPTY_TOKEN_USAGE } from '../constants/limits.js';
2
+ import { CompletionInbox } from '../gateway/completion-inbox.js';
2
3
  import { LocalTaskGateway } from '../gateway/local.js';
3
4
  import { ToolNameCollisionError, ToolRegistry } from '../registry/tool/execute.js';
4
5
  import { drainQuery } from '../runtime/query/index.js';
@@ -132,8 +133,19 @@ export class SupervisorAgent extends AbstractAgent {
132
133
  // it does not exist yet. `query` binds them once it does.
133
134
  const questionParks = new QuestionParkBinding();
134
135
  const pendingAnswers = new PendingAnswers();
136
+ // Created here for the same reason: both ends are here. The tools claim
137
+ // a completion when they deliver it as a `tool_result`, and the loop
138
+ // drains whatever is left over into the transcript — so the inbox has
139
+ // to be the same object on both sides, and this is the only place that
140
+ // sees both.
141
+ //
142
+ // It attaches through `onTaskCompleted`, which every gateway already
143
+ // implements, so a host gateway needs no change to take part.
144
+ const completionInbox = new CompletionInbox();
145
+ completionInbox.attach(gateway);
135
146
  const coordinatorToolDefs = buildCoordinatorTools({
136
147
  gateway,
148
+ completionInbox,
137
149
  workingDirectory: input.workingDirectory,
138
150
  runtimeContext: input.runtimeContext,
139
151
  allowedAgentIds: config.agentIds,
@@ -245,6 +257,7 @@ export class SupervisorAgent extends AbstractAgent {
245
257
  runtimeToolOverrides: input.runtimeToolOverrides,
246
258
  runtimeContext: input.runtimeContext,
247
259
  taskGateway: gateway,
260
+ completionInbox,
248
261
  launchedTasks,
249
262
  advisory: config.advisory,
250
263
  invocationState: childInvocationState,
@@ -1 +1 @@
1
- {"version":3,"file":"SupervisorAgent.js","sourceRoot":"","sources":["../../src/agents/SupervisorAgent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SupervisorAgent.js","sourceRoot":"","sources":["../../src/agents/SupervisorAgent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=completion-inbox.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion-inbox.test.d.ts","sourceRoot":"","sources":["../../../src/gateway/__tests__/completion-inbox.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,258 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { CompletionInbox, formatCompletionNotification } from '../completion-inbox.js';
3
+ /**
4
+ * Who tells the supervisor a worker finished.
5
+ *
6
+ * Normally the `create_task` call does: it blocks, and the worker's output
7
+ * comes back as that call's `tool_result`. Two cases have no such call — a
8
+ * launch made in the background, and a blocking launch whose deadline passed
9
+ * while the worker kept going — and until this existed the result of those
10
+ * simply vanished. The gateway still held it; nothing ever read it.
11
+ *
12
+ * An earlier version of this channel was removed in `dc16d58` because it
13
+ * fired for completions the blocking tool had ALREADY delivered, so the
14
+ * supervisor saw every result twice: once as a `tool_result`, once as an
15
+ * orphan envelope. That removal is the reason the tests below care as much
16
+ * about what does NOT get delivered as about what does.
17
+ */
18
+ function handleFor(taskId, result) {
19
+ return {
20
+ taskId: taskId,
21
+ agentId: 'reviewer',
22
+ state: 'completed',
23
+ createdAt: 1_000,
24
+ completedAt: 3_500,
25
+ ...(result !== undefined
26
+ ? { result: { status: 'completed', result } }
27
+ : {}),
28
+ };
29
+ }
30
+ /** A gateway that only does the one thing the inbox uses. */
31
+ function fakeGateway() {
32
+ const listeners = new Set();
33
+ const gateway = {
34
+ onTaskCompleted(cb) {
35
+ listeners.add(cb);
36
+ return () => listeners.delete(cb);
37
+ },
38
+ };
39
+ return {
40
+ gateway,
41
+ settle: (h) => {
42
+ for (const cb of listeners)
43
+ cb(h);
44
+ },
45
+ get listeners() {
46
+ return listeners.size;
47
+ },
48
+ };
49
+ }
50
+ describe('a completion nobody waited for reaches the transcript', () => {
51
+ it('queues a settled task and hands it over once', () => {
52
+ const { gateway, settle } = fakeGateway();
53
+ const inbox = new CompletionInbox();
54
+ inbox.attach(gateway);
55
+ settle(handleFor('tsk_1', 'the report'));
56
+ expect(inbox.hasUnheard).toBe(true);
57
+ expect(inbox.drain().map((h) => h.taskId)).toEqual(['tsk_1']);
58
+ // Drained, not peeked: a notification that survives its own delivery
59
+ // is the duplicate bug wearing a different hat.
60
+ expect(inbox.drain()).toEqual([]);
61
+ expect(inbox.hasUnheard).toBe(false);
62
+ });
63
+ it('queues nothing at all when no task settles', () => {
64
+ const { gateway } = fakeGateway();
65
+ const inbox = new CompletionInbox();
66
+ inbox.attach(gateway);
67
+ expect(inbox.hasUnheard).toBe(false);
68
+ expect(inbox.drain()).toEqual([]);
69
+ });
70
+ });
71
+ describe('a completion the tool already delivered is never delivered twice', () => {
72
+ it('drops a claimed completion', () => {
73
+ // The `dc16d58` regression, pinned. `create_task` blocked, got the
74
+ // result, and returned it as its own tool_result — so the envelope
75
+ // must not also carry it.
76
+ const { gateway, settle } = fakeGateway();
77
+ const inbox = new CompletionInbox();
78
+ inbox.attach(gateway);
79
+ settle(handleFor('tsk_1', 'the report'));
80
+ inbox.claim('tsk_1');
81
+ expect(inbox.hasUnheard).toBe(false);
82
+ expect(inbox.drain()).toEqual([]);
83
+ });
84
+ it('drops it even when the claim beats the announcement', () => {
85
+ // Ordering is not guaranteed: the tool's own `waitForTask` can resolve
86
+ // before the gateway's completion listener runs. A claim that only
87
+ // worked after the announcement would leak a duplicate exactly in the
88
+ // races that are hardest to reproduce.
89
+ const { gateway, settle } = fakeGateway();
90
+ const inbox = new CompletionInbox();
91
+ inbox.attach(gateway);
92
+ inbox.claim('tsk_1');
93
+ settle(handleFor('tsk_1', 'the report'));
94
+ expect(inbox.drain()).toEqual([]);
95
+ });
96
+ it('still delivers the sibling that nobody claimed', () => {
97
+ // The mixed turn: one worker awaited to completion, one abandoned.
98
+ const { gateway, settle } = fakeGateway();
99
+ const inbox = new CompletionInbox();
100
+ inbox.attach(gateway);
101
+ settle(handleFor('tsk_awaited', 'delivered inline'));
102
+ settle(handleFor('tsk_abandoned', 'nobody heard this'));
103
+ inbox.claim('tsk_awaited');
104
+ expect(inbox.drain().map((h) => h.taskId)).toEqual(['tsk_abandoned']);
105
+ });
106
+ it('subscribes once no matter how often it is attached', () => {
107
+ // Two subscriptions would queue every completion twice and reproduce
108
+ // the duplicate delivery from the inside.
109
+ const { gateway, settle, ...rest } = fakeGateway();
110
+ const inbox = new CompletionInbox();
111
+ inbox.attach(gateway);
112
+ inbox.attach(gateway);
113
+ settle(handleFor('tsk_1', 'once'));
114
+ expect(inbox.drain()).toHaveLength(1);
115
+ void rest;
116
+ });
117
+ it('stops listening when closed', () => {
118
+ const { gateway, settle } = fakeGateway();
119
+ const inbox = new CompletionInbox();
120
+ inbox.attach(gateway);
121
+ inbox.close();
122
+ settle(handleFor('tsk_1', 'too late'));
123
+ expect(inbox.drain()).toEqual([]);
124
+ });
125
+ });
126
+ describe('a launch nobody is waiting for holds the run open', () => {
127
+ it('counts an expected task as pending work before it settles', () => {
128
+ // Without this the run settles while a background worker is still
129
+ // going and discards the result the launch existed to produce.
130
+ const { gateway } = fakeGateway();
131
+ const inbox = new CompletionInbox();
132
+ inbox.attach(gateway);
133
+ expect(inbox.hasPendingWork).toBe(false);
134
+ inbox.expect('tsk_1');
135
+ expect(inbox.hasPendingWork).toBe(true);
136
+ });
137
+ it('stops counting it once it settles', () => {
138
+ const { gateway, settle } = fakeGateway();
139
+ const inbox = new CompletionInbox();
140
+ inbox.attach(gateway);
141
+ inbox.expect('tsk_1');
142
+ settle(handleFor('tsk_1', 'done'));
143
+ // Still pending — as an UNHEARD completion now rather than an
144
+ // outstanding one, which is what the loop drains.
145
+ expect(inbox.hasPendingWork).toBe(true);
146
+ inbox.drain();
147
+ expect(inbox.hasPendingWork).toBe(false);
148
+ });
149
+ it('ignores a task already delivered inline', () => {
150
+ const { gateway } = fakeGateway();
151
+ const inbox = new CompletionInbox();
152
+ inbox.attach(gateway);
153
+ inbox.claim('tsk_1');
154
+ inbox.expect('tsk_1');
155
+ expect(inbox.hasPendingWork).toBe(false);
156
+ });
157
+ it('stops expecting a task that was cancelled', () => {
158
+ // `expect` is only cleared by a COMPLETION, so a cancelled worker used
159
+ // to keep the run open for the whole grace period, every time it tried
160
+ // to settle, waiting for a result that had been called off.
161
+ const { gateway } = fakeGateway();
162
+ const inbox = new CompletionInbox();
163
+ inbox.attach(gateway);
164
+ inbox.expect('tsk_1');
165
+ inbox.forget('tsk_1');
166
+ expect(inbox.hasPendingWork).toBe(false);
167
+ });
168
+ it('waits for an arrival and returns as soon as one lands', async () => {
169
+ const { gateway, settle } = fakeGateway();
170
+ const inbox = new CompletionInbox();
171
+ inbox.attach(gateway);
172
+ inbox.expect('tsk_1');
173
+ const waited = inbox.waitForArrival(5_000);
174
+ settle(handleFor('tsk_1', 'done'));
175
+ await waited;
176
+ expect(inbox.drain().map((h) => h.taskId)).toEqual(['tsk_1']);
177
+ });
178
+ it('does not wait at all when there is nothing outstanding', async () => {
179
+ const { gateway } = fakeGateway();
180
+ const inbox = new CompletionInbox();
181
+ inbox.attach(gateway);
182
+ // A deadline this long would hang the suite if it were honoured.
183
+ await inbox.waitForArrival(600_000);
184
+ });
185
+ it('gives up at the deadline rather than holding a run forever', async () => {
186
+ // The bound is the point: a worker that never finishes must not keep
187
+ // the run open indefinitely.
188
+ const { gateway } = fakeGateway();
189
+ const inbox = new CompletionInbox();
190
+ inbox.attach(gateway);
191
+ inbox.expect('tsk_never');
192
+ await inbox.waitForArrival(10);
193
+ expect(inbox.hasPendingWork).toBe(true);
194
+ });
195
+ it('releases a waiter when the inbox closes', async () => {
196
+ const { gateway } = fakeGateway();
197
+ const inbox = new CompletionInbox();
198
+ inbox.attach(gateway);
199
+ inbox.expect('tsk_1');
200
+ const waited = inbox.waitForArrival(600_000);
201
+ inbox.close();
202
+ await waited;
203
+ });
204
+ });
205
+ describe('the notification says which task and what it produced', () => {
206
+ it('carries the id, the agent, the state and the output', () => {
207
+ // All four matter. Without the id the supervisor cannot say which of
208
+ // five workers this was; without the output it has to make the extra
209
+ // call this mechanism exists to remove.
210
+ const text = formatCompletionNotification([handleFor('tsk_42', 'the findings')]);
211
+ expect(text).toContain('task_id: tsk_42');
212
+ expect(text).toContain('agent: reviewer');
213
+ expect(text).toContain('state: completed');
214
+ expect(text).toContain('duration_ms: 2500');
215
+ expect(text).toContain('the findings');
216
+ });
217
+ it('names the tool that fetches the rest when it truncates', () => {
218
+ const text = formatCompletionNotification([handleFor('tsk_42', 'x'.repeat(10_000))]);
219
+ expect(text).toContain('truncated');
220
+ // The id is repeated in the truncation notice, so the follow-up call
221
+ // does not require scrolling back up through 4 kB of output.
222
+ expect(text).toContain('wait_for_task with task_id "tsk_42"');
223
+ expect(text.length).toBeLessThan(4_500);
224
+ });
225
+ it('says so rather than going blank when a task produced nothing', () => {
226
+ const text = formatCompletionNotification([handleFor('tsk_42')]);
227
+ expect(text).toContain('task_id: tsk_42');
228
+ expect(text).toContain('produced no output');
229
+ });
230
+ it('groups a batch into one message', () => {
231
+ const text = formatCompletionNotification([
232
+ handleFor('tsk_1', 'first'),
233
+ handleFor('tsk_2', 'second'),
234
+ ]);
235
+ expect(text).toContain('2 tasks');
236
+ expect(text).toContain('tsk_1');
237
+ expect(text).toContain('tsk_2');
238
+ });
239
+ it('explains why it is arriving here and not as a tool result', () => {
240
+ // Otherwise the model has to guess whether it missed a call, and the
241
+ // guess it makes is to go looking — which is the polling loop again.
242
+ const text = formatCompletionNotification([handleFor('tsk_1', 'done')]);
243
+ expect(text).toContain('not waiting on it');
244
+ });
245
+ });
246
+ describe('the inbox does not require anything of a host gateway', () => {
247
+ it('uses only onTaskCompleted', () => {
248
+ // The whole point of attaching through the existing subscription: a
249
+ // host that implements TaskGateway keeps working untouched, and one
250
+ // that was already firing completions into an empty listener set now
251
+ // has a listener.
252
+ const onTaskCompleted = vi.fn(() => () => { });
253
+ const inbox = new CompletionInbox();
254
+ inbox.attach({ onTaskCompleted });
255
+ expect(onTaskCompleted).toHaveBeenCalledTimes(1);
256
+ });
257
+ });
258
+ //# sourceMappingURL=completion-inbox.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion-inbox.test.js","sourceRoot":"","sources":["../../../src/gateway/__tests__/completion-inbox.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAIjD,OAAO,EAAE,eAAe,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAA;AAEtF;;;;;;;;;;;;;;GAcG;AAEH,SAAS,SAAS,CAAC,MAAc,EAAE,MAAe;IACjD,OAAO;QACN,MAAM,EAAE,MAAgB;QACxB,OAAO,EAAE,UAAU;QACnB,KAAK,EAAE,WAAW;QAClB,SAAS,EAAE,KAAK;QAChB,WAAW,EAAE,KAAK;QAClB,GAAG,CAAC,MAAM,KAAK,SAAS;YACvB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAA0B,EAAE;YACrE,CAAC,CAAC,EAAE,CAAC;KACN,CAAA;AACF,CAAC;AAED,6DAA6D;AAC7D,SAAS,WAAW;IAKnB,MAAM,SAAS,GAAG,IAAI,GAAG,EAA2B,CAAA;IACpD,MAAM,OAAO,GAAG;QACf,eAAe,CAAC,EAA2B;YAC1C,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACjB,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAClC,CAAC;KACyB,CAAA;IAC3B,OAAO;QACN,OAAO;QACP,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE;YACb,KAAK,MAAM,EAAE,IAAI,SAAS;gBAAE,EAAE,CAAC,CAAC,CAAC,CAAA;QAClC,CAAC;QACD,IAAI,SAAS;YACZ,OAAO,SAAS,CAAC,IAAI,CAAA;QACtB,CAAC;KACD,CAAA;AACF,CAAC;AAED,QAAQ,CAAC,uDAAuD,EAAE,GAAG,EAAE;IACtE,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACvD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,CAAA;QACzC,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;QACnC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAErB,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAA;QAExC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACnC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;QAC7D,qEAAqE;QACrE,gDAAgD;QAChD,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QACjC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACrD,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,CAAA;QACjC,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;QACnC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAErB,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACpC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,kEAAkE,EAAE,GAAG,EAAE;IACjF,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACrC,mEAAmE;QACnE,mEAAmE;QACnE,0BAA0B;QAC1B,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,CAAA;QACzC,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;QACnC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAErB,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAA;QACxC,KAAK,CAAC,KAAK,CAAC,OAAiB,CAAC,CAAA;QAE9B,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACpC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC9D,uEAAuE;QACvE,mEAAmE;QACnE,sEAAsE;QACtE,uCAAuC;QACvC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,CAAA;QACzC,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;QACnC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAErB,KAAK,CAAC,KAAK,CAAC,OAAiB,CAAC,CAAA;QAC9B,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAA;QAExC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACzD,mEAAmE;QACnE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,CAAA;QACzC,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;QACnC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAErB,MAAM,CAAC,SAAS,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC,CAAA;QACpD,MAAM,CAAC,SAAS,CAAC,eAAe,EAAE,mBAAmB,CAAC,CAAC,CAAA;QACvD,KAAK,CAAC,KAAK,CAAC,aAAuB,CAAC,CAAA;QAEpC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC,CAAA;IACtE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC7D,qEAAqE;QACrE,0CAA0C;QAC1C,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,WAAW,EAAE,CAAA;QAClD,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;QACnC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACrB,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAErB,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;QAElC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACrC,KAAK,IAAI,CAAA;IACV,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACtC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,CAAA;QACzC,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;QACnC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACrB,KAAK,CAAC,KAAK,EAAE,CAAA;QAEb,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAA;QAEtC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,mDAAmD,EAAE,GAAG,EAAE;IAClE,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACpE,kEAAkE;QAClE,+DAA+D;QAC/D,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,CAAA;QACjC,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;QACnC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAErB,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACxC,KAAK,CAAC,MAAM,CAAC,OAAiB,CAAC,CAAA;QAC/B,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC5C,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,CAAA;QACzC,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;QACnC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACrB,KAAK,CAAC,MAAM,CAAC,OAAiB,CAAC,CAAA;QAE/B,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;QAElC,8DAA8D;QAC9D,kDAAkD;QAClD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvC,KAAK,CAAC,KAAK,EAAE,CAAA;QACb,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QAClD,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,CAAA;QACjC,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;QACnC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAErB,KAAK,CAAC,KAAK,CAAC,OAAiB,CAAC,CAAA;QAC9B,KAAK,CAAC,MAAM,CAAC,OAAiB,CAAC,CAAA;QAE/B,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACpD,uEAAuE;QACvE,uEAAuE;QACvE,4DAA4D;QAC5D,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,CAAA;QACjC,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;QACnC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACrB,KAAK,CAAC,MAAM,CAAC,OAAiB,CAAC,CAAA;QAE/B,KAAK,CAAC,MAAM,CAAC,OAAiB,CAAC,CAAA;QAE/B,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,CAAA;QACzC,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;QACnC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACrB,KAAK,CAAC,MAAM,CAAC,OAAiB,CAAC,CAAA;QAE/B,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;QAC1C,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;QAClC,MAAM,MAAM,CAAA;QAEZ,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;IAC9D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,CAAA;QACjC,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;QACnC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QAErB,iEAAiE;QACjE,MAAM,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC3E,qEAAqE;QACrE,6BAA6B;QAC7B,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,CAAA;QACjC,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;QACnC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACrB,KAAK,CAAC,MAAM,CAAC,WAAqB,CAAC,CAAA;QAEnC,MAAM,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAA;QAE9B,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE,CAAA;QACjC,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;QACnC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACrB,KAAK,CAAC,MAAM,CAAC,OAAiB,CAAC,CAAA;QAE/B,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;QAC5C,KAAK,CAAC,KAAK,EAAE,CAAA;QACb,MAAM,MAAM,CAAA;IACb,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,uDAAuD,EAAE,GAAG,EAAE;IACtE,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC9D,qEAAqE;QACrE,qEAAqE;QACrE,wCAAwC;QACxC,MAAM,IAAI,GAAG,4BAA4B,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,CAAA;QAEhF,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;QACzC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;QACzC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAA;QAC1C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAA;QAC3C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QACjE,MAAM,IAAI,GAAG,4BAA4B,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QAEpF,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;QACnC,qEAAqE;QACrE,6DAA6D;QAC7D,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAA;QAC7D,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACvE,MAAM,IAAI,GAAG,4BAA4B,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;QAEhE,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;QACzC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC1C,MAAM,IAAI,GAAG,4BAA4B,CAAC;YACzC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC;YAC3B,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC;SAC5B,CAAC,CAAA;QAEF,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QACjC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QAC/B,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACpE,qEAAqE;QACrE,qEAAqE;QACrE,MAAM,IAAI,GAAG,4BAA4B,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;QAEvE,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,uDAAuD,EAAE,GAAG,EAAE;IACtE,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACpC,oEAAoE;QACpE,oEAAoE;QACpE,qEAAqE;QACrE,kBAAkB;QAClB,MAAM,eAAe,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAC7C,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;QAEnC,KAAK,CAAC,MAAM,CAAC,EAAE,eAAe,EAA4B,CAAC,CAAA;QAE3D,MAAM,CAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
@@ -0,0 +1,113 @@
1
+ import type { TaskGateway, TaskHandle } from '../types/agent/gateway.js';
2
+ import type { TaskId } from '../types/ids/index.js';
3
+ /**
4
+ * Completions that finished with nobody left to hear them.
5
+ *
6
+ * A worker's result reaches the supervisor as the `tool_result` of the
7
+ * `create_task` that launched it. That works whenever the launching call is
8
+ * still the live path — but it is not the only way a task ends:
9
+ *
10
+ * - the launching tool hit its deadline and the executor returned
11
+ * *"timed out… it may still be running"* to the model. The worker then
12
+ * finished normally, holding a result nothing would ever read.
13
+ * - the task was launched in the background on purpose, so there is no
14
+ * call waiting on it by design.
15
+ *
16
+ * In both cases the completion exists, the gateway remembers it, and the
17
+ * model is never told. That is the gap this closes: the run subscribes once,
18
+ * every settled task lands here, and anything a tool did NOT hand over
19
+ * inline is drained into the transcript as a notification the next turn can
20
+ * read.
21
+ *
22
+ * The disambiguation is the whole design. An earlier version of the envelope
23
+ * path was removed (`dc16d58`) because it fired for completions the blocking
24
+ * tool had ALREADY delivered, so the supervisor saw every result twice —
25
+ * once correctly as a `tool_result`, once as an orphan envelope. Removing it
26
+ * fixed the duplicate and left the abandoned case with no channel at all.
27
+ * Claiming is what tells the two apart: a tool that delivers a completion
28
+ * says so, and only unclaimed completions become envelopes.
29
+ *
30
+ * It attaches through `onTaskCompleted`, which every `TaskGateway` already
31
+ * has, so a host gateway needs no change to take part — a host that was
32
+ * firing completions into a listener set with no listeners now has one.
33
+ */
34
+ export declare class CompletionInbox {
35
+ private readonly unheard;
36
+ private readonly claimed;
37
+ /** Launched with nothing waiting on it, and not settled yet. */
38
+ private readonly outstanding;
39
+ private readonly arrivals;
40
+ private detach?;
41
+ /**
42
+ * Start listening.
43
+ *
44
+ * Returns a detach function; calling `attach` twice is a no-op rather
45
+ * than a second subscription, because a doubly-attached inbox would
46
+ * queue every completion twice and reproduce the exact duplicate this
47
+ * class exists to prevent.
48
+ */
49
+ attach(gateway: TaskGateway): () => void;
50
+ /**
51
+ * Say that a task was launched with nothing waiting on it.
52
+ *
53
+ * Without this the inbox can only see completions that have already
54
+ * happened, and a run whose supervisor launched a background worker and
55
+ * then answered would settle while the worker was still going — throwing
56
+ * away the very result the launch existed to produce. Knowing a task is
57
+ * outstanding is what lets the loop hold the run open for it.
58
+ */
59
+ expect(taskId: TaskId): void;
60
+ /** Whether anything is either waiting to be told or still running. */
61
+ get hasPendingWork(): boolean;
62
+ /**
63
+ * Wait for the next completion, or for the deadline, whichever comes first.
64
+ *
65
+ * Bounded on purpose. A worker that never finishes must not hold a run
66
+ * open forever, and the caller decides how long "long enough" is — the
67
+ * run's own budget is the only thing that knows.
68
+ */
69
+ waitForArrival(timeoutMs: number): Promise<void>;
70
+ /**
71
+ * Say that this completion reached the model as a `tool_result`.
72
+ *
73
+ * Idempotent, and safe to call before the completion is announced: the
74
+ * claim is remembered so a late announcement does not re-queue it.
75
+ */
76
+ claim(taskId: TaskId): void;
77
+ /** Whether anything is waiting to be told. */
78
+ get hasUnheard(): boolean;
79
+ /**
80
+ * Take every unheard completion, leaving the inbox empty.
81
+ *
82
+ * Draining rather than peeking: a notification that stays queued after
83
+ * being delivered is the duplicate-delivery bug in a different costume.
84
+ */
85
+ drain(): TaskHandle[];
86
+ /**
87
+ * Stop expecting a task that is never going to arrive.
88
+ *
89
+ * Cancelling is the case this exists for. `expect` puts a task on the
90
+ * outstanding list and only a COMPLETION takes it off, so a cancelled
91
+ * worker left `hasPendingWork` true for the rest of the run — and every
92
+ * attempt to settle then paid the full grace period waiting for a result
93
+ * that had been called off.
94
+ */
95
+ forget(taskId: TaskId): void;
96
+ /** Stop listening. Safe to call more than once. */
97
+ close(): void;
98
+ }
99
+ /**
100
+ * The message a supervisor reads when a worker it stopped waiting for
101
+ * finishes.
102
+ *
103
+ * It carries the task id, because without one the model cannot say which of
104
+ * five workers this was, and it carries the output, because a notification
105
+ * that only says "done" forces exactly the follow-up call this mechanism
106
+ * exists to remove. Long output is truncated with the task id repeated in
107
+ * the truncation notice, so the full text stays one `wait_for_task` away and
108
+ * the model knows which id to ask for — that tool takes a `task_id` and
109
+ * returns immediately for a task that has already finished, where the
110
+ * listing takes only a state filter and could not have been followed.
111
+ */
112
+ export declare function formatCompletionNotification(handles: readonly TaskHandle[]): string;
113
+ //# sourceMappingURL=completion-inbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion-inbox.d.ts","sourceRoot":"","sources":["../../src/gateway/completion-inbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACxE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAEnD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;IACxD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoB;IAC5C,gEAAgE;IAChE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,MAAM,CAAC,CAAY;IAE3B;;;;;;;OAOG;IACH,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,IAAI;IAcxC;;;;;;;;OAQG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK5B,sEAAsE;IACtE,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED;;;;;;OAMG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BhD;;;;;OAKG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAM3B,8CAA8C;IAC9C,IAAI,UAAU,IAAI,OAAO,CAExB;IAED;;;;;OAKG;IACH,KAAK,IAAI,UAAU,EAAE;IAQrB;;;;;;;;OAQG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQ5B,mDAAmD;IACnD,KAAK,IAAI,IAAI;CAUb;AAKD;;;;;;;;;;;;GAYG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,GAAG,MAAM,CA8BnF"}