@voltro/ai 0.84.0 → 0.86.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 (61) hide show
  1. package/CHANGELOG.md +1215 -0
  2. package/THIRD-PARTY-NOTICES.md +5 -151
  3. package/dist/agent.d.ts +34 -41
  4. package/dist/agent.js +64 -2
  5. package/dist/agentConstants.js +4 -0
  6. package/dist/agentExecutor.js +51 -0
  7. package/dist/api.js +199 -0
  8. package/dist/appTools.js +80 -0
  9. package/dist/budget.js +201 -0
  10. package/dist/callEvidence.js +51 -0
  11. package/dist/copilot.js +126 -0
  12. package/dist/cost.js +242 -0
  13. package/dist/embed.js +41 -0
  14. package/dist/embeddingProvider.js +51 -0
  15. package/dist/eval.js +130 -0
  16. package/dist/events.d.ts +171 -168
  17. package/dist/events.js +81 -2
  18. package/dist/executableModalities.js +13 -0
  19. package/dist/gateway.js +58 -0
  20. package/dist/gatewayCatalog.js +47 -0
  21. package/dist/gatewayMedia.js +88 -0
  22. package/dist/index.d.ts +328 -326
  23. package/dist/index.js +42 -2581
  24. package/dist/inferenceDispatch.js +493 -0
  25. package/dist/inferenceQueue.js +96 -0
  26. package/dist/jsonOutputValidation.js +27 -0
  27. package/dist/mcpClient.js +332 -0
  28. package/dist/mcpTools.js +80 -0
  29. package/dist/media.js +182 -0
  30. package/dist/mediaBytes.js +19 -0
  31. package/dist/mediaCall.js +13 -0
  32. package/dist/mediaTaskProvider.js +16 -0
  33. package/dist/middleware.js +32 -0
  34. package/dist/observe.js +52 -0
  35. package/dist/prompts.js +103 -0
  36. package/dist/provider.js +303 -0
  37. package/dist/realtimeEvent.js +97 -0
  38. package/dist/realtimeSession.js +154 -0
  39. package/dist/rerank.js +61 -0
  40. package/dist/resumableStream.js +321 -0
  41. package/dist/retrieveReranked.js +16 -0
  42. package/dist/runAndPersist.js +148 -0
  43. package/dist/semanticCache.js +66 -0
  44. package/dist/speechProvider.js +16 -0
  45. package/dist/streamRegistry.js +14 -0
  46. package/dist/streamText.js +170 -0
  47. package/dist/streamTranscribe.js +74 -0
  48. package/dist/streamWakeups.js +44 -0
  49. package/dist/structuredEvidence.js +48 -0
  50. package/dist/test.js +1 -1
  51. package/dist/threads.js +92 -0
  52. package/dist/tools.js +68 -0
  53. package/dist/transcribe.js +64 -0
  54. package/dist/transcriptionEvent.js +46 -0
  55. package/dist/workflow.d.ts +12 -10
  56. package/dist/workflow.js +117 -112
  57. package/package.json +6 -6
  58. package/dist/agentDescriptor-DuxvWGDi.js +0 -63
  59. package/dist/agentEvent-BuXA7sRt.js +0 -152
  60. package/dist/inferenceQueue-BmtEm3YI.js +0 -1061
  61. package/dist/provider-BnemgE4D.js +0 -409
