stitchkit 0.77.0 → 0.79.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 (99) hide show
  1. package/dist/agent-runtime-browser.js +53 -581
  2. package/dist/agent-runtime-coding-tools.js +6 -5
  3. package/dist/agent-runtime-harness.js +20 -93
  4. package/dist/agent-runtime-openrouter.js +1 -1
  5. package/dist/agent-runtime.js +65 -61
  6. package/dist/application/decisions.d.ts +28 -25
  7. package/dist/application/decisions.d.ts.map +1 -1
  8. package/dist/application/kernel.d.ts +2 -0
  9. package/dist/application/kernel.d.ts.map +1 -1
  10. package/dist/application/keyspace.d.ts +11 -1
  11. package/dist/application/keyspace.d.ts.map +1 -1
  12. package/dist/application/schedule.d.ts.map +1 -1
  13. package/dist/application/schemas.d.ts +2 -0
  14. package/dist/application/schemas.d.ts.map +1 -1
  15. package/dist/application/server-resource.d.ts.map +1 -1
  16. package/dist/application/watch-hub.d.ts.map +1 -1
  17. package/dist/application-diagnostic-journal.d.ts +21 -0
  18. package/dist/application-diagnostic-journal.d.ts.map +1 -0
  19. package/dist/application-diagnostic-journal.js +632 -0
  20. package/dist/application-opentelemetry.js +3 -2
  21. package/dist/application-schemas.js +14 -98
  22. package/dist/application.d.ts +1 -2
  23. package/dist/application.d.ts.map +1 -1
  24. package/dist/application.js +155 -882
  25. package/dist/cli.js +13 -11
  26. package/dist/contract/index.js +15 -10
  27. package/dist/files/boundary.d.ts.map +1 -1
  28. package/dist/files.js +1 -1
  29. package/dist/{index-7b188kmz.js → index-2qzskm8h.js} +15 -1
  30. package/dist/{index-k2zczx1g.js → index-2rwwmr7v.js} +3 -3
  31. package/dist/{index-8eywc9zv.js → index-3gye9wzb.js} +6 -3
  32. package/dist/index-4fpa9dy2.js +51 -0
  33. package/dist/{index-7qy2ex0m.js → index-5mtc969c.js} +2 -2
  34. package/dist/index-5s3zajp8.js +192 -0
  35. package/dist/{index-3cwck0rm.js → index-6s7n2v50.js} +60 -374
  36. package/dist/{index-s4c8wy8m.js → index-758zx2ha.js} +11 -90
  37. package/dist/{index-qyrqwr4c.js → index-77fekveh.js} +4 -1
  38. package/dist/{index-58jzmnn4.js → index-7ag81v2f.js} +355 -34
  39. package/dist/index-7gnkny4z.js +326 -0
  40. package/dist/index-7zbps32p.js +89 -0
  41. package/dist/index-85vfqd7m.js +135 -0
  42. package/dist/{index-m668wzyc.js → index-9s6z8vgf.js} +17 -141
  43. package/dist/{index-bfcpjw20.js → index-actkayzn.js} +7 -3
  44. package/dist/index-b9aefrqd.js +20 -0
  45. package/dist/index-dre2ywck.js +48 -0
  46. package/dist/{index-nemjkxjp.js → index-dwf1f2ap.js} +16 -12
  47. package/dist/{index-wwst0td5.js → index-dx9xehwt.js} +1 -1
  48. package/dist/{index-ezmn6ac6.js → index-dxesg10d.js} +4 -4
  49. package/dist/{index-aczggrty.js → index-dxjjv399.js} +2 -2
  50. package/dist/{index-jqtsc9mj.js → index-egaabxkz.js} +3 -3
  51. package/dist/{index-vc1b0b1b.js → index-evcnmsc3.js} +49 -8
  52. package/dist/{index-nt1mp8km.js → index-fxz0v7vg.js} +84 -84
  53. package/dist/index-h4pj6fta.js +87 -0
  54. package/dist/{index-1rxswfbv.js → index-hb5pf3s4.js} +1 -1
  55. package/dist/{index-t8qyvrvg.js → index-k9ay6v6d.js} +21 -272
  56. package/dist/index-kzfs85xp.js +9 -0
  57. package/dist/{index-vbf2p6me.js → index-m9kzax52.js} +91 -89
  58. package/dist/{index-22by16v6.js → index-mgtxfe6b.js} +1 -1
  59. package/dist/index-p7hgdyhb.js +22 -0
  60. package/dist/index-pq95qkbf.js +0 -0
  61. package/dist/index-t0z5p5w6.js +318 -0
  62. package/dist/{index-s2rchahr.js → index-vwp69871.js} +13 -11
  63. package/dist/index-wc4x00bn.js +103 -0
  64. package/dist/{index-da1aqnhb.js → index-xcetq6j3.js} +8 -6
  65. package/dist/{index-f6n5n7nz.js → index-y01f4223.js} +33 -126
  66. package/dist/{index-35z5h2ty.js → index-ywd0y6m1.js} +18 -218
  67. package/dist/index.js +65 -1588
  68. package/dist/internal/deadline.d.ts +17 -0
  69. package/dist/internal/deadline.d.ts.map +1 -0
  70. package/dist/live.js +15 -89
  71. package/dist/node.js +17 -15
  72. package/dist/observability/context.d.ts.map +1 -1
  73. package/dist/observability/index.js +7 -6
  74. package/dist/primitives.js +5 -2
  75. package/dist/react.js +1 -1
  76. package/dist/remote.js +7 -6
  77. package/dist/server/event-bus.d.ts.map +1 -1
  78. package/dist/server/index.js +26 -38
  79. package/dist/telegram.js +1 -1
  80. package/dist/testing.js +86 -97
  81. package/dist/tool-invoker.js +11 -9
  82. package/dist/tools/async-operation-contract.d.ts +61 -0
  83. package/dist/tools/async-operation-contract.d.ts.map +1 -0
  84. package/dist/tools/async-operation.d.ts +2 -47
  85. package/dist/tools/async-operation.d.ts.map +1 -1
  86. package/dist/tools/view-file-contract.d.ts +98 -0
  87. package/dist/tools/view-file-contract.d.ts.map +1 -0
  88. package/dist/tools/view-file.d.ts +4 -83
  89. package/dist/tools/view-file.d.ts.map +1 -1
  90. package/dist/tools-contract.d.ts +29 -0
  91. package/dist/tools-contract.d.ts.map +1 -0
  92. package/dist/tools-contract.js +24 -0
  93. package/dist/tools.d.ts +3 -3
  94. package/dist/tools.d.ts.map +1 -1
  95. package/dist/tools.js +59 -95
  96. package/llms-full.txt +146 -14
  97. package/package.json +14 -7
  98. package/dist/index-ksp6e2ye.js +0 -24
  99. package/dist/index-vj3vvpaa.js +0 -307
