agentenkit 0.3.0 → 0.4.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 (216) hide show
  1. package/README.md +34 -14
  2. package/dist/adapters/inline.d.ts +19 -5
  3. package/dist/adapters/inline.d.ts.map +1 -1
  4. package/dist/adapters/inline.js +87 -14
  5. package/dist/adapters/inline.js.map +1 -1
  6. package/dist/adapters/memory.d.ts +65 -3
  7. package/dist/adapters/memory.d.ts.map +1 -1
  8. package/dist/adapters/memory.js +267 -3
  9. package/dist/adapters/memory.js.map +1 -1
  10. package/dist/adapters/prisma.d.ts +125 -18
  11. package/dist/adapters/prisma.d.ts.map +1 -1
  12. package/dist/adapters/prisma.js +308 -67
  13. package/dist/adapters/prisma.js.map +1 -1
  14. package/dist/adapters/qstash.d.ts +15 -2
  15. package/dist/adapters/qstash.d.ts.map +1 -1
  16. package/dist/adapters/qstash.js +31 -14
  17. package/dist/adapters/qstash.js.map +1 -1
  18. package/dist/adapters/redis.d.ts +40 -4
  19. package/dist/adapters/redis.d.ts.map +1 -1
  20. package/dist/adapters/redis.js +265 -20
  21. package/dist/adapters/redis.js.map +1 -1
  22. package/dist/adapters/sqlite.d.ts +52 -2
  23. package/dist/adapters/sqlite.d.ts.map +1 -1
  24. package/dist/adapters/sqlite.js +342 -35
  25. package/dist/adapters/sqlite.js.map +1 -1
  26. package/dist/adapters/stream-scripts.d.ts +49 -0
  27. package/dist/adapters/stream-scripts.d.ts.map +1 -0
  28. package/dist/adapters/stream-scripts.js +150 -0
  29. package/dist/adapters/stream-scripts.js.map +1 -0
  30. package/dist/adapters/upstash.d.ts +20 -0
  31. package/dist/adapters/upstash.d.ts.map +1 -1
  32. package/dist/adapters/upstash.js +29 -0
  33. package/dist/adapters/upstash.js.map +1 -1
  34. package/dist/admin/memory.d.ts +11 -1
  35. package/dist/admin/memory.d.ts.map +1 -1
  36. package/dist/admin/memory.js +83 -14
  37. package/dist/admin/memory.js.map +1 -1
  38. package/dist/admin/migrations/postgres/0002-run-settled-at.d.ts +5 -0
  39. package/dist/admin/migrations/postgres/0002-run-settled-at.d.ts.map +1 -0
  40. package/dist/admin/migrations/postgres/0002-run-settled-at.js +11 -0
  41. package/dist/admin/migrations/postgres/0002-run-settled-at.js.map +1 -0
  42. package/dist/admin/migrations/postgres/0003-run-enqueued-at.d.ts +5 -0
  43. package/dist/admin/migrations/postgres/0003-run-enqueued-at.d.ts.map +1 -0
  44. package/dist/admin/migrations/postgres/0003-run-enqueued-at.js +15 -0
  45. package/dist/admin/migrations/postgres/0003-run-enqueued-at.js.map +1 -0
  46. package/dist/admin/migrations/postgres/0004-run-settle-claim.d.ts +5 -0
  47. package/dist/admin/migrations/postgres/0004-run-settle-claim.d.ts.map +1 -0
  48. package/dist/admin/migrations/postgres/0004-run-settle-claim.js +15 -0
  49. package/dist/admin/migrations/postgres/0004-run-settle-claim.js.map +1 -0
  50. package/dist/admin/migrations/postgres/0005-bigint-counters.d.ts +5 -0
  51. package/dist/admin/migrations/postgres/0005-bigint-counters.d.ts.map +1 -0
  52. package/dist/admin/migrations/postgres/0005-bigint-counters.js +12 -0
  53. package/dist/admin/migrations/postgres/0005-bigint-counters.js.map +1 -0
  54. package/dist/admin/migrations/postgres/index.d.ts.map +1 -1
  55. package/dist/admin/migrations/postgres/index.js +16 -1
  56. package/dist/admin/migrations/postgres/index.js.map +1 -1
  57. package/dist/admin/migrations/runner.d.ts +21 -1
  58. package/dist/admin/migrations/runner.d.ts.map +1 -1
  59. package/dist/admin/migrations/runner.js +41 -4
  60. package/dist/admin/migrations/runner.js.map +1 -1
  61. package/dist/admin/migrations/sqlite/0002-run-settled-at.d.ts +5 -0
  62. package/dist/admin/migrations/sqlite/0002-run-settled-at.d.ts.map +1 -0
  63. package/dist/admin/migrations/sqlite/0002-run-settled-at.js +11 -0
  64. package/dist/admin/migrations/sqlite/0002-run-settled-at.js.map +1 -0
  65. package/dist/admin/migrations/sqlite/0003-run-enqueued-at.d.ts +5 -0
  66. package/dist/admin/migrations/sqlite/0003-run-enqueued-at.d.ts.map +1 -0
  67. package/dist/admin/migrations/sqlite/0003-run-enqueued-at.js +15 -0
  68. package/dist/admin/migrations/sqlite/0003-run-enqueued-at.js.map +1 -0
  69. package/dist/admin/migrations/sqlite/0004-run-settle-claim.d.ts +5 -0
  70. package/dist/admin/migrations/sqlite/0004-run-settle-claim.d.ts.map +1 -0
  71. package/dist/admin/migrations/sqlite/0004-run-settle-claim.js +15 -0
  72. package/dist/admin/migrations/sqlite/0004-run-settle-claim.js.map +1 -0
  73. package/dist/admin/migrations/sqlite/index.d.ts +2 -2
  74. package/dist/admin/migrations/sqlite/index.d.ts.map +1 -1
  75. package/dist/admin/migrations/sqlite/index.js +17 -3
  76. package/dist/admin/migrations/sqlite/index.js.map +1 -1
  77. package/dist/admin/postgres.d.ts +14 -4
  78. package/dist/admin/postgres.d.ts.map +1 -1
  79. package/dist/admin/postgres.js +131 -36
  80. package/dist/admin/postgres.js.map +1 -1
  81. package/dist/admin/shared.d.ts +19 -0
  82. package/dist/admin/shared.d.ts.map +1 -0
  83. package/dist/admin/shared.js +28 -0
  84. package/dist/admin/shared.js.map +1 -0
  85. package/dist/admin/sqlite.d.ts +9 -1
  86. package/dist/admin/sqlite.d.ts.map +1 -1
  87. package/dist/admin/sqlite.js +112 -29
  88. package/dist/admin/sqlite.js.map +1 -1
  89. package/dist/core/admin.d.ts +28 -6
  90. package/dist/core/admin.d.ts.map +1 -1
  91. package/dist/core/admin.js +92 -23
  92. package/dist/core/admin.js.map +1 -1
  93. package/dist/core/agent.d.ts +7 -4
  94. package/dist/core/agent.d.ts.map +1 -1
  95. package/dist/core/agent.js +15 -11
  96. package/dist/core/agent.js.map +1 -1
  97. package/dist/core/agui.d.ts +17 -0
  98. package/dist/core/agui.d.ts.map +1 -0
  99. package/dist/core/agui.js +69 -0
  100. package/dist/core/agui.js.map +1 -0
  101. package/dist/core/context.d.ts +13 -1
  102. package/dist/core/context.d.ts.map +1 -1
  103. package/dist/core/context.js +70 -19
  104. package/dist/core/context.js.map +1 -1
  105. package/dist/core/deleteThread.d.ts.map +1 -1
  106. package/dist/core/deleteThread.js +33 -4
  107. package/dist/core/deleteThread.js.map +1 -1
  108. package/dist/core/engine.d.ts +41 -11
  109. package/dist/core/engine.d.ts.map +1 -1
  110. package/dist/core/engine.js +855 -352
  111. package/dist/core/engine.js.map +1 -1
  112. package/dist/core/follow.d.ts +63 -1
  113. package/dist/core/follow.d.ts.map +1 -1
  114. package/dist/core/follow.js +293 -16
  115. package/dist/core/follow.js.map +1 -1
  116. package/dist/core/hitl.d.ts +43 -0
  117. package/dist/core/hitl.d.ts.map +1 -1
  118. package/dist/core/hitl.js +163 -35
  119. package/dist/core/hitl.js.map +1 -1
  120. package/dist/core/keys.d.ts +22 -4
  121. package/dist/core/keys.d.ts.map +1 -1
  122. package/dist/core/keys.js +23 -5
  123. package/dist/core/keys.js.map +1 -1
  124. package/dist/core/lease.d.ts +46 -0
  125. package/dist/core/lease.d.ts.map +1 -0
  126. package/dist/core/lease.js +142 -0
  127. package/dist/core/lease.js.map +1 -0
  128. package/dist/core/loop.d.ts +27 -7
  129. package/dist/core/loop.d.ts.map +1 -1
  130. package/dist/core/loop.js +140 -55
  131. package/dist/core/loop.js.map +1 -1
  132. package/dist/core/messages.d.ts +21 -2
  133. package/dist/core/messages.d.ts.map +1 -1
  134. package/dist/core/messages.js +61 -2
  135. package/dist/core/messages.js.map +1 -1
  136. package/dist/core/prune.d.ts +24 -0
  137. package/dist/core/prune.d.ts.map +1 -0
  138. package/dist/core/prune.js +43 -0
  139. package/dist/core/prune.js.map +1 -0
  140. package/dist/core/publish.d.ts +38 -10
  141. package/dist/core/publish.d.ts.map +1 -1
  142. package/dist/core/publish.js +126 -12
  143. package/dist/core/publish.js.map +1 -1
  144. package/dist/core/reclaim.d.ts +8 -1
  145. package/dist/core/reclaim.d.ts.map +1 -1
  146. package/dist/core/reclaim.js +149 -18
  147. package/dist/core/reclaim.js.map +1 -1
  148. package/dist/core/run.d.ts +7 -3
  149. package/dist/core/run.d.ts.map +1 -1
  150. package/dist/core/run.js +95 -35
  151. package/dist/core/run.js.map +1 -1
  152. package/dist/core/segment.d.ts +62 -0
  153. package/dist/core/segment.d.ts.map +1 -0
  154. package/dist/core/segment.js +318 -0
  155. package/dist/core/segment.js.map +1 -0
  156. package/dist/core/settle.d.ts +57 -0
  157. package/dist/core/settle.d.ts.map +1 -0
  158. package/dist/core/settle.js +181 -0
  159. package/dist/core/settle.js.map +1 -0
  160. package/dist/core/snapshot.d.ts +36 -0
  161. package/dist/core/snapshot.d.ts.map +1 -0
  162. package/dist/core/snapshot.js +87 -0
  163. package/dist/core/snapshot.js.map +1 -0
  164. package/dist/core/stop.d.ts +16 -1
  165. package/dist/core/stop.d.ts.map +1 -1
  166. package/dist/core/stop.js +69 -15
  167. package/dist/core/stop.js.map +1 -1
  168. package/dist/core/stream-events.d.ts +184 -0
  169. package/dist/core/stream-events.d.ts.map +1 -0
  170. package/dist/core/stream-events.js +26 -0
  171. package/dist/core/stream-events.js.map +1 -0
  172. package/dist/core/stream.d.ts +29 -0
  173. package/dist/core/stream.d.ts.map +1 -1
  174. package/dist/core/stream.js +79 -0
  175. package/dist/core/stream.js.map +1 -1
  176. package/dist/core/subagent.d.ts +36 -5
  177. package/dist/core/subagent.d.ts.map +1 -1
  178. package/dist/core/subagent.js +117 -22
  179. package/dist/core/subagent.js.map +1 -1
  180. package/dist/core/types.d.ts +195 -12
  181. package/dist/core/types.d.ts.map +1 -1
  182. package/dist/core/types.js +26 -1
  183. package/dist/core/types.js.map +1 -1
  184. package/dist/core/usage.d.ts +53 -5
  185. package/dist/core/usage.d.ts.map +1 -1
  186. package/dist/core/usage.js +170 -47
  187. package/dist/core/usage.js.map +1 -1
  188. package/dist/index.d.ts +16 -11
  189. package/dist/index.d.ts.map +1 -1
  190. package/dist/index.js +12 -7
  191. package/dist/index.js.map +1 -1
  192. package/dist/ports/admin.d.ts +59 -0
  193. package/dist/ports/admin.d.ts.map +1 -1
  194. package/dist/ports/kv.d.ts +17 -0
  195. package/dist/ports/kv.d.ts.map +1 -1
  196. package/dist/ports/queue.d.ts +87 -7
  197. package/dist/ports/queue.d.ts.map +1 -1
  198. package/dist/ports/queue.js +36 -1
  199. package/dist/ports/queue.js.map +1 -1
  200. package/dist/ports/runtime.d.ts +171 -20
  201. package/dist/ports/runtime.d.ts.map +1 -1
  202. package/dist/ports/storage.d.ts +26 -5
  203. package/dist/ports/storage.d.ts.map +1 -1
  204. package/dist/ports/streams.d.ts +60 -0
  205. package/dist/ports/streams.d.ts.map +1 -0
  206. package/dist/ports/streams.js +20 -0
  207. package/dist/ports/streams.js.map +1 -0
  208. package/dist/pricing.d.ts +5 -0
  209. package/dist/pricing.d.ts.map +1 -1
  210. package/dist/pricing.js +35 -10
  211. package/dist/pricing.js.map +1 -1
  212. package/dist/runtime.d.ts +6 -0
  213. package/dist/runtime.d.ts.map +1 -1
  214. package/dist/runtime.js +144 -46
  215. package/dist/runtime.js.map +1 -1
  216. package/package.json +1 -1
