@voltro/ai 0.85.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.
- package/CHANGELOG.md +666 -0
- package/THIRD-PARTY-NOTICES.md +5 -33
- package/dist/agent.js +64 -2
- package/dist/agentConstants.js +4 -0
- package/dist/agentExecutor.js +51 -0
- package/dist/api.js +199 -0
- package/dist/appTools.js +80 -0
- package/dist/budget.js +201 -0
- package/dist/callEvidence.js +51 -0
- package/dist/copilot.js +126 -0
- package/dist/cost.js +242 -0
- package/dist/embed.js +41 -0
- package/dist/embeddingProvider.js +51 -0
- package/dist/eval.js +130 -0
- package/dist/events.d.ts +4 -0
- package/dist/events.js +81 -2
- package/dist/executableModalities.js +13 -0
- package/dist/gateway.js +58 -0
- package/dist/gatewayCatalog.js +47 -0
- package/dist/gatewayMedia.js +88 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +42 -2750
- package/dist/inferenceDispatch.js +493 -0
- package/dist/inferenceQueue.js +96 -0
- package/dist/jsonOutputValidation.js +27 -0
- package/dist/mcpClient.js +332 -0
- package/dist/mcpTools.js +80 -0
- package/dist/media.js +182 -0
- package/dist/mediaBytes.js +19 -0
- package/dist/mediaCall.js +13 -0
- package/dist/mediaTaskProvider.js +16 -0
- package/dist/middleware.js +32 -0
- package/dist/observe.js +52 -0
- package/dist/prompts.js +103 -0
- package/dist/provider.js +303 -0
- package/dist/realtimeEvent.js +97 -0
- package/dist/realtimeSession.js +154 -0
- package/dist/rerank.js +61 -0
- package/dist/resumableStream.js +321 -0
- package/dist/retrieveReranked.js +16 -0
- package/dist/runAndPersist.js +148 -0
- package/dist/semanticCache.js +66 -0
- package/dist/speechProvider.js +16 -0
- package/dist/streamRegistry.js +14 -0
- package/dist/streamText.js +170 -0
- package/dist/streamTranscribe.js +74 -0
- package/dist/streamWakeups.js +44 -0
- package/dist/structuredEvidence.js +48 -0
- package/dist/test.js +1 -1
- package/dist/threads.js +92 -0
- package/dist/tools.js +68 -0
- package/dist/transcribe.js +64 -0
- package/dist/transcriptionEvent.js +46 -0
- package/dist/workflow.d.ts +2 -0
- package/dist/workflow.js +115 -110
- package/package.json +5 -5
- package/dist/agentDescriptor-DhoiXVqO.js +0 -63
- package/dist/agentEvent-Bl4egdM5.js +0 -211
- package/dist/inferenceQueue-DcEulZep.js +0 -1077
- 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 };
|