@autonome-research/thread-phase 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +226 -0
  3. package/dist/agent/index.d.ts +28 -0
  4. package/dist/agent/index.d.ts.map +1 -0
  5. package/dist/agent/index.js +28 -0
  6. package/dist/agent/index.js.map +1 -0
  7. package/dist/agent/openai-adapter.d.ts +15 -0
  8. package/dist/agent/openai-adapter.d.ts.map +1 -0
  9. package/dist/agent/openai-adapter.js +57 -0
  10. package/dist/agent/openai-adapter.js.map +1 -0
  11. package/dist/agent/parse-json.d.ts +12 -0
  12. package/dist/agent/parse-json.d.ts.map +1 -0
  13. package/dist/agent/parse-json.js +31 -0
  14. package/dist/agent/parse-json.js.map +1 -0
  15. package/dist/agent/retry.d.ts +15 -0
  16. package/dist/agent/retry.d.ts.map +1 -0
  17. package/dist/agent/retry.js +35 -0
  18. package/dist/agent/retry.js.map +1 -0
  19. package/dist/agent/runner.d.ts +25 -0
  20. package/dist/agent/runner.d.ts.map +1 -0
  21. package/dist/agent/runner.js +270 -0
  22. package/dist/agent/runner.js.map +1 -0
  23. package/dist/agent/stream-consumer.d.ts +57 -0
  24. package/dist/agent/stream-consumer.d.ts.map +1 -0
  25. package/dist/agent/stream-consumer.js +126 -0
  26. package/dist/agent/stream-consumer.js.map +1 -0
  27. package/dist/agent/types.d.ts +135 -0
  28. package/dist/agent/types.d.ts.map +1 -0
  29. package/dist/agent/types.js +9 -0
  30. package/dist/agent/types.js.map +1 -0
  31. package/dist/agent-runner.d.ts +10 -0
  32. package/dist/agent-runner.d.ts.map +1 -0
  33. package/dist/agent-runner.js +10 -0
  34. package/dist/agent-runner.js.map +1 -0
  35. package/dist/agents/capability.d.ts +36 -0
  36. package/dist/agents/capability.d.ts.map +1 -0
  37. package/dist/agents/capability.js +51 -0
  38. package/dist/agents/capability.js.map +1 -0
  39. package/dist/agents/event-bus.d.ts +20 -0
  40. package/dist/agents/event-bus.d.ts.map +1 -0
  41. package/dist/agents/event-bus.js +40 -0
  42. package/dist/agents/event-bus.js.map +1 -0
  43. package/dist/agents/index.d.ts +23 -0
  44. package/dist/agents/index.d.ts.map +1 -0
  45. package/dist/agents/index.js +33 -0
  46. package/dist/agents/index.js.map +1 -0
  47. package/dist/agents/inference-adapter.d.ts +52 -0
  48. package/dist/agents/inference-adapter.d.ts.map +1 -0
  49. package/dist/agents/inference-adapter.js +209 -0
  50. package/dist/agents/inference-adapter.js.map +1 -0
  51. package/dist/agents/job-store-bridge.d.ts +44 -0
  52. package/dist/agents/job-store-bridge.d.ts.map +1 -0
  53. package/dist/agents/job-store-bridge.js +58 -0
  54. package/dist/agents/job-store-bridge.js.map +1 -0
  55. package/dist/agents/memory.d.ts +40 -0
  56. package/dist/agents/memory.d.ts.map +1 -0
  57. package/dist/agents/memory.js +14 -0
  58. package/dist/agents/memory.js.map +1 -0
  59. package/dist/agents/protocol.d.ts +302 -0
  60. package/dist/agents/protocol.d.ts.map +1 -0
  61. package/dist/agents/protocol.js +36 -0
  62. package/dist/agents/protocol.js.map +1 -0
  63. package/dist/agents/run-helpers.d.ts +70 -0
  64. package/dist/agents/run-helpers.d.ts.map +1 -0
  65. package/dist/agents/run-helpers.js +131 -0
  66. package/dist/agents/run-helpers.js.map +1 -0
  67. package/dist/agents/serialize-error.d.ts +18 -0
  68. package/dist/agents/serialize-error.d.ts.map +1 -0
  69. package/dist/agents/serialize-error.js +27 -0
  70. package/dist/agents/serialize-error.js.map +1 -0
  71. package/dist/agents/structured-output.d.ts +90 -0
  72. package/dist/agents/structured-output.d.ts.map +1 -0
  73. package/dist/agents/structured-output.js +101 -0
  74. package/dist/agents/structured-output.js.map +1 -0
  75. package/dist/agents/test-utils/conformance.d.ts +59 -0
  76. package/dist/agents/test-utils/conformance.d.ts.map +1 -0
  77. package/dist/agents/test-utils/conformance.js +207 -0
  78. package/dist/agents/test-utils/conformance.js.map +1 -0
  79. package/dist/agents/test-utils/index.d.ts +12 -0
  80. package/dist/agents/test-utils/index.d.ts.map +1 -0
  81. package/dist/agents/test-utils/index.js +12 -0
  82. package/dist/agents/test-utils/index.js.map +1 -0
  83. package/dist/agents/test-utils/mock-agent.d.ts +66 -0
  84. package/dist/agents/test-utils/mock-agent.d.ts.map +1 -0
  85. package/dist/agents/test-utils/mock-agent.js +244 -0
  86. package/dist/agents/test-utils/mock-agent.js.map +1 -0
  87. package/dist/agents/thread.d.ts +57 -0
  88. package/dist/agents/thread.d.ts.map +1 -0
  89. package/dist/agents/thread.js +128 -0
  90. package/dist/agents/thread.js.map +1 -0
  91. package/dist/agents/turn-accumulator.d.ts +94 -0
  92. package/dist/agents/turn-accumulator.d.ts.map +1 -0
  93. package/dist/agents/turn-accumulator.js +150 -0
  94. package/dist/agents/turn-accumulator.js.map +1 -0
  95. package/dist/agents/with-memory.d.ts +55 -0
  96. package/dist/agents/with-memory.d.ts.map +1 -0
  97. package/dist/agents/with-memory.js +155 -0
  98. package/dist/agents/with-memory.js.map +1 -0
  99. package/dist/agents/with-thread.d.ts +45 -0
  100. package/dist/agents/with-thread.d.ts.map +1 -0
  101. package/dist/agents/with-thread.js +70 -0
  102. package/dist/agents/with-thread.js.map +1 -0
  103. package/dist/cache.d.ts +47 -0
  104. package/dist/cache.d.ts.map +1 -0
  105. package/dist/cache.js +81 -0
  106. package/dist/cache.js.map +1 -0
  107. package/dist/context/compressor.d.ts +36 -0
  108. package/dist/context/compressor.d.ts.map +1 -0
  109. package/dist/context/compressor.js +158 -0
  110. package/dist/context/compressor.js.map +1 -0
  111. package/dist/context/index.d.ts +4 -0
  112. package/dist/context/index.d.ts.map +1 -0
  113. package/dist/context/index.js +4 -0
  114. package/dist/context/index.js.map +1 -0
  115. package/dist/context/result-capper.d.ts +32 -0
  116. package/dist/context/result-capper.d.ts.map +1 -0
  117. package/dist/context/result-capper.js +50 -0
  118. package/dist/context/result-capper.js.map +1 -0
  119. package/dist/context/token-budget.d.ts +81 -0
  120. package/dist/context/token-budget.d.ts.map +1 -0
  121. package/dist/context/token-budget.js +99 -0
  122. package/dist/context/token-budget.js.map +1 -0
  123. package/dist/helpers/caller.d.ts +18 -0
  124. package/dist/helpers/caller.d.ts.map +1 -0
  125. package/dist/helpers/caller.js +40 -0
  126. package/dist/helpers/caller.js.map +1 -0
  127. package/dist/helpers/hook.d.ts +73 -0
  128. package/dist/helpers/hook.d.ts.map +1 -0
  129. package/dist/helpers/hook.js +244 -0
  130. package/dist/helpers/hook.js.map +1 -0
  131. package/dist/helpers/index.d.ts +12 -0
  132. package/dist/helpers/index.d.ts.map +1 -0
  133. package/dist/helpers/index.js +11 -0
  134. package/dist/helpers/index.js.map +1 -0
  135. package/dist/helpers/one-shot.d.ts +27 -0
  136. package/dist/helpers/one-shot.d.ts.map +1 -0
  137. package/dist/helpers/one-shot.js +43 -0
  138. package/dist/helpers/one-shot.js.map +1 -0
  139. package/dist/helpers/schedule.d.ts +59 -0
  140. package/dist/helpers/schedule.d.ts.map +1 -0
  141. package/dist/helpers/schedule.js +118 -0
  142. package/dist/helpers/schedule.js.map +1 -0
  143. package/dist/helpers/types.d.ts +34 -0
  144. package/dist/helpers/types.d.ts.map +1 -0
  145. package/dist/helpers/types.js +11 -0
  146. package/dist/helpers/types.js.map +1 -0
  147. package/dist/index.d.ts +26 -0
  148. package/dist/index.d.ts.map +1 -0
  149. package/dist/index.js +37 -0
  150. package/dist/index.js.map +1 -0
  151. package/dist/inference.d.ts +27 -0
  152. package/dist/inference.d.ts.map +1 -0
  153. package/dist/inference.js +34 -0
  154. package/dist/inference.js.map +1 -0
  155. package/dist/messages.d.ts +64 -0
  156. package/dist/messages.d.ts.map +1 -0
  157. package/dist/messages.js +17 -0
  158. package/dist/messages.js.map +1 -0
  159. package/dist/orchestrator.d.ts +56 -0
  160. package/dist/orchestrator.d.ts.map +1 -0
  161. package/dist/orchestrator.js +62 -0
  162. package/dist/orchestrator.js.map +1 -0
  163. package/dist/patterns/bounded-fanout-of.d.ts +61 -0
  164. package/dist/patterns/bounded-fanout-of.d.ts.map +1 -0
  165. package/dist/patterns/bounded-fanout-of.js +142 -0
  166. package/dist/patterns/bounded-fanout-of.js.map +1 -0
  167. package/dist/patterns/bounded-fanout.d.ts +111 -0
  168. package/dist/patterns/bounded-fanout.d.ts.map +1 -0
  169. package/dist/patterns/bounded-fanout.js +151 -0
  170. package/dist/patterns/bounded-fanout.js.map +1 -0
  171. package/dist/patterns/index.d.ts +14 -0
  172. package/dist/patterns/index.d.ts.map +1 -0
  173. package/dist/patterns/index.js +13 -0
  174. package/dist/patterns/index.js.map +1 -0
  175. package/dist/patterns/intent-gate.d.ts +27 -0
  176. package/dist/patterns/intent-gate.d.ts.map +1 -0
  177. package/dist/patterns/intent-gate.js +32 -0
  178. package/dist/patterns/intent-gate.js.map +1 -0
  179. package/dist/patterns/match.d.ts +30 -0
  180. package/dist/patterns/match.d.ts.map +1 -0
  181. package/dist/patterns/match.js +58 -0
  182. package/dist/patterns/match.js.map +1 -0
  183. package/dist/patterns/parallel-fanout.d.ts +28 -0
  184. package/dist/patterns/parallel-fanout.d.ts.map +1 -0
  185. package/dist/patterns/parallel-fanout.js +24 -0
  186. package/dist/patterns/parallel-fanout.js.map +1 -0
  187. package/dist/patterns/parallel-phases.d.ts +27 -0
  188. package/dist/patterns/parallel-phases.d.ts.map +1 -0
  189. package/dist/patterns/parallel-phases.js +77 -0
  190. package/dist/patterns/parallel-phases.js.map +1 -0
  191. package/dist/patterns/preflight-confidence.d.ts +20 -0
  192. package/dist/patterns/preflight-confidence.d.ts.map +1 -0
  193. package/dist/patterns/preflight-confidence.js +38 -0
  194. package/dist/patterns/preflight-confidence.js.map +1 -0
  195. package/dist/patterns/spot-check.d.ts +19 -0
  196. package/dist/patterns/spot-check.d.ts.map +1 -0
  197. package/dist/patterns/spot-check.js +33 -0
  198. package/dist/patterns/spot-check.js.map +1 -0
  199. package/dist/patterns/sub-pipeline.d.ts +84 -0
  200. package/dist/patterns/sub-pipeline.d.ts.map +1 -0
  201. package/dist/patterns/sub-pipeline.js +90 -0
  202. package/dist/patterns/sub-pipeline.js.map +1 -0
  203. package/dist/patterns/synthesize-with-followup.d.ts +35 -0
  204. package/dist/patterns/synthesize-with-followup.d.ts.map +1 -0
  205. package/dist/patterns/synthesize-with-followup.js +45 -0
  206. package/dist/patterns/synthesize-with-followup.js.map +1 -0
  207. package/dist/patterns/while-condition.d.ts +31 -0
  208. package/dist/patterns/while-condition.d.ts.map +1 -0
  209. package/dist/patterns/while-condition.js +59 -0
  210. package/dist/patterns/while-condition.js.map +1 -0
  211. package/dist/patterns/with-retry.d.ts +37 -0
  212. package/dist/patterns/with-retry.d.ts.map +1 -0
  213. package/dist/patterns/with-retry.js +73 -0
  214. package/dist/patterns/with-retry.js.map +1 -0
  215. package/dist/phase.d.ts +78 -0
  216. package/dist/phase.d.ts.map +1 -0
  217. package/dist/phase.js +36 -0
  218. package/dist/phase.js.map +1 -0
  219. package/dist/session/index.d.ts +5 -0
  220. package/dist/session/index.d.ts.map +1 -0
  221. package/dist/session/index.js +4 -0
  222. package/dist/session/index.js.map +1 -0
  223. package/dist/session/job-runner.d.ts +67 -0
  224. package/dist/session/job-runner.d.ts.map +1 -0
  225. package/dist/session/job-runner.js +131 -0
  226. package/dist/session/job-runner.js.map +1 -0
  227. package/dist/session/job-store.d.ts +98 -0
  228. package/dist/session/job-store.d.ts.map +1 -0
  229. package/dist/session/job-store.js +37 -0
  230. package/dist/session/job-store.js.map +1 -0
  231. package/dist/session/sqlite-job-store.d.ts +40 -0
  232. package/dist/session/sqlite-job-store.d.ts.map +1 -0
  233. package/dist/session/sqlite-job-store.js +200 -0
  234. package/dist/session/sqlite-job-store.js.map +1 -0
  235. package/dist/session/sse.d.ts +60 -0
  236. package/dist/session/sse.d.ts.map +1 -0
  237. package/dist/session/sse.js +97 -0
  238. package/dist/session/sse.js.map +1 -0
  239. package/dist/tools/index.d.ts +2 -0
  240. package/dist/tools/index.d.ts.map +1 -0
  241. package/dist/tools/index.js +2 -0
  242. package/dist/tools/index.js.map +1 -0
  243. package/dist/tools/registry.d.ts +44 -0
  244. package/dist/tools/registry.d.ts.map +1 -0
  245. package/dist/tools/registry.js +74 -0
  246. package/dist/tools/registry.js.map +1 -0
  247. package/dist/triggers/index.d.ts +15 -0
  248. package/dist/triggers/index.d.ts.map +1 -0
  249. package/dist/triggers/index.js +14 -0
  250. package/dist/triggers/index.js.map +1 -0
  251. package/dist/triggers/run-trigger.d.ts +86 -0
  252. package/dist/triggers/run-trigger.d.ts.map +1 -0
  253. package/dist/triggers/run-trigger.js +146 -0
  254. package/dist/triggers/run-trigger.js.map +1 -0
  255. package/dist/triggers/timer-trigger.d.ts +46 -0
  256. package/dist/triggers/timer-trigger.d.ts.map +1 -0
  257. package/dist/triggers/timer-trigger.js +74 -0
  258. package/dist/triggers/timer-trigger.js.map +1 -0
  259. package/dist/triggers/types.d.ts +61 -0
  260. package/dist/triggers/types.d.ts.map +1 -0
  261. package/dist/triggers/types.js +23 -0
  262. package/dist/triggers/types.js.map +1 -0
  263. package/package.json +64 -0
