@voltro/ai 0.28.0 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,391 +1,27 @@
1
- import { a as e, c as t, d as n, f as r, g as i, h as a, i as o, l as s, m as c, n as l, o as u, p as d, r as f, s as p, t as ee, u as te } from "./provider-BOC5wBxx.js";
2
- import { AgentErrorCode as ne, AgentEvent as re, SeqEvent as ie } from "./events.js";
3
- import { a as ae, i as oe, n as se, o as m, r as ce, s as h, t as le } from "./agentDescriptor-CCeWeadZ.js";
4
- import { createGateway as ue, gateway as de } from "@ai-sdk/gateway";
5
- import { Output as fe, cosineSimilarity as pe, embed as me, embedMany as he, generateImage as ge, generateObject as _e, generateSpeech as ve, generateText as ye, jsonSchema as g, rerank as be, stepCountIs as xe, streamText as Se, tool as Ce } from "ai";
6
- import { Chunk as _, Context as we, Duration as Te, Effect as v, JSONSchema as Ee, Metric as y, MetricBoundaries as De, Option as b, Runtime as Oe, Schema as x, Stream as S } from "effect";
7
- import { and as C, boolean as ke, contains as Ae, eq as w, generateId as je, gt as Me, gte as Ne, id as T, inSet as Pe, integer as E, json as Fe, lt as Ie, lte as Le, neq as Re, queryFor as ze, registerRetention as Be, retentionTtlMsFromEnv as Ve, table as D, text as O, timestamp as k } from "@voltro/database";
8
- //#region src/tools.ts
9
- var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
10
- ...e,
11
- [Ue]: !0
12
- }), Ge = (e) => typeof e == "object" && !!e && e[Ue] === !0, Ke = (e) => {
13
- let t = e.default;
14
- if (typeof t != "function") return 0;
15
- let n = 0;
16
- for (let r of Object.values(e)) Ge(r) && r.execute === void 0 && r.handler === void 0 && (r.handler = t, n += 1);
17
- return n;
18
- }, qe = (e, t) => {
19
- let n = t ?? Oe.defaultRuntime;
20
- return Oe.runPromise(n)(e);
21
- }, Je = (e, t, n) => n ? e.pipe(v.timeoutFail({
22
- duration: `${n} millis`,
23
- onTimeout: () => /* @__PURE__ */ Error(`tool '${t}' timed out`)
24
- })) : e, Ye = (e, t, n) => {
25
- if (e.execute) return qe(Je(He(e.execute, t), e.name, e.timeoutMs), n.runtime);
26
- if (e.handler) {
27
- let r = e.handler, i = r(t, n);
28
- return v.isEffect(i) ? qe(Je(i, e.name, e.timeoutMs), n.runtime) : i;
29
- }
30
- return Promise.reject(/* @__PURE__ */ Error(`tool '${e.name}' has neither execute nor handler`));
31
- }, Xe = (e) => {
32
- let t = Ee.make(e);
33
- return t && t.type === "object" ? t : {
34
- type: "object",
35
- properties: {},
36
- additionalProperties: !1
37
- };
38
- }, A = (e, t = { store: void 0 }) => {
39
- let n = {};
40
- for (let [r, i] of Object.entries(e)) n[i.name || r] = Ce({
41
- description: i.description,
42
- inputSchema: g(Xe(i.input)),
43
- execute: async (e) => {
44
- let n = await v.runPromise(x.decodeUnknown(i.input)(e)), r = await Ye(i, n, t);
45
- return i.output ? v.runPromise(x.decodeUnknown(i.output)(r)) : r;
46
- }
47
- });
48
- return n;
49
- }, Ze = {
50
- "claude-opus-4-8": {
51
- inputPer1M: 15,
52
- outputPer1M: 75
53
- },
54
- "claude-opus-4-6": {
55
- inputPer1M: 15,
56
- outputPer1M: 75
57
- },
58
- "claude-sonnet-4-6": {
59
- inputPer1M: 3,
60
- outputPer1M: 15
61
- },
62
- "claude-haiku-4-5": {
63
- inputPer1M: 1,
64
- outputPer1M: 5
65
- },
66
- "claude-haiku-4-5-20251001": {
67
- inputPer1M: 1,
68
- outputPer1M: 5
69
- },
70
- "gpt-5.5": {
71
- inputPer1M: 5,
72
- outputPer1M: 30
73
- },
74
- "gpt-4o": {
75
- inputPer1M: 2.5,
76
- outputPer1M: 10
77
- },
78
- "gpt-4o-mini": {
79
- inputPer1M: .15,
80
- outputPer1M: .6
81
- },
82
- "gemini-2.5-pro": {
83
- inputPer1M: 1.25,
84
- outputPer1M: 10
85
- },
86
- "gemini-2.5-flash": {
87
- inputPer1M: .3,
88
- outputPer1M: 2.5
89
- },
90
- "gemini-2.0-flash": {
91
- inputPer1M: .1,
92
- outputPer1M: .4
93
- }
94
- }, j = {}, Qe = (e) => {
95
- let t = j;
96
- return j = { ...e }, t;
97
- }, $e = () => ({
98
- ...Ze,
99
- ...j
100
- }), et = (e) => {
101
- let t = $e();
102
- if (t[e] !== void 0) return t[e];
103
- let n = e.indexOf("/");
104
- if (n > 0) {
105
- let r = e.slice(n + 1);
106
- if (t[r] !== void 0) return t[r];
107
- }
108
- }, M = (e, t) => {
109
- let n = e.inputTokens ?? 0, r = e.outputTokens ?? 0;
110
- if (t.actualCostUsd !== void 0) {
111
- let e = n + r, i = e > 0 ? n / e : 0;
112
- return {
113
- inputTokens: n,
114
- outputTokens: r,
115
- inputCostUsd: t.actualCostUsd * i,
116
- outputCostUsd: t.actualCostUsd * (1 - i),
117
- totalCostUsd: t.actualCostUsd,
118
- costSource: "gateway"
119
- };
120
- }
121
- let i = t.price ?? et(t.model) ?? {
122
- inputPer1M: 0,
123
- outputPer1M: 0
124
- }, a = n / 1e6 * i.inputPer1M, o = r / 1e6 * i.outputPer1M;
125
- return {
126
- inputTokens: n,
127
- outputTokens: r,
128
- inputCostUsd: a,
129
- outputCostUsd: o,
130
- totalCostUsd: a + o,
131
- costSource: "estimated"
132
- };
133
- }, N = "_voltro_ai_usage", tt = D(N, {
134
- id: T({ prefix: "aiu" }),
135
- tenantId: O().nullable(),
136
- provider: O(),
137
- model: O(),
138
- operation: O(),
139
- agent: O().nullable(),
140
- inputTokens: E().default(0),
141
- outputTokens: E().default(0),
142
- costMicroUsd: E().default(0),
143
- costSource: O().default("estimated"),
144
- calledAt: k().default("now")
145
- }).index(["tenantId"]), nt = (e) => {
146
- let t = e?.gateway?.cost, n = typeof t == "number" ? t : typeof t == "string" ? Number(t) : NaN;
147
- return Number.isFinite(n) ? n : void 0;
148
- }, rt = (e, t) => (Be({
149
- table: N,
150
- timeColumn: "calledAt",
151
- ttlMs: Ve(process.env.VOLTRO_AI_USAGE_TTL_HOURS, 24 * 365)
152
- }), v.promise(async () => {
153
- let n = M(t.usage, {
154
- model: t.model,
155
- ...t.price === void 0 ? {} : { price: t.price },
156
- ...t.actualCostUsd === void 0 ? {} : { actualCostUsd: t.actualCostUsd }
157
- });
158
- return await e.insert(N, {
159
- tenantId: t.tenantId ?? null,
160
- provider: t.provider,
161
- model: t.model,
162
- operation: t.operation,
163
- agent: t.agent ?? null,
164
- inputTokens: n.inputTokens,
165
- outputTokens: n.outputTokens,
166
- costMicroUsd: Math.round(n.totalCostUsd * 1e6),
167
- costSource: n.costSource,
168
- calledAt: t.calledAt ?? /* @__PURE__ */ new Date()
169
- }), n;
170
- })), it = (e, t = {}) => v.promise(async () => {
171
- let n = [...t.tenantId === void 0 ? [] : [w("tenantId", t.tenantId)], ...t.since === void 0 ? [] : [Ne("calledAt", t.since)]], r = ze(tt), i = n.length === 0 ? r : r.where(n.length === 1 ? n[0] : C(...n));
172
- return (await e.query(i.descriptor)).reduce((e, t) => e + (Number(t.costMicroUsd) || 0), 0) / 1e6;
173
- }), at = class extends x.TaggedError()("AiBudgetExceeded", {
174
- tenantId: x.NullOr(x.String),
175
- limitUsd: x.Number,
176
- spentUsd: x.Number,
177
- attemptedUsd: x.Number
178
- }) {}, P = "_voltro_ai_budget", ot = D(P, {
179
- id: T({ prefix: "aib" }),
180
- bucket: O().maxLength(191),
181
- tenantId: O().nullable(),
182
- reservedMicroUsd: E().default(0),
183
- updatedAt: k().default("now")
184
- }).unique("byAiBudgetBucket", ["bucket"]), st = (e, t) => `${e ?? "global"}::${t === void 0 ? "all" : String(t.getTime())}`, ct = 32, lt = (e, t) => v.gen(function* () {
185
- Be({
186
- table: P,
187
- timeColumn: "updatedAt",
188
- ttlMs: Ve(process.env.VOLTRO_AI_USAGE_TTL_HOURS, 24 * 365)
189
- });
190
- let n = t.addUsd ?? 0, r = Math.round(n * 1e6), i = Math.round(t.limitUsd * 1e6), a = st(t.tenantId, t.since), o = t.tenantId ?? null, s = (e) => new at({
191
- tenantId: o,
192
- limitUsd: t.limitUsd,
193
- spentUsd: e / 1e6,
194
- attemptedUsd: n
195
- }), c = yield* v.promise(async () => {
196
- for (let t = 0; t < ct; t++) {
197
- t > 0 && await new Promise((e) => setTimeout(e, t));
198
- let n = (await e.query(ze(ot).where(w("bucket", a)).descriptor))[0], s = n && Number(n.reservedMicroUsd) || 0;
199
- if (s + r > i) return {
200
- ok: !1,
201
- reservedMicro: s
202
- };
203
- if (r === 0) return { ok: !0 };
204
- if (n) {
205
- if (await e.updateMany("_voltro_ai_budget", {
206
- reservedMicroUsd: s + r,
207
- updatedAt: /* @__PURE__ */ new Date()
208
- }, { where: C(w("id", String(n.id)), w("reservedMicroUsd", s)) }) === 1) return { ok: !0 };
209
- } else {
210
- let t = je({
211
- kind: "typeid",
212
- prefix: "aib"
213
- }, P), n = await e.insertIgnore(P, {
214
- id: t,
215
- bucket: a,
216
- tenantId: o,
217
- reservedMicroUsd: r,
218
- updatedAt: /* @__PURE__ */ new Date()
219
- }, { conflictColumns: ["bucket"] });
220
- if (String(n.id) === t) return { ok: !0 };
221
- }
222
- }
223
- throw Error(`requireAiBudget: contention on bucket '${a}' exceeded ${ct} attempts`);
224
- });
225
- if (!c.ok) return yield* v.fail(s(c.reservedMicro));
226
- }), ut = De.exponential({
227
- start: .001,
228
- factor: 2,
229
- count: 16
230
- }), F = y.counter("voltro_ai_calls_total", { description: "Total AI provider calls (generate + stream)." }), dt = y.counter("voltro_ai_call_errors_total", { description: "AI provider calls that errored." }), I = y.histogram("voltro_ai_call_duration_seconds", ut, "AI provider call duration in seconds."), ft = y.counter("voltro_ai_input_tokens_total", {
231
- description: "Total prompt (input) tokens across AI calls.",
232
- incremental: !0
233
- }), pt = y.counter("voltro_ai_output_tokens_total", {
234
- description: "Total completion (output) tokens across AI calls.",
235
- incremental: !0
236
- }), mt = y.counter("voltro_ai_cost_microusd_total", {
237
- description: "Total estimated AI spend in micro-USD (USD × 1e6).",
238
- incremental: !0
239
- }), L = (e, t) => ({
240
- provider: e.name,
241
- model: e.model ?? e.name,
242
- operation: t
243
- }), R = (e, t, n) => e.pipe(v.tagMetrics("provider", t.provider), v.tagMetrics("model", t.model), v.tagMetrics("operation", t.operation), v.tagMetrics("status", n)), ht = (e, t) => {
244
- let n = t.inputTokens ?? 0, r = t.outputTokens ?? 0, i = M({
245
- inputTokens: n,
246
- outputTokens: r
247
- }, { model: e.model }), a = Math.round(i.totalCostUsd * 1e6);
248
- return v.all([
249
- R(y.incrementBy(ft, n), e, "ok"),
250
- R(y.incrementBy(pt, r), e, "ok"),
251
- R(y.incrementBy(mt, a), e, "ok")
252
- ], { discard: !0 });
253
- }, z = (e, t, n) => v.gen(function* () {
254
- let r = yield* v.clockWith((e) => e.currentTimeMillis);
255
- return yield* n.pipe(v.tap((n) => ht(e, t(n))), v.tap(() => R(y.increment(F), e, "ok").pipe(v.zipRight(v.clockWith((e) => e.currentTimeMillis).pipe(v.flatMap((t) => R(y.update(I, (t - r) / 1e3), e, "ok")))))), v.tapError(() => R(y.increment(F), e, "error").pipe(v.zipRight(R(y.increment(dt), e, "error")), v.zipRight(v.clockWith((e) => e.currentTimeMillis).pipe(v.flatMap((t) => R(y.update(I, (t - r) / 1e3), e, "error")))))), v.withSpan("voltro.ai.call", { attributes: {
256
- "ai.provider": e.provider,
257
- "ai.model": e.model,
258
- "ai.operation": e.operation
259
- } }));
260
- }), gt = (e, t) => {
261
- let n = Date.now();
262
- return t.pipe(S.tap((t) => t._tag === "done" ? R(y.increment(F), e, "ok").pipe(v.zipRight(R(y.update(I, (Date.now() - n) / 1e3), e, "ok")), v.zipRight(ht(e, t.usage ?? {}))) : t._tag === "error" ? R(y.increment(F), e, "error").pipe(v.zipRight(R(y.increment(dt), e, "error")), v.zipRight(R(y.update(I, (Date.now() - n) / 1e3), e, "error"))) : v.void), S.withSpan("voltro.ai.call", { attributes: {
263
- "ai.provider": e.provider,
264
- "ai.model": e.model,
265
- "ai.operation": e.operation
266
- } }));
267
- }, B = class extends x.TaggedError()("AiError", {
268
- reason: x.Literal("generation", "decode"),
269
- message: x.String
270
- }) {}, V = (e, t, n) => {
271
- let r = [e, ...t ?? []], i = (e) => n(r[e]).pipe(v.catchTag("AiError", (t) => t.reason === "generation" && e + 1 < r.length ? i(e + 1) : v.fail(t)));
272
- return i(0);
273
- }, _t = (t) => V(t.provider ?? f(), t.fallbacks, (n) => z(L(n, "generateText"), (e) => e.usage, v.tryPromise({
274
- try: async () => {
275
- let r = await ye({
276
- model: e(n),
277
- prompt: t.prompt,
278
- ...t.system === void 0 ? {} : { system: t.system },
279
- ...t.maxTokens === void 0 ? {} : { maxOutputTokens: t.maxTokens },
280
- ...t.providerOptions === void 0 ? {} : { providerOptions: t.providerOptions }
281
- });
282
- return {
283
- text: r.text,
284
- usage: {
285
- inputTokens: r.usage.inputTokens,
286
- outputTokens: r.usage.outputTokens,
287
- totalTokens: r.usage.totalTokens
288
- },
289
- providerMetadata: r.providerMetadata
290
- };
291
- },
292
- catch: (e) => new B({
293
- reason: "generation",
294
- message: String(e?.message ?? e)
295
- })
296
- }))), vt = (e, t) => v.gen(function* () {
297
- let n = Ee.make(e);
298
- if (n?.type !== "object") {
299
- let e = n?.anyOf === void 0 ? `type:${JSON.stringify(n?.type ?? null)}` : "anyOf (e.g. Schema.Struct({}) or a union)";
300
- return yield* v.fail(new B({
301
- reason: "generation",
302
- message: `${t}: the output schema must render as a top-level JSON object (type:"object"), but got ${e}. Use a Schema.Struct({ ... }) as the output schema — wrap arrays/scalars in a field (e.g. Schema.Struct({ items: Schema.Array(...) })).`
303
- }));
304
- }
305
- return n;
306
- }), yt = (t) => v.gen(function* () {
307
- let n = yield* vt(t.schema, "generateObject");
308
- return yield* V(t.provider ?? f(), t.fallbacks, (r) => z(L(r, "generateObject"), (e) => e.usage, v.gen(function* () {
309
- let i = e(r), a = yield* v.tryPromise({
310
- try: () => _e({
311
- model: i,
312
- schema: g(n),
313
- prompt: t.prompt,
314
- ...t.system === void 0 ? {} : { system: t.system },
315
- ...t.maxTokens === void 0 ? {} : { maxOutputTokens: t.maxTokens },
316
- ...t.providerOptions === void 0 ? {} : { providerOptions: t.providerOptions }
317
- }),
318
- catch: (e) => new B({
319
- reason: "generation",
320
- message: String(e?.message ?? e)
321
- })
322
- });
323
- return {
324
- object: yield* x.decodeUnknown(t.schema)(a.object).pipe(v.mapError((e) => new B({
325
- reason: "decode",
326
- message: `model output failed schema decode: ${String(e)}`
327
- }))),
328
- usage: {
329
- inputTokens: a.usage.inputTokens,
330
- outputTokens: a.usage.outputTokens,
331
- totalTokens: a.usage.totalTokens
332
- },
333
- providerMetadata: a.providerMetadata
334
- };
335
- })));
336
- }), bt = (t) => v.gen(function* () {
337
- let n = yield* v.runtime(), r = yield* vt(t.schema, "generateObjectWithTools"), i = {
338
- store: void 0,
339
- ...t.toolContext,
340
- runtime: n
341
- }, a = A(t.tools, i);
342
- return yield* V(t.provider ?? f(), t.fallbacks, (n) => z(L(n, "generateObjectWithTools"), (e) => e.usage, v.gen(function* () {
343
- let i = e(n), o = yield* v.tryPromise({
344
- try: () => ye({
345
- model: i,
346
- prompt: t.prompt,
347
- tools: a,
348
- stopWhen: xe(t.maxSteps ?? 8),
349
- output: fe.object({ schema: g(r) }),
350
- ...t.system === void 0 ? {} : { system: t.system },
351
- ...t.maxTokens === void 0 ? {} : { maxOutputTokens: t.maxTokens },
352
- ...t.providerOptions === void 0 ? {} : { providerOptions: t.providerOptions }
353
- }),
354
- catch: (e) => new B({
355
- reason: "generation",
356
- message: String(e?.message ?? e)
357
- })
358
- });
359
- return {
360
- object: yield* x.decodeUnknown(t.schema)(o.output).pipe(v.mapError((e) => new B({
361
- reason: "decode",
362
- message: `model output failed schema decode: ${String(e)}`
363
- }))),
364
- usage: {
365
- inputTokens: o.usage.inputTokens,
366
- outputTokens: o.usage.outputTokens,
367
- totalTokens: o.usage.totalTokens
368
- },
369
- providerMetadata: o.providerMetadata
370
- };
371
- })));
372
- }), xt = class extends we.Tag("@voltro/AiService")() {}, St = {
373
- generateText: (e) => _t(e),
374
- generateObject: (e) => yt(e)
375
- }, Ct = (e) => e === void 0 ? {} : { providerOptions: e }, H = (e) => new B({
1
+ import { a as e, c as t, d as n, f as r, g as i, h as a, i as o, l as s, m as c, n as l, o as u, p as d, r as f, s as p, t as m, u as h } from "./provider-BOC5wBxx.js";
2
+ import { A as g, C as ee, D as te, E as ne, F as re, I as ie, L as ae, M as oe, N as se, O as ce, P as le, S as ue, T as de, _, a as fe, b as pe, c as me, d as he, f as v, g as ge, h as _e, i as ve, j as ye, k as be, l as y, m as xe, n as Se, o as Ce, p as we, r as Te, s as Ee, t as b, u as De, v as Oe, w as ke, x as Ae, y as x } from "./inferenceQueue-B25RTJZ4.js";
3
+ import { AgentErrorCode as je, AgentEvent as Me, SeqEvent as Ne } from "./events.js";
4
+ import { a as Pe, i as Fe, n as Ie, o as S, r as Le, s as C, t as Re } from "./agentDescriptor-CCeWeadZ.js";
5
+ import { createGateway as ze, gateway as Be } from "@ai-sdk/gateway";
6
+ import { cosineSimilarity as Ve, embed as He, embedMany as Ue, generateImage as We, generateSpeech as Ge, rerank as Ke, stepCountIs as qe, streamText as Je } from "ai";
7
+ import { Chunk as w, Duration as Ye, Effect as T, Option as E, Schema as D, Stream as O } from "effect";
8
+ import { and as k, boolean as Xe, contains as Ze, eq as A, generateId as Qe, gt as $e, gte as et, id as j, inSet as tt, integer as M, json as nt, lt as N, lte as P, neq as rt, or as it, table as F, text as I, timestamp as L } from "@voltro/database";
9
+ import { rowDep as at, tableDep as ot } from "@voltro/cache";
10
+ //#region src/media.ts
11
+ var st = (e) => e === void 0 ? {} : { providerOptions: e }, R = (e) => new y({
376
12
  reason: "generation",
377
13
  message: String(e?.message ?? e)
378
- }), wt = (e) => {
14
+ }), ct = (e) => {
379
15
  let t = e.provider ?? f();
380
- return z(L(t, "generateImage"), (e) => e.usage ?? {}, v.tryPromise({
16
+ return x(_(t, "generateImage"), (e) => e.usage ?? {}, T.tryPromise({
381
17
  try: async () => {
382
- let n = await ge({
18
+ let n = await We({
383
19
  model: o(t),
384
20
  prompt: e.prompt,
385
21
  ...e.n === void 0 ? {} : { n: e.n },
386
22
  ...e.size === void 0 ? {} : { size: e.size },
387
23
  ...e.aspectRatio === void 0 ? {} : { aspectRatio: e.aspectRatio },
388
- ...Ct(e.providerOptions)
24
+ ...st(e.providerOptions)
389
25
  });
390
26
  return {
391
27
  images: n.images.map((e) => ({
@@ -400,13 +36,13 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
400
36
  providerMetadata: n.providerMetadata
401
37
  };
402
38
  },
403
- catch: H
39
+ catch: R
404
40
  }));
405
- }, Tt = (e) => {
41
+ }, lt = (e) => {
406
42
  let t = e.provider ?? f();
407
- return z(L(t, "generateSpeech"), () => ({}), v.tryPromise({
43
+ return x(_(t, "generateSpeech"), () => ({}), T.tryPromise({
408
44
  try: async () => {
409
- let n = await ve({
45
+ let n = await Ge({
410
46
  model: u(t),
411
47
  text: e.text,
412
48
  ...e.voice === void 0 ? {} : { voice: e.voice },
@@ -414,7 +50,7 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
414
50
  ...e.instructions === void 0 ? {} : { instructions: e.instructions },
415
51
  ...e.speed === void 0 ? {} : { speed: e.speed },
416
52
  ...e.language === void 0 ? {} : { language: e.language },
417
- ...Ct(e.providerOptions)
53
+ ...st(e.providerOptions)
418
54
  });
419
55
  return {
420
56
  audio: {
@@ -424,14 +60,14 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
424
60
  providerMetadata: n.providerMetadata
425
61
  };
426
62
  },
427
- catch: H
63
+ catch: R
428
64
  }));
429
- }, Et = (e) => ({
65
+ }, ut = (e) => ({
430
66
  type: "url",
431
67
  url: e
432
- }), Dt = (e) => Uint8Array.from(Buffer.from(e, "base64")), Ot = (e) => {
68
+ }), dt = (e) => Uint8Array.from(Buffer.from(e, "base64")), ft = (e) => {
433
69
  let t = e.provider ?? f();
434
- return z(L(t, "generateVideo"), () => ({}), v.tryPromise({
70
+ return x(_(t, "generateVideo"), () => ({}), T.tryPromise({
435
71
  try: async () => {
436
72
  let n = await p(t).doGenerate({
437
73
  prompt: e.prompt,
@@ -441,9 +77,9 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
441
77
  duration: e.params?.durationSeconds,
442
78
  fps: e.params?.fps,
443
79
  seed: e.params?.seed,
444
- image: e.inputs?.image === void 0 ? void 0 : Et(e.inputs.image),
80
+ image: e.inputs?.image === void 0 ? void 0 : ut(e.inputs.image),
445
81
  frameImages: void 0,
446
- inputReferences: e.inputs?.references?.map(Et),
82
+ inputReferences: e.inputs?.references?.map(ut),
447
83
  generateAudio: void 0,
448
84
  providerOptions: e.providerOptions ?? {}
449
85
  }), r = n.videos[0];
@@ -453,7 +89,7 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
453
89
  url: r.url,
454
90
  mediaType: r.mediaType
455
91
  } : r.type === "base64" ? {
456
- data: Dt(r.data),
92
+ data: dt(r.data),
457
93
  mediaType: r.mediaType
458
94
  } : {
459
95
  data: r.data,
@@ -462,53 +98,53 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
462
98
  providerMetadata: n.providerMetadata
463
99
  };
464
100
  },
465
- catch: H
101
+ catch: R
466
102
  }));
467
- }, kt = (e) => RegExp("^" + e.split("*").map((e) => e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join(".*") + "$"), At = (e, t) => t instanceof RegExp ? t.test(e) : t.some((t) => kt(t).test(e)), U = (e, t) => !(t.deny !== void 0 && At(e, t.deny) || t.allow !== void 0 && !At(e, t.allow)), W = (e) => e === "mutation" || e === "action", jt = (e) => ({
103
+ }, pt = (e) => RegExp("^" + e.split("*").map((e) => e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join(".*") + "$"), mt = (e, t) => t instanceof RegExp ? t.test(e) : t.some((t) => pt(t).test(e)), z = (e, t) => !(t.deny !== void 0 && mt(e, t.deny) || t.allow !== void 0 && !mt(e, t.allow)), B = (e) => e === "mutation" || e === "action", ht = (e) => ({
468
104
  id: e,
469
105
  via: "agent"
470
- }), G = (e, t) => {
106
+ }), V = (e, t) => {
471
107
  let n = e.exposeAsTool;
472
108
  if (n === void 0 || n === !1 || n === !0) return null;
473
- let r = W(e.kind), i = n.confirm ?? (r && (t.requireConfirmForWrites ?? !0));
109
+ let r = B(e.kind), i = n.confirm ?? (r && (t.requireConfirmForWrites ?? !0));
474
110
  return {
475
111
  description: n.description,
476
112
  confirm: i,
477
113
  ...n.maxPerRun === void 0 ? {} : { maxPerRun: n.maxPerRun }
478
114
  };
479
- }, Mt = (e, t = {}) => e.filter((e) => U(e.descriptor.name, t)).map((e) => ({
115
+ }, gt = (e, t = {}) => e.filter((e) => z(e.descriptor.name, t)).map((e) => ({
480
116
  entry: e,
481
- exposure: G(e.descriptor, t)
117
+ exposure: V(e.descriptor, t)
482
118
  })).filter((e) => e.exposure !== null).map(({ entry: e, exposure: t }) => ({
483
119
  name: e.descriptor.name,
484
120
  kind: e.descriptor.kind,
485
121
  description: t.description,
486
- write: W(e.descriptor.kind),
122
+ write: B(e.descriptor.kind),
487
123
  confirm: t.confirm,
488
124
  ...t.maxPerRun === void 0 ? {} : { maxPerRun: t.maxPerRun }
489
- })).sort((e, t) => e.name.localeCompare(t.name)), Nt = (e, t = {}) => e.filter((e) => U(e.descriptor.name, t)).filter((e) => G(e.descriptor, t) !== null).filter((e) => t.includeWrites === !0 || !W(e.descriptor.kind)).map((e) => {
490
- let n = G(e.descriptor, t);
491
- return We({
125
+ })).sort((e, t) => e.name.localeCompare(t.name)), _t = (e, t = {}) => e.filter((e) => z(e.descriptor.name, t)).filter((e) => V(e.descriptor, t) !== null).filter((e) => t.includeWrites === !0 || !B(e.descriptor.kind)).map((e) => {
126
+ let n = V(e.descriptor, t);
127
+ return re({
492
128
  name: e.descriptor.name,
493
129
  description: n.description,
494
130
  input: e.descriptor.input,
495
131
  ...e.descriptor.output === void 0 ? {} : { output: e.descriptor.output },
496
132
  handler: (t) => Promise.resolve(e.invoke(t))
497
133
  });
498
- }), K = /* @__PURE__ */ new Map(), Pt = (e) => {
499
- let t = K.get(e);
134
+ }), H = /* @__PURE__ */ new Map(), vt = (e) => {
135
+ let t = H.get(e);
500
136
  if (t) return t;
501
137
  let n = new AbortController();
502
- return K.set(e, n), n;
503
- }, Ft = (e) => {
504
- let t = K.get(e);
505
- return t ? (K.delete(e), t.abort(), !0) : !1;
506
- }, It = (e) => K.has(e), Lt = (e) => {
507
- K.delete(e);
508
- }, Rt = () => K.size, zt = (e) => {
138
+ return H.set(e, n), n;
139
+ }, yt = (e) => {
140
+ let t = H.get(e);
141
+ return t ? (H.delete(e), t.abort(), !0) : !1;
142
+ }, bt = (e) => H.has(e), xt = (e) => {
143
+ H.delete(e);
144
+ }, St = () => H.size, Ct = (e) => {
509
145
  let t = e?.name, n = String(e?.message ?? e ?? "");
510
146
  return t === "AbortError" || t === "TimeoutError" || /\babort(ed)?\b/i.test(n);
511
- }, Bt = (e) => {
147
+ }, wt = (e) => {
512
148
  switch (e?.type) {
513
149
  case "text-delta": return {
514
150
  _tag: "token",
@@ -574,14 +210,14 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
574
210
  };
575
211
  default: return null;
576
212
  }
577
- }, q = (t) => S.unwrap(v.gen(function* () {
578
- let n = yield* v.runtime(), r = t.provider ?? f(), i = e(r), a = t.tools ? {
213
+ }, U = (t) => O.unwrap(T.gen(function* () {
214
+ let n = yield* T.runtime(), r = t.provider ?? f(), i = e(r), a = t.tools ? {
579
215
  store: void 0,
580
216
  ...t.toolContext,
581
217
  runtime: n
582
- } : t.toolContext, o = t.tools ? A(t.tools, a) : void 0, s = t.streamId === void 0 ? new AbortController() : Pt(t.streamId);
218
+ } : t.toolContext, o = t.tools ? le(t.tools, a) : void 0, s = t.streamId === void 0 ? new AbortController() : vt(t.streamId);
583
219
  t.signal !== void 0 && (t.signal.aborted ? s.abort() : t.signal.addEventListener("abort", () => s.abort(), { once: !0 }));
584
- let c = s.signal, l = Se({
220
+ let c = s.signal, l = Je({
585
221
  model: i,
586
222
  ...t.messages === void 0 ? { prompt: t.prompt } : { messages: [...t.messages] },
587
223
  ...t.system === void 0 ? {} : { system: t.system },
@@ -591,59 +227,59 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
591
227
  abortSignal: c,
592
228
  ...o ? {
593
229
  tools: o,
594
- stopWhen: xe(t.maxSteps ?? 8)
230
+ stopWhen: qe(t.maxSteps ?? 8)
595
231
  } : {}
596
232
  });
597
- return gt(L(r, "streamText"), S.fromAsyncIterable(l.fullStream, (e) => e).pipe(S.map(Bt), S.filter((e) => e !== null), S.catchAll((e) => {
598
- let t = c.aborted || zt(e);
599
- return S.make({
233
+ return Oe(_(r, "streamText"), O.fromAsyncIterable(l.fullStream, (e) => e).pipe(O.map(wt), O.filter((e) => e !== null), O.catchAll((e) => {
234
+ let t = c.aborted || Ct(e);
235
+ return O.make({
600
236
  _tag: "error",
601
237
  code: t ? "cancelled" : "provider",
602
238
  message: t ? "stream aborted" : String(e),
603
239
  retryable: !t
604
240
  });
605
- }), S.ensuring(v.sync(() => {
606
- s.abort(), t.streamId !== void 0 && Lt(t.streamId);
241
+ }), O.ensuring(T.sync(() => {
242
+ s.abort(), t.streamId !== void 0 && xt(t.streamId);
607
243
  }))));
608
- })), Vt = (e) => e._tag === "token" || e._tag === "reasoning" || e._tag === "toolCall" || e._tag === "toolResult" || e._tag === "source" || e._tag === "file" || e._tag === "message", Ht = (e) => e._tag === "done" || e._tag === "error", Ut = (e, t = {}) => {
244
+ })), Tt = (e) => e._tag === "token" || e._tag === "reasoning" || e._tag === "toolCall" || e._tag === "toolResult" || e._tag === "source" || e._tag === "file" || e._tag === "message", Et = (e) => e._tag === "done" || e._tag === "error", Dt = (e, t = {}) => {
609
245
  let n = Math.max(1, t.maxAttempts ?? 3), r = t.backoffMs ?? 250, i = t.maxBackoffMs ?? 5e3, a = [e.provider, ...e.fallbacks ?? []], o = (t, s) => {
610
246
  let c = !1, l = a[t];
611
- return q(l === void 0 ? e : {
247
+ return U(l === void 0 ? e : {
612
248
  ...e,
613
249
  provider: l
614
- }).pipe(S.takeUntil(Ht), S.flatMap((e) => {
250
+ }).pipe(O.takeUntil(Et), O.flatMap((e) => {
615
251
  if (e._tag === "error" && e.retryable && !c) {
616
252
  if (s + 1 < n) {
617
253
  let e = Math.min(i, r * 2 ** s);
618
- return S.unwrap(v.as(v.sleep(Te.millis(e)), o(t, s + 1)));
254
+ return O.unwrap(T.as(T.sleep(Ye.millis(e)), o(t, s + 1)));
619
255
  }
620
256
  if (t + 1 < a.length) return o(t + 1, 0);
621
257
  }
622
- return Vt(e) && (c = !0), S.make(e);
258
+ return Tt(e) && (c = !0), O.make(e);
623
259
  }, { concurrency: 1 }));
624
260
  };
625
261
  return o(0, 0);
626
- }, Wt = (e) => {
262
+ }, Ot = (e) => {
627
263
  let t = [e.provider, ...e.fallbacks ?? []], n = (r) => {
628
264
  let i = !1, a = t[r];
629
- return q(a === void 0 ? e : {
265
+ return U(a === void 0 ? e : {
630
266
  ...e,
631
267
  provider: a
632
- }).pipe(S.takeUntil(Ht), S.flatMap((e) => e._tag === "error" && e.retryable && !i && r + 1 < t.length ? n(r + 1) : (Vt(e) && (i = !0), S.make(e)), { concurrency: 1 }));
268
+ }).pipe(O.takeUntil(Et), O.flatMap((e) => e._tag === "error" && e.retryable && !i && r + 1 < t.length ? n(r + 1) : (Tt(e) && (i = !0), O.make(e)), { concurrency: 1 }));
633
269
  };
634
270
  return n(0);
635
- }, Gt = (e, t, n = {}) => {
636
- let r = n.pollMs ?? 50, i = n.fromSeq ?? 0, a = n.idleTimeoutMs, o = [_.empty(), b.none()];
637
- return S.paginateChunkEffect({
271
+ }, kt = (e, t, n = {}) => {
272
+ let r = n.pollMs ?? 50, i = n.fromSeq ?? 0, a = n.idleTimeoutMs, o = [w.empty(), E.none()];
273
+ return O.paginateChunkEffect({
638
274
  cursor: i,
639
275
  finishing: !1,
640
276
  idleMs: 0
641
- }, (n) => v.gen(function* () {
277
+ }, (n) => T.gen(function* () {
642
278
  if (n.finishing) return o;
643
279
  let i = yield* t.read(e, n.cursor);
644
280
  if (i.length > 0) {
645
281
  let e = i[i.length - 1].seq;
646
- return [_.fromIterable(i), b.some({
282
+ return [w.fromIterable(i), E.some({
647
283
  cursor: e,
648
284
  finishing: !1,
649
285
  idleMs: 0
@@ -653,38 +289,38 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
653
289
  let r = yield* t.read(e, n.cursor);
654
290
  if (r.length === 0) return o;
655
291
  let i = r[r.length - 1].seq;
656
- return [_.fromIterable(r), b.some({
292
+ return [w.fromIterable(r), E.some({
657
293
  cursor: i,
658
294
  finishing: !0,
659
295
  idleMs: 0
660
296
  })];
661
297
  }
662
298
  let s = n.idleMs + r;
663
- return a !== void 0 && s >= a ? o : (yield* v.sleep(Te.millis(r)), [_.empty(), b.some({
299
+ return a !== void 0 && s >= a ? o : (yield* T.sleep(Ye.millis(r)), [w.empty(), E.some({
664
300
  ...n,
665
301
  idleMs: s
666
302
  })]);
667
303
  }));
668
- }, Kt = (e, t, n) => {
304
+ }, At = (e, t, n) => {
669
305
  let r = 0;
670
- return n().pipe(S.runForEach((n) => (r += 1, t.append(e, {
306
+ return n().pipe(O.runForEach((n) => (r += 1, t.append(e, {
671
307
  seq: r,
672
308
  event: n
673
- }))), v.ensuring(t.markDone(e)), v.catchAllCause(() => v.void));
674
- }, qt = (e) => S.unwrap(v.gen(function* () {
675
- return (yield* e.store.claimProducer(e.streamId)) && (yield* v.forkDaemon(Kt(e.streamId, e.store, e.source))), Gt(e.streamId, e.store, {
309
+ }))), T.ensuring(t.markDone(e)), T.catchAllCause(() => T.void));
310
+ }, jt = (e) => O.unwrap(T.gen(function* () {
311
+ return (yield* e.store.claimProducer(e.streamId)) && (yield* T.forkDaemon(At(e.streamId, e.store, e.source))), kt(e.streamId, e.store, {
676
312
  fromSeq: e.fromSeq ?? 0,
677
313
  pollMs: e.pollMs ?? 50,
678
314
  ...e.idleTimeoutMs === void 0 ? {} : { idleTimeoutMs: e.idleTimeoutMs }
679
315
  });
680
- })), Jt = (e) => qt({
316
+ })), Mt = (e) => jt({
681
317
  streamId: e.streamId,
682
318
  store: e.store,
683
- source: () => q(e.options),
319
+ source: () => U(e.options),
684
320
  ...e.fromSeq === void 0 ? {} : { fromSeq: e.fromSeq },
685
321
  ...e.pollMs === void 0 ? {} : { pollMs: e.pollMs },
686
322
  ...e.idleTimeoutMs === void 0 ? {} : { idleTimeoutMs: e.idleTimeoutMs }
687
- }), Yt = () => {
323
+ }), Nt = () => {
688
324
  let e = /* @__PURE__ */ new Map(), t = /* @__PURE__ */ new Set(), n = (t) => {
689
325
  let n = e.get(t);
690
326
  return n || (n = {
@@ -693,42 +329,42 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
693
329
  }, e.set(t, n)), n;
694
330
  };
695
331
  return {
696
- claimProducer: (e) => v.sync(() => t.has(e) ? !1 : (t.add(e), !0)),
697
- append: (e, t) => v.sync(() => {
332
+ claimProducer: (e) => T.sync(() => t.has(e) ? !1 : (t.add(e), !0)),
333
+ append: (e, t) => T.sync(() => {
698
334
  n(e).events.push(t);
699
335
  }),
700
- read: (e, t) => v.sync(() => n(e).events.filter((e) => e.seq > t)),
701
- markDone: (e) => v.sync(() => {
336
+ read: (e, t) => T.sync(() => n(e).events.filter((e) => e.seq > t)),
337
+ markDone: (e) => T.sync(() => {
702
338
  n(e).done = !0;
703
339
  }),
704
- isDone: (e) => v.sync(() => n(e).done)
340
+ isDone: (e) => T.sync(() => n(e).done)
705
341
  };
706
- }, J = "_voltro_stream_events", Y = "_voltro_stream_state", Xt = D(J, {
707
- id: T({ prefix: "sev" }),
708
- streamId: O(),
709
- seq: E(),
710
- event: Fe(),
711
- createdAt: k().default("now")
712
- }).unique(["streamId", "seq"]).index(["streamId"]), Zt = D(Y, {
713
- id: T({ prefix: "sst" }),
714
- streamId: O().unique(),
715
- done: ke().default(!1),
716
- createdAt: k().default("now"),
717
- updatedAt: k().default("now")
718
- }).index(["createdAt"]), Qt = (e) => e === !0 || e === 1 || e === "1" || e === "t", $t = async (e, t) => (await e.query({
342
+ }, W = "_voltro_stream_events", G = "_voltro_stream_state", Pt = F(W, {
343
+ id: j({ prefix: "sev" }),
344
+ streamId: I(),
345
+ seq: M(),
346
+ event: nt(),
347
+ createdAt: L().default("now")
348
+ }).unique(["streamId", "seq"]).index(["streamId"]), Ft = F(G, {
349
+ id: j({ prefix: "sst" }),
350
+ streamId: I().unique(),
351
+ done: Xe().default(!1),
352
+ createdAt: L().default("now"),
353
+ updatedAt: L().default("now")
354
+ }).index(["createdAt"]), It = (e) => e === !0 || e === 1 || e === "1" || e === "t", Lt = async (e, t) => (await e.query({
719
355
  table: "_voltro_stream_state",
720
- predicate: w("streamId", t),
356
+ predicate: A("streamId", t),
721
357
  order: [],
722
358
  take: 1,
723
359
  skip: void 0,
724
360
  projection: void 0
725
- }))[0]?.id ?? null, en = (e) => ({
726
- claimProducer: (t) => v.promise(async () => {
727
- let n = je({
361
+ }))[0]?.id ?? null, Rt = (e) => ({
362
+ claimProducer: (t) => T.promise(async () => {
363
+ let n = Qe({
728
364
  kind: "typeid",
729
365
  prefix: "sst"
730
- }, Y);
731
- return (await e.insertIgnore(Y, {
366
+ }, G);
367
+ return (await e.insertIgnore(G, {
732
368
  id: n,
733
369
  streamId: t,
734
370
  done: !1,
@@ -736,17 +372,17 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
736
372
  updatedAt: /* @__PURE__ */ new Date()
737
373
  }, { conflictColumns: ["streamId"] })).id === n;
738
374
  }),
739
- append: (t, n) => v.promise(async () => {
740
- await e.insert(J, {
375
+ append: (t, n) => T.promise(async () => {
376
+ await e.insert(W, {
741
377
  streamId: t,
742
378
  seq: n.seq,
743
379
  event: n.event,
744
380
  createdAt: /* @__PURE__ */ new Date()
745
381
  });
746
382
  }),
747
- read: (t, n) => v.promise(async () => (await e.query({
748
- table: J,
749
- predicate: C(w("streamId", t), Me("seq", n)),
383
+ read: (t, n) => T.promise(async () => (await e.query({
384
+ table: W,
385
+ predicate: k(A("streamId", t), $e("seq", n)),
750
386
  order: [{
751
387
  column: "seq",
752
388
  direction: "asc"
@@ -758,28 +394,28 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
758
394
  seq: Number(e.seq),
759
395
  event: e.event
760
396
  }))),
761
- markDone: (t) => v.promise(async () => {
762
- let n = await $t(e, t);
763
- n !== null && await e.update(Y, n, {
397
+ markDone: (t) => T.promise(async () => {
398
+ let n = await Lt(e, t);
399
+ n !== null && await e.update(G, n, {
764
400
  done: !0,
765
401
  updatedAt: /* @__PURE__ */ new Date()
766
402
  });
767
403
  }),
768
- isDone: (t) => v.promise(async () => {
404
+ isDone: (t) => T.promise(async () => {
769
405
  let n = (await e.query({
770
- table: Y,
771
- predicate: w("streamId", t),
406
+ table: G,
407
+ predicate: A("streamId", t),
772
408
  order: [],
773
409
  take: 1,
774
410
  skip: void 0,
775
411
  projection: void 0
776
412
  }))[0];
777
- return n !== void 0 && Qt(n.done);
413
+ return n !== void 0 && It(n.done);
778
414
  })
779
- }), tn = (e, t) => v.promise(async () => {
415
+ }), zt = (e, t) => T.promise(async () => {
780
416
  let n = await e.query({
781
- table: Y,
782
- predicate: w("done", !0),
417
+ table: G,
418
+ predicate: A("done", !0),
783
419
  order: [],
784
420
  take: void 0,
785
421
  skip: void 0,
@@ -789,25 +425,25 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
789
425
  let n = i;
790
426
  if ((n.createdAt instanceof Date ? n.createdAt : new Date(String(n.createdAt))).getTime() >= t.olderThan.getTime()) continue;
791
427
  let a = await e.query({
792
- table: J,
793
- predicate: w("streamId", n.streamId),
428
+ table: W,
429
+ predicate: A("streamId", n.streamId),
794
430
  order: [],
795
431
  take: void 0,
796
432
  skip: void 0,
797
433
  projection: void 0
798
434
  });
799
- for (let t of a) await e.delete(J, t.id);
800
- await e.delete(Y, n.id), r += 1;
435
+ for (let t of a) await e.delete(W, t.id);
436
+ await e.delete(G, n.id), r += 1;
801
437
  }
802
438
  return r;
803
- }), nn = (e, t = {}) => {
439
+ }), Bt = (e, t = {}) => {
804
440
  let n = t.keyPrefix ?? "voltro:rstream", r = t.ttlSeconds ?? 3600, i = (e) => `${n}:log:${e}`, a = (e) => `${n}:producer:${e}`, o = (e) => `${n}:done:${e}`;
805
441
  return {
806
- claimProducer: (t) => v.promise(() => e.setNx(a(t), "1", r)),
807
- append: (t, n) => v.promise(async () => {
442
+ claimProducer: (t) => T.promise(() => e.setNx(a(t), "1", r)),
443
+ append: (t, n) => T.promise(async () => {
808
444
  await e.rpush(i(t), JSON.stringify(n)), e.expire && await e.expire(i(t), r);
809
445
  }),
810
- read: (t, n) => v.promise(async () => {
446
+ read: (t, n) => T.promise(async () => {
811
447
  let r = await e.lrange(i(t), n, -1), a = [];
812
448
  for (let e of r) try {
813
449
  let t = JSON.parse(e);
@@ -815,39 +451,39 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
815
451
  } catch {}
816
452
  return a;
817
453
  }),
818
- markDone: (t) => v.promise(() => e.set(o(t), "1", r)),
819
- isDone: (t) => v.promise(() => e.exists(o(t)))
454
+ markDone: (t) => T.promise(() => e.set(o(t), "1", r)),
455
+ isDone: (t) => T.promise(() => e.exists(o(t)))
820
456
  };
821
- }, rn = D(h, {
822
- id: T({ prefix: "thread" }),
823
- tenantId: O().nullable(),
824
- title: O().nullable(),
825
- createdAt: k(),
826
- updatedAt: k()
827
- }).renamedFrom("agent_threads").index(["tenantId"]), an = D(m, {
828
- id: T({ prefix: "msg" }),
829
- threadId: O(),
830
- tenantId: O().nullable(),
831
- role: O(),
832
- content: O(),
833
- streaming: ke(),
834
- order: E(),
835
- stepOrder: E(),
836
- parts: Fe(),
837
- createdAt: k()
838
- }).renamedFrom("agent_messages").index(["threadId"]), on = (e, t = {}) => v.promise(async () => {
457
+ }, Vt = F(C, {
458
+ id: j({ prefix: "thread" }),
459
+ tenantId: I().nullable(),
460
+ title: I().nullable(),
461
+ createdAt: L(),
462
+ updatedAt: L()
463
+ }).renamedFrom("agent_threads").index(["tenantId"]), Ht = F(S, {
464
+ id: j({ prefix: "msg" }),
465
+ threadId: I(),
466
+ tenantId: I().nullable(),
467
+ role: I(),
468
+ content: I(),
469
+ streaming: Xe(),
470
+ order: M(),
471
+ stepOrder: M(),
472
+ parts: nt(),
473
+ createdAt: L()
474
+ }).renamedFrom("agent_messages").index(["threadId"]), Ut = (e, t = {}) => T.promise(async () => {
839
475
  let n = /* @__PURE__ */ new Date();
840
- return await e.insert(h, {
476
+ return await e.insert(C, {
841
477
  tenantId: t.tenantId ?? null,
842
478
  title: t.title ?? null,
843
479
  createdAt: n,
844
480
  updatedAt: n
845
481
  });
846
- }), sn = (e, t) => v.promise(async () => {
482
+ }), Wt = (e, t) => T.promise(async () => {
847
483
  let n = t.parts ?? (t.content ? [{
848
484
  type: "text",
849
485
  text: t.content
850
- }] : []), r = await e.insert(m, {
486
+ }] : []), r = await e.insert(S, {
851
487
  threadId: t.threadId,
852
488
  tenantId: t.tenantId ?? null,
853
489
  role: t.role,
@@ -858,9 +494,9 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
858
494
  parts: n,
859
495
  createdAt: /* @__PURE__ */ new Date()
860
496
  });
861
- return await e.update(h, t.threadId, { updatedAt: /* @__PURE__ */ new Date() }).catch(() => null), r;
862
- }), X = (e, t) => v.promise(async () => await e.query({
863
- table: m,
497
+ return await e.update(C, t.threadId, { updatedAt: /* @__PURE__ */ new Date() }).catch(() => null), r;
498
+ }), K = (e, t) => T.promise(async () => await e.query({
499
+ table: S,
864
500
  predicate: {
865
501
  _tag: "leaf",
866
502
  column: "threadId",
@@ -874,7 +510,7 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
874
510
  take: void 0,
875
511
  skip: void 0,
876
512
  projection: void 0
877
- })), cn = (e, t) => v.promise(async () => (await e.query({
513
+ })), Gt = (e, t) => T.promise(async () => (await e.query({
878
514
  table: "_voltro_agent_threads",
879
515
  predicate: {
880
516
  _tag: "leaf",
@@ -886,14 +522,14 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
886
522
  take: 1,
887
523
  skip: void 0,
888
524
  projection: void 0
889
- }))[0] ?? null), ln = (e) => [...e].sort((e, t) => e.order - t.order || e.stepOrder - t.stepOrder).filter((e) => !e.streaming && e.content.length > 0 && (e.role === "user" || e.role === "assistant")).map((e) => e.role === "user" ? {
525
+ }))[0] ?? null), Kt = (e) => [...e].sort((e, t) => e.order - t.order || e.stepOrder - t.stepOrder).filter((e) => !e.streaming && e.content.length > 0 && (e.role === "user" || e.role === "assistant")).map((e) => e.role === "user" ? {
890
526
  role: "user",
891
527
  content: e.content
892
528
  } : {
893
529
  role: "assistant",
894
530
  content: e.content
895
- }), un = (e, t) => v.promise(async () => {
896
- let n = await e.insert(m, {
531
+ }), qt = (e, t) => T.promise(async () => {
532
+ let n = await e.insert(S, {
897
533
  threadId: t.threadId,
898
534
  tenantId: t.tenantId ?? null,
899
535
  role: "assistant",
@@ -904,14 +540,14 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
904
540
  parts: [],
905
541
  createdAt: /* @__PURE__ */ new Date()
906
542
  });
907
- return await e.update(h, t.threadId, { updatedAt: /* @__PURE__ */ new Date() }).catch(() => null), n.id;
908
- }), dn = (e, t, n) => v.promise(async () => {
909
- await e.update(m, t, {
543
+ return await e.update(C, t.threadId, { updatedAt: /* @__PURE__ */ new Date() }).catch(() => null), n.id;
544
+ }), Jt = (e, t, n) => T.promise(async () => {
545
+ await e.update(S, t, {
910
546
  parts: n,
911
- content: Z(n)
547
+ content: q(n)
912
548
  });
913
- }), Z = (e) => e.filter((e) => e.type === "text").map((e) => e.text).join(""), fn = (e, t) => v.gen(function* () {
914
- let n = yield* un(e, {
549
+ }), q = (e) => e.filter((e) => e.type === "text").map((e) => e.text).join(""), Yt = (e, t) => T.gen(function* () {
550
+ let n = yield* qt(e, {
915
551
  threadId: t.threadId,
916
552
  tenantId: t.tenantId ?? null,
917
553
  order: t.order
@@ -930,9 +566,9 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
930
566
  return e;
931
567
  }, f = (t) => {
932
568
  let r = Date.now();
933
- return !t && r - c < u ? v.void : (c = r, dn(e, n, d()));
569
+ return !t && r - c < u ? T.void : (c = r, Jt(e, n, d()));
934
570
  };
935
- yield* q({
571
+ yield* U({
936
572
  prompt: t.prompt,
937
573
  ...t.messages === void 0 ? {} : { messages: t.messages },
938
574
  ...t.system === void 0 ? {} : { system: t.system },
@@ -941,7 +577,7 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
941
577
  ...t.maxSteps === void 0 ? {} : { maxSteps: t.maxSteps },
942
578
  ...t.toolContext === void 0 ? {} : { toolContext: t.toolContext },
943
579
  ...t.providerOptions === void 0 ? {} : { providerOptions: t.providerOptions }
944
- }).pipe(S.runForEach((e) => v.gen(function* () {
580
+ }).pipe(O.runForEach((e) => T.gen(function* () {
945
581
  switch (e._tag) {
946
582
  case "token":
947
583
  i += e.text, yield* f(!1);
@@ -997,32 +633,32 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
997
633
  }
998
634
  })));
999
635
  let p = d();
1000
- return yield* v.promise(() => e.update(m, n, {
636
+ return yield* T.promise(() => e.update(S, n, {
1001
637
  parts: p,
1002
- content: Z(p),
638
+ content: q(p),
1003
639
  streaming: !1
1004
- })), l ? yield* v.fail(Error(l)) : Z(p);
1005
- }), pn = "@voltro/ai/AgentExecutor", mn = (e, t) => ({
1006
- _brand: pn,
640
+ })), l ? yield* T.fail(Error(l)) : q(p);
641
+ }), Xt = "@voltro/ai/AgentExecutor", Zt = (e, t) => ({
642
+ _brand: Xt,
1007
643
  descriptor: e,
1008
644
  config: t
1009
- }), hn = (e) => typeof e == "object" && !!e && e._brand === pn, gn = (e, t) => {
645
+ }), Qt = (e) => typeof e == "object" && !!e && e._brand === Xt, $t = (e, t) => {
1010
646
  let n = e.config.system;
1011
647
  if (n !== void 0) return typeof n == "function" ? n(t) : n;
1012
- }, _n = (e, t) => {
648
+ }, en = (e, t) => {
1013
649
  let n = e.config.model;
1014
650
  return typeof n == "function" ? n(t) : n;
1015
- }, vn = (e, t, n) => v.gen(function* () {
1016
- let r = n.promptOf ? n.promptOf(n.input) : String(n.input?.prompt ?? ""), i = gn(e, n.input), a = _n(e, n.input);
1017
- yield* sn(t, {
651
+ }, tn = (e, t, n) => T.gen(function* () {
652
+ let r = n.promptOf ? n.promptOf(n.input) : String(n.input?.prompt ?? ""), i = $t(e, n.input), a = en(e, n.input);
653
+ yield* Wt(t, {
1018
654
  threadId: n.threadId,
1019
655
  role: "user",
1020
656
  content: r,
1021
657
  tenantId: n.tenantId ?? null,
1022
658
  order: n.order
1023
659
  });
1024
- let o = ln(yield* X(t, n.threadId));
1025
- return yield* fn(t, {
660
+ let o = Kt(yield* K(t, n.threadId));
661
+ return yield* Yt(t, {
1026
662
  threadId: n.threadId,
1027
663
  tenantId: n.tenantId ?? null,
1028
664
  prompt: r,
@@ -1036,18 +672,18 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
1036
672
  order: n.order + 1,
1037
673
  ...n.throttleMs === void 0 ? {} : { throttleMs: n.throttleMs }
1038
674
  });
1039
- }), yn = (e, t) => X(e, t), bn = (e, t) => ({
675
+ }), nn = (e, t) => K(e, t), rn = (e, t) => ({
1040
676
  specificationVersion: "v4",
1041
677
  provider: "mock",
1042
678
  modelId: e,
1043
679
  maxEmbeddingsPerCall: 2048,
1044
680
  supportsParallelCalls: !0,
1045
681
  doEmbed: async ({ values: e }) => ({
1046
- embeddings: e.map((e) => xn(e, t)),
682
+ embeddings: e.map((e) => an(e, t)),
1047
683
  usage: { tokens: e.reduce((e, t) => e + t.length, 0) },
1048
684
  warnings: []
1049
685
  })
1050
- }), xn = (e, t) => {
686
+ }), an = (e, t) => {
1051
687
  let n = Array(t);
1052
688
  for (let r = 0; r < t; r++) {
1053
689
  let t = 2166136261 ^ r * 16777619;
@@ -1055,14 +691,14 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
1055
691
  n[r] = (t >>> 0) / 4294967295 * 2 - 1;
1056
692
  }
1057
693
  return n;
1058
- }, Sn = async (e) => {
694
+ }, J = async (e) => {
1059
695
  switch (e.name) {
1060
- case "mock": return bn(e.model, e.mockDim ?? 8);
1061
- case "openai": return (await Cn("@ai-sdk/openai", "openai")).openai.textEmbeddingModel(e.model);
1062
- case "voyage": return (await Cn("voyage-ai-provider", "voyage")).voyage.textEmbeddingModel(e.model);
1063
- case "cohere": return (await Cn("@ai-sdk/cohere", "cohere")).cohere.textEmbeddingModel(e.model);
696
+ case "mock": return rn(e.model, e.mockDim ?? 8);
697
+ case "openai": return (await Y("@ai-sdk/openai", "openai")).openai.textEmbeddingModel(e.model);
698
+ case "voyage": return (await Y("voyage-ai-provider", "voyage")).voyage.textEmbeddingModel(e.model);
699
+ case "cohere": return (await Y("@ai-sdk/cohere", "cohere")).cohere.textEmbeddingModel(e.model);
1064
700
  }
1065
- }, Cn = async (e, t) => {
701
+ }, Y = async (e, t) => {
1066
702
  try {
1067
703
  return await import(
1068
704
  /* @vite-ignore */
@@ -1071,51 +707,101 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
1071
707
  } catch {
1072
708
  throw Error(`embedding provider '${t}' needs the '${e}' package — install it (pnpm add ${e}) or use AI_EMBED_PROVIDER=mock for tests/demos.`);
1073
709
  }
1074
- }, wn = (e = process.env) => {
710
+ }, X = (e = process.env) => {
1075
711
  let t = (e.AI_EMBED_PROVIDER ?? "mock").toLowerCase(), n = t === "openai" ? "text-embedding-3-small" : t === "voyage" ? "voyage-3" : t === "cohere" ? "embed-english-v3.0" : "mock", r = e.AI_EMBED_MODEL ?? n, i = e.AI_EMBED_MOCK_DIM === void 0 ? void 0 : Number(e.AI_EMBED_MOCK_DIM);
1076
712
  return {
1077
713
  name: t,
1078
714
  model: r,
1079
715
  ...i !== void 0 && Number.isFinite(i) ? { mockDim: i } : {}
1080
716
  };
1081
- }, Tn = (e, t) => v.tryPromise({
1082
- try: async () => (await me({
1083
- model: await Sn(t ?? wn()),
717
+ }, Z = (e, t) => T.tryPromise({
718
+ try: async () => (await He({
719
+ model: await J(t ?? X()),
1084
720
  value: e
1085
721
  })).embedding,
1086
- catch: (e) => new B({
722
+ catch: (e) => new y({
1087
723
  reason: "generation",
1088
724
  message: String(e?.message ?? e)
1089
725
  })
1090
- }), En = (e, t) => v.tryPromise({
1091
- try: async () => (await he({
1092
- model: await Sn(t ?? wn()),
726
+ }), on = (e, t) => T.tryPromise({
727
+ try: async () => (await Ue({
728
+ model: await J(t ?? X()),
1093
729
  values: [...e]
1094
730
  })).embeddings,
1095
- catch: (e) => new B({
731
+ catch: (e) => new y({
1096
732
  reason: "generation",
1097
733
  message: String(e?.message ?? e)
1098
734
  })
1099
- }), Dn = (e, t) => pe([...e], [...t]), On = (e) => v.tryPromise({
735
+ }), sn = (e, t) => Ve([...e], [...t]), cn = {
736
+ inputTokens: 0,
737
+ outputTokens: 0,
738
+ totalTokens: 0
739
+ }, ln = .95, un = (e, t) => t === void 0 ? e : `${t}\n\n${e}`, dn = (e, t, n) => e.lookup(t, { threshold: n }).pipe(T.catchTag("CacheError", () => T.succeed(E.none()))), fn = (e, t, n, r) => e.put(t, n, {
740
+ deps: r.deps,
741
+ ...r.ttlMs === void 0 ? {} : { ttlMs: r.ttlMs }
742
+ }).pipe(T.catchTag("CacheError", () => T.void)), pn = (e, t, n) => T.gen(function* () {
743
+ let r = n.embed ?? Z, i = t.threshold ?? ln, a = yield* r(un(e.prompt, e.system)), o = yield* dn(n.cache, a, i);
744
+ if (E.isSome(o)) return {
745
+ value: o.value,
746
+ cached: !0,
747
+ usage: cn
748
+ };
749
+ let s = yield* _e(e);
750
+ return yield* fn(n.cache, a, s.text, t), {
751
+ value: s.text,
752
+ cached: !1,
753
+ usage: s.usage
754
+ };
755
+ }), mn = (e, t, n) => T.gen(function* () {
756
+ let r = n.embed ?? Z, i = t.threshold ?? ln, a = yield* r(un(e.prompt, e.system)), o = yield* dn(n.cache, a, i);
757
+ if (E.isSome(o)) return {
758
+ value: o.value,
759
+ cached: !0,
760
+ usage: cn
761
+ };
762
+ let s = yield* v(e);
763
+ return yield* fn(n.cache, a, s.object, t), {
764
+ value: s.object,
765
+ cached: !1,
766
+ usage: s.usage
767
+ };
768
+ }), hn = (e) => {
769
+ let t = /* @__PURE__ */ new Set(), n = async (n) => {
770
+ let r = await e.query(n);
771
+ t.add(ot(n.table));
772
+ for (let e of r) {
773
+ let r = e.id;
774
+ r != null && t.add(at(n.table, String(r)));
775
+ }
776
+ return r;
777
+ };
778
+ return {
779
+ store: new Proxy(e, { get(e, t, r) {
780
+ return t === "query" ? n : Reflect.get(e, t, r);
781
+ } }),
782
+ deps: () => [...t],
783
+ reset: () => t.clear()
784
+ };
785
+ }, gn = (e) => T.tryPromise({
1100
786
  try: async () => {
1101
- let t = e.getText ?? ((e) => String(e)), n = e.provider ?? "mock", r = [...n === "mock" ? kn(e.query, e.documents, t) : await jn(n, e.query, e.documents, t, e.model)].sort((e, t) => t.score - e.score);
787
+ let t = e.getText ?? ((e) => String(e)), n = e.provider ?? "mock", r = [...n === "mock" ? _n(e.query, e.documents, t) : await yn(n, e.query, e.documents, t, e.model)].sort((e, t) => t.score - e.score);
1102
788
  return e.topN === void 0 ? r : r.slice(0, e.topN);
1103
789
  },
1104
- catch: (e) => new B({
790
+ catch: (e) => new y({
1105
791
  reason: "generation",
1106
792
  message: String(e?.message ?? e)
1107
793
  })
1108
- }), kn = (e, t, n) => {
1109
- let r = An(e), i = new Set(r);
794
+ }), _n = (e, t, n) => {
795
+ let r = vn(e), i = new Set(r);
1110
796
  return t.map((e) => {
1111
- let t = new Set(An(n(e))), r = 0;
797
+ let t = new Set(vn(n(e))), r = 0;
1112
798
  for (let e of i) t.has(e) && r++;
1113
799
  return {
1114
800
  document: e,
1115
801
  score: i.size === 0 ? 0 : r / i.size
1116
802
  };
1117
803
  });
1118
- }, An = (e) => e.toLowerCase().split(/[^a-z0-9]+/).filter((e) => e.length > 0), jn = async (e, t, n, r, i) => {
804
+ }, vn = (e) => e.toLowerCase().split(/[^a-z0-9]+/).filter((e) => e.length > 0), yn = async (e, t, n, r, i) => {
1119
805
  let a = e === "cohere" ? "@ai-sdk/cohere" : "voyage-ai-provider", o;
1120
806
  try {
1121
807
  o = await import(
@@ -1127,7 +813,7 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
1127
813
  }
1128
814
  let s = o[e], c = s?.rerankingModel ?? s?.reranking;
1129
815
  if (typeof c != "function") throw Error(`rerank provider '${e}' does not expose a reranking model in '${a}'.`);
1130
- return (await be({
816
+ return (await Ke({
1131
817
  model: c(i ?? (e === "cohere" ? "rerank-english-v3.0" : "rerank-2")),
1132
818
  query: t,
1133
819
  documents: n.map(r)
@@ -1135,12 +821,137 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
1135
821
  document: n[e.originalIndex],
1136
822
  score: e.score
1137
823
  }));
1138
- }, Q = (e) => {
824
+ }, bn = (e) => {
825
+ if (e.name.trim() === "") throw Error("defineEval: name must be non-empty");
826
+ if (e.cases.length === 0) throw Error(`defineEval "${e.name}": at least one case is required`);
827
+ let t = /* @__PURE__ */ new Set();
828
+ for (let n of e.cases) {
829
+ if (n.id.trim() === "") throw Error(`defineEval "${e.name}": every case needs a non-empty id`);
830
+ if (t.has(n.id)) throw Error(`defineEval "${e.name}": duplicate case id "${n.id}"`);
831
+ t.add(n.id);
832
+ }
833
+ let n = e.judge?.threshold;
834
+ if (n !== void 0 && (n < 0 || n > 1)) throw Error(`defineEval "${e.name}": judge.threshold must be within 0..1 (got ${n})`);
835
+ return {
836
+ ...e,
837
+ __eval: !0
838
+ };
839
+ }, xn = (e) => typeof e == "object" && !!e && "__eval" in e && e.__eval === !0, Sn = (e, t) => {
840
+ let n = [], r = e.text;
841
+ for (let i of t) switch (i.kind) {
842
+ case "contains": {
843
+ let e = i.caseInsensitive ? r.toLowerCase() : r, t = i.caseInsensitive ? i.value.toLowerCase() : i.value;
844
+ e.includes(t) || n.push({
845
+ assertion: i,
846
+ detail: `output does not contain "${i.value}"`
847
+ });
848
+ break;
849
+ }
850
+ case "notContains": {
851
+ let e = i.caseInsensitive ? r.toLowerCase() : r, t = i.caseInsensitive ? i.value.toLowerCase() : i.value;
852
+ e.includes(t) && n.push({
853
+ assertion: i,
854
+ detail: `output unexpectedly contains "${i.value}"`
855
+ });
856
+ break;
857
+ }
858
+ case "matches": {
859
+ let e;
860
+ try {
861
+ e = new RegExp(i.pattern, i.flags);
862
+ } catch (e) {
863
+ n.push({
864
+ assertion: i,
865
+ detail: `invalid pattern /${i.pattern}/: ${e.message}`
866
+ });
867
+ break;
868
+ }
869
+ e.test(r) || n.push({
870
+ assertion: i,
871
+ detail: `output does not match /${i.pattern}/`
872
+ });
873
+ break;
874
+ }
875
+ case "equals":
876
+ (i.trim ? r.trim() : r) !== (i.trim ? i.value.trim() : i.value) && n.push({
877
+ assertion: i,
878
+ detail: "output is not equal to the expected value"
879
+ });
880
+ break;
881
+ case "maxLatencyMs":
882
+ e.latencyMs > i.value && n.push({
883
+ assertion: i,
884
+ detail: `latency ${e.latencyMs}ms exceeds ${i.value}ms`
885
+ });
886
+ break;
887
+ case "nonEmpty":
888
+ r.trim() === "" && n.push({
889
+ assertion: i,
890
+ detail: "output is empty"
891
+ });
892
+ break;
893
+ }
894
+ return n;
895
+ }, Cn = .7, wn = (e, t, n, r, i) => {
896
+ let a = Sn(t, [...n, ...e.assert ?? []]), o = r?.threshold ?? .7, s = i === void 0 || i.score >= o;
897
+ return {
898
+ id: e.id,
899
+ pass: a.length === 0 && s,
900
+ assertionFailures: a,
901
+ ...i === void 0 ? {} : { judge: i },
902
+ output: t
903
+ };
904
+ }, Tn = async (e, t) => {
905
+ let n = [];
906
+ for (let r of e.cases) {
907
+ let i = await t.replay({
908
+ case: r,
909
+ def: e
910
+ }), a = e.judge !== void 0 && t.judge !== void 0 ? await t.judge({
911
+ case: r,
912
+ output: i,
913
+ config: e.judge
914
+ }) : void 0;
915
+ n.push(wn(r, i, e.assert ?? [], e.judge, a));
916
+ }
917
+ let r = n.filter((e) => !e.pass).length;
918
+ return {
919
+ name: e.name,
920
+ ok: r === 0,
921
+ passed: n.length - r,
922
+ failed: r,
923
+ cases: n,
924
+ ...t.branchId === void 0 ? {} : { branch: { id: t.branchId } }
925
+ };
926
+ }, En = D.Struct({
927
+ pass: D.Boolean,
928
+ score: D.Number,
929
+ reason: D.String
930
+ }), Dn = (e, t, n) => [
931
+ "You are grading an AI assistant response against a rubric. Respond with a JSON",
932
+ "object { pass: boolean, score: number (0..1), reason: string }. Score 1 is a",
933
+ "perfect response, 0 is unusable. Be strict: a plausible-sounding but wrong or",
934
+ "incomplete answer scores low.",
935
+ "",
936
+ `RUBRIC:\n${n.rubric}`,
937
+ ...e.golden === void 0 ? [] : ["", `REFERENCE (the previously-accepted answer):\n${e.golden}`],
938
+ ...e.input.prompt === "" ? [] : ["", `USER PROMPT:\n${e.input.prompt}`],
939
+ "",
940
+ `CANDIDATE RESPONSE (to grade):\n${t.text}`
941
+ ].join("\n"), On = async ({ case: e, output: t, config: n }) => await T.runPromise(v({
942
+ schema: En,
943
+ prompt: Dn(e, t, n),
944
+ provider: f()
945
+ }).pipe(T.map((e) => e.object), T.catchAll((e) => T.succeed({
946
+ pass: !1,
947
+ score: 0,
948
+ reason: `judge failed: ${e.message}`
949
+ })))), kn = (e) => {
1139
950
  if (e === void 0) return;
1140
951
  let t = Number(e);
1141
952
  return Number.isFinite(t) ? t * 1e6 : void 0;
1142
- }, Mn = (e) => {
1143
- let t = Q(e.pricing?.input), n = Q(e.pricing?.output), r = Q(e.pricing?.cachedInputTokens ?? void 0);
953
+ }, An = (e) => {
954
+ let t = kn(e.pricing?.input), n = kn(e.pricing?.output), r = kn(e.pricing?.cachedInputTokens ?? void 0);
1144
955
  return {
1145
956
  id: e.id,
1146
957
  name: e.name,
@@ -1152,16 +963,16 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
1152
963
  ...r === void 0 ? {} : { cachedInputPer1M: r }
1153
964
  } } : {}
1154
965
  };
1155
- }, Nn = async (e = {}) => {
1156
- let t = (await (e.gatewayProvider ?? (e.apiKey !== void 0 || e.baseURL !== void 0 ? ue({
966
+ }, jn = async (e = {}) => {
967
+ let t = (await (e.gatewayProvider ?? (e.apiKey !== void 0 || e.baseURL !== void 0 ? ze({
1157
968
  ...e.apiKey === void 0 ? {} : { apiKey: e.apiKey },
1158
969
  ...e.baseURL === void 0 ? {} : { baseURL: e.baseURL }
1159
- }) : de)).getAvailableModels()).models.map(Mn);
970
+ }) : Be)).getAvailableModels()).models.map(An);
1160
971
  return e.modality === void 0 ? t : t.filter((t) => t.modality === e.modality);
1161
- }, Pn = class extends x.TaggedError()("CopilotRejected", {
1162
- reason: x.Literal("unknown-table", "unknown-column", "bad-op", "bad-aggregate", "empty"),
1163
- detail: x.String
1164
- }) {}, Fn = 200, In = 50, Ln = /* @__PURE__ */ new Set([
972
+ }, Mn = class extends D.TaggedError()("CopilotRejected", {
973
+ reason: D.Literal("unknown-table", "unknown-column", "bad-op", "bad-aggregate", "empty"),
974
+ detail: D.String
975
+ }) {}, Nn = 200, Pn = 50, Fn = /* @__PURE__ */ new Set([
1165
976
  "eq",
1166
977
  "neq",
1167
978
  "gt",
@@ -1170,38 +981,38 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
1170
981
  "lte",
1171
982
  "contains",
1172
983
  "in"
1173
- ]), Rn = (e) => {
984
+ ]), In = (e) => {
1174
985
  switch (e.op) {
1175
- case "eq": return w(e.column, e.value);
1176
- case "neq": return Re(e.column, e.value);
1177
- case "gt": return Me(e.column, e.value);
1178
- case "gte": return Ne(e.column, e.value);
1179
- case "lt": return Ie(e.column, e.value);
1180
- case "lte": return Le(e.column, e.value);
1181
- case "contains": return Ae(e.column, e.value);
1182
- case "in": return Pe(e.column, Array.isArray(e.value) ? e.value : [e.value]);
986
+ case "eq": return A(e.column, e.value);
987
+ case "neq": return rt(e.column, e.value);
988
+ case "gt": return $e(e.column, e.value);
989
+ case "gte": return et(e.column, e.value);
990
+ case "lt": return N(e.column, e.value);
991
+ case "lte": return P(e.column, e.value);
992
+ case "contains": return Ze(e.column, e.value);
993
+ case "in": return tt(e.column, Array.isArray(e.value) ? e.value : [e.value]);
1183
994
  }
1184
- }, $ = (e, t) => ({
995
+ }, Q = (e, t) => ({
1185
996
  ok: !1,
1186
- rejection: new Pn({
997
+ rejection: new Mn({
1187
998
  reason: e,
1188
999
  detail: t
1189
1000
  })
1190
- }), zn = (e, t) => {
1001
+ }), Ln = (e, t) => {
1191
1002
  let n = t.tables.find((t) => t.name === e.table);
1192
- if (n === void 0) return $("unknown-table", e.table);
1003
+ if (n === void 0) return Q("unknown-table", e.table);
1193
1004
  let r = new Set(n.columns.map((e) => e.name));
1194
- for (let t of e.columns ?? []) if (!r.has(t)) return $("unknown-column", `${e.table}.${t}`);
1005
+ for (let t of e.columns ?? []) if (!r.has(t)) return Q("unknown-column", `${e.table}.${t}`);
1195
1006
  for (let t of e.filters ?? []) {
1196
- if (!Ln.has(t.op)) return $("bad-op", String(t.op));
1197
- if (!r.has(t.column)) return $("unknown-column", `${e.table}.${t.column}`);
1007
+ if (!Fn.has(t.op)) return Q("bad-op", String(t.op));
1008
+ if (!r.has(t.column)) return Q("unknown-column", `${e.table}.${t.column}`);
1198
1009
  }
1199
- if (e.orderBy !== void 0 && !r.has(e.orderBy.column)) return $("unknown-column", `${e.table}.${e.orderBy.column}`);
1010
+ if (e.orderBy !== void 0 && !r.has(e.orderBy.column)) return Q("unknown-column", `${e.table}.${e.orderBy.column}`);
1200
1011
  if (e.aggregate !== void 0) {
1201
1012
  let { fn: t, column: n } = e.aggregate;
1202
- if (t !== "count" && (n === void 0 || !r.has(n))) return $("bad-aggregate", `${t}(${n ?? "∅"})`);
1013
+ if (t !== "count" && (n === void 0 || !r.has(n))) return Q("bad-aggregate", `${t}(${n ?? "∅"})`);
1203
1014
  }
1204
- let i = e.filters ?? [], a = i.length === 0 ? void 0 : i.length === 1 ? Rn(i[0]) : C(...i.map(Rn)), o = Math.min(Math.max(1, e.limit ?? In), 200), s = {
1015
+ let i = e.filters ?? [], a = i.length === 0 ? void 0 : i.length === 1 ? In(i[0]) : k(...i.map(In)), o = Math.min(Math.max(1, e.limit ?? Pn), 200), s = {
1205
1016
  table: e.table,
1206
1017
  predicate: a,
1207
1018
  order: e.orderBy ? [{
@@ -1222,24 +1033,24 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
1222
1033
  descriptor: s,
1223
1034
  table: e.table
1224
1035
  };
1225
- }, Bn = x.Struct({
1226
- table: x.String,
1227
- columns: x.optional(x.Array(x.String)),
1228
- filters: x.optional(x.Array(x.Struct({
1229
- column: x.String,
1230
- op: x.Literal("eq", "neq", "gt", "gte", "lt", "lte", "contains", "in"),
1231
- value: x.Unknown
1036
+ }, Rn = D.Struct({
1037
+ table: D.String,
1038
+ columns: D.optional(D.Array(D.String)),
1039
+ filters: D.optional(D.Array(D.Struct({
1040
+ column: D.String,
1041
+ op: D.Literal("eq", "neq", "gt", "gte", "lt", "lte", "contains", "in"),
1042
+ value: D.Unknown
1232
1043
  }))),
1233
- orderBy: x.optional(x.Struct({
1234
- column: x.String,
1235
- direction: x.optional(x.Literal("asc", "desc"))
1044
+ orderBy: D.optional(D.Struct({
1045
+ column: D.String,
1046
+ direction: D.optional(D.Literal("asc", "desc"))
1236
1047
  })),
1237
- limit: x.optional(x.Number),
1238
- aggregate: x.optional(x.Struct({
1239
- fn: x.Literal("count", "sum", "avg", "min", "max"),
1240
- column: x.optional(x.String)
1048
+ limit: D.optional(D.Number),
1049
+ aggregate: D.optional(D.Struct({
1050
+ fn: D.Literal("count", "sum", "avg", "min", "max"),
1051
+ column: D.optional(D.String)
1241
1052
  }))
1242
- }), Vn = (e) => [
1053
+ }), zn = (e) => [
1243
1054
  "You are a data copilot. Translate the user question into a JSON query proposal.",
1244
1055
  "",
1245
1056
  "You may ONLY reference these tables and columns:",
@@ -1251,12 +1062,187 @@ var He = (e, t) => e(t), Ue = Symbol.for("@voltro/ai/Tool"), We = (e) => ({
1251
1062
  "- NEVER invent a table or column. If the question cannot be answered from the listed schema, pick the closest table and leave filters empty.",
1252
1063
  "- The query is READ-ONLY. You cannot insert, update, or delete.",
1253
1064
  "- Keep the result small (limit ≤ 200)."
1254
- ].join("\n"), Hn = async (e, t, n) => {
1255
- let r = Vn(t);
1256
- return zn(await n.propose({
1065
+ ].join("\n"), Bn = async (e, t, n) => {
1066
+ let r = zn(t);
1067
+ return Ln(await n.propose({
1257
1068
  system: r,
1258
1069
  prompt: e
1259
1070
  }), t);
1071
+ }, Vn = 4, Hn = 250, Un = {
1072
+ examined: !1,
1073
+ claimed: 0,
1074
+ succeeded: 0,
1075
+ failed: 0,
1076
+ retried: 0,
1077
+ reclaimed: 0,
1078
+ failures: []
1079
+ }, $ = (e) => {
1080
+ let t = e instanceof Error ? e.message : String(e);
1081
+ return t.length > 1e3 ? `${t.slice(0, 1e3)}…` : t;
1082
+ }, Wn = (e) => {
1083
+ let t = e;
1084
+ if (typeof t?.retryAfterMillis == "number") return t.retryAfterMillis;
1085
+ if (typeof t?.retryAfter == "number") return t.retryAfter * 1e3;
1086
+ }, Gn = (e) => it(k(A("status", "pending"), P("enqueuedAt", new Date(e))), k(A("status", "running"), N("leaseUntil", new Date(e)))), Kn = async (e, t = {}) => {
1087
+ let n = e.now?.() ?? Date.now(), r = t.batch ?? 4, i = t.leaseMs ?? 3e5, a = t.maxAttempts ?? 4, o = e.replicaId ?? `pid-${process.pid}`, s;
1088
+ try {
1089
+ s = await e.store.query({
1090
+ table: b,
1091
+ predicate: Gn(n),
1092
+ order: [{
1093
+ column: "enqueuedAt",
1094
+ direction: "asc"
1095
+ }],
1096
+ take: r,
1097
+ skip: void 0,
1098
+ projection: void 0
1099
+ });
1100
+ } catch (e) {
1101
+ return {
1102
+ ...Un,
1103
+ examined: !0,
1104
+ failures: [{
1105
+ id: b,
1106
+ detail: $(e)
1107
+ }]
1108
+ };
1109
+ }
1110
+ if (s.length === 0) return {
1111
+ ...Un,
1112
+ examined: !0
1113
+ };
1114
+ let c = [], l = 0, u = 0, d = 0, f = 0, p = 0, m = s.map((r) => async () => {
1115
+ let s = me(r), m = String(r.status) === "running", h = 0;
1116
+ try {
1117
+ h = await e.store.updateMany(b, {
1118
+ status: "running",
1119
+ leaseUntil: new Date(n + i),
1120
+ claimedBy: o,
1121
+ startedAt: new Date(n)
1122
+ }, { where: k(A("id", s.id), m ? k(A("status", "running"), N("leaseUntil", new Date(n))) : k(A("status", "pending"), P("enqueuedAt", new Date(n)))) });
1123
+ } catch (e) {
1124
+ c.push({
1125
+ id: s.id,
1126
+ detail: $(e)
1127
+ });
1128
+ return;
1129
+ }
1130
+ if (h !== 1) return;
1131
+ l += 1, m && (p += 1);
1132
+ let g = Date.now();
1133
+ try {
1134
+ let t = await qn(e, s);
1135
+ await e.resume({
1136
+ executionId: s.executionId,
1137
+ workflowName: s.workflowName,
1138
+ signalName: s.signalName,
1139
+ payload: t.payload
1140
+ }), await e.store.update(b, s.id, {
1141
+ status: "succeeded",
1142
+ result: t.payload,
1143
+ completedAt: /* @__PURE__ */ new Date(),
1144
+ durationMs: Date.now() - g,
1145
+ leaseUntil: null
1146
+ }), u += 1, e.log?.info("ai.infer: offloaded call completed", {
1147
+ id: s.id,
1148
+ model: s.model,
1149
+ durationMs: Date.now() - g
1150
+ });
1151
+ } catch (n) {
1152
+ let r = fe({
1153
+ attempts: s.attempts,
1154
+ maxAttempts: a,
1155
+ baseDelayMs: t.baseDelayMs ?? 1e3,
1156
+ maxDelayMs: t.maxDelayMs ?? 3e4,
1157
+ retryAfterMs: Wn(n)
1158
+ }), i = $(n);
1159
+ if (c.push({
1160
+ id: s.id,
1161
+ detail: i
1162
+ }), r.kind === "retry") {
1163
+ await e.store.update(b, s.id, {
1164
+ status: "pending",
1165
+ attempts: r.attempts,
1166
+ errorMessage: i,
1167
+ leaseUntil: null,
1168
+ enqueuedAt: new Date(Date.now() + r.delayMs)
1169
+ }).catch(() => {}), f += 1;
1170
+ return;
1171
+ }
1172
+ await e.resume({
1173
+ executionId: s.executionId,
1174
+ workflowName: s.workflowName,
1175
+ signalName: s.signalName,
1176
+ payload: {
1177
+ __voltro_ai_error: !0,
1178
+ message: i,
1179
+ attempts: r.attempts
1180
+ }
1181
+ }).catch((e) => {
1182
+ c.push({
1183
+ id: s.id,
1184
+ detail: `could not resume the parked run: ${$(e)}`
1185
+ });
1186
+ }), await e.store.update(b, s.id, {
1187
+ status: "failed",
1188
+ attempts: r.attempts,
1189
+ errorMessage: i,
1190
+ completedAt: /* @__PURE__ */ new Date(),
1191
+ leaseUntil: null
1192
+ }).catch(() => {}), d += 1, e.log?.warn("ai.infer: offloaded call gave up", {
1193
+ id: s.id,
1194
+ model: s.model,
1195
+ attempts: r.attempts,
1196
+ detail: i
1197
+ });
1198
+ }
1199
+ });
1200
+ return await Promise.all(m.map((e) => e())), {
1201
+ examined: !0,
1202
+ claimed: l,
1203
+ succeeded: u,
1204
+ failed: d,
1205
+ retried: f,
1206
+ reclaimed: p,
1207
+ failures: c
1208
+ };
1209
+ }, qn = async (e, t) => {
1210
+ let n = {
1211
+ provider: t.provider,
1212
+ model: t.model
1213
+ }, r = {
1214
+ prompt: t.prompt,
1215
+ provider: n,
1216
+ ...t.system === null ? {} : { system: t.system },
1217
+ ...t.maxTokens === null ? {} : { maxTokens: t.maxTokens },
1218
+ ...t.providerOptions !== null && t.providerOptions !== void 0 ? { providerOptions: t.providerOptions } : {}
1219
+ };
1220
+ if (t.kind === "object") {
1221
+ if (t.jsonSchema === null) throw Error(`inference ${t.id} is kind 'object' but carries no jsonSchema`);
1222
+ let n = await e.run(we({
1223
+ ...r,
1224
+ jsonSchema: t.jsonSchema
1225
+ }));
1226
+ return await Jn(e, t, "generateObject", n), { payload: n.object };
1227
+ }
1228
+ let i = await e.run(_e(r));
1229
+ return await Jn(e, t, "generateText", i), { payload: {
1230
+ text: i.text,
1231
+ inputTokens: i.usage.inputTokens ?? null,
1232
+ outputTokens: i.usage.outputTokens ?? null,
1233
+ totalTokens: i.usage.totalTokens ?? null
1234
+ } };
1235
+ }, Jn = async (e, t, n, r) => {
1236
+ let i = ce(r.providerMetadata);
1237
+ await e.run(ye(e.store, {
1238
+ provider: t.provider,
1239
+ model: t.model,
1240
+ operation: n,
1241
+ agent: t.stepName,
1242
+ usage: r.usage,
1243
+ ...t.tenantId === null ? {} : { tenantId: t.tenantId },
1244
+ ...i === void 0 ? {} : { actualCostUsd: i }
1245
+ })).catch(() => {});
1260
1246
  };
1261
1247
  //#endregion
1262
- export { m as AGENT_MESSAGES_TABLE, h as AGENT_THREADS_TABLE, P as AI_BUDGET_TABLE, N as AI_USAGE_TABLE, ne as AgentErrorCode, re as AgentEvent, at as AiBudgetExceeded, B as AiError, xt as AiService, Fn as COPILOT_MAX_LIMIT, Bn as CopilotProposalSchema, Pn as CopilotRejected, Ze as MODEL_PRICING_DEFAULTS, ee as MockScript, J as STREAM_EVENTS_TABLE, Y as STREAM_STATE_TABLE, ie as SeqEvent, Rt as activeStreamCount, jt as agentActor, le as agentInputSchema, se as agentMessageSchema, an as agentMessagesTable, ce as agentRouteDescriptors, rn as agentThreadsTable, ot as aiBudgetTable, L as aiCallAttributes, it as aiSpendUsd, tt as aiUsageTable, Nt as appTools, sn as appendMessage, un as appendStreamingMessage, s as applyMiddleware, Vn as buildCopilotSystemPrompt, A as buildSdkTools, Ft as cancelStream, te as clearAiMiddleware, Gt as consumeResumableStream, Dn as cosineSimilarity, on as createThread, en as dataStoreResumableStreamStore, St as defaultAiService, n as defaultSettingsMiddleware, oe as defineAgent, mn as defineAgentExecutor, We as defineTool, Tn as embed, En as embedMany, wn as embeddingProviderFromEnv, M as estimateCostUsd, r as extractReasoningMiddleware, nt as gatewayCostUsd, tn as gcResumableStreams, wt as generateImage, yt as generateObject, bt as generateObjectWithTools, Tt as generateSpeech, _t as generateText, Ot as generateVideo, d as getAiMiddleware, Nn as getAvailableModels, X as getMessages, l as getProviderOverride, cn as getThread, xn as hashToVector, ln as historyToModelMessages, ae as isAgentDescriptor, hn as isAgentExecutor, It as isStreamActive, Ge as isTool, yn as loadAgentMessages, c as loggingMiddleware, Yt as memoryResumableStreamStore, $e as modelPricing, gt as observeStream, U as passesPolicy, dn as patchStreamingMessage, et as priceForModel, f as providerFromEnv, rt as recordAiUsage, nn as redisResumableStreamStore, Pt as registerStream, lt as requireAiBudget, On as rerank, _n as resolveAgentModel, Sn as resolveEmbeddingModel, o as resolveImageModel, e as resolveModel, u as resolveSpeechModel, gn as resolveSystem, Ke as resolveToolModuleHandlers, p as resolveVideoModel, qt as resumableStream, Jt as resumableStreamText, vn as runAgentTurn, fn as runAssistant, Hn as runDataCopilot, a as setAiMiddleware, Qe as setModelPricing, t as setProviderOverride, i as simulateStreamingMiddleware, Kt as startResumableProducer, Xt as streamEventsTable, Zt as streamStateTable, q as streamText, Wt as streamTextWithFallback, Ut as streamTextWithRetry, Mt as synthesizeToolSpecs, Mn as toModelInfo, Lt as unregisterStream, zn as validateCopilotProposal, z as withAiCallSpan };
1248
+ export { S as AGENT_MESSAGES_TABLE, C as AGENT_THREADS_TABLE, pe as AI_BUDGET_TABLE, b as AI_INFERENCES_TABLE, Ae as AI_USAGE_TABLE, je as AgentErrorCode, Me as AgentEvent, ue as AiBudgetExceeded, y as AiError, De as AiService, Nn as COPILOT_MAX_LIMIT, Rn as CopilotProposalSchema, Mn as CopilotRejected, Se as DEFAULT_INFERENCE_ATTEMPTS, Vn as DEFAULT_INFERENCE_CONCURRENCY, Te as DEFAULT_INFERENCE_LEASE_MS, Hn as DEFAULT_INFERENCE_POLL_MS, Cn as DEFAULT_JUDGE_THRESHOLD, ee as MODEL_PRICING_DEFAULTS, m as MockScript, W as STREAM_EVENTS_TABLE, G as STREAM_STATE_TABLE, Ne as SeqEvent, St as activeStreamCount, ht as agentActor, Re as agentInputSchema, Ie as agentMessageSchema, Ht as agentMessagesTable, Le as agentRouteDescriptors, Vt as agentThreadsTable, ke as aiBudgetTable, _ as aiCallAttributes, ve as aiInferencesTable, de as aiSpendUsd, ne as aiUsageTable, _t as appTools, Wt as appendMessage, qt as appendStreamingMessage, s as applyMiddleware, zn as buildCopilotSystemPrompt, le as buildSdkTools, yt as cancelStream, h as clearAiMiddleware, kt as consumeResumableStream, sn as cosineSimilarity, Ut as createThread, Rt as dataStoreResumableStreamStore, fe as decideInferenceFailure, he as defaultAiService, n as defaultSettingsMiddleware, Fe as defineAgent, Zt as defineAgentExecutor, bn as defineEval, re as defineTool, Kn as dispatchInferences, Z as embed, on as embedMany, X as embeddingProviderFromEnv, te as estimateCostUsd, Sn as evaluateAssertions, r as extractReasoningMiddleware, ce as gatewayCostUsd, zt as gcResumableStreams, ct as generateImage, v as generateObject, we as generateObjectJson, xe as generateObjectWithTools, lt as generateSpeech, _e as generateText, ft as generateVideo, d as getAiMiddleware, jn as getAvailableModels, K as getMessages, l as getProviderOverride, Gt as getThread, an as hashToVector, Kt as historyToModelMessages, Ce as inferenceSignalName, Pe as isAgentDescriptor, Qt as isAgentExecutor, xn as isEvalDefinition, bt as isStreamActive, ie as isTool, On as llmJudge, nn as loadAgentMessages, c as loggingMiddleware, Nt as memoryResumableStreamStore, be as modelPricing, Oe as observeStream, Ee as offloadedInferenceId, ge as outputJsonSchema, z as passesPolicy, Jt as patchStreamingMessage, g as priceForModel, f as providerFromEnv, ye as recordAiUsage, hn as recordReads, Bt as redisResumableStreamStore, vt as registerStream, oe as requireAiBudget, gn as rerank, en as resolveAgentModel, J as resolveEmbeddingModel, o as resolveImageModel, e as resolveModel, u as resolveSpeechModel, $t as resolveSystem, ae as resolveToolModuleHandlers, p as resolveVideoModel, jt as resumableStream, Mt as resumableStreamText, tn as runAgentTurn, Yt as runAssistant, Bn as runDataCopilot, Tn as runEval, wn as scoreCase, mn as semanticGenerateObject, pn as semanticGenerateText, a as setAiMiddleware, se as setModelPricing, t as setProviderOverride, i as simulateStreamingMiddleware, At as startResumableProducer, Pt as streamEventsTable, Ft as streamStateTable, U as streamText, Ot as streamTextWithFallback, Dt as streamTextWithRetry, gt as synthesizeToolSpecs, An as toModelInfo, me as toQueuedInference, xt as unregisterStream, Ln as validateCopilotProposal, x as withAiCallSpan };