@@ -1,5 +1,11 @@
1
1
  import { currentRunId } from './keys.js';
2
2
  import { hitlDeadline, loadOpenHitls } from './hitl.js';
3
+ import { enqueueJob } from './lease.js';
4
+ import { DuplicateJobError, PRIORITY_LOW, UnsupportedError } from '../ports/queue.js';
5
+ import { runLockKey } from './lease.js';
6
+ import { ACTIVE_STATES, publish, transition } from './publish.js';
7
+ import { closeLostSegment } from './segment.js';
8
+ import { isTerminal } from './settle.js';
3
9
  // Small grace so an in-flight /respond delivery always lands first —
4
10
  // reclamation only ever sees true orphans.
5
11
  export function reclaimGraceAfterMs(deps) {
@@ -13,6 +19,13 @@ export function reclaimGraceAfterMs(deps) {
13
19
  * delay. Callers are first-touch checks in run() and respond(), plus any
14
20
  * listener that wants the denial to land live in front of a user.
15
21
  *
22
+ * It also covers a run the queue lost: a thread QUEUED or RUNNING whose run
23
+ * lock nobody holds and whose job the queue no longer has. A worker that died
24
+ * leaves exactly that behind once its lock lapses, and so does a job dropped
25
+ * as dead. The run is re-dispatched and resumes from its last persisted
26
+ * step, unless its record already ended, in which case the thread is moved
27
+ * to match the record.
28
+ *
16
29
  * It no longer heals inline. It re-dispatches the run and lets the engine
17
30
  * resolve the park, so there is exactly ONE definition of what an expired
18
31
  * approval becomes — and so a thread holding several open approvals (§2.7)
@@ -20,10 +33,14 @@ export function reclaimGraceAfterMs(deps) {
20
33
  * same run twice is safe: the run lock and the engine's readiness check make
21
34
  * the duplicate a no-op (§2.8).
22
35
  *
23
- * Returns true iff a re-dispatch was enqueued. */
36
+ * Returns true iff a re-dispatch was enqueued or the thread was healed. */
24
37
  export async function reclaimIfOrphaned(deps, threadId) {
25
38
  const thread = await deps.storage.threads.get(threadId);
26
- if (thread?.state !== 'WAITING_FOR_INPUT')
39
+ if (!thread)
40
+ return false;
41
+ if (thread.state === 'QUEUED' || thread.state === 'RUNNING')
42
+ return reclaimLost(deps, thread);
43
+ if (thread.state !== 'WAITING_FOR_INPUT')
27
44
  return false;
28
45
  const open = await loadOpenHitls(deps, threadId);
29
46
  if (open.length === 0)
@@ -38,22 +55,136 @@ export async function reclaimIfOrphaned(deps, threadId) {
38
55
  // payload; a legacy park without one falls back to the default handle.
39
56
  const requested = await deps.storage.events.listByType(threadId, 'INPUT_REQUIRED');
40
57
  const resume = requested.at(-1)?.payload?.resume;
41
- await deps.queue.enqueue({
42
- threadId,
43
- // Resuming a parked run REUSES its id — it is the same run continuing,
44
- // and the park's own expiry job must stay a duplicate of this one (§2.1).
45
- runId: await currentRunId(deps, threadId),
46
- model: resume?.model ?? thread.model,
47
- ...(resume
48
- ? {
49
- agent: resume.agent,
50
- ...(resume.tokenBudget !== undefined ? { tokenBudget: resume.tokenBudget } : {}),
51
- ...(resume.providerOptions ? { providerOptions: resume.providerOptions } : {}),
52
- ...(resume.state ? { state: resume.state } : {}),
53
- ...(resume.costBudgetMicros !== undefined ? { costBudgetMicros: resume.costBudgetMicros } : {}),
54
- }
55
- : {}),
56
- });
58
+ // Resuming a parked run REUSES its id — it is the same run continuing, and
59
+ // the park's own expiry job must stay a duplicate of this one (§2.1). Keyed
60
+ // on the run, so two callers that heal the thread at once queue one job.
61
+ const runId = await currentRunId(deps, threadId);
62
+ try {
63
+ await enqueueJob(deps, {
64
+ kind: 'reclaim',
65
+ threadId,
66
+ runId,
67
+ model: resume?.model ?? thread.model,
68
+ ...(resume
69
+ ? {
70
+ agent: resume.agent,
71
+ ...(resume.tokenBudget !== undefined ? { tokenBudget: resume.tokenBudget } : {}),
72
+ ...(resume.providerOptions ? { providerOptions: resume.providerOptions } : {}),
73
+ ...(resume.state ? { state: resume.state } : {}),
74
+ ...(resume.costBudgetMicros !== undefined ? { costBudgetMicros: resume.costBudgetMicros } : {}),
75
+ ...(resume.maxSteps ? { maxSteps: resume.maxSteps } : {}),
76
+ ...(resume.dispatchedAt ? { dispatchedAt: resume.dispatchedAt } : {}),
77
+ }
78
+ : {}),
79
+ }, { key: `reclaim:${runId}`, priority: PRIORITY_LOW });
80
+ }
81
+ catch (err) {
82
+ if (err instanceof DuplicateJobError)
83
+ return false; // someone else got there first
84
+ throw err;
85
+ }
86
+ return true;
87
+ }
88
+ /** Re-dispatch a QUEUED or RUNNING thread that nothing is working on: no run
89
+ * lock, no job on the queue, and a run record that has sat untouched for
90
+ * longer than a lock lease. With a queue that cannot look a job up, the
91
+ * run must also have been quiet for longer than any of its jobs could
92
+ * wait. */
93
+ async function reclaimLost(deps, thread) {
94
+ const threadId = thread.id;
95
+ const runId = await currentRunId(deps, threadId);
96
+ if (!runId)
97
+ return false;
98
+ // A live worker: the lock is renewed while one runs (§3.4).
99
+ if ((await deps.kv.get(runLockKey(threadId))) !== null)
100
+ return false;
101
+ // A queue that cannot look a job up (QStash) cannot say whether it still
102
+ // holds this one. Then only time can: see the wait below.
103
+ let queueCannotSay = false;
104
+ try {
105
+ if (await deps.queue.find(runId))
106
+ return false; // still queued, or leased: the queue has it
107
+ }
108
+ catch (err) {
109
+ if (!(err instanceof UnsupportedError))
110
+ throw err;
111
+ queueCannotSay = true;
112
+ }
113
+ const rec = await deps.admin.runs.get(runId);
114
+ if (!rec)
115
+ return false;
116
+ const log = (deps.log ?? console);
117
+ if (rec.endedAt) {
118
+ // The run ended but the thread never heard: a finalize that failed half
119
+ // way. The thread is moved to match the record.
120
+ const state = isTerminal(rec.state) ? rec.state : 'FAILED';
121
+ log.warn?.("thread stuck past its run's end; moved to the run's state", { threadId, runId, state });
122
+ if (!(await transition(deps, threadId, { from: ACTIVE_STATES, to: state, runId, model: thread.model }))) {
123
+ return false;
124
+ }
125
+ await publish(deps, threadId, 'STATE_CHANGE', {
126
+ state, stopReason: rec.stopReason, runId, endedAt: rec.endedAt,
127
+ });
128
+ await closeLostSegment(deps, threadId, runId, 'the run ended but its worker never closed its stream');
129
+ return true;
130
+ }
131
+ // A run just accepted has no lock and no job for a moment between its state
132
+ // write and its enqueue. A lock lease of silence tells that apart from a run
133
+ // nobody will ever pick up.
134
+ let last = new Date(rec.startedAt).getTime();
135
+ if (rec.enqueuedAt && new Date(rec.enqueuedAt).getTime() > last)
136
+ last = new Date(rec.enqueuedAt).getTime();
137
+ let wait = deps.config.runLockLeaseSeconds * 1000;
138
+ if (queueCannotSay) {
139
+ // Without the queue's word, the run is lost only once it has been quiet
140
+ // for longer than any job of it could fairly wait: a retry sent back
141
+ // with a delay, or a queue with a wait limit. The thread's own last
142
+ // change counts too, since a retry moves it back to QUEUED. Should the
143
+ // job turn up after all, it finds the run taken and does nothing.
144
+ const touched = new Date(thread.updatedAt).getTime();
145
+ if (touched > last)
146
+ last = touched;
147
+ wait = Math.max(wait, deps.config.maxQueueWaitMs, longestRetryDelayMs(deps));
148
+ }
149
+ if (Date.now() - last < wait)
150
+ return false;
151
+ log.warn?.('run lost by the queue; re-dispatched', { threadId, runId, state: thread.state });
152
+ // A worker that took it and died may have left its segment's stream open.
153
+ await closeLostSegment(deps, threadId, runId, 'the worker was lost; the run was dispatched again');
154
+ try {
155
+ await enqueueJob(deps, {
156
+ kind: 'reclaim',
157
+ threadId, runId, model: rec.model, agent: rec.agent,
158
+ enqueuedAt: Date.now(),
159
+ ...(rec.enqueuedAt ? { dispatchedAt: new Date(rec.enqueuedAt).getTime() } : {}),
160
+ ...(rec.runState ? { state: rec.runState } : {}),
161
+ ...(rec.providerOptions ? { providerOptions: rec.providerOptions } : {}),
162
+ ...(rec.costBudgetMicros ? { costBudgetMicros: rec.costBudgetMicros } : {}),
163
+ ...(rec.maxSteps ? { maxSteps: rec.maxSteps } : {}),
164
+ ...(rec.tokenBudget ? { tokenBudget: rec.tokenBudget } : {}),
165
+ }, { key: `reclaim:${runId}`, priority: PRIORITY_LOW });
166
+ }
167
+ catch (err) {
168
+ if (err instanceof DuplicateJobError)
169
+ return false; // someone else got there first
170
+ throw err;
171
+ }
57
172
  return true;
58
173
  }
174
+ /** The longest a failed run's retry is held back (§2.8): the base doubled
175
+ * per attempt, capped, plus the most jitter a delay can get. */
176
+ function longestRetryDelayMs(deps) {
177
+ const { runRetryBackoffMs: base, runRetryBackoffMaxMs: max, runMaxAttempts } = deps.config;
178
+ if (base <= 0)
179
+ return 0;
180
+ let d = base;
181
+ for (let i = 1; i < runMaxAttempts; i++) {
182
+ d *= 2;
183
+ if (max > 0 && d >= max)
184
+ break;
185
+ }
186
+ if (max > 0 && d > max)
187
+ d = max;
188
+ return d + d / 4;
189
+ }
59
190
  //# sourceMappingURL=reclaim.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reclaim.js","sourceRoot":"","sources":["../../src/core/reclaim.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAExD,qEAAqE;AACrE,2CAA2C;AAC3C,MAAM,UAAU,mBAAmB,CAAC,IAAkB;IACpD,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;AAC5D,CAAC;AAED;;;;;;;;;;;;;;;mDAemD;AACnD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAkB,EAAE,QAAgB;IAC1E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxD,IAAI,MAAM,EAAE,KAAK,KAAK,mBAAmB;QAAE,OAAO,KAAK,CAAC;IAExD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACjD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEpC,2EAA2E;IAC3E,wDAAwD;IACxD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;QACzF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,uEAAuE;IACvE,uEAAuE;IACvE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IACnF,MAAM,MAAM,GAAI,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,OAA0C,EAAE,MAAM,CAAC;IAErF,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QACvB,QAAQ;QACR,uEAAuE;QACvE,0EAA0E;QAC1E,KAAK,EAAE,MAAM,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC;QACzC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,MAAM,CAAC,KAAK;QACpC,GAAG,CAAC,MAAM;YACR,CAAC,CAAC;gBACE,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,GAAG,CAAC,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChF,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9E,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChD,GAAG,CAAC,MAAM,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChG;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"reclaim.js","sourceRoot":"","sources":["../../src/core/reclaim.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,12 @@
1
- import type { RuntimePorts, RunInput, RunResult } from '../ports/runtime.js';
1
+ import type { Attachment, RuntimePorts, RunInput, RunResult } from '../ports/runtime.js';
2
2
  import type { RegisteredAgent } from './agent.js';
3
3
  /** The §5.1 behavior: heal orphans → billing pre-check (§4) → persist the user
4
- * message → state RUNNING (hot + durable) → enqueue on the dispatch queue
4
+ * message → state QUEUED (hot + durable) → enqueue on the dispatch queue
5
5
  * (§2.8). Accepts no execution responsibility whatsoever — the queue does
6
- * the rest, and the job dispatches back to THIS handle. */
6
+ * the rest, and the job dispatches back to THIS handle. The worker that picks
7
+ * the job up moves the thread to RUNNING. */
7
8
  export declare function run(deps: RuntimePorts, agent: RegisteredAgent, input: RunInput): Promise<RunResult>;
9
+ /** A user turn: plain text alone, or text plus the images attached to it
10
+ * (§5.1), in the shape the model reads natively. */
11
+ export declare function userContent(text: string, attachments?: Attachment[]): unknown;
8
12
  //# sourceMappingURL=run.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/core/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAQlD;;;4DAG4D;AAC5D,wBAAsB,GAAG,CACvB,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,QAAQ,GACd,OAAO,CAAC,SAAS,CAAC,CAqKpB"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/core/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEzF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AASlD;;;;8CAI8C;AAC9C,wBAAsB,GAAG,CACvB,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,QAAQ,GACd,OAAO,CAAC,SAAS,CAAC,CAqNpB;AAwDD;qDACqD;AACrD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,UAAU,EAAE,GAAG,OAAO,CAO7E"}
package/dist/core/run.js CHANGED
@@ -1,13 +1,16 @@
1
+ import { QueueFullError, UnsupportedError } from '../ports/queue.js';
1
2
  import { reclaimIfOrphaned } from './reclaim.js';
2
- import { runIdKey } from './keys.js';
3
+ import { runIdKey, THREAD_KEY_TTL_SECONDS } from './keys.js';
3
4
  import { recordStoppedRun } from './stop.js';
4
5
  import { randomUUID } from 'node:crypto';
5
- import { publish, setThreadState, publishEvent } from './publish.js';
6
+ import { ACTIVE_STATES, publish, publishEvent, transition } from './publish.js';
6
7
  import { mergeProviderOptions } from './types.js';
8
+ import { enqueueJob } from './lease.js';
7
9
  /** The §5.1 behavior: heal orphans → billing pre-check (§4) → persist the user
8
- * message → state RUNNING (hot + durable) → enqueue on the dispatch queue
10
+ * message → state QUEUED (hot + durable) → enqueue on the dispatch queue
9
11
  * (§2.8). Accepts no execution responsibility whatsoever — the queue does
10
- * the rest, and the job dispatches back to THIS handle. */
12
+ * the rest, and the job dispatches back to THIS handle. The worker that picks
13
+ * the job up moves the thread to RUNNING. */
11
14
  export async function run(deps, agent, input) {
12
15
  // Model resolution order (§3.1): run input → spec default → 'gpt-4o'
13
16
  const model = input.model ?? agent.spec.model ?? 'gpt-4o';
@@ -23,9 +26,8 @@ export async function run(deps, agent, input) {
23
26
  if (!thread)
24
27
  return { accepted: false, threadId, error: 'Thread not found' };
25
28
  const initialState = thread.state;
26
- if (state === 'RUNNING' || state === 'WAITING_FOR_INPUT' ||
27
- thread.state === 'RUNNING' || thread.state === 'WAITING_FOR_INPUT') {
28
- return { accepted: false, threadId, error: 'Thread has an active run' };
29
+ if (ACTIVE_STATES.includes(state) || ACTIVE_STATES.includes(thread.state)) {
30
+ return { accepted: false, threadId, reason: 'active_run', error: 'Thread has an active run' };
29
31
  }
30
32
  // Billing pre-execution check (§4) — user-injected hook. A refusal is
31
33
  // published on the thread as well as returned, so every client on the
@@ -34,14 +36,45 @@ export async function run(deps, agent, input) {
34
36
  const check = await deps.config.billingPreCheck({
35
37
  threadId,
36
38
  state: input.state ?? {},
39
+ stage: 'dispatch',
37
40
  publishEvent: (type, payload, options) => publishEvent(deps, threadId, type, payload, options),
38
41
  });
39
42
  if (!check.ok) {
40
43
  const error = check.error ?? 'Billing check failed';
41
44
  await publish(deps, threadId, 'RUN_REFUSED', { reason: 'billing', error });
42
- return { accepted: false, threadId, error };
45
+ return { accepted: false, threadId, reason: 'billing', error };
43
46
  }
44
47
  }
48
+ // Overload check (§2.8), BEFORE anything is written: a queue at its depth
49
+ // cap refuses the run outright, the thread stays as it was, and the caller
50
+ // can say "try again shortly". Only new work is refused here; a retry, a
51
+ // resume or an expiry belongs to a run already under way and always goes in.
52
+ if (deps.config.maxQueueDepth > 0) {
53
+ let ready;
54
+ try {
55
+ ready = (await deps.queue.stats()).ready;
56
+ }
57
+ catch (err) {
58
+ if (!(err instanceof UnsupportedError))
59
+ throw err;
60
+ }
61
+ if (ready !== undefined && ready >= deps.config.maxQueueDepth) {
62
+ (deps.log ?? console).warn?.('run refused: queue full', { threadId, ready, maxQueueDepth: deps.config.maxQueueDepth });
63
+ await publish(deps, threadId, 'RUN_REFUSED', { reason: 'queue_full', error: new QueueFullError().message });
64
+ return { accepted: false, threadId, reason: 'queue_full', error: 'The assistant is busy right now. Try again shortly.' };
65
+ }
66
+ }
67
+ // A caller-named run (§2.1) is checked before anything is written: a reused
68
+ // id must refuse, never resend.
69
+ if (input.runId && (await deps.admin.runs.get(input.runId))) {
70
+ return { accepted: false, threadId, error: 'Run id already used' };
71
+ }
72
+ if (input.maxSteps !== undefined && (!Number.isInteger(input.maxSteps) || input.maxSteps < 0)) {
73
+ return { accepted: false, threadId, error: 'maxSteps must be zero or a positive number' };
74
+ }
75
+ // A run may cap itself below the config, never above it. 0 keeps the
76
+ // config's.
77
+ const maxSteps = Math.min(input.maxSteps ?? 0, deps.config.maxSteps);
45
78
  // Edit + resend (§5.1): the edited turn and everything it led to are
46
79
  // dropped, then the new text is appended in its place — one thread, no
47
80
  // forking. Only a user turn may be edited: cutting from anywhere else can
@@ -60,21 +93,28 @@ export async function run(deps, agent, input) {
60
93
  }
61
94
  // The durable store already provides an atomic state claim. Do this before
62
95
  // editing or appending history, so only the winning send changes the thread.
63
- const runId = randomUUID();
96
+ const runId = input.runId || randomUUID();
64
97
  const previousRunId = await deps.kv.get(runIdKey(threadId));
65
- const admitted = await deps.storage.threads.claimState(threadId, initialState, 'RUNNING');
98
+ // The thread now belongs to this run: every later state change names it, so
99
+ // a run that is stopped or replaced can never move the thread (§3.4).
100
+ const admitted = await transition(deps, threadId, {
101
+ from: [initialState], to: 'QUEUED', newRunId: runId, model,
102
+ });
66
103
  if (!admitted)
67
- return { accepted: false, threadId, error: 'Thread has an active run' };
104
+ return { accepted: false, threadId, reason: 'active_run', error: 'Thread has an active run' };
68
105
  let installed = false;
69
106
  try {
70
- await deps.kv.set(runIdKey(threadId), runId);
107
+ await deps.kv.set(runIdKey(threadId), runId, { exSeconds: THREAD_KEY_TTL_SECONDS });
71
108
  installed = true;
72
- await deps.kv.set(`agent:state:${threadId}`, 'RUNNING');
73
- // The run's durable record opens here (§2.9): a thread accumulates many runs
74
- // and Thread.state only ever describes the latest, so this is the only place
75
- // "what happened, how long, what did it cost" can be answered from.
109
+ // The run's durable record opens here (§2.9), QUEUED: no worker has it
110
+ // yet. A thread accumulates many runs and Thread.state only ever describes
111
+ // the latest, so this is the only place "what happened, how long, what did
112
+ // it cost" can be answered from. It remembers when it was enqueued, so the
113
+ // wait is visible while it lasts and measurable once it ends.
114
+ const enqueuedAt = new Date();
76
115
  await deps.admin.runs.start({
77
- id: runId, threadId, agent: agent.name, model,
116
+ id: runId, threadId, agent: agent.name, model, state: 'QUEUED', enqueuedAt,
117
+ costBudgetMicros: input.costBudgetMicros ?? 0, maxSteps,
78
118
  // What this run was asked to do (§2.9) — without it a dashboard can show
79
119
  // that a run was slow but not what it was slow at.
80
120
  ...(deps.config.recordPayloads
@@ -99,7 +139,7 @@ export async function run(deps, agent, input) {
99
139
  }
100
140
  const userMessage = await deps.storage.messages.append(threadId, {
101
141
  role: 'user',
102
- content: input.prompt,
142
+ content: userContent(input.prompt, input.attachments),
103
143
  });
104
144
  // The user's turn goes on the bus like everything else (§2.2). Without it a
105
145
  // second client watching the same thread sees the reply stream in with no
@@ -111,23 +151,27 @@ export async function run(deps, agent, input) {
111
151
  content: userMessage.content,
112
152
  agentId: userMessage.agentId,
113
153
  createdAt: userMessage.createdAt,
154
+ // The sender's own name for it (see RunInput.clientMessageId).
155
+ ...(input.clientMessageId ? { clientMessageId: input.clientMessageId } : {}),
114
156
  });
115
- // Admission already set durable RUNNING. Never overwrite a stop that
157
+ // Admission already set durable QUEUED. Never overwrite a stop that
116
158
  // arrived while history was being persisted.
117
159
  if (!await dispatchActive(deps, threadId, runId)) {
118
160
  return { accepted: false, threadId, runId, error: 'Run was stopped before dispatch' };
119
161
  }
120
162
  // A durable run boundary lets reconnecting clients distinguish this turn's
121
- // in-flight chunks from earlier completed turns.
122
- await publish(deps, threadId, 'STATE_CHANGE', { state: 'RUNNING' });
163
+ // in-flight chunks from earlier completed turns. It names the run and when
164
+ // it was accepted; the worker that picks it up publishes RUNNING with the
165
+ // moment work started, so a client's clock measures work, not waiting.
166
+ await publish(deps, threadId, 'STATE_CHANGE', { state: 'QUEUED', runId, enqueuedAt });
123
167
  // What started the thread (§2.9), recorded once: the first dispatched
124
168
  // run's parameters. A later run never overwrites it. Observability must
125
169
  // never fail a run, so this is best-effort.
126
170
  await deps.admin.threads
127
171
  .upsert({
128
- id: threadId, state: 'RUNNING', model,
172
+ id: threadId, state: 'QUEUED', model,
129
173
  startedWith: {
130
- runId, agent: agent.name, model, at: new Date(),
174
+ runId, agent: agent.name, model, at: enqueuedAt,
131
175
  ...(deps.config.recordPayloads
132
176
  ? {
133
177
  prompt: capText(input.prompt, deps.config.payloadCapChars),
@@ -142,9 +186,12 @@ export async function run(deps, agent, input) {
142
186
  if (!await dispatchActive(deps, threadId, runId)) {
143
187
  return { accepted: false, threadId, runId, error: 'Run was stopped before dispatch' };
144
188
  }
145
- await deps.queue.enqueue({
189
+ await enqueueJob(deps, {
146
190
  threadId, runId, model, agent: agent.name,
147
- enqueuedAt: Date.now(),
191
+ enqueuedAt: enqueuedAt.getTime(),
192
+ dispatchedAt: enqueuedAt.getTime(),
193
+ ...(maxSteps ? { maxSteps } : {}),
194
+ ...(input.partitionKey ? { partitionKey: input.partitionKey } : {}),
148
195
  // Persisted on the ticket so a worker — or a resume after an approval,
149
196
  // hours later, in another process — rehydrates the same state (§2.10).
150
197
  ...(input.state ? { state: input.state } : {}),
@@ -152,43 +199,43 @@ export async function run(deps, agent, input) {
152
199
  costBudgetMicros: input.costBudgetMicros,
153
200
  providerOptions: input.providerOptions,
154
201
  });
155
- return { accepted: true, threadId, runId, state: 'RUNNING' };
202
+ return { accepted: true, threadId, runId, state: 'QUEUED' };
156
203
  }
157
204
  catch (err) {
158
205
  const error = err instanceof Error ? err.message : String(err);
159
206
  await failDispatch(deps, threadId, runId, model, error, installed ? undefined : previousRunId);
160
- return { accepted: false, threadId, runId, error };
207
+ return {
208
+ accepted: false, threadId, runId, error,
209
+ ...(err instanceof QueueFullError ? { reason: 'queue_full' } : {}),
210
+ };
161
211
  }
162
212
  }
163
213
  /** Stop can arrive while a request is still preparing its dispatch. */
164
214
  async function dispatchActive(deps, threadId, runId) {
165
215
  const current = await deps.kv.get(runIdKey(threadId));
166
216
  const thread = await deps.storage.threads.get(threadId);
167
- if (current === runId && thread?.state === 'RUNNING')
217
+ if (current === runId && thread?.state === 'QUEUED')
168
218
  return true;
169
219
  await recordStoppedRun(deps, runId, new Date());
170
220
  if (current === runId && thread?.state === 'CANCELLED') {
171
- await deps.kv.set(`agent:state:${threadId}`, 'CANCELLED');
221
+ await deps.kv.set(`agent:state:${threadId}`, 'CANCELLED', { exSeconds: THREAD_KEY_TTL_SECONDS });
172
222
  }
173
223
  return false;
174
224
  }
175
225
  /** A rejected dispatch must not leave an active thread with no worker.
176
226
  * Conditional cleanup cannot overwrite a stop or a newer run. */
177
227
  async function failDispatch(deps, threadId, runId, model, error, previousRunId) {
178
- const key = `agent:state:${threadId}`;
179
228
  const current = await deps.kv.get(runIdKey(threadId));
180
229
  // If installing the identity failed, the reservation can still be ours
181
230
  // under the prior id. Never close or modify that prior run's record.
182
231
  if (current !== runId && (previousRunId === undefined || current !== previousRunId))
183
232
  return;
184
- if (!await deps.storage.threads.claimState(threadId, 'RUNNING', 'FAILED'))
233
+ if (!(await transition(deps, threadId, { from: ['QUEUED'], to: 'FAILED', runId, model })))
185
234
  return;
186
- await deps.kv.set(key, 'FAILED');
187
- await setThreadState(deps, threadId, 'FAILED', model);
235
+ const endedAt = new Date();
188
236
  try {
189
237
  const prior = await deps.admin.runs.get(runId);
190
238
  if (prior) {
191
- const endedAt = new Date();
192
239
  await deps.admin.runs.patch(runId, {
193
240
  state: 'FAILED', stopReason: 'failed', error, endedAt,
194
241
  durationMs: endedAt.getTime() - new Date(prior.startedAt).getTime(),
@@ -196,7 +243,9 @@ async function failDispatch(deps, threadId, runId, model, error, previousRunId)
196
243
  }
197
244
  }
198
245
  catch { /* Operational history must not block dispatch recovery. */ }
199
- await publish(deps, threadId, 'STATE_CHANGE', { state: 'FAILED', stopReason: 'failed', runId, error });
246
+ await publish(deps, threadId, 'STATE_CHANGE', {
247
+ state: 'FAILED', stopReason: 'failed', runId, error, endedAt,
248
+ });
200
249
  }
201
250
  /** The provider options a run is dispatched with (§3.1): config → spec →
202
251
  * input, each winning over the one before, per provider namespace. Null when
@@ -205,6 +254,17 @@ function providerOptionsFor(deps, agent, input) {
205
254
  const merged = mergeProviderOptions(mergeProviderOptions(deps.config.providerOptions, agent.spec.providerOptions), input.providerOptions);
206
255
  return merged && Object.keys(merged).length > 0 ? merged : null;
207
256
  }
257
+ /** A user turn: plain text alone, or text plus the images attached to it
258
+ * (§5.1), in the shape the model reads natively. */
259
+ export function userContent(text, attachments) {
260
+ const images = (attachments ?? []).filter((a) => a.url);
261
+ if (images.length === 0)
262
+ return text;
263
+ return [
264
+ ...(text ? [{ type: 'text', text }] : []),
265
+ ...images.map((a) => ({ type: 'image', image: a.url, ...(a.mediaType ? { mimeType: a.mediaType } : {}) })),
266
+ ];
267
+ }
208
268
  function capText(text, limit) {
209
269
  return text.length > limit ? `${text.slice(0, limit)}…` : text;
210
270
  }
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/core/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/core/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import type { RuntimePorts } from '../ports/runtime.js';
2
+ import type { RunStreams } from '../ports/streams.js';
3
+ import { type StreamEnd, type StreamEvent } from './stream-events.js';
4
+ /** The worker's side of a run stream: one per segment, open from pickup to
5
+ * the segment's end. Everything published on the thread while it is open
6
+ * is turned into typed stream events here (see forward), so the engine
7
+ * keeps calling `publish` and only opens and closes the segment.
8
+ *
9
+ * Events are appended together: they wait up to `streamFlushMs`, or until
10
+ * `streamFlushEvents` are waiting. A step end, a tool result, a park and a
11
+ * close go out at once. A failed append is logged, never thrown: the stream
12
+ * is delivery, and the run's messages are saved either way. */
13
+ /** The segment counter: each pickup of a run takes the next number, so a
14
+ * retry or a resume gets a stream of its own. */
15
+ export declare const segmentKey: (runId: string) => string;
16
+ /** The segment this process has open on a thread, if any. */
17
+ export declare function activeSegment(deps: RuntimePorts, threadId: string): SegmentStream | undefined;
18
+ /** Opens the segment's stream and says RUN_STARTED on it. Null when the
19
+ * runtime has no streams, or the open failed (logged): the run goes on
20
+ * without a stream. */
21
+ export declare function openSegment(deps: RuntimePorts, threadId: string, runId: string | undefined): Promise<SegmentStream | null>;
22
+ /** Closes a segment's stream that its worker could not: the sweep's end for
23
+ * a run whose worker died. A stream that is already closed or gone is left
24
+ * as it is. */
25
+ export declare function closeLostSegment(deps: RuntimePorts, threadId: string, runId: string, error: string): Promise<void>;
26
+ export declare class SegmentStream {
27
+ private readonly deps;
28
+ private readonly streams;
29
+ readonly threadId: string;
30
+ readonly runId: string;
31
+ readonly segment: number;
32
+ readonly streamId: string;
33
+ private buf;
34
+ private timer?;
35
+ private chain;
36
+ private ended;
37
+ private readonly agents;
38
+ private ids;
39
+ /** A one-shot agent's final text, carried on RUN_FINISHED. */
40
+ oneShotText?: string;
41
+ constructor(deps: RuntimePorts, streams: RunStreams, threadId: string, runId: string, segment: number, streamId: string);
42
+ get closed(): boolean;
43
+ /** Queue events; resolves once they are appended when any must go at once. */
44
+ push(events: StreamEvent[]): Promise<void>;
45
+ /** Append what waits; resolves once everything pushed so far is out. */
46
+ flush(): Promise<void>;
47
+ /** End the stream: what is open is ended, what waits is appended, and the
48
+ * end item goes last. A second close is a no-op. */
49
+ close(end: StreamEnd): Promise<void>;
50
+ /** Turn a published event into stream events. `reserved` is whether the
51
+ * type is one of the platform's; any other is an app's own, and goes out
52
+ * as CUSTOM. */
53
+ forward(type: string, payload: unknown, reserved: boolean): Promise<void>;
54
+ private blocks;
55
+ private newId;
56
+ private wrap;
57
+ /** End an agent's open text and reasoning. */
58
+ private endBlocks;
59
+ /** One SDK stream part as stream events, for one agent ('' the main one). */
60
+ private mapChunk;
61
+ }
62
+ //# sourceMappingURL=segment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segment.d.ts","sourceRoot":"","sources":["../../src/core/segment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAc,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAElF;;;;;;;;gEAQgE;AAEhE;kDACkD;AAClD,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,WAA6B,CAAC;AAMtE,6DAA6D;AAC7D,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAE7F;AAiBD;;wBAEwB;AACxB,wBAAsB,WAAW,CAC/B,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAsB/B;AAED;;gBAEgB;AAChB,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,qBAAa,aAAa;IAWtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM;IAf3B,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,KAAK,CAAC,CAAgC;IAC9C,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,GAAG,CAAK;IAChB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;gBAGF,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,UAAU,EAC3B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM;IAG3B,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,8EAA8E;IAC9E,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAc1C,wEAAwE;IACxE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAetB;yDACqD;IAC/C,KAAK,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB1C;;qBAEiB;IACjB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA6DzE,OAAO,CAAC,MAAM;IASd,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,IAAI;IAIZ,8CAA8C;IAC9C,OAAO,CAAC,SAAS;IAWjB,6EAA6E;IAC7E,OAAO,CAAC,QAAQ;CAgEjB"}