@@ -0,0 +1,244 @@
1
+ /**
2
+ * Scripted `AgentAdapter` for tests.
3
+ *
4
+ * `createMockAgent` returns a `AgentAdapterMeta` whose adapter replays a
5
+ * configured sequence of `AgentEvent`s and resolves with a configured
6
+ * `AgentRunResult`. The mock honors the protocol's lifecycle invariants:
7
+ * exactly one `agent_start`, exactly one trailing `agent_end`, `result`
8
+ * always resolves, `abort()` is idempotent, `options.signal` is observed.
9
+ *
10
+ * Used by in-tree tests targeting the AgentAdapter surface and by the
11
+ * conformance suite as the self-test adapter.
12
+ *
13
+ * @internal
14
+ */
15
+ import { defineAgentAdapter, } from '../protocol.js';
16
+ /**
17
+ * Default capabilities used when none are overridden.
18
+ *
19
+ * @internal
20
+ */
21
+ export const MOCK_DEFAULT_CAPABILITIES = {
22
+ streaming: 'text',
23
+ cancellation: 'cooperative',
24
+ resumption: 'none',
25
+ structuredOutput: 'none',
26
+ };
27
+ /**
28
+ * Build a mock adapter suitable for testing pattern code and any consumer
29
+ * targeting the AgentAdapter protocol.
30
+ *
31
+ * @internal
32
+ */
33
+ export function createMockAgent(opts = {}) {
34
+ const id = opts.id ?? 'mock';
35
+ const capabilities = {
36
+ ...MOCK_DEFAULT_CAPABILITIES,
37
+ ...opts.capabilities,
38
+ };
39
+ return defineAgentAdapter({
40
+ id,
41
+ capabilities,
42
+ adapter: (config, options) => {
43
+ if (config.throwOnConstruct) {
44
+ throw config.throwOnConstruct;
45
+ }
46
+ const traceId = options?.traceId;
47
+ const bus = options?.eventBus;
48
+ const externalSignal = options?.signal;
49
+ const localController = new AbortController();
50
+ // AbortSignal.any (Node 20+) composes without manual listeners that
51
+ // would pin our closure if the external signal outlives the run.
52
+ const composite = externalSignal
53
+ ? AbortSignal.any([externalSignal, localController.signal])
54
+ : localController.signal;
55
+ const emit = (event) => {
56
+ if (bus)
57
+ bus.emit(event);
58
+ };
59
+ // Single-producer queue feeding the AsyncIterable. We push every event
60
+ // (start, scripted, end) into `queue` and the iterator drains it.
61
+ const queue = [];
62
+ const waiters = [];
63
+ let producerDone = false;
64
+ const push = (event) => {
65
+ const waiter = waiters.shift();
66
+ if (waiter) {
67
+ waiter({ value: event, done: false });
68
+ }
69
+ else {
70
+ queue.push(event);
71
+ }
72
+ };
73
+ const finishIterator = () => {
74
+ producerDone = true;
75
+ while (waiters.length > 0) {
76
+ const w = waiters.shift();
77
+ w({ value: undefined, done: true });
78
+ }
79
+ };
80
+ let resolveResult;
81
+ const resultPromise = new Promise((resolve) => {
82
+ resolveResult = resolve;
83
+ });
84
+ const stamp = (event) => {
85
+ // Adapters set `source` to their id; preserve any traceId from options.
86
+ const next = { ...event, source: id };
87
+ if (traceId !== undefined && next.traceId === undefined) {
88
+ next.traceId = traceId;
89
+ }
90
+ return next;
91
+ };
92
+ const run = async () => {
93
+ const start = stamp({ type: 'agent_start', source: id });
94
+ push(start);
95
+ emit(start);
96
+ let aborted = composite.aborted;
97
+ for (const raw of config.events) {
98
+ if (composite.aborted) {
99
+ aborted = true;
100
+ break;
101
+ }
102
+ if (config.perEventDelayMs && config.perEventDelayMs > 0) {
103
+ await delay(config.perEventDelayMs, composite);
104
+ }
105
+ else {
106
+ // Microtask hop so consumers get a chance to interleave.
107
+ await Promise.resolve();
108
+ }
109
+ if (composite.aborted) {
110
+ aborted = true;
111
+ break;
112
+ }
113
+ const ev = stamp(raw);
114
+ push(ev);
115
+ emit(ev);
116
+ }
117
+ const finishReason = aborted ? 'aborted' : config.result.finishReason;
118
+ const end = stamp({
119
+ type: 'agent_end',
120
+ source: id,
121
+ reason: finishReason,
122
+ resumeToken: config.result.resumeToken,
123
+ });
124
+ push(end);
125
+ emit(end);
126
+ finishIterator();
127
+ resolveResult(aborted ? { ...config.result, finishReason: 'aborted' } : config.result);
128
+ };
129
+ // Kick off lazily — start when either events is iterated or result
130
+ // is awaited. The protocol requires synchronous return, so we defer
131
+ // the loop to a microtask.
132
+ let started = false;
133
+ const start = () => {
134
+ if (started)
135
+ return;
136
+ started = true;
137
+ // Detach from the caller's stack; errors here must not surface as
138
+ // a synchronous throw from `adapter()`. Any unexpected failure is
139
+ // funneled into an error event + finishReason: 'error'.
140
+ void run().catch((err) => {
141
+ const errEvent = stamp({
142
+ type: 'error',
143
+ source: id,
144
+ error: serializeMockError(err),
145
+ transient: false,
146
+ });
147
+ push(errEvent);
148
+ emit(errEvent);
149
+ const end = stamp({
150
+ type: 'agent_end',
151
+ source: id,
152
+ reason: 'error',
153
+ });
154
+ push(end);
155
+ emit(end);
156
+ finishIterator();
157
+ resolveResult({ ...config.result, finishReason: 'error' });
158
+ });
159
+ };
160
+ // Single-consumer guard — matches inferenceAgent's behavior. A second
161
+ // iterator would silently split events between consumers.
162
+ let iteratorVended = false;
163
+ const events = {
164
+ [Symbol.asyncIterator]() {
165
+ if (iteratorVended) {
166
+ throw new Error('AgentRun.events is single-consumer; iterate it once. Use AgentEventBus (options.eventBus) for multi-subscriber fan-out.');
167
+ }
168
+ iteratorVended = true;
169
+ start();
170
+ return {
171
+ next() {
172
+ if (queue.length > 0) {
173
+ const value = queue.shift();
174
+ return Promise.resolve({ value, done: false });
175
+ }
176
+ if (producerDone) {
177
+ return Promise.resolve({ value: undefined, done: true });
178
+ }
179
+ return new Promise((resolve) => {
180
+ waiters.push(resolve);
181
+ });
182
+ },
183
+ return() {
184
+ // Early termination — cancel and drain.
185
+ localController.abort();
186
+ finishIterator();
187
+ return Promise.resolve({ value: undefined, done: true });
188
+ },
189
+ };
190
+ },
191
+ };
192
+ const result = {
193
+ then(onFulfilled, onRejected) {
194
+ start();
195
+ return resultPromise.then(onFulfilled, onRejected);
196
+ },
197
+ catch(onRejected) {
198
+ start();
199
+ return resultPromise.catch(onRejected);
200
+ },
201
+ finally(onFinally) {
202
+ start();
203
+ return resultPromise.finally(onFinally);
204
+ },
205
+ [Symbol.toStringTag]: 'Promise',
206
+ };
207
+ return {
208
+ events,
209
+ result,
210
+ abort(_reason) {
211
+ // Idempotent — AbortController.abort is itself idempotent.
212
+ localController.abort();
213
+ },
214
+ };
215
+ },
216
+ });
217
+ }
218
+ // ---------------------------------------------------------------------------
219
+ // helpers
220
+ // ---------------------------------------------------------------------------
221
+ function delay(ms, signal) {
222
+ return new Promise((resolve) => {
223
+ if (signal.aborted) {
224
+ resolve();
225
+ return;
226
+ }
227
+ const t = setTimeout(() => {
228
+ signal.removeEventListener('abort', onAbort);
229
+ resolve();
230
+ }, ms);
231
+ const onAbort = () => {
232
+ clearTimeout(t);
233
+ resolve();
234
+ };
235
+ signal.addEventListener('abort', onAbort, { once: true });
236
+ });
237
+ }
238
+ function serializeMockError(err) {
239
+ if (err instanceof Error) {
240
+ return { name: err.name, message: err.message, stack: err.stack };
241
+ }
242
+ return { name: 'NonError', message: String(err) };
243
+ }
244
+ //# sourceMappingURL=mock-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-agent.js","sourceRoot":"","sources":["../../../src/agents/test-utils/mock-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Thread — the conversational object that flows through pipeline phases.
3
+ *
4
+ * The canonical `AgentEvent` log is the source of truth; `resumeTokens`
5
+ * point at adapter-native continuation state held externally by each
6
+ * adapter (session files on disk, response ids in a vendor's store). When
7
+ * the next phase happens to use the same adapter, it passes the matching
8
+ * resume token and continues natively. When the next phase is a different
9
+ * adapter, it renders the canonical events into a permissive message log
10
+ * via `threadToMessages` and starts a fresh session.
11
+ *
12
+ * @internal
13
+ */
14
+ import type { AgentEvent, ResumeToken } from './protocol.js';
15
+ import type { Message } from '../messages.js';
16
+ /**
17
+ * Conversational state across phases.
18
+ *
19
+ * - `events`: append-only canonical log. Survives cross-adapter handoffs.
20
+ * - `resumeTokens`: per-adapter (keyed by `AgentAdapterMeta.id`) pointers
21
+ * to adapter-native state. Adapters set their own token, never another
22
+ * adapter's.
23
+ *
24
+ * @internal
25
+ */
26
+ export interface Thread {
27
+ events: AgentEvent[];
28
+ resumeTokens: Record<string, ResumeToken>;
29
+ }
30
+ /** @internal */
31
+ export declare function createThread(): Thread;
32
+ /** @internal */
33
+ export declare function appendEvent(thread: Thread, event: AgentEvent): void;
34
+ /** @internal */
35
+ export declare function resumeTokenFor(thread: Thread, adapterId: string): ResumeToken | undefined;
36
+ /** @internal */
37
+ export declare function setResumeToken(thread: Thread, adapterId: string, token: ResumeToken): void;
38
+ /**
39
+ * Render canonical events into thread-phase's internal `Message[]` for
40
+ * cross-adapter handoff when no per-adapter resume token is available.
41
+ *
42
+ * Lossy by design:
43
+ * - `native` events are skipped — they have no canonical message equivalent.
44
+ * - `tool_result.output` is coerced to a string. Adapters that need the
45
+ * native shape should consume the canonical event log directly.
46
+ * - `error` and `agent_start`/`agent_end` events do not produce messages;
47
+ * they are run-lifecycle signals, not conversation content.
48
+ * - Multiple assistant turns within one run become one assistant message
49
+ * per turn boundary (`turn_end`); a trailing text run without a
50
+ * `turn_end` is flushed at `agent_end`.
51
+ *
52
+ * Treat the output as conversation history, not as an authoritative log.
53
+ *
54
+ * @internal
55
+ */
56
+ export declare function threadToMessages(thread: Thread): Message[];
57
+ //# sourceMappingURL=thread.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread.d.ts","sourceRoot":"","sources":["../../src/agents/thread.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,KAAK,EAAE,OAAO,EAAY,MAAM,gBAAgB,CAAC;AAExD;;;;;;;;;GASG;AACH,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CAC3C;AAED,gBAAgB;AAChB,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,gBAAgB;AAChB,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAEnE;AAED,gBAAgB;AAChB,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAEzF;AAED,gBAAgB;AAChB,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAE1F;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE,CAmE1D"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Thread — the conversational object that flows through pipeline phases.
3
+ *
4
+ * The canonical `AgentEvent` log is the source of truth; `resumeTokens`
5
+ * point at adapter-native continuation state held externally by each
6
+ * adapter (session files on disk, response ids in a vendor's store). When
7
+ * the next phase happens to use the same adapter, it passes the matching
8
+ * resume token and continues natively. When the next phase is a different
9
+ * adapter, it renders the canonical events into a permissive message log
10
+ * via `threadToMessages` and starts a fresh session.
11
+ *
12
+ * @internal
13
+ */
14
+ /** @internal */
15
+ export function createThread() {
16
+ return { events: [], resumeTokens: {} };
17
+ }
18
+ /** @internal */
19
+ export function appendEvent(thread, event) {
20
+ thread.events.push(event);
21
+ }
22
+ /** @internal */
23
+ export function resumeTokenFor(thread, adapterId) {
24
+ return thread.resumeTokens[adapterId];
25
+ }
26
+ /** @internal */
27
+ export function setResumeToken(thread, adapterId, token) {
28
+ thread.resumeTokens[adapterId] = token;
29
+ }
30
+ /**
31
+ * Render canonical events into thread-phase's internal `Message[]` for
32
+ * cross-adapter handoff when no per-adapter resume token is available.
33
+ *
34
+ * Lossy by design:
35
+ * - `native` events are skipped — they have no canonical message equivalent.
36
+ * - `tool_result.output` is coerced to a string. Adapters that need the
37
+ * native shape should consume the canonical event log directly.
38
+ * - `error` and `agent_start`/`agent_end` events do not produce messages;
39
+ * they are run-lifecycle signals, not conversation content.
40
+ * - Multiple assistant turns within one run become one assistant message
41
+ * per turn boundary (`turn_end`); a trailing text run without a
42
+ * `turn_end` is flushed at `agent_end`.
43
+ *
44
+ * Treat the output as conversation history, not as an authoritative log.
45
+ *
46
+ * @internal
47
+ */
48
+ export function threadToMessages(thread) {
49
+ const out = [];
50
+ let pendingText = '';
51
+ let pendingToolCalls = [];
52
+ let hasAssistantContent = false;
53
+ const flushAssistant = () => {
54
+ if (!hasAssistantContent)
55
+ return;
56
+ out.push({
57
+ role: 'assistant',
58
+ content: pendingText,
59
+ toolCalls: pendingToolCalls,
60
+ });
61
+ pendingText = '';
62
+ pendingToolCalls = [];
63
+ hasAssistantContent = false;
64
+ };
65
+ for (const event of thread.events) {
66
+ switch (event.type) {
67
+ case 'text':
68
+ pendingText += event.delta;
69
+ hasAssistantContent = true;
70
+ break;
71
+ case 'tool_call':
72
+ pendingToolCalls.push({
73
+ id: event.id,
74
+ name: event.name,
75
+ input: coerceToolInput(event.input),
76
+ });
77
+ hasAssistantContent = true;
78
+ break;
79
+ case 'turn_end':
80
+ // Prefer the adapter-assembled assistant text when present; deltas
81
+ // may not have streamed (turns-only adapters).
82
+ if (event.assistantText && !pendingText) {
83
+ pendingText = event.assistantText;
84
+ hasAssistantContent = true;
85
+ }
86
+ flushAssistant();
87
+ break;
88
+ case 'tool_result':
89
+ flushAssistant();
90
+ out.push({
91
+ role: 'tool',
92
+ toolCallId: event.id,
93
+ content: coerceToolOutput(event.output),
94
+ });
95
+ break;
96
+ case 'agent_end':
97
+ flushAssistant();
98
+ break;
99
+ case 'agent_start':
100
+ case 'error':
101
+ case 'native':
102
+ case 'thinking':
103
+ // Reasoning content is not part of conversation history; downstream
104
+ // adapters should see the agent's text output, not its inner monologue.
105
+ break;
106
+ }
107
+ }
108
+ // A run that ends without a terminal turn_end/agent_end still flushes.
109
+ flushAssistant();
110
+ return out;
111
+ }
112
+ function coerceToolInput(input) {
113
+ if (input !== null && typeof input === 'object' && !Array.isArray(input)) {
114
+ return input;
115
+ }
116
+ return { value: input };
117
+ }
118
+ function coerceToolOutput(output) {
119
+ if (typeof output === 'string')
120
+ return output;
121
+ try {
122
+ return JSON.stringify(output);
123
+ }
124
+ catch {
125
+ return String(output);
126
+ }
127
+ }
128
+ //# sourceMappingURL=thread.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread.js","sourceRoot":"","sources":["../../src/agents/thread.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Helper for translating primitive adapter-level callbacks into canonical
3
+ * `AgentEvent`s with correct turn-boundary semantics.
4
+ *
5
+ * The non-obvious problem this solves: some underlying runtimes (the in-tree
6
+ * OpenAI runner is one) emit their end-of-turn marker BEFORE the tool calls
7
+ * of that turn — the model decodes content, the runtime fires `round_complete`,
8
+ * then the tool calls follow as separate events. In canonical semantics, a
9
+ * `turn_end` belongs AFTER its turn's tool calls so `toolCallCount` reflects
10
+ * what actually happened in that turn.
11
+ *
12
+ * The accumulator handles this by deferring `turn_end` emission. Call
13
+ * `markTurnEnd()` when the underlying runtime says the turn ended; the event
14
+ * is held until the NEXT text delta (= new turn starts) or `close()` (= run
15
+ * ends). Tool calls in between count against the pending turn.
16
+ *
17
+ * Adapters whose runtime emits turn boundaries naturally (after all tool
18
+ * calls of the same turn) can still use this helper — `markTurnEnd()` +
19
+ * `close()` with no intervening events flushes immediately.
20
+ *
21
+ * Also handles the boilerplate of stamping `source` and `traceId` on every
22
+ * canonical event the adapter emits, which every adapter has to do.
23
+ *
24
+ * @internal
25
+ */
26
+ import type { UsageInfo } from '../agent/types.js';
27
+ import type { AgentEvent } from './protocol.js';
28
+ /** @internal */
29
+ export declare class TurnAccumulator {
30
+ private readonly emit;
31
+ private readonly source;
32
+ private readonly traceId?;
33
+ private turnText;
34
+ private currentTurnToolCalls;
35
+ private pending;
36
+ constructor(emit: (event: AgentEvent) => void, source: string, traceId?: string | undefined);
37
+ /**
38
+ * Emit a text delta. Flushes any pending `turn_end` first — a text delta
39
+ * after `markTurnEnd()` is the canonical signal that a new turn has begun.
40
+ */
41
+ text(delta: string): void;
42
+ /**
43
+ * Emit a thinking (reasoning) delta. Does NOT flush a pending turn —
44
+ * reasoning is intra-turn content, not a turn boundary signal.
45
+ */
46
+ thinking(delta: string): void;
47
+ /**
48
+ * Emit a tool call. Counts toward the current turn regardless of which
49
+ * turn-end style the adapter uses — deferred (`markTurnEnd`) or
50
+ * immediate (`endTurn`).
51
+ */
52
+ toolCall(id: string, name: string, input: unknown): void;
53
+ /** Emit a tool result. Does not affect pending-turn state. */
54
+ toolResult(id: string, name: string, output: unknown, isError: boolean): void;
55
+ /**
56
+ * Emit a native (adapter-specific) event verbatim. Stamps `source` and
57
+ * `traceId` so adapters don't have to repeat the boilerplate. Does not
58
+ * affect pending-turn state.
59
+ */
60
+ native(kind: string, payload: unknown): void;
61
+ /**
62
+ * Mark the end of a turn — deferred-emission variant. Use when the
63
+ * underlying runtime emits its end-of-turn marker BEFORE the tool calls
64
+ * that belong to that turn (the in-tree OpenAI runner is one such case).
65
+ * The `turn_end` event is NOT emitted yet; it stays pending until either
66
+ * the next text delta (next turn starts) or `close()` (run ends). Tool
67
+ * calls that arrive between now and the flush count toward this turn.
68
+ *
69
+ * For runtimes with natural turn ordering (tool calls inside the turn,
70
+ * then turn boundary), use `endTurn()` instead.
71
+ *
72
+ * Optional `usage` is attached to the eventual `turn_end` event.
73
+ */
74
+ markTurnEnd(usage?: UsageInfo): void;
75
+ /**
76
+ * Emit a `turn_end` event NOW with the current turn's text and tool-call
77
+ * count, then reset the counters. Use when the underlying runtime
78
+ * already had all of this turn's tool calls before the boundary signal
79
+ * (the ACP `session/prompt` response is one such case — agent_message_chunks
80
+ * and tool_calls precede the stopReason).
81
+ *
82
+ * If a `markTurnEnd()` deferred turn is still pending, it's flushed first.
83
+ *
84
+ * Optional `usage` is attached to the emitted `turn_end` event.
85
+ */
86
+ endTurn(usage?: UsageInfo): void;
87
+ /**
88
+ * Flush any pending `turn_end`. Call once at run end, before emitting
89
+ * `agent_end`. Idempotent — calling twice with nothing pending is a no-op.
90
+ */
91
+ close(): void;
92
+ private flush;
93
+ }
94
+ //# sourceMappingURL=turn-accumulator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-accumulator.d.ts","sourceRoot":"","sources":["../../src/agents/turn-accumulator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEhD,gBAAgB;AAChB,qBAAa,eAAe;IAMxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAP3B,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,oBAAoB,CAAK;IACjC,OAAO,CAAC,OAAO,CAAkF;gBAG9E,IAAI,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,EACjC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,YAAA;IAGnC;;;OAGG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMzB;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI7B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAKxD,8DAA8D;IAC9D,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAY7E;;;;OAIG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAI5C;;;;;;;;;;;;OAYG;IACH,WAAW,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI;IAKpC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI;IAchC;;;OAGG;IACH,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,KAAK;CAcd"}