@@ -0,0 +1,326 @@
1
+ // src/application/channel.ts
2
+ import { z } from "zod";
3
+ var PositiveSafeIntegerSchema = z.number().int().positive().safe();
4
+ var BoundedChannelPolicySchema = z.enum(["ordered", "latest"]);
5
+ var BoundedChannelStateSchema = z.enum(["open", "draining", "closed", "failed"]);
6
+ var BoundedChannelSnapshotSchema = z.object({
7
+ state: BoundedChannelStateSchema,
8
+ policy: BoundedChannelPolicySchema,
9
+ queuedItems: z.number().int().nonnegative(),
10
+ queuedBytes: z.number().int().nonnegative(),
11
+ waitingReader: z.boolean(),
12
+ offered: z.number().int().nonnegative(),
13
+ delivered: z.number().int().nonnegative(),
14
+ queued: z.number().int().nonnegative(),
15
+ coalesced: z.number().int().nonnegative(),
16
+ refused: z.number().int().nonnegative(),
17
+ discarded: z.number().int().nonnegative()
18
+ }).strict().readonly();
19
+
20
+ class BoundedChannelReaderError extends Error {
21
+ constructor() {
22
+ super("A bounded channel permits only one pending next() call");
23
+ this.name = "BoundedChannelReaderError";
24
+ }
25
+ }
26
+ function createBoundedChannel(config) {
27
+ const policy = BoundedChannelPolicySchema.parse(config.policy);
28
+ const maxItems = PositiveSafeIntegerSchema.parse(config.maxItems);
29
+ const maxBytes = PositiveSafeIntegerSchema.parse(config.maxBytes);
30
+ const queue = [];
31
+ let state = "open";
32
+ let queuedBytes = 0;
33
+ let waiting;
34
+ let failure;
35
+ let hasFailure = false;
36
+ let offered = 0;
37
+ let delivered = 0;
38
+ let queued = 0;
39
+ let coalesced = 0;
40
+ let refused = 0;
41
+ let discarded = 0;
42
+ const removeAbortListener = () => {
43
+ config.signal?.removeEventListener("abort", abortChannel);
44
+ };
45
+ const snapshot = () => BoundedChannelSnapshotSchema.parse({
46
+ state,
47
+ policy,
48
+ queuedItems: queue.length,
49
+ queuedBytes,
50
+ waitingReader: waiting !== undefined,
51
+ offered,
52
+ delivered,
53
+ queued,
54
+ coalesced,
55
+ refused,
56
+ discarded
57
+ });
58
+ const clearQueue = () => {
59
+ discarded += queue.length;
60
+ queue.length = 0;
61
+ queuedBytes = 0;
62
+ };
63
+ const settleClosed = () => {
64
+ if (state !== "draining" || queue.length > 0)
65
+ return;
66
+ state = "closed";
67
+ removeAbortListener();
68
+ const reader = waiting;
69
+ waiting = undefined;
70
+ reader?.resolve({ done: true, value: undefined });
71
+ };
72
+ const close = (options = {}) => {
73
+ if (state === "closed" || state === "failed")
74
+ return snapshot();
75
+ const mode = options.mode ?? "drain";
76
+ if (mode !== "drain" && mode !== "discard") {
77
+ throw new TypeError("Bounded channel close mode must be drain or discard");
78
+ }
79
+ if (mode === "discard") {
80
+ clearQueue();
81
+ state = "closed";
82
+ removeAbortListener();
83
+ const reader = waiting;
84
+ waiting = undefined;
85
+ reader?.resolve({ done: true, value: undefined });
86
+ return snapshot();
87
+ }
88
+ state = "draining";
89
+ settleClosed();
90
+ return snapshot();
91
+ };
92
+ function abortChannel() {
93
+ close({ mode: "discard" });
94
+ }
95
+ const channel = {
96
+ [Symbol.asyncIterator]() {
97
+ return channel;
98
+ },
99
+ offer(value) {
100
+ offered += 1;
101
+ if (state !== "open") {
102
+ refused += 1;
103
+ return { outcome: "refused", reason: "not-open" };
104
+ }
105
+ const bytes = config.sizeOf(value);
106
+ if (!Number.isSafeInteger(bytes) || bytes < 0) {
107
+ throw new TypeError("Bounded channel sizeOf() must return a non-negative safe integer");
108
+ }
109
+ if (bytes > maxBytes) {
110
+ refused += 1;
111
+ return { outcome: "refused", reason: "item-too-large" };
112
+ }
113
+ const reader = waiting;
114
+ if (reader) {
115
+ waiting = undefined;
116
+ delivered += 1;
117
+ reader.resolve({ done: false, value });
118
+ return { outcome: "delivered" };
119
+ }
120
+ if (policy === "latest" && queue.length > 0) {
121
+ const previous = queue[0];
122
+ if (!previous)
123
+ throw new Error("Bounded latest channel lost its pending value");
124
+ queue[0] = { value, bytes };
125
+ queuedBytes += bytes - previous.bytes;
126
+ coalesced += 1;
127
+ return { outcome: "coalesced", replaced: 1 };
128
+ }
129
+ if (queue.length >= maxItems) {
130
+ refused += 1;
131
+ return { outcome: "refused", reason: "item-capacity" };
132
+ }
133
+ if (queuedBytes + bytes > maxBytes) {
134
+ refused += 1;
135
+ return { outcome: "refused", reason: "byte-capacity" };
136
+ }
137
+ queue.push({ value, bytes });
138
+ queuedBytes += bytes;
139
+ queued += 1;
140
+ return { outcome: "queued" };
141
+ },
142
+ next() {
143
+ if (hasFailure)
144
+ return Promise.reject(failure);
145
+ const next = queue.shift();
146
+ if (next) {
147
+ queuedBytes -= next.bytes;
148
+ delivered += 1;
149
+ settleClosed();
150
+ return Promise.resolve({ done: false, value: next.value });
151
+ }
152
+ if (state === "closed" || state === "draining") {
153
+ settleClosed();
154
+ return Promise.resolve({ done: true, value: undefined });
155
+ }
156
+ if (waiting)
157
+ return Promise.reject(new BoundedChannelReaderError);
158
+ return new Promise((resolve, reject) => {
159
+ waiting = { resolve, reject };
160
+ });
161
+ },
162
+ return() {
163
+ close({ mode: "discard" });
164
+ return Promise.resolve({ done: true, value: undefined });
165
+ },
166
+ throw(error) {
167
+ channel.fail(error);
168
+ return Promise.reject(error);
169
+ },
170
+ close,
171
+ fail(error) {
172
+ if (state === "closed" || state === "failed")
173
+ return snapshot();
174
+ failure = error;
175
+ hasFailure = true;
176
+ state = "failed";
177
+ clearQueue();
178
+ removeAbortListener();
179
+ const reader = waiting;
180
+ waiting = undefined;
181
+ reader?.reject(error);
182
+ return snapshot();
183
+ },
184
+ getSnapshot: snapshot
185
+ };
186
+ if (config.signal?.aborted)
187
+ abortChannel();
188
+ else
189
+ config.signal?.addEventListener("abort", abortChannel, { once: true });
190
+ return channel;
191
+ }
192
+ var CreditWindowSnapshotSchema = z.object({
193
+ state: z.enum(["open", "closed"]),
194
+ capacityBytes: PositiveSafeIntegerSchema,
195
+ availableBytes: z.number().int().nonnegative(),
196
+ leasedBytes: z.number().int().nonnegative(),
197
+ acquired: z.number().int().nonnegative(),
198
+ refused: z.number().int().nonnegative(),
199
+ replenishedBytes: z.number().int().nonnegative(),
200
+ waiting: z.number().int().nonnegative()
201
+ }).strict().readonly();
202
+ function createCreditWindow(config) {
203
+ const capacityBytes = PositiveSafeIntegerSchema.parse(config.capacityBytes);
204
+ let availableBytes = capacityBytes;
205
+ let state = "open";
206
+ let acquired = 0;
207
+ let refused = 0;
208
+ let replenishedBytes = 0;
209
+ const waiters = new Set;
210
+ const snapshot = () => CreditWindowSnapshotSchema.parse({
211
+ state,
212
+ capacityBytes,
213
+ availableBytes,
214
+ leasedBytes: capacityBytes - availableBytes,
215
+ acquired,
216
+ refused,
217
+ replenishedBytes,
218
+ waiting: waiters.size
219
+ });
220
+ const serveWaiters = () => {
221
+ for (const waiter of waiters) {
222
+ if (waiter.bytes > availableBytes)
223
+ return;
224
+ waiter.settle({ outcome: "leased", lease: lease(waiter.bytes) });
225
+ }
226
+ };
227
+ const lease = (requested) => {
228
+ availableBytes -= requested;
229
+ acquired += 1;
230
+ let leaseReleased = false;
231
+ return {
232
+ bytes: requested,
233
+ get released() {
234
+ return leaseReleased;
235
+ },
236
+ release() {
237
+ if (leaseReleased)
238
+ return;
239
+ leaseReleased = true;
240
+ availableBytes += requested;
241
+ replenishedBytes += requested;
242
+ if (availableBytes > capacityBytes) {
243
+ throw new Error("Credit window accounting exceeded its capacity");
244
+ }
245
+ serveWaiters();
246
+ }
247
+ };
248
+ };
249
+ const tryLease = (requested) => {
250
+ if (state === "closed")
251
+ return { outcome: "refused", reason: "closed" };
252
+ if (requested > capacityBytes) {
253
+ return { outcome: "refused", reason: "larger-than-window" };
254
+ }
255
+ if (requested > availableBytes) {
256
+ return { outcome: "refused", reason: "insufficient-credit" };
257
+ }
258
+ return { outcome: "leased", lease: lease(requested) };
259
+ };
260
+ const acquireNow = (requested) => {
261
+ const result = tryLease(requested);
262
+ if (result.outcome === "refused")
263
+ refused += 1;
264
+ return result;
265
+ };
266
+ const acquireWaiting = (requested, options) => {
267
+ const timeoutMs = options.timeoutMs === undefined ? undefined : PositiveSafeIntegerSchema.parse(options.timeoutMs);
268
+ const immediate = tryLease(requested);
269
+ if (immediate.outcome === "leased")
270
+ return Promise.resolve(immediate);
271
+ if (immediate.reason !== "insufficient-credit") {
272
+ refused += 1;
273
+ return Promise.resolve({ outcome: "refused", reason: immediate.reason });
274
+ }
275
+ if (options.signal?.aborted) {
276
+ refused += 1;
277
+ return Promise.resolve({ outcome: "refused", reason: "aborted" });
278
+ }
279
+ return new Promise((resolve) => {
280
+ let settled = false;
281
+ let timer;
282
+ const waiter = {
283
+ bytes: requested,
284
+ settle(result) {
285
+ if (settled)
286
+ return;
287
+ settled = true;
288
+ if (timer !== undefined)
289
+ clearTimeout(timer);
290
+ options.signal?.removeEventListener("abort", onAbort);
291
+ waiters.delete(waiter);
292
+ if (result.outcome === "refused")
293
+ refused += 1;
294
+ resolve(result);
295
+ }
296
+ };
297
+ function onAbort() {
298
+ waiter.settle({ outcome: "refused", reason: "aborted" });
299
+ }
300
+ waiters.add(waiter);
301
+ options.signal?.addEventListener("abort", onAbort, { once: true });
302
+ if (timeoutMs !== undefined) {
303
+ timer = setTimeout(() => {
304
+ waiter.settle({ outcome: "refused", reason: "timed-out" });
305
+ }, timeoutMs);
306
+ }
307
+ });
308
+ };
309
+ function acquire(bytes, options) {
310
+ const requested = PositiveSafeIntegerSchema.parse(bytes);
311
+ return options === undefined ? acquireNow(requested) : acquireWaiting(requested, options);
312
+ }
313
+ return {
314
+ acquire,
315
+ close() {
316
+ state = "closed";
317
+ for (const waiter of [...waiters]) {
318
+ waiter.settle({ outcome: "refused", reason: "closed" });
319
+ }
320
+ return snapshot();
321
+ },
322
+ getSnapshot: snapshot
323
+ };
324
+ }
325
+
326
+ export { BoundedChannelPolicySchema, BoundedChannelStateSchema, BoundedChannelSnapshotSchema, BoundedChannelReaderError, createBoundedChannel, CreditWindowSnapshotSchema, createCreditWindow };
@@ -0,0 +1,89 @@
1
+ import {
2
+ safeJsonParse
3
+ } from "./index-kzfs85xp.js";
4
+ import {
5
+ isRecord
6
+ } from "./index-77fekveh.js";
7
+
8
+ // src/tools/coerce.ts
9
+ import { z } from "zod";
10
+ function needsJsonCoercion(schema) {
11
+ if (schema instanceof z.ZodArray || schema instanceof z.ZodObject || schema instanceof z.ZodRecord || schema instanceof z.ZodTuple || schema instanceof z.ZodUnion) {
12
+ return true;
13
+ }
14
+ if (schema instanceof z.ZodOptional || schema instanceof z.ZodNullable || schema instanceof z.ZodDefault) {
15
+ return needsJsonCoercion(schema.unwrap());
16
+ }
17
+ return false;
18
+ }
19
+ function acceptsRawString(schema) {
20
+ const type = schema._zod.def.type;
21
+ if (type === "string" || type === "template_literal")
22
+ return true;
23
+ if (schema instanceof z.ZodLiteral) {
24
+ return schema.def.values.some((value) => typeof value === "string");
25
+ }
26
+ if (schema instanceof z.ZodEnum) {
27
+ return schema.options.some((value) => typeof value === "string");
28
+ }
29
+ if (schema instanceof z.ZodOptional || schema instanceof z.ZodNullable || schema instanceof z.ZodDefault) {
30
+ return acceptsRawString(schema.unwrap());
31
+ }
32
+ if (schema instanceof z.ZodUnion) {
33
+ return schema.def.options.some((option) => acceptsRawString(option));
34
+ }
35
+ return false;
36
+ }
37
+ function matchingVariant(union, value) {
38
+ const disc = union.def.discriminator;
39
+ const tag = value[disc];
40
+ for (const option of union.def.options) {
41
+ if (!(option instanceof z.ZodObject))
42
+ continue;
43
+ const field = option.shape[disc];
44
+ if (field instanceof z.ZodLiteral && field.def.values.some((v) => v === tag))
45
+ return option;
46
+ if (field instanceof z.ZodEnum && field.options.some((v) => v === tag))
47
+ return option;
48
+ }
49
+ return;
50
+ }
51
+ function coerceValue(value, schema) {
52
+ if (!schema)
53
+ return value;
54
+ if (schema instanceof z.ZodOptional || schema instanceof z.ZodNullable || schema instanceof z.ZodDefault) {
55
+ return coerceValue(value, schema.unwrap());
56
+ }
57
+ let current = value;
58
+ if (typeof current === "string" && needsJsonCoercion(schema)) {
59
+ if (acceptsRawString(schema))
60
+ return current;
61
+ try {
62
+ current = safeJsonParse(current);
63
+ } catch {
64
+ return value;
65
+ }
66
+ }
67
+ if (schema instanceof z.ZodObject && isRecord(current)) {
68
+ const shape = schema.shape;
69
+ const out = {};
70
+ for (const [key, item] of Object.entries(current)) {
71
+ out[key] = coerceValue(item, shape[key]);
72
+ }
73
+ return out;
74
+ }
75
+ if (schema instanceof z.ZodArray && Array.isArray(current)) {
76
+ return current.map((item) => coerceValue(item, schema.element));
77
+ }
78
+ if (schema instanceof z.ZodDiscriminatedUnion && isRecord(current)) {
79
+ const variant = matchingVariant(schema, current);
80
+ return variant ? coerceValue(current, variant) : current;
81
+ }
82
+ return current;
83
+ }
84
+ function coerceJsonArgs(args, schema) {
85
+ const coerced = coerceValue(args, schema);
86
+ return isRecord(coerced) ? coerced : args;
87
+ }
88
+
89
+ export { coerceJsonArgs };
@@ -0,0 +1,135 @@
1
+ import {
2
+ AgentAssistantPlaceholderSchema,
3
+ AgentMessageSchema,
4
+ AgentProviderEnvelopeSchema,
5
+ AgentRecordIdSchema,
6
+ AgentRecordVersionSchema,
7
+ AgentRunMetricsSchema,
8
+ AgentRunSchema,
9
+ AgentRunStateSchema,
10
+ AgentTerminalReasonSchema,
11
+ AgentTimestampSchema
12
+ } from "./index-x1th9s8c.js";
13
+
14
+ // src/agent-runtime/event-schema.ts
15
+ import { z } from "zod";
16
+ var AgentAdmissionEventSchema = z.object({
17
+ type: z.literal("admission"),
18
+ eventId: AgentRecordIdSchema,
19
+ conversationId: AgentRecordIdSchema,
20
+ runId: AgentRecordIdSchema,
21
+ snapshotVersion: AgentRecordVersionSchema,
22
+ input: AgentMessageSchema,
23
+ run: AgentRunSchema,
24
+ assistant: z.union([AgentAssistantPlaceholderSchema, AgentMessageSchema]),
25
+ emittedAt: AgentTimestampSchema
26
+ });
27
+ var EventIdentitySchema = z.object({
28
+ conversationId: AgentRecordIdSchema,
29
+ runId: AgentRecordIdSchema,
30
+ emittedAt: AgentTimestampSchema
31
+ });
32
+ var AgentTransientDeltaEventSchema = EventIdentitySchema.extend({
33
+ type: z.literal("assistant-delta"),
34
+ runtimeEpoch: z.string().min(1),
35
+ sequence: z.int().nonnegative(),
36
+ textDelta: z.string()
37
+ });
38
+ var AgentTransientReasoningIdentitySchema = EventIdentitySchema.extend({
39
+ runtimeEpoch: z.string().min(1),
40
+ sequence: z.int().nonnegative(),
41
+ provider: AgentProviderEnvelopeSchema.optional()
42
+ });
43
+ var AgentReasoningStartEventSchema = AgentTransientReasoningIdentitySchema.extend({
44
+ type: z.literal("reasoning-start")
45
+ });
46
+ var AgentReasoningDeltaEventSchema = AgentTransientReasoningIdentitySchema.extend({
47
+ type: z.literal("reasoning-delta"),
48
+ textDelta: z.string()
49
+ });
50
+ var AgentReasoningEndEventSchema = AgentTransientReasoningIdentitySchema.extend({
51
+ type: z.literal("reasoning-end")
52
+ });
53
+ var AgentCheckpointEventSchema = EventIdentitySchema.extend({
54
+ type: z.literal("assistant-checkpoint"),
55
+ eventId: AgentRecordIdSchema,
56
+ snapshotVersion: AgentRecordVersionSchema,
57
+ message: AgentMessageSchema,
58
+ metrics: AgentRunMetricsSchema.optional()
59
+ });
60
+ var AgentRunStateEventSchema = EventIdentitySchema.extend({
61
+ type: z.literal("run-state"),
62
+ eventId: AgentRecordIdSchema,
63
+ snapshotVersion: AgentRecordVersionSchema,
64
+ state: AgentRunStateSchema
65
+ });
66
+ var AgentToolStatusEventSchema = EventIdentitySchema.extend({
67
+ type: z.literal("tool-status"),
68
+ runtimeEpoch: z.string().min(1),
69
+ sequence: z.int().nonnegative(),
70
+ callId: AgentRecordIdSchema,
71
+ toolName: z.string().min(1),
72
+ status: z.enum(["started", "completed", "failed", "interrupted"]),
73
+ input: z.json().optional(),
74
+ output: z.json().optional()
75
+ });
76
+ var AgentTerminalEventSchema = EventIdentitySchema.extend({
77
+ type: z.literal("terminal"),
78
+ eventId: AgentRecordIdSchema,
79
+ snapshotVersion: AgentRecordVersionSchema,
80
+ reason: AgentTerminalReasonSchema,
81
+ policyName: z.string().min(1).optional(),
82
+ message: AgentMessageSchema,
83
+ metrics: AgentRunMetricsSchema.optional()
84
+ });
85
+ var AgentRuntimeEventSchema = z.discriminatedUnion("type", [
86
+ AgentAdmissionEventSchema,
87
+ AgentTransientDeltaEventSchema,
88
+ AgentReasoningStartEventSchema,
89
+ AgentReasoningDeltaEventSchema,
90
+ AgentReasoningEndEventSchema,
91
+ AgentCheckpointEventSchema,
92
+ AgentRunStateEventSchema,
93
+ AgentToolStatusEventSchema,
94
+ AgentTerminalEventSchema
95
+ ]);
96
+ var AgentRuntimeEventCursorSchema = z.object({
97
+ snapshotVersion: AgentRecordVersionSchema.optional(),
98
+ durableEventIds: z.array(AgentRecordIdSchema).optional(),
99
+ runtimeEpoch: z.string().min(1).optional(),
100
+ sequence: z.int().nonnegative().optional()
101
+ });
102
+ function isDurableEvent(event) {
103
+ return event.type === "admission" || event.type === "assistant-checkpoint" || event.type === "run-state" || event.type === "terminal";
104
+ }
105
+ function advanceAgentRuntimeEventCursor(rawCursor, event) {
106
+ const cursor = AgentRuntimeEventCursorSchema.parse(rawCursor);
107
+ if (isDurableEvent(event)) {
108
+ const previous = cursor.snapshotVersion;
109
+ const durableEventIds = previous === event.snapshotVersion ? cursor.durableEventIds ?? [] : [];
110
+ if (previous !== undefined && event.snapshotVersion < previous || durableEventIds.includes(event.eventId)) {
111
+ return { status: "duplicate", cursor };
112
+ }
113
+ return {
114
+ status: "accepted",
115
+ cursor: {
116
+ ...cursor,
117
+ snapshotVersion: event.snapshotVersion,
118
+ durableEventIds: [...durableEventIds, event.eventId]
119
+ }
120
+ };
121
+ }
122
+ const previousSequence = cursor.runtimeEpoch === event.runtimeEpoch ? cursor.sequence : undefined;
123
+ if (previousSequence !== undefined && event.sequence <= previousSequence) {
124
+ return { status: "duplicate", cursor };
125
+ }
126
+ return {
127
+ status: previousSequence !== undefined && event.sequence > previousSequence + 1 ? "gap" : "accepted",
128
+ cursor: { ...cursor, runtimeEpoch: event.runtimeEpoch, sequence: event.sequence }
129
+ };
130
+ }
131
+ function agentDurableEventId(type, runId, snapshotVersion) {
132
+ return `${runId}:${type}:${snapshotVersion}`;
133
+ }
134
+
135
+ export { AgentAdmissionEventSchema, AgentTransientDeltaEventSchema, AgentReasoningStartEventSchema, AgentReasoningDeltaEventSchema, AgentReasoningEndEventSchema, AgentCheckpointEventSchema, AgentRunStateEventSchema, AgentToolStatusEventSchema, AgentTerminalEventSchema, AgentRuntimeEventSchema, AgentRuntimeEventCursorSchema, advanceAgentRuntimeEventCursor, agentDurableEventId };