@@ -0,0 +1,154 @@
1
+ import { RealtimeClientEvent as e, RealtimeServerEvent as t } from "./realtimeEvent.js";
2
+ import { createOpenAI as n } from "@ai-sdk/openai";
3
+ import { createGateway as r } from "@ai-sdk/gateway";
4
+ import { Effect as i, Queue as a, Result as o, Schema as s } from "effect";
5
+ import { defineWebSocket as c } from "@voltro/protocol";
6
+ import { WebSocket as l } from "ws";
7
+ //#region src/realtimeSession.ts
8
+ var u = (e) => {
9
+ if (e.name !== "gateway" && e.name !== "openai") throw TypeError(`Provider '${e.name}' does not support realtime sessions. Use 'gateway' or 'openai'.`);
10
+ let t = {
11
+ ...e.apiKey === void 0 ? {} : { apiKey: e.apiKey },
12
+ ...e.baseURL === void 0 ? {} : { baseURL: e.baseURL }
13
+ };
14
+ return (e.name === "gateway" ? r(t) : n(t)).experimental_realtime(e.model);
15
+ }, d = s.decodeUnknownResult(e, { onExcessProperty: "error" }), f = s.decodeUnknownResult(t), p = class extends Error {
16
+ code;
17
+ constructor(e, t) {
18
+ super(t), this.code = e;
19
+ }
20
+ }, m = {
21
+ maxMessageBytes: 262144,
22
+ maxPendingBytes: 1048576,
23
+ maxPendingMessages: 32,
24
+ setupTimeoutMs: 15e3,
25
+ maxDurationMs: 6e5
26
+ }, h = (e) => {
27
+ let t = {
28
+ ...m,
29
+ ...e.limits
30
+ };
31
+ for (let [e, n] of Object.entries(t)) if (!Number.isSafeInteger(n) || n <= 0 || n > 2147483647) throw TypeError(`defineRealtimeSession: ${e} must be a positive integer at most 2147483647.`);
32
+ if (typeof e.authorize != "function") throw TypeError("defineRealtimeSession: authorize is required.");
33
+ if ("tools" in e.sessionConfig && e.sessionConfig.tools !== void 0) throw TypeError("defineRealtimeSession: tools are not supported; use a server-authorized tool execution surface instead.");
34
+ return c({
35
+ path: e.path,
36
+ auth: "subject",
37
+ limits: {
38
+ maxMessageBytes: t.maxMessageBytes,
39
+ maxPendingBytes: t.maxPendingBytes,
40
+ maxPendingMessages: t.maxPendingMessages
41
+ },
42
+ onConnection: (n) => g(e, t, n)
43
+ });
44
+ }, g = (e, t, n) => {
45
+ let r = new AbortController(), s = !1, c = !1, u = (e, t) => {
46
+ s || (s = !0, r.abort(), n.close(e, t));
47
+ }, m = () => {
48
+ s = !0, r.abort();
49
+ }, h = () => u(4400, "Realtime session is not ready");
50
+ n.onMessage((e) => {
51
+ c ? h(e) : u(4400, "Realtime session is not ready");
52
+ }), n.signal.addEventListener("abort", m, { once: !0 }), n.signal.aborted && m();
53
+ let g = i.scoped(i.gen(function* () {
54
+ yield* i.addFinalizer(() => i.sync(() => {
55
+ s || u(4502, "Realtime session failed"), n.signal.removeEventListener("abort", m);
56
+ }));
57
+ let r = yield* a.dropping(t.maxPendingMessages), g = yield* a.dropping(t.maxPendingMessages);
58
+ yield* i.addFinalizer(() => i.all([a.shutdown(r), a.shutdown(g)]));
59
+ let v = 0, y = 0, b = 0, x = 0, S = (e, n) => {
60
+ if (s) return;
61
+ let i = n === "input" ? v : y, o = n === "input" ? b : x, c = n === "input" ? r : g;
62
+ e.byteLength > t.maxMessageBytes || i + e.byteLength > t.maxPendingBytes || o >= t.maxPendingMessages || !a.offerUnsafe(c, e) ? u(4409, "Realtime buffer limit exceeded") : n === "input" ? (v += e.byteLength, b++) : (y += e.byteLength, x++);
63
+ };
64
+ h = (e) => S(e, "input"), yield* i.forkScoped(i.sleep(t.maxDurationMs).pipe(i.tap(() => i.sync(() => u(4401, "Realtime session expired")))));
65
+ let C = yield* i.gen(function* () {
66
+ let r = n.subject;
67
+ if (r === null || r.type === "anonymous" || !(yield* i.suspend(() => e.authorize(r, {
68
+ provider: e.model.provider,
69
+ modelId: e.model.modelId
70
+ })))) return yield* i.fail(new p(4403, "Realtime access denied"));
71
+ let a = e.model.doCreateClientSecret, o = e.model.getWebSocketConfig;
72
+ if (a === void 0 || o === void 0) return yield* i.fail(new p(4502, "Realtime provider does not support WebSocket sessions"));
73
+ let d = yield* i.tryPromise(() => Promise.resolve(a.call(e.model, {
74
+ expiresAfterSeconds: Math.ceil(t.maxDurationMs / 1e3),
75
+ sessionConfig: e.sessionConfig
76
+ })));
77
+ if (d.expiresAt !== void 0) {
78
+ let e = d.expiresAt * 1e3 - Date.now();
79
+ if (!Number.isFinite(e) || e <= 0) return yield* i.fail(new p(4401, "Realtime session expired"));
80
+ yield* i.forkScoped(i.sleep(Math.min(e, t.maxDurationMs)).pipe(i.tap(() => i.sync(() => u(4401, "Realtime session expired")))));
81
+ }
82
+ let f = o.call(e.model, d), m = yield* i.acquireRelease(i.sync(() => {
83
+ let e = new l(f.url, f.protocols, {
84
+ maxPayload: t.maxMessageBytes,
85
+ perMessageDeflate: !1,
86
+ handshakeTimeout: t.setupTimeoutMs
87
+ });
88
+ return e.on("error", () => {
89
+ s || u(4502, "Realtime provider failed");
90
+ }), e.on("close", () => {
91
+ s || u(4501, "Realtime provider disconnected");
92
+ }), e.on("message", (e, t) => {
93
+ t ? u(4502, "Invalid realtime provider event") : S(Array.isArray(e) ? Buffer.concat(e) : e instanceof ArrayBuffer ? new Uint8Array(e) : e, "output");
94
+ }), e;
95
+ }), (e) => i.sync(() => {
96
+ e.terminate();
97
+ }));
98
+ return yield* i.callback((e) => {
99
+ let t = () => e(i.void), n = () => e(i.fail(new p(4502, "Realtime provider failed")));
100
+ return m.once("open", t), m.once("error", n), m.once("close", n), i.sync(() => {
101
+ m.off("open", t), m.off("error", n), m.off("close", n);
102
+ });
103
+ }), yield* i.tryPromise(() => Promise.resolve(e.model.serializeClientEvent({
104
+ type: "session-update",
105
+ config: e.sessionConfig
106
+ })).then((e) => _(m, e, t, () => s))), yield* i.tryPromise(() => n.sendAsync(JSON.stringify({ type: "ready" }))), c = !0, m;
107
+ }).pipe(i.timeoutOrElse({
108
+ duration: t.setupTimeoutMs,
109
+ orElse: () => i.fail(new p(4408, "Realtime setup timed out"))
110
+ })), w = (e, t) => i.forever(i.flatMap(a.take(e === "input" ? r : g), (n) => i.tryPromise({
111
+ try: () => t(n),
112
+ catch: (e) => e instanceof p ? e : new p(4502, "Realtime provider failed")
113
+ }).pipe(i.ensuring(i.sync(() => {
114
+ e === "input" ? (v -= n.byteLength, b--) : (y -= n.byteLength, x--);
115
+ }))))).pipe(i.catch((e) => i.sync(() => u(e.code, e.message))));
116
+ yield* i.forkScoped(w("input", async (n) => {
117
+ let r;
118
+ try {
119
+ r = JSON.parse(new TextDecoder("utf-8", { fatal: !0 }).decode(n));
120
+ } catch {
121
+ throw new p(4400, "Invalid realtime client event");
122
+ }
123
+ let i = d(r);
124
+ if (o.isFailure(i)) throw new p(4400, "Invalid realtime client event");
125
+ let a = await e.model.serializeClientEvent(i.success);
126
+ await _(C, a, t, () => s);
127
+ })), yield* i.forkScoped(w("output", async (r) => {
128
+ let i = JSON.parse(new TextDecoder("utf-8", { fatal: !0 }).decode(r)), a = e.model.getHealthCheckResponse?.(i);
129
+ a != null && await _(C, a, t, () => s);
130
+ let c = e.model.parseServerEvent(i), l = Array.isArray(c) ? c : [c];
131
+ if (l.length > t.maxPendingMessages) throw new p(4409, "Realtime buffer limit exceeded");
132
+ for (let e of l) {
133
+ if (s) return;
134
+ if (e?.type === "custom") continue;
135
+ let r = f(e);
136
+ if (o.isFailure(r)) throw new p(4502, "Invalid realtime provider event");
137
+ let i = JSON.stringify(r.success);
138
+ if (Buffer.byteLength(i) > t.maxMessageBytes) throw new p(4409, "Realtime buffer limit exceeded");
139
+ await n.sendAsync(i);
140
+ }
141
+ })), yield* i.never;
142
+ }).pipe(i.catch((e) => i.sync(() => {
143
+ e instanceof p ? u(e.code, e.message) : u(4502, "Realtime session failed");
144
+ }))));
145
+ return i.runPromise(g, { signal: r.signal }).catch((e) => {
146
+ s || u(4502, "Realtime session failed");
147
+ }), m;
148
+ }, _ = (e, t, n, r) => {
149
+ if (r() || e.readyState !== l.OPEN) return Promise.reject(new p(4501, "Realtime provider disconnected"));
150
+ let i = JSON.stringify(t);
151
+ return i === void 0 || Buffer.byteLength(i) > n.maxMessageBytes || e.bufferedAmount + Buffer.byteLength(i) > n.maxPendingBytes ? Promise.reject(new p(4409, "Realtime buffer limit exceeded")) : new Promise((t, n) => e.send(i, (e) => e ? n(new p(4502, "Realtime provider failed")) : t()));
152
+ };
153
+ //#endregion
154
+ export { h as defineRealtimeSession, u as resolveRealtimeModel };
package/dist/rerank.js ADDED
@@ -0,0 +1,61 @@
1
+ import { aiGenerationError as e } from "./api.js";
2
+ import { rerank as t } from "ai";
3
+ import { Effect as n } from "effect";
4
+ //#region src/rerank.ts
5
+ var r = (t) => n.tryPromise({
6
+ try: async () => {
7
+ let e = t.getText ?? ((e) => String(e)), n = t.provider ?? "mock", r = [...typeof n == "string" ? n === "mock" ? i(t.query, t.documents, e) : await o(n, t.query, t.documents, e, t.model) : await s(n, t.query, t.documents, e, t.model)].sort((e, t) => t.score - e.score);
8
+ return t.topN === void 0 ? r : r.slice(0, t.topN);
9
+ },
10
+ catch: (t) => e(t)
11
+ }), i = (e, t, n) => {
12
+ let r = a(e), i = new Set(r);
13
+ return t.map((e) => {
14
+ let t = new Set(a(n(e))), r = 0;
15
+ for (let e of i) t.has(e) && r++;
16
+ return {
17
+ document: e,
18
+ score: i.size === 0 ? 0 : r / i.size
19
+ };
20
+ });
21
+ }, a = (e) => e.toLowerCase().split(/[^a-z0-9]+/).filter((e) => e.length > 0), o = async (e, n, r, i, a) => {
22
+ let o = e === "cohere" ? "@ai-sdk/cohere" : "voyage-ai-provider", s;
23
+ try {
24
+ s = await import(
25
+ /* @vite-ignore */
26
+ o
27
+ );
28
+ } catch {
29
+ throw Error(`rerank provider '${e}' needs the '${o}' package — install it or use the default mock provider for tests/demos.`);
30
+ }
31
+ let c = s[e], l = c?.rerankingModel ?? c?.reranking;
32
+ if (typeof l != "function") throw Error(`rerank provider '${e}' does not expose a reranking model in '${o}'.`);
33
+ let u = l(a ?? (e === "cohere" ? "rerank-english-v3.0" : "rerank-2")), d = r.map(i);
34
+ return (await t({
35
+ model: u,
36
+ query: n,
37
+ documents: d
38
+ })).ranking.map((e) => ({
39
+ document: r[e.originalIndex],
40
+ score: e.score
41
+ }));
42
+ }, s = async (e, n, r, a, o) => {
43
+ if (e.name === "mock") return i(n, r, a);
44
+ if (e.name !== "gateway") throw Error(`rerank: provider '${e.name}' has no reranking model. Use { name: 'gateway', model: 'cohere/rerank-v4-pro' } to reach the catalog, or the direct-key shorthands 'cohere' / 'voyage'.`);
45
+ let { createGateway: s } = await import("@ai-sdk/gateway"), c = s({
46
+ ...e.apiKey === void 0 ? {} : { apiKey: e.apiKey },
47
+ ...e.baseURL === void 0 ? {} : { baseURL: e.baseURL }
48
+ });
49
+ if (typeof c.rerankingModel != "function") throw Error("rerank: this @ai-sdk/gateway build exposes no `rerankingModel`.");
50
+ let l = o ?? e.model, u = r.map(a);
51
+ return (await t({
52
+ model: c.rerankingModel(l),
53
+ query: n,
54
+ documents: u
55
+ })).ranking.map((e) => ({
56
+ document: r[e.originalIndex],
57
+ score: e.score
58
+ }));
59
+ };
60
+ //#endregion
61
+ export { r as rerank };
@@ -0,0 +1,321 @@
1
+ import { streamText as e } from "./streamText.js";
2
+ import { awaitStreamChange as t, hasStreamReaders as n, watchStream as r, withStreamWakeups as i } from "./streamWakeups.js";
3
+ import { Cause as a, Clock as o, Duration as s, Effect as c, Exit as l, Option as u, Stream as d } from "effect";
4
+ import { and as f, boolean as p, eq as m, generateId as h, gt as g, id as _, inSet as v, integer as y, json as b, lt as x, registerRetention as S, retentionTtlMsFromEnv as C, table as w, text as T, timestamp as E } from "@voltro/database";
5
+ //#region src/resumableStream.ts
6
+ var D = (e) => e._tag === "done" || e._tag === "error", O = (e, n, i = {}) => {
7
+ let a = i.pollMs ?? 50, l = Math.max(a, i.maxPollMs ?? 1e3);
8
+ if (!Number.isFinite(a) || a <= 0 || !Number.isFinite(l)) throw RangeError("Stream poll intervals must be finite positive milliseconds");
9
+ let f = i.fromSeq ?? 0, p = i.idleTimeoutMs, m = [[], u.none()];
10
+ return d.unwrap(c.map(r(n, e), (r) => d.paginate({
11
+ cursor: f,
12
+ idleMs: 0,
13
+ pollMs: a
14
+ }, (i) => c.gen(function* () {
15
+ let d = r.version, f = yield* n.read(e, i.cursor, 256);
16
+ if (f.length > 0) {
17
+ let e = f[f.length - 1].seq;
18
+ return [Array.from(f), u.some({
19
+ cursor: e,
20
+ idleMs: 0,
21
+ pollMs: a
22
+ })];
23
+ }
24
+ if (yield* n.isDone(e)) {
25
+ let t = yield* n.read(e, i.cursor, 256);
26
+ if (t.length === 0) return m;
27
+ let r = t[t.length - 1].seq;
28
+ return [Array.from(t), u.some({
29
+ cursor: r,
30
+ idleMs: 0,
31
+ pollMs: a
32
+ })];
33
+ }
34
+ if (p !== void 0 && i.idleMs >= p) return m;
35
+ let h = Math.min(i.pollMs, p === void 0 ? Infinity : p - i.idleMs), g = yield* o.currentTimeMillis;
36
+ yield* c.raceFirst(t(r, d), c.sleep(s.millis(h)));
37
+ let _ = Math.max(0, (yield* o.currentTimeMillis) - g), v = r.version !== d;
38
+ return [[], u.some({
39
+ ...i,
40
+ idleMs: v ? 0 : i.idleMs + _,
41
+ pollMs: v ? a : Math.min(l, i.pollMs * 2)
42
+ })];
43
+ })).pipe(d.takeUntil(({ event: e }) => D(e)))));
44
+ }, k = (e, t, n) => c.suspend(() => {
45
+ let r = 0, i = !1, o, s = (n) => c.suspend(() => (r += 1, D(n) && (o = r), t.append(e, {
46
+ seq: r,
47
+ event: n
48
+ }).pipe(c.tap(() => c.sync(() => {
49
+ D(n) && (i = !0);
50
+ }))))), u = (n) => c.gen(function* () {
51
+ if (t.appendMany === void 0) {
52
+ for (let e of n) yield* s(e);
53
+ return;
54
+ }
55
+ let a = n;
56
+ for (let n = 0; n < a.length; n += 64) {
57
+ let s = a.slice(n, n + 64).map((e) => (r += 1, D(e) && (o = r), {
58
+ seq: r,
59
+ event: e
60
+ }));
61
+ yield* t.appendMany(e, s), s.some(({ event: e }) => D(e)) && (i = !0);
62
+ }
63
+ });
64
+ return c.uninterruptibleMask((r) => c.gen(function* () {
65
+ let f = yield* r(c.suspend(() => n().pipe(d.takeUntil(D), d.runForEachArray(u)))).pipe(c.exit);
66
+ if (!i && o !== void 0) {
67
+ let n = o;
68
+ i = (yield* t.read(e, n - 1)).some((e) => e.seq === n && D(e.event));
69
+ }
70
+ if (!i) {
71
+ let e = l.isFailure(f) && a.hasInterruptsOnly(f.cause);
72
+ yield* s({
73
+ _tag: "error",
74
+ code: e ? "cancelled" : "internal",
75
+ message: e ? "Resumable stream producer cancelled." : "Resumable stream producer failed.",
76
+ retryable: !1
77
+ });
78
+ }
79
+ yield* t.markDone(e);
80
+ }));
81
+ }), A = (e) => d.unwrap(c.gen(function* () {
82
+ return (yield* e.store.claimProducer(e.streamId)) && (yield* c.forkDetach(k(e.streamId, e.store, e.source).pipe(c.catchCause(() => c.logError("ai: resumable stream finalization could not be persisted"))))), O(e.streamId, e.store, {
83
+ fromSeq: e.fromSeq ?? 0,
84
+ pollMs: e.pollMs ?? 50,
85
+ ...e.maxPollMs === void 0 ? {} : { maxPollMs: e.maxPollMs },
86
+ ...e.idleTimeoutMs === void 0 ? {} : { idleTimeoutMs: e.idleTimeoutMs }
87
+ });
88
+ })), j = (t) => A({
89
+ streamId: t.streamId,
90
+ store: t.store,
91
+ source: () => e(t.options),
92
+ ...t.fromSeq === void 0 ? {} : { fromSeq: t.fromSeq },
93
+ ...t.pollMs === void 0 ? {} : { pollMs: t.pollMs },
94
+ ...t.maxPollMs === void 0 ? {} : { maxPollMs: t.maxPollMs },
95
+ ...t.idleTimeoutMs === void 0 ? {} : { idleTimeoutMs: t.idleTimeoutMs }
96
+ }), M = (e = {}) => {
97
+ let t = e.retentionMs ?? 6048e5;
98
+ if (!Number.isFinite(t) || t < 0) throw RangeError("Stream retention must be finite non-negative milliseconds");
99
+ let r = e.now ?? Date.now, a = /* @__PURE__ */ new Map(), o = /* @__PURE__ */ new Set(), s = /* @__PURE__ */ new Set(), l = !1, u, d = () => {
100
+ if (l) throw Error("Resumable stream store has been disposed");
101
+ u ??= a.entries();
102
+ let e = r() - t;
103
+ for (let t = 0; t < 16; t++) {
104
+ let t = u.next();
105
+ if (t.done) {
106
+ u = void 0;
107
+ break;
108
+ }
109
+ let [r, i] = t.value;
110
+ i.finishedAt !== void 0 && i.finishedAt <= e && !n(m, r) && a.delete(r);
111
+ }
112
+ }, f = (e) => {
113
+ let t = a.get(e);
114
+ return t === void 0 && (t = {
115
+ events: [],
116
+ ordered: !0,
117
+ finishedAt: void 0
118
+ }, a.set(e, t)), t;
119
+ }, p = (e, t) => {
120
+ let n = f(e), r = t.seq, i = n.events.at(-1);
121
+ (!Number.isFinite(r) || i !== void 0 && r < i.seq) && (n.ordered = !1), n.events.push({
122
+ seq: r,
123
+ event: t.event
124
+ });
125
+ }, m = i({
126
+ claimProducer: (e) => c.sync(() => (d(), !o.has(e) && (o.add(e), !0))),
127
+ append: (e, t) => c.sync(() => {
128
+ d(), p(e, t);
129
+ }),
130
+ appendMany: (e, t) => c.sync(() => {
131
+ d();
132
+ for (let n of t) p(e, n);
133
+ }),
134
+ read: (e, t, n) => c.sync(() => {
135
+ if (d(), n !== void 0 && (!Number.isSafeInteger(n) || n < 0)) throw RangeError("Stream read limit must be a non-negative integer");
136
+ let r = a.get(e);
137
+ if (r === void 0 || n === 0) return [];
138
+ let i;
139
+ if (!r.ordered || Number.isNaN(t)) {
140
+ let e = [];
141
+ for (let i of r.events) if (i.seq > t && e.push(i), n !== void 0 && e.length >= n) break;
142
+ i = e;
143
+ } else {
144
+ let e = 0, a = r.events.length;
145
+ for (; e < a;) {
146
+ let n = e + Math.floor((a - e) / 2);
147
+ r.events[n].seq <= t ? e = n + 1 : a = n;
148
+ }
149
+ i = r.events.slice(e, n === void 0 ? void 0 : e + n);
150
+ }
151
+ return i.map((e) => ({ ...e }));
152
+ }),
153
+ markDone: (e) => c.sync(() => {
154
+ d();
155
+ let t = f(e);
156
+ t.finishedAt = r(), s.add(e);
157
+ }),
158
+ isDone: (e) => c.sync(() => (d(), s.has(e))),
159
+ dispose: c.sync(() => {
160
+ l = !0, a.clear(), o.clear(), s.clear(), u = void 0;
161
+ })
162
+ });
163
+ return m;
164
+ }, N = "_voltro_stream_events", P = "_voltro_stream_state", F = w(N, {
165
+ id: _({ prefix: "sev" }),
166
+ streamId: T(),
167
+ seq: y(),
168
+ event: b(),
169
+ createdAt: E().default("now")
170
+ }).unique(["streamId", "seq"]).index(["streamId"]), I = w(P, {
171
+ id: _({ prefix: "sst" }),
172
+ streamId: T().unique(),
173
+ done: p().default(!1),
174
+ createdAt: E().default("now"),
175
+ updatedAt: E().default("now")
176
+ }).index(["createdAt"]), L = 168, R = () => {
177
+ let e = C(process.env.VOLTRO_STREAM_LOG_TTL_HOURS, 168);
178
+ S({
179
+ source: "framework",
180
+ table: N,
181
+ timeColumn: "createdAt",
182
+ ttlMs: e,
183
+ envVar: "VOLTRO_STREAM_LOG_TTL_HOURS",
184
+ label: "resumable stream log"
185
+ }), S({
186
+ source: "framework",
187
+ table: P,
188
+ timeColumn: "createdAt",
189
+ ttlMs: e,
190
+ envVar: "VOLTRO_STREAM_LOG_TTL_HOURS",
191
+ label: "resumable stream state"
192
+ });
193
+ }, z = (e) => e === !0 || e === 1 || e === "1" || e === "t", B = async (e, t) => (await e.query({
194
+ table: "_voltro_stream_state",
195
+ predicate: m("streamId", t),
196
+ order: [],
197
+ take: 1,
198
+ skip: void 0,
199
+ projection: void 0
200
+ }))[0]?.id ?? null, V = (e) => (R(), i({
201
+ claimProducer: (t) => c.promise(async () => {
202
+ let n = h({
203
+ kind: "typeid",
204
+ prefix: "sst"
205
+ }, P);
206
+ return (await e.insertIgnore(P, {
207
+ id: n,
208
+ streamId: t,
209
+ done: !1,
210
+ createdAt: /* @__PURE__ */ new Date(),
211
+ updatedAt: /* @__PURE__ */ new Date()
212
+ }, { conflictColumns: ["streamId"] })).id === n;
213
+ }),
214
+ append: (t, n) => c.promise(async () => {
215
+ await e.insert(N, {
216
+ streamId: t,
217
+ seq: n.seq,
218
+ event: n.event,
219
+ createdAt: /* @__PURE__ */ new Date()
220
+ });
221
+ }),
222
+ appendMany: (t, n) => c.promise(async () => {
223
+ if (n.length === 0) return;
224
+ let r = /* @__PURE__ */ new Date();
225
+ await e.insertMany(N, n.map((e) => ({
226
+ streamId: t,
227
+ seq: e.seq,
228
+ event: e.event,
229
+ createdAt: r
230
+ })));
231
+ }),
232
+ read: (t, n, r) => c.promise(async () => (await e.query({
233
+ table: N,
234
+ predicate: f(m("streamId", t), g("seq", n)),
235
+ order: [{
236
+ column: "seq",
237
+ direction: "asc"
238
+ }],
239
+ take: r,
240
+ skip: void 0,
241
+ projection: void 0
242
+ })).map((e) => ({
243
+ seq: Number(e.seq),
244
+ event: e.event
245
+ }))),
246
+ markDone: (t) => c.promise(async () => {
247
+ let n = await B(e, t);
248
+ n !== null && await e.update(P, n, {
249
+ done: !0,
250
+ updatedAt: /* @__PURE__ */ new Date()
251
+ });
252
+ }),
253
+ isDone: (t) => c.promise(async () => {
254
+ let n = (await e.query({
255
+ table: P,
256
+ predicate: m("streamId", t),
257
+ order: [],
258
+ take: 1,
259
+ skip: void 0,
260
+ projection: void 0
261
+ }))[0];
262
+ return n !== void 0 && z(n.done);
263
+ })
264
+ })), H = (e, t) => c.promise(async () => {
265
+ if (!Number.isFinite(t.olderThan.getTime())) throw RangeError("olderThan must be a valid Date");
266
+ let n = f(m("done", !0), x("createdAt", t.olderThan)), r = 0;
267
+ for (;;) {
268
+ let t = await e.query({
269
+ table: P,
270
+ predicate: n,
271
+ order: [{
272
+ column: "id",
273
+ direction: "asc"
274
+ }],
275
+ take: 200,
276
+ skip: void 0,
277
+ projection: ["id", "streamId"]
278
+ });
279
+ if (t.length === 0) return r;
280
+ await e.deleteMany(N, { where: v("streamId", t.map((e) => e.streamId)) });
281
+ let i = await e.deleteMany(P, { where: f(n, v("id", t.map((e) => e.id))) });
282
+ if (r += i, i === 0) return r;
283
+ }
284
+ }), U = (e, t = {}) => {
285
+ let n = t.keyPrefix ?? "voltro:rstream", r = t.ttlSeconds ?? 3600, a = (e) => `${n}:log:${e}`, o = (e) => `${n}:producer:${e}`, s = (e) => `${n}:done:${e}`;
286
+ return i({
287
+ claimProducer: (t) => c.promise(() => e.setNx(o(t), "1", r)),
288
+ append: (t, n) => c.promise(async () => {
289
+ await e.rpush(a(t), JSON.stringify(n)), e.expire && await e.expire(a(t), r);
290
+ }),
291
+ read: (t, n, r) => c.promise(async () => {
292
+ if (r !== void 0 && (!Number.isSafeInteger(r) || r < 0)) throw RangeError("Stream read limit must be a non-negative integer");
293
+ if (r === 0) return [];
294
+ let i = [], o = Math.max(0, n - 1), s = n > 0;
295
+ for (;;) {
296
+ let c = r === void 0 ? void 0 : r + +!!s, l = await e.lrange(a(t), o, c === void 0 ? -1 : o + c - 1);
297
+ if (s) {
298
+ s = !1;
299
+ let e = !1;
300
+ try {
301
+ e = l[0] !== void 0 && JSON.parse(l[0]).seq === n;
302
+ } catch {}
303
+ if (!e) {
304
+ o = 0;
305
+ continue;
306
+ }
307
+ }
308
+ for (let e of l) try {
309
+ let t = JSON.parse(e);
310
+ t.seq > n && i.push(t);
311
+ } catch {}
312
+ if (r === void 0 || i.length > 0 || l.length < c) return i;
313
+ o += l.length;
314
+ }
315
+ }),
316
+ markDone: (t) => c.promise(() => e.set(s(t), "1", r)),
317
+ isDone: (t) => c.promise(() => e.exists(s(t)))
318
+ });
319
+ };
320
+ //#endregion
321
+ export { L as DEFAULT_STREAM_LOG_RETENTION_HOURS, N as STREAM_EVENTS_TABLE, P as STREAM_STATE_TABLE, O as consumeResumableStream, V as dataStoreResumableStreamStore, H as gcResumableStreams, M as memoryResumableStreamStore, U as redisResumableStreamStore, A as resumableStream, j as resumableStreamText, k as startResumableProducer, F as streamEventsTable, I as streamStateTable };
@@ -0,0 +1,16 @@
1
+ import { rerank as e } from "./rerank.js";
2
+ import { Effect as t } from "effect";
3
+ //#region src/retrieveReranked.ts
4
+ var n = (n) => t.gen(function* () {
5
+ let t = n.candidates ?? 50, r = n.topN ?? 8, i = yield* n.search(t);
6
+ return i.length === 0 ? i : (yield* e({
7
+ query: n.query,
8
+ documents: i,
9
+ getText: n.getText,
10
+ topN: r,
11
+ ...n.provider === void 0 ? {} : { provider: n.provider },
12
+ ...n.model === void 0 ? {} : { model: n.model }
13
+ })).map((e) => e.document);
14
+ });
15
+ //#endregion
16
+ export { n as retrieveReranked };