@browserlessapi/inferlo 0.6.0 → 0.8.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 (140) hide show
  1. package/README.md +9 -5
  2. package/dist/ai/ai-sdk.d.ts +48 -0
  3. package/dist/ai/ai-sdk.js +235 -0
  4. package/dist/ai/ai-sdk.js.map +1 -0
  5. package/dist/ai/index.d.ts +37 -3
  6. package/dist/ai/index.js +96 -7
  7. package/dist/ai/index.js.map +1 -1
  8. package/dist/ai/public.d.ts +5 -1
  9. package/dist/ai/public.js +2 -0
  10. package/dist/ai/public.js.map +1 -1
  11. package/dist/ai/ui.d.ts +47 -0
  12. package/dist/ai/ui.js +33 -0
  13. package/dist/ai/ui.js.map +1 -0
  14. package/dist/app.d.ts +55 -4
  15. package/dist/app.js +439 -39
  16. package/dist/app.js.map +1 -1
  17. package/dist/astro.d.ts +60 -0
  18. package/dist/astro.js +68 -0
  19. package/dist/astro.js.map +1 -0
  20. package/dist/audit.d.ts +8 -1
  21. package/dist/audit.js +9 -2
  22. package/dist/audit.js.map +1 -1
  23. package/dist/auth.d.ts +1 -0
  24. package/dist/auth.js +1 -0
  25. package/dist/auth.js.map +1 -1
  26. package/dist/authjs.d.ts +70 -0
  27. package/dist/authjs.js +94 -0
  28. package/dist/authjs.js.map +1 -0
  29. package/dist/azure.d.ts +66 -0
  30. package/dist/azure.js +119 -0
  31. package/dist/azure.js.map +1 -0
  32. package/dist/better-auth.d.ts +89 -0
  33. package/dist/better-auth.js +75 -0
  34. package/dist/better-auth.js.map +1 -0
  35. package/dist/cache.d.ts +13 -9
  36. package/dist/cache.js +11 -9
  37. package/dist/cache.js.map +1 -1
  38. package/dist/cli/main.js +5 -5
  39. package/dist/cli/main.js.map +1 -1
  40. package/dist/client-ip.d.ts +41 -1
  41. package/dist/client-ip.js +85 -1
  42. package/dist/client-ip.js.map +1 -1
  43. package/dist/cross-site.d.ts +14 -0
  44. package/dist/cross-site.js +56 -0
  45. package/dist/cross-site.js.map +1 -0
  46. package/dist/db/memory.js +2 -1
  47. package/dist/db/memory.js.map +1 -1
  48. package/dist/db/postgres.js +23 -6
  49. package/dist/db/postgres.js.map +1 -1
  50. package/dist/db/table.d.ts +37 -5
  51. package/dist/db/table.js +96 -15
  52. package/dist/db/table.js.map +1 -1
  53. package/dist/db/types.d.ts +2 -0
  54. package/dist/describe.d.ts +23 -5
  55. package/dist/describe.js +20 -2
  56. package/dist/describe.js.map +1 -1
  57. package/dist/disk-storage.d.ts +6 -0
  58. package/dist/disk-storage.js +96 -0
  59. package/dist/disk-storage.js.map +1 -0
  60. package/dist/events.d.ts +134 -0
  61. package/dist/events.js +196 -0
  62. package/dist/events.js.map +1 -0
  63. package/dist/files.d.ts +23 -0
  64. package/dist/files.js +168 -0
  65. package/dist/files.js.map +1 -0
  66. package/dist/index.d.ts +26 -8
  67. package/dist/index.js +10 -2
  68. package/dist/index.js.map +1 -1
  69. package/dist/jobs.d.ts +56 -10
  70. package/dist/jobs.js +71 -13
  71. package/dist/jobs.js.map +1 -1
  72. package/dist/jwt.d.ts +83 -0
  73. package/dist/jwt.js +312 -0
  74. package/dist/jwt.js.map +1 -0
  75. package/dist/langchain.d.ts +58 -0
  76. package/dist/langchain.js +220 -0
  77. package/dist/langchain.js.map +1 -0
  78. package/dist/model.d.ts +23 -6
  79. package/dist/model.js +41 -7
  80. package/dist/model.js.map +1 -1
  81. package/dist/oidc.d.ts +70 -0
  82. package/dist/oidc.js +379 -0
  83. package/dist/oidc.js.map +1 -0
  84. package/dist/openapi.js +17 -2
  85. package/dist/openapi.js.map +1 -1
  86. package/dist/passport.d.ts +54 -0
  87. package/dist/passport.js +68 -0
  88. package/dist/passport.js.map +1 -0
  89. package/dist/postgres-js.d.ts +39 -0
  90. package/dist/postgres-js.js +71 -0
  91. package/dist/postgres-js.js.map +1 -0
  92. package/dist/rate-limit.d.ts +5 -3
  93. package/dist/rate-limit.js +3 -3
  94. package/dist/rate-limit.js.map +1 -1
  95. package/dist/redis-events.d.ts +27 -0
  96. package/dist/redis-events.js +163 -0
  97. package/dist/redis-events.js.map +1 -0
  98. package/dist/redis-jobs.d.ts +24 -0
  99. package/dist/redis-jobs.js +203 -0
  100. package/dist/redis-jobs.js.map +1 -0
  101. package/dist/redis-sockets.d.ts +24 -0
  102. package/dist/redis-sockets.js +75 -0
  103. package/dist/redis-sockets.js.map +1 -0
  104. package/dist/redis.d.ts +30 -0
  105. package/dist/redis.js +106 -0
  106. package/dist/redis.js.map +1 -0
  107. package/dist/response-body.d.ts +6 -0
  108. package/dist/response-body.js +7 -0
  109. package/dist/response-body.js.map +1 -0
  110. package/dist/route.d.ts +117 -3
  111. package/dist/route.js +27 -0
  112. package/dist/route.js.map +1 -1
  113. package/dist/schema.d.ts +23 -3
  114. package/dist/schema.js +70 -0
  115. package/dist/schema.js.map +1 -1
  116. package/dist/serve.d.ts +24 -1
  117. package/dist/serve.js +200 -8
  118. package/dist/serve.js.map +1 -1
  119. package/dist/service-client.d.ts +91 -0
  120. package/dist/service-client.js +177 -0
  121. package/dist/service-client.js.map +1 -0
  122. package/dist/sessions.d.ts +2 -0
  123. package/dist/sessions.js +36 -4
  124. package/dist/sessions.js.map +1 -1
  125. package/dist/sockets.d.ts +58 -0
  126. package/dist/sockets.js +111 -0
  127. package/dist/sockets.js.map +1 -0
  128. package/dist/storage.d.ts +47 -0
  129. package/dist/storage.js +123 -0
  130. package/dist/storage.js.map +1 -0
  131. package/dist/tracing.d.ts +7 -3
  132. package/dist/tracing.js +8 -2
  133. package/dist/tracing.js.map +1 -1
  134. package/dist/websocket.d.ts +81 -0
  135. package/dist/websocket.js +251 -0
  136. package/dist/websocket.js.map +1 -0
  137. package/llms.txt +2 -0
  138. package/package.json +77 -5
  139. package/templates/app/AGENTS.md +9 -5
  140. package/templates/app/test/notes.test.ts +2 -0
package/dist/jwt.js ADDED
@@ -0,0 +1,312 @@
1
+ import { InferloError } from "./errors.js";
2
+ export const ASYMMETRIC = ["RS256", "RS384", "RS512", "PS256", "PS384", "PS512", "ES256", "ES384", "ES512", "EdDSA", "Ed25519"];
3
+ const HMAC = ["HS256", "HS384", "HS512"];
4
+ const OPTIONS = ["issuer", "audience", "jwksUrl", "secret", "algorithms", "user", "clockToleranceSeconds", "cacheMs", "roles", "tenant"];
5
+ const MAX_TOKEN = 16 * 1024;
6
+ const FETCH_TIMEOUT = 5000;
7
+ /** A token with an unknown key id fetches the keys again, but not more often than this. */
8
+ const REFETCH_COOLDOWN = 30_000;
9
+ const fix = 'Use jwt({ issuer: "https://login.example.com/", audience: "https://api.example.com" }), with the issuer and audience your identity provider shows for this API.';
10
+ function invalid(message, fixText = fix) {
11
+ return new InferloError("IL6042", message, { fix: fixText });
12
+ }
13
+ export function isLocal(url) {
14
+ return ["localhost", "127.0.0.1", "[::1]"].includes(url.hostname);
15
+ }
16
+ function checkUrl(value, what) {
17
+ let url;
18
+ try {
19
+ url = new URL(value);
20
+ }
21
+ catch {
22
+ throw invalid(`jwt() ${what} must be a URL, got ${JSON.stringify(value)}.`);
23
+ }
24
+ if (url.protocol !== "https:" && !(url.protocol === "http:" && isLocal(url))) {
25
+ throw invalid(`jwt() ${what} must use https (plain http only on localhost), got ${JSON.stringify(value)}.`);
26
+ }
27
+ return url;
28
+ }
29
+ function base64urlBytes(text) {
30
+ if (!/^[A-Za-z0-9_-]*$/.test(text))
31
+ throw new Error("not base64url");
32
+ const base64 = text.replace(/-/g, "+").replace(/_/g, "/") + "===".slice((text.length + 3) % 4);
33
+ return Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));
34
+ }
35
+ function decodeJson(text) {
36
+ const value = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(base64urlBytes(text)));
37
+ if (!value || typeof value !== "object" || Array.isArray(value))
38
+ throw new Error("not an object");
39
+ return value;
40
+ }
41
+ const HASH = { "256": "SHA-256", "384": "SHA-384", "512": "SHA-512" };
42
+ /** Web Crypto import and verify parameters for an algorithm, or null when the key does not fit it. */
43
+ function cryptoParams(alg, jwk) {
44
+ const bits = alg.slice(2);
45
+ if (alg.startsWith("RS")) {
46
+ if (jwk && jwk.kty !== "RSA")
47
+ return null;
48
+ return { importAlg: { name: "RSASSA-PKCS1-v1_5", hash: HASH[bits] }, verifyAlg: { name: "RSASSA-PKCS1-v1_5" } };
49
+ }
50
+ if (alg.startsWith("PS")) {
51
+ if (jwk && jwk.kty !== "RSA")
52
+ return null;
53
+ return { importAlg: { name: "RSA-PSS", hash: HASH[bits] }, verifyAlg: { name: "RSA-PSS", saltLength: Number(bits) / 8 } };
54
+ }
55
+ if (alg.startsWith("ES")) {
56
+ const curve = { ES256: "P-256", ES384: "P-384", ES512: "P-521" }[alg];
57
+ if (jwk && (jwk.kty !== "EC" || jwk.crv !== curve))
58
+ return null;
59
+ return { importAlg: { name: "ECDSA", namedCurve: curve }, verifyAlg: { name: "ECDSA", hash: HASH[bits] } };
60
+ }
61
+ if (alg === "EdDSA" || alg === "Ed25519") {
62
+ if (jwk && (jwk.kty !== "OKP" || jwk.crv !== "Ed25519"))
63
+ return null;
64
+ return { importAlg: { name: "Ed25519" }, verifyAlg: { name: "Ed25519" } };
65
+ }
66
+ return null;
67
+ }
68
+ /** Only the public parts of a key, so Web Crypto does not reject it over use, key_ops or alg fields. */
69
+ function publicJwk(jwk) {
70
+ if (jwk.kty === "RSA")
71
+ return { kty: "RSA", n: jwk.n, e: jwk.e, ext: true };
72
+ if (jwk.kty === "EC")
73
+ return { kty: "EC", crv: jwk.crv, x: jwk.x, y: jwk.y, ext: true };
74
+ return { kty: "OKP", crv: jwk.crv, x: jwk.x, ext: true };
75
+ }
76
+ function defaultUser(claims) {
77
+ const roles = Array.isArray(claims.roles) ? claims.roles.filter((r) => typeof r === "string") : [];
78
+ const user = { id: claims.sub, roles };
79
+ if (typeof claims.email === "string")
80
+ user.email = claims.email;
81
+ if (typeof claims.name === "string")
82
+ user.name = claims.name;
83
+ // Apps that register their own user type (Register) map the claims with options.user.
84
+ return user;
85
+ }
86
+ /**
87
+ * The app's auth from access tokens (JWTs) of an OpenID Connect provider: createApp({ auth: jwt({ issuer,
88
+ * audience }) }). Requests send Authorization: Bearer <token>.
89
+ */
90
+ export function jwt(options) {
91
+ if (!options || typeof options !== "object" || Array.isArray(options))
92
+ throw invalid("jwt() needs { issuer, audience }.");
93
+ for (const key of Object.keys(options))
94
+ if (!OPTIONS.includes(key))
95
+ throw invalid(`jwt() has no option "${key}".`, `Use ${OPTIONS.join(", ")}.`);
96
+ if (typeof options.issuer !== "string" || !options.issuer)
97
+ throw invalid("jwt() needs the issuer: the iss claim of the provider's tokens.");
98
+ const audiences = typeof options.audience === "string" ? [options.audience] : Array.isArray(options.audience) ? options.audience : [];
99
+ if (!audiences.length || audiences.some((a) => typeof a !== "string" || !a)) {
100
+ throw invalid("jwt() needs the audience: this API's identifier at the provider (the aud claim of its tokens), so tokens issued for other apps are refused.");
101
+ }
102
+ for (const key of ["user", "roles", "tenant"]) {
103
+ if (options[key] !== undefined && typeof options[key] !== "function")
104
+ throw invalid(`jwt() ${key} must be a function.`);
105
+ }
106
+ const secret = options.secret;
107
+ if (secret !== undefined) {
108
+ if (typeof secret !== "string" || secret.length < 32)
109
+ throw invalid("jwt() secret must be a string of at least 32 characters.", "Keep the provider's signing secret in config({ secrets }) and pass it as secret.");
110
+ if (options.jwksUrl !== undefined)
111
+ throw invalid("jwt() takes a secret or a jwksUrl, not both.");
112
+ }
113
+ const allowed = options.algorithms ?? (secret === undefined ? ASYMMETRIC : ["HS256"]);
114
+ if (!Array.isArray(allowed) || !allowed.length || allowed.some((a) => ![...ASYMMETRIC, ...HMAC].includes(a))) {
115
+ throw invalid(`jwt() algorithms must be a list of ${[...ASYMMETRIC, ...HMAC].join(", ")}.`);
116
+ }
117
+ if (secret === undefined && allowed.some((a) => HMAC.includes(a)))
118
+ throw invalid("jwt() algorithms HS256, HS384 and HS512 need a secret.");
119
+ if (secret !== undefined && allowed.some((a) => !HMAC.includes(a)))
120
+ throw invalid("jwt() with a secret accepts only HS256, HS384 or HS512.");
121
+ const tolerance = options.clockToleranceSeconds ?? 60;
122
+ if (!Number.isInteger(tolerance) || tolerance < 0 || tolerance > 300)
123
+ throw invalid("jwt() clockToleranceSeconds must be a whole number from 0 to 300.");
124
+ const cacheMs = options.cacheMs ?? 600_000;
125
+ if (!Number.isInteger(cacheMs) || cacheMs < 60_000 || cacheMs > 86_400_000)
126
+ throw invalid("jwt() cacheMs must be a whole number of milliseconds from 60000 (1 minute) to 86400000 (1 day).");
127
+ const issuer = options.issuer;
128
+ const jwksUrl = options.jwksUrl === undefined ? undefined : checkUrl(options.jwksUrl, "jwksUrl").href;
129
+ if (secret === undefined && jwksUrl === undefined)
130
+ checkUrl(issuer, "issuer");
131
+ const toUser = options.user ?? defaultUser;
132
+ const verify = createJwtVerifier({ issuer, audiences, secret, allowed, tolerance, cacheMs, jwksUrl });
133
+ return {
134
+ async resolve(req, { db }) {
135
+ const authorization = req.headers.get("authorization");
136
+ if (!authorization || !/^bearer\s+/i.test(authorization))
137
+ return null;
138
+ const claims = await verify(authorization.replace(/^bearer\s+/i, "").trim());
139
+ if (!claims)
140
+ return null;
141
+ return (await toUser(claims, { db, req })) ?? null;
142
+ },
143
+ ...(options.roles ? { roles: options.roles } : {}),
144
+ ...(options.tenant ? { tenant: options.tenant } : {}),
145
+ };
146
+ }
147
+ /**
148
+ * Verifies JWTs for an issuer and audience: the signature against the issuer's keys (cached, fetched again for a
149
+ * rotated key) or a shared secret, then iss, aud, exp, nbf, iat and sub. Resolves to the claims, or null for any
150
+ * token that is not valid. Throws 503 IL3008 when no keys could ever be loaded. Internal: used by jwt() and oidc().
151
+ */
152
+ export function createJwtVerifier(config) {
153
+ const { issuer, audiences, secret, allowed, tolerance, cacheMs, jwksUrl } = config;
154
+ // Signing keys: fetched on first use, kept for cacheMs, and fetched again (at most every 30 s) for an unknown key id.
155
+ let keys;
156
+ let fetchedAt = 0;
157
+ let loading;
158
+ const imported = new Map();
159
+ const hmacKeys = new Map();
160
+ const getJson = async (url) => {
161
+ const response = await fetch(url, { headers: { accept: "application/json" }, redirect: "error", signal: AbortSignal.timeout(FETCH_TIMEOUT) });
162
+ if (!response.ok)
163
+ throw new Error(`${url} answered ${response.status}`);
164
+ const body = (await response.json());
165
+ if (!body || typeof body !== "object" || Array.isArray(body))
166
+ throw new Error(`${url} did not answer a JSON object`);
167
+ return body;
168
+ };
169
+ const load = async () => {
170
+ let url = jwksUrl;
171
+ if (!url && config.discoverJwksUrl)
172
+ url = await config.discoverJwksUrl();
173
+ if (!url) {
174
+ const discovery = await getJson(`${issuer.replace(/\/+$/, "")}/.well-known/openid-configuration`);
175
+ if (discovery.issuer !== issuer)
176
+ throw new Error(`the OpenID configuration names the issuer ${JSON.stringify(discovery.issuer)}, not ${JSON.stringify(issuer)}`);
177
+ if (typeof discovery.jwks_uri !== "string")
178
+ throw new Error("the OpenID configuration has no jwks_uri");
179
+ url = checkUrl(discovery.jwks_uri, "jwks_uri").href;
180
+ }
181
+ const set = await getJson(url);
182
+ if (!Array.isArray(set.keys))
183
+ throw new Error(`${url} is not a JSON Web Key Set`);
184
+ return set.keys.filter((k) => Boolean(k) && typeof k === "object" && k.use !== "enc");
185
+ };
186
+ const refresh = () => {
187
+ loading ??= load()
188
+ .then((found) => {
189
+ keys = found;
190
+ fetchedAt = Date.now();
191
+ imported.clear();
192
+ return found;
193
+ })
194
+ .finally(() => {
195
+ loading = undefined;
196
+ });
197
+ return loading;
198
+ };
199
+ const unavailable = (cause) => new InferloError("IL3008", "The identity provider's signing keys could not be loaded, so the token cannot be checked.", {
200
+ status: 503,
201
+ fix: `Check that ${jwksUrl ?? `${issuer.replace(/\/+$/, "")}/.well-known/openid-configuration`} is reachable from the server and answers the provider's keys (${cause instanceof Error ? cause.message : String(cause)}).`,
202
+ });
203
+ const candidates = async (kid, alg) => {
204
+ const match = (list) => list.filter((k) => (kid === undefined || k.kid === kid) && (k.alg === undefined || k.alg === alg) && cryptoParams(alg, k) !== null);
205
+ const stale = !keys || Date.now() - fetchedAt > cacheMs;
206
+ if (stale) {
207
+ try {
208
+ await refresh();
209
+ }
210
+ catch (error) {
211
+ // Keep using the keys we have while the provider cannot be reached; without any, nothing can be checked.
212
+ if (!keys)
213
+ throw unavailable(error);
214
+ fetchedAt = Date.now() - cacheMs + REFETCH_COOLDOWN;
215
+ }
216
+ }
217
+ let found = match(keys);
218
+ if (!found.length && kid !== undefined && Date.now() - fetchedAt > REFETCH_COOLDOWN) {
219
+ // A key the provider started using since the last fetch (key rotation).
220
+ try {
221
+ found = match(await refresh());
222
+ }
223
+ catch {
224
+ found = [];
225
+ }
226
+ }
227
+ return found.slice(0, 10);
228
+ };
229
+ const keyFor = (jwk, alg) => {
230
+ const id = `${alg}\u0000${jwk.kid ?? ""}\u0000${jwk.n ?? ""}${jwk.x ?? ""}${jwk.y ?? ""}`;
231
+ let key = imported.get(id);
232
+ if (!key) {
233
+ key = crypto.subtle.importKey("jwk", publicJwk(jwk), cryptoParams(alg).importAlg, false, ["verify"]);
234
+ key.catch(() => imported.delete(id));
235
+ imported.set(id, key);
236
+ }
237
+ return key;
238
+ };
239
+ const hmacKey = (alg) => {
240
+ let key = hmacKeys.get(alg);
241
+ if (!key) {
242
+ key = crypto.subtle.importKey("raw", new TextEncoder().encode(secret), { name: "HMAC", hash: HASH[alg.slice(2)] }, false, ["verify"]);
243
+ hmacKeys.set(alg, key);
244
+ }
245
+ return key;
246
+ };
247
+ /** The verified claims of a token, or null for any token that is not valid for this API. */
248
+ const verify = async (token) => {
249
+ if (token.length > MAX_TOKEN)
250
+ return null;
251
+ const parts = token.split(".");
252
+ if (parts.length !== 3)
253
+ return null;
254
+ const [headerPart, payloadPart, signaturePart] = parts;
255
+ let header;
256
+ let claims;
257
+ let signature;
258
+ try {
259
+ header = decodeJson(headerPart);
260
+ claims = decodeJson(payloadPart);
261
+ signature = base64urlBytes(signaturePart);
262
+ }
263
+ catch {
264
+ return null;
265
+ }
266
+ const alg = header.alg;
267
+ if (typeof alg !== "string" || !allowed.includes(alg))
268
+ return null;
269
+ // Extensions this verifier does not understand must not be ignored (RFC 7515, section 4.1.11).
270
+ if (header.crit !== undefined)
271
+ return null;
272
+ if (header.kid !== undefined && typeof header.kid !== "string")
273
+ return null;
274
+ const data = new TextEncoder().encode(`${headerPart}.${payloadPart}`);
275
+ let valid = false;
276
+ if (secret !== undefined) {
277
+ valid = await crypto.subtle.verify("HMAC", await hmacKey(alg), signature, data);
278
+ }
279
+ else {
280
+ for (const jwk of await candidates(header.kid, alg)) {
281
+ try {
282
+ if (await crypto.subtle.verify(cryptoParams(alg).verifyAlg, await keyFor(jwk, alg), signature, data)) {
283
+ valid = true;
284
+ break;
285
+ }
286
+ }
287
+ catch {
288
+ // A key Web Crypto cannot use (a malformed key in the set) does not verify anything.
289
+ }
290
+ }
291
+ }
292
+ if (!valid)
293
+ return null;
294
+ const now = Date.now() / 1000;
295
+ if (claims.iss !== issuer)
296
+ return null;
297
+ const aud = typeof claims.aud === "string" ? [claims.aud] : Array.isArray(claims.aud) ? claims.aud : [];
298
+ if (!aud.some((a) => audiences.includes(a)))
299
+ return null;
300
+ if (typeof claims.exp !== "number" || claims.exp + tolerance <= now)
301
+ return null;
302
+ if (claims.nbf !== undefined && (typeof claims.nbf !== "number" || claims.nbf - tolerance > now))
303
+ return null;
304
+ if (claims.iat !== undefined && (typeof claims.iat !== "number" || claims.iat - tolerance > now))
305
+ return null;
306
+ if (typeof claims.sub !== "string" || !claims.sub)
307
+ return null;
308
+ return claims;
309
+ };
310
+ return verify;
311
+ }
312
+ //# sourceMappingURL=jwt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt.js","sourceRoot":"","sources":["../src/jwt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * LangChain.js: Inferlo's AI aliases as a LangChain chat model, and Inferlo tools (function tools and routes)
3
+ * as LangChain tools.
4
+ *
5
+ * import { toLangChainModel, toLangChainTools } from "@browserlessapi/inferlo/langchain";
6
+ *
7
+ * const model = toLangChainModel(ctx.ai, { model: "fast", for: user.id });
8
+ * const agent = createAgent({ model, tools: toLangChainTools([getWeather, createTicket], { ai: ctx.ai }) });
9
+ *
10
+ * The model keeps Inferlo's aliases, fallback, budgets, usage tracking and tracing; LangChain runs the agent
11
+ * loop and the tools. Needs @langchain/core 0.3 or later (an optional peer dependency).
12
+ */
13
+ import { BaseChatModel, type BaseChatModelCallOptions, type BindToolsInput } from "@langchain/core/language_models/chat_models";
14
+ import { AIMessageChunk, type BaseMessage } from "@langchain/core/messages";
15
+ import { ChatGenerationChunk, type ChatResult } from "@langchain/core/outputs";
16
+ import { DynamicStructuredTool } from "@langchain/core/tools";
17
+ import { type AI } from "./ai/index.ts";
18
+ import { type ToolDef } from "./ai/tool.ts";
19
+ import type { RouteDef } from "./route.ts";
20
+ export interface LangChainModelOptions {
21
+ /** Alias ("fast") or "provider:model". Default: the AI's default model. */
22
+ model?: string;
23
+ /** Who the calls are for (user or tenant id), for usage tracking and budgets. */
24
+ for?: string;
25
+ temperature?: number;
26
+ maxTokens?: number;
27
+ }
28
+ /** Call options of the chat model: LangChain's, plus the tools bindTools() adds. */
29
+ export interface InferloChatModelCallOptions extends BaseChatModelCallOptions {
30
+ tools?: BindToolsInput[];
31
+ }
32
+ /** Inferlo's AI client as a LangChain chat model. Make one with toLangChainModel(ai, { model }). */
33
+ export declare class InferloChatModel extends BaseChatModel<InferloChatModelCallOptions, AIMessageChunk> {
34
+ readonly ai: AI;
35
+ readonly options: LangChainModelOptions;
36
+ constructor(ai: AI, options?: LangChainModelOptions);
37
+ static lc_name(): string;
38
+ _llmType(): string;
39
+ /** Offer tools to the model: LangChain tools, OpenAI-style tool definitions, or Inferlo function tools. */
40
+ bindTools(tools: (BindToolsInput | ToolDef)[], kwargs?: Partial<InferloChatModelCallOptions>): any;
41
+ _generate(messages: BaseMessage[], options: this["ParsedCallOptions"]): Promise<ChatResult>;
42
+ /** Streams text with ai.stream(). With tools bound, the answer (and its tool calls) comes as one chunk. */
43
+ _streamResponseChunks(messages: BaseMessage[], options: this["ParsedCallOptions"], runManager?: {
44
+ handleLLMNewToken(token: string): Promise<unknown>;
45
+ }): AsyncGenerator<ChatGenerationChunk>;
46
+ }
47
+ /**
48
+ * A LangChain chat model that calls Inferlo's AI: toLangChainModel(ctx.ai, { model: "fast", for: user.id }).
49
+ * Use it anywhere LangChain takes a chat model (createAgent, chains, LangGraph).
50
+ */
51
+ export declare function toLangChainModel(ai: AI, options?: LangChainModelOptions): InferloChatModel;
52
+ /**
53
+ * Inferlo tools as LangChain tools. Function tools (tool(name, ...).handle(fn)) work anywhere; routes work with a
54
+ * request's AI client ({ ai: ctx.ai }) and run as the signed-in user, with the route's auth and validation.
55
+ */
56
+ export declare function toLangChainTools(tools: readonly (ToolDef | RouteDef)[], options?: {
57
+ ai?: AI;
58
+ }): DynamicStructuredTool[];
@@ -0,0 +1,220 @@
1
+ /**
2
+ * LangChain.js: Inferlo's AI aliases as a LangChain chat model, and Inferlo tools (function tools and routes)
3
+ * as LangChain tools.
4
+ *
5
+ * import { toLangChainModel, toLangChainTools } from "@browserlessapi/inferlo/langchain";
6
+ *
7
+ * const model = toLangChainModel(ctx.ai, { model: "fast", for: user.id });
8
+ * const agent = createAgent({ model, tools: toLangChainTools([getWeather, createTicket], { ai: ctx.ai }) });
9
+ *
10
+ * The model keeps Inferlo's aliases, fallback, budgets, usage tracking and tracing; LangChain runs the agent
11
+ * loop and the tools. Needs @langchain/core 0.3 or later (an optional peer dependency).
12
+ */
13
+ import { BaseChatModel } from "@langchain/core/language_models/chat_models";
14
+ import { AIMessage, AIMessageChunk } from "@langchain/core/messages";
15
+ import { ChatGenerationChunk } from "@langchain/core/outputs";
16
+ import { DynamicStructuredTool } from "@langchain/core/tools";
17
+ import { convertToOpenAITool } from "@langchain/core/utils/function_calling";
18
+ import { callModel, routeToolsOf } from "./ai/index.js";
19
+ import { functionToolSpec, isTool, runFunctionTool } from "./ai/tool.js";
20
+ import { InferloError } from "./errors.js";
21
+ const invalid = (message, fix) => new InferloError("IL5030", message, { fix });
22
+ /** Inferlo's AI client as a LangChain chat model. Make one with toLangChainModel(ai, { model }). */
23
+ export class InferloChatModel extends BaseChatModel {
24
+ ai;
25
+ options;
26
+ constructor(ai, options = {}) {
27
+ super({});
28
+ this.ai = ai;
29
+ this.options = options;
30
+ }
31
+ static lc_name() {
32
+ return "InferloChatModel";
33
+ }
34
+ _llmType() {
35
+ return "inferlo";
36
+ }
37
+ /** Offer tools to the model: LangChain tools, OpenAI-style tool definitions, or Inferlo function tools. */
38
+ bindTools(tools, kwargs) {
39
+ return this.withConfig({ ...kwargs, tools: tools });
40
+ }
41
+ async _generate(messages, options) {
42
+ const result = await callModel(this.ai, {
43
+ model: this.options.model,
44
+ messages: toMessages(messages),
45
+ tools: toolSpecs(options.tools),
46
+ temperature: this.options.temperature,
47
+ maxTokens: this.options.maxTokens,
48
+ for: this.options.for,
49
+ signal: options.signal,
50
+ });
51
+ const usage = { input_tokens: result.usage.inputTokens, output_tokens: result.usage.outputTokens, total_tokens: result.usage.inputTokens + result.usage.outputTokens };
52
+ const message = new AIMessage({
53
+ content: result.text,
54
+ tool_calls: result.toolCalls.map((call) => ({ id: call.id, name: call.name, args: toolArgs(call.input), type: "tool_call" })),
55
+ usage_metadata: usage,
56
+ response_metadata: { model: result.usage.model, requested: result.usage.requested, cost: result.usage.cost },
57
+ });
58
+ return { generations: [{ text: result.text, message }], llmOutput: { tokenUsage: { promptTokens: usage.input_tokens, completionTokens: usage.output_tokens, totalTokens: usage.total_tokens } } };
59
+ }
60
+ /** Streams text with ai.stream(). With tools bound, the answer (and its tool calls) comes as one chunk. */
61
+ async *_streamResponseChunks(messages, options, runManager) {
62
+ if (toolSpecs(options.tools)?.length) {
63
+ const { generations } = await this._generate(messages, options);
64
+ const message = generations[0].message;
65
+ yield new ChatGenerationChunk({
66
+ text: generations[0].text,
67
+ message: new AIMessageChunk({
68
+ content: message.content,
69
+ tool_call_chunks: (message.tool_calls ?? []).map((call, index) => ({ id: call.id, name: call.name, args: JSON.stringify(call.args), index, type: "tool_call_chunk" })),
70
+ usage_metadata: message.usage_metadata,
71
+ response_metadata: message.response_metadata,
72
+ }),
73
+ });
74
+ return;
75
+ }
76
+ const all = toMessages(messages);
77
+ const system = all.filter((m) => m.role === "system").map((m) => m.content).join("\n\n");
78
+ const stream = this.ai.stream({
79
+ model: this.options.model,
80
+ ...(system ? { system } : {}),
81
+ messages: all.filter((m) => m.role !== "system"),
82
+ temperature: this.options.temperature,
83
+ maxTokens: this.options.maxTokens,
84
+ for: this.options.for,
85
+ signal: options.signal,
86
+ });
87
+ for await (const text of stream) {
88
+ yield new ChatGenerationChunk({ text, message: new AIMessageChunk({ content: text }) });
89
+ await runManager?.handleLLMNewToken(text);
90
+ }
91
+ const usage = await stream.usage();
92
+ yield new ChatGenerationChunk({
93
+ text: "",
94
+ message: new AIMessageChunk({
95
+ content: "",
96
+ usage_metadata: { input_tokens: usage.inputTokens, output_tokens: usage.outputTokens, total_tokens: usage.inputTokens + usage.outputTokens },
97
+ response_metadata: { model: usage.model, requested: usage.requested, cost: usage.cost },
98
+ }),
99
+ });
100
+ }
101
+ }
102
+ /**
103
+ * A LangChain chat model that calls Inferlo's AI: toLangChainModel(ctx.ai, { model: "fast", for: user.id }).
104
+ * Use it anywhere LangChain takes a chat model (createAgent, chains, LangGraph).
105
+ */
106
+ export function toLangChainModel(ai, options = {}) {
107
+ if (!ai || typeof ai !== "object" || typeof ai.generate !== "function") {
108
+ throw invalid("toLangChainModel(ai) needs Inferlo's AI client.", 'Pass ctx.ai in a route handler or job, app.ai, or the client createAI() returns: toLangChainModel(ctx.ai, { model: "fast" }).');
109
+ }
110
+ if (options === null || typeof options !== "object")
111
+ throw invalid("toLangChainModel() options must be an object.", 'Use toLangChainModel(ai, { model: "fast" }).');
112
+ for (const key of Object.keys(options)) {
113
+ if (!["model", "for", "temperature", "maxTokens"].includes(key))
114
+ throw invalid(`Unknown toLangChainModel() option "${key}".`, "Options: model, for, temperature, maxTokens.");
115
+ }
116
+ return new InferloChatModel(ai, { ...options });
117
+ }
118
+ /**
119
+ * Inferlo tools as LangChain tools. Function tools (tool(name, ...).handle(fn)) work anywhere; routes work with a
120
+ * request's AI client ({ ai: ctx.ai }) and run as the signed-in user, with the route's auth and validation.
121
+ */
122
+ export function toLangChainTools(tools, options = {}) {
123
+ if (!Array.isArray(tools))
124
+ throw invalid("toLangChainTools() needs an array of tools.", "Pass [getWeather, createTicket]: function tools and routes.");
125
+ const routeTools = options.ai ? routeToolsOf(options.ai) : undefined;
126
+ const names = new Set();
127
+ return tools.map((entry) => {
128
+ let spec;
129
+ let run;
130
+ if (isTool(entry)) {
131
+ spec = functionToolSpec(entry);
132
+ run = async (input) => (await runFunctionTool(entry, input, undefined)).text;
133
+ }
134
+ else if (entry && typeof entry === "object" && "path" in entry && "method" in entry) {
135
+ if (!routeTools) {
136
+ throw new InferloError("IL5009", "Routes as LangChain tools need the AI client of a request.", {
137
+ fix: "Call toLangChainTools([createTicket], { ai: ctx.ai }) in a route handler, so each route runs as the signed-in user with its auth and validation, or make a function tool with tool(name, { description, input }).handle(fn).",
138
+ });
139
+ }
140
+ const route = entry;
141
+ spec = routeTools.describe(route);
142
+ run = async (input) => (await routeTools.runner(route, input)).text;
143
+ }
144
+ else {
145
+ throw invalid("toLangChainTools() takes function tools made with tool(...).handle(fn) and routes.", "Pass [getWeather, createTicket].");
146
+ }
147
+ if (names.has(spec.name))
148
+ throw new InferloError("IL5013", `Two tools are named "${spec.name}".`, { fix: "Give each tool a unique name (a route's tool name is its export name, or tool: { name })." });
149
+ names.add(spec.name);
150
+ return new DynamicStructuredTool({ name: spec.name, description: spec.description, schema: spec.inputSchema, func: async (input) => run(input) });
151
+ });
152
+ }
153
+ /** Bound tools as Inferlo tool specs. */
154
+ function toolSpecs(tools) {
155
+ if (!tools?.length)
156
+ return undefined;
157
+ return tools.map((tool) => {
158
+ if (isTool(tool))
159
+ return functionToolSpec(tool);
160
+ const converted = convertToOpenAITool(tool);
161
+ const fn = converted.function;
162
+ if (!fn?.name)
163
+ throw invalid("A tool bound to the Inferlo chat model has no name.", "Bind LangChain tools, { type: \"function\", function: { name, description, parameters } } objects, or Inferlo function tools.");
164
+ return { name: fn.name, description: fn.description ?? "", inputSchema: fn.parameters ?? { type: "object", properties: {} } };
165
+ });
166
+ }
167
+ function toolArgs(input) {
168
+ return input && typeof input === "object" && !Array.isArray(input) ? input : { input };
169
+ }
170
+ function typeOf(message) {
171
+ const m = message;
172
+ return typeof m.getType === "function" ? m.getType() : typeof m._getType === "function" ? m._getType() : String(m.type);
173
+ }
174
+ /** LangChain messages as Inferlo messages. */
175
+ function toMessages(messages) {
176
+ return messages.map((message) => {
177
+ const type = typeOf(message);
178
+ const { text, images } = contentOf(message.content);
179
+ if (type === "system")
180
+ return { role: "system", content: text };
181
+ if (type === "human" || type === "generic")
182
+ return { role: "user", content: text, ...(images.length ? { images } : {}) };
183
+ if (type === "ai") {
184
+ const calls = message.tool_calls ?? [];
185
+ return { role: "assistant", content: text, ...(calls.length ? { toolCalls: calls.map((c) => ({ id: c.id ?? "", name: c.name, input: c.args })) } : {}) };
186
+ }
187
+ if (type === "tool") {
188
+ const tool = message;
189
+ return { role: "tool", content: text, toolCallId: tool.tool_call_id, ...(tool.status === "error" ? { isError: true } : {}) };
190
+ }
191
+ throw invalid(`The Inferlo chat model does not take "${type}" messages.`, "Use system, human, AI and tool messages.");
192
+ });
193
+ }
194
+ function contentOf(content) {
195
+ if (typeof content === "string")
196
+ return { text: content, images: [] };
197
+ const images = [];
198
+ let text = "";
199
+ for (const part of Array.isArray(content) ? content : []) {
200
+ if (!part || typeof part !== "object")
201
+ continue;
202
+ const p = part;
203
+ if (p.type === "text" && typeof p.text === "string")
204
+ text += p.text;
205
+ else if (p.type === "image_url") {
206
+ const url = typeof p.image_url === "string" ? p.image_url : p.image_url?.url;
207
+ if (url)
208
+ images.push({ url });
209
+ }
210
+ else if (p.type === "image") {
211
+ const mediaType = p.mimeType ?? p.mime_type;
212
+ if (typeof p.url === "string")
213
+ images.push({ url: p.url });
214
+ else if (typeof p.data === "string" && mediaType)
215
+ images.push({ base64: p.data, mediaType: mediaType });
216
+ }
217
+ }
218
+ return { text, images };
219
+ }
220
+ //# sourceMappingURL=langchain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"langchain.js","sourceRoot":"","sources":["../src/langchain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,aAAa,EAAsD,MAAM,6CAA6C,CAAC;AAChI,OAAO,EAAE,SAAS,EAAE,cAAc,EAAoB,MAAM,0BAA0B,CAAC;AACvF,OAAO,EAAE,mBAAmB,EAAmB,MAAM,yBAAyB,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAC7E,OAAO,EAAE,SAAS,EAAE,YAAY,EAAW,MAAM,eAAe,CAAC;AAEjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,eAAe,EAAgB,MAAM,cAAc,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAiB3C,MAAM,OAAO,GAAG,CAAC,OAAe,EAAE,GAAW,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;AAE/F,oGAAoG;AACpG,MAAM,OAAO,gBAAiB,SAAQ,aAA0D;IACrF,EAAE,CAAK;IACP,OAAO,CAAwB;IAExC,YAAY,EAAM,EAAE,UAAiC,EAAE;QACrD,KAAK,CAAC,EAAE,CAAC,CAAC;QACV,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,OAAO;QACZ,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,QAAQ;QACN,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,2GAA2G;IAClG,SAAS,CAAC,KAAmC,EAAE,MAA6C;QACnG,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,KAAyB,EAA0C,CAAC,CAAC;IAClH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAuB,EAAE,OAAkC;QACzE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE;YACtC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;YACzB,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC;YAC9B,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC;YAC/B,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW;YACrC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;YACjC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;YACrB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QACvK,MAAM,OAAO,GAAG,IAAI,SAAS,CAAC;YAC5B,OAAO,EAAE,MAAM,CAAC,IAAI;YACpB,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,WAAoB,EAAE,CAAC,CAAC;YACtI,cAAc,EAAE,KAAK;YACrB,iBAAiB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE;SAC7G,CAAC,CAAC;QACH,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,gBAAgB,EAAE,KAAK,CAAC,aAAa,EAAE,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,EAAE,EAAE,CAAC;IACpM,CAAC;IAED,2GAA2G;IAClG,KAAK,CAAC,CAAC,qBAAqB,CAAC,QAAuB,EAAE,OAAkC,EAAE,UAAmE;QACpK,IAAI,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;YACrC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAChE,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAE,CAAC,OAAoB,CAAC;YACrD,MAAM,IAAI,mBAAmB,CAAC;gBAC5B,IAAI,EAAE,WAAW,CAAC,CAAC,CAAE,CAAC,IAAI;gBAC1B,OAAO,EAAE,IAAI,cAAc,CAAC;oBAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,gBAAgB,EAAE,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,iBAA0B,EAAE,CAAC,CAAC;oBAC/K,cAAc,EAAE,OAAO,CAAC,cAAc;oBACtC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;iBAC7C,CAAC;aACH,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzF,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC;YAC5B,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;YACzB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7B,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;YAChD,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW;YACrC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;YACjC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;YACrB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAChC,MAAM,IAAI,mBAAmB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YACxF,MAAM,UAAU,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACnC,MAAM,IAAI,mBAAmB,CAAC;YAC5B,IAAI,EAAE,EAAE;YACR,OAAO,EAAE,IAAI,cAAc,CAAC;gBAC1B,OAAO,EAAE,EAAE;gBACX,cAAc,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,WAAW,EAAE,aAAa,EAAE,KAAK,CAAC,YAAY,EAAE,YAAY,EAAE,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,YAAY,EAAE;gBAC5I,iBAAiB,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE;aACxF,CAAC;SACH,CAAC,CAAC;IACL,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAM,EAAE,UAAiC,EAAE;IAC1E,IAAI,CAAC,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,OAAQ,EAAS,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QAC/E,MAAM,OAAO,CAAC,iDAAiD,EAAE,+HAA+H,CAAC,CAAC;IACpM,CAAC;IACD,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,MAAM,OAAO,CAAC,+CAA+C,EAAE,8CAA8C,CAAC,CAAC;IACpK,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,MAAM,OAAO,CAAC,sCAAsC,GAAG,IAAI,EAAE,8CAA8C,CAAC,CAAC;IAChL,CAAC;IACD,OAAO,IAAI,gBAAgB,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAsC,EAAE,UAAuB,EAAE;IAChG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,OAAO,CAAC,6CAA6C,EAAE,6DAA6D,CAAC,CAAC;IACvJ,MAAM,UAAU,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACzB,IAAI,IAAc,CAAC;QACnB,IAAI,GAAwC,CAAC;QAC7C,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAClB,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAC/B,GAAG,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/E,CAAC;aAAM,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;YACtF,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,IAAI,YAAY,CAAC,QAAQ,EAAE,4DAA4D,EAAE;oBAC7F,GAAG,EAAE,8NAA8N;iBACpO,CAAC,CAAC;YACL,CAAC;YACD,MAAM,KAAK,GAAG,KAAiB,CAAC;YAChC,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClC,GAAG,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,CAAC,oFAAoF,EAAE,kCAAkC,CAAC,CAAC;QAC1I,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,YAAY,CAAC,QAAQ,EAAE,wBAAwB,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,GAAG,EAAE,2FAA2F,EAAE,CAAC,CAAC;QACxM,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,OAAO,IAAI,qBAAqB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,WAAoB,EAAE,IAAI,EAAE,KAAK,EAAE,KAAc,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACtK,CAAC,CAAC,CAAC;AACL,CAAC;AAED,yCAAyC;AACzC,SAAS,SAAS,CAAC,KAAqC;IACtD,IAAI,CAAC,KAAK,EAAE,MAAM;QAAE,OAAO,SAAS,CAAC;IACrC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACxB,IAAI,MAAM,CAAC,IAAI,CAAC;YAAE,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,mBAAmB,CAAC,IAAa,CAAiG,CAAC;QACrJ,MAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,EAAE,EAAE,IAAI;YAAE,MAAM,OAAO,CAAC,qDAAqD,EAAE,+HAA+H,CAAC,CAAC;QACrN,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,WAAW,IAAI,EAAE,EAAE,WAAW,EAAE,EAAE,CAAC,UAAU,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC;IAChI,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,KAA6B,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAClH,CAAC;AAED,SAAS,MAAM,CAAC,OAAoB;IAClC,MAAM,CAAC,GAAG,OAAwF,CAAC;IACnG,OAAO,OAAO,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC1H,CAAC;AAED,8CAA8C;AAC9C,SAAS,UAAU,CAAC,QAAuB;IACzC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7B,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAChE,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QACzH,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,MAAM,KAAK,GAAI,OAAqB,CAAC,UAAU,IAAI,EAAE,CAAC;YACtD,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3J,CAAC;QACD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,OAA+D,CAAC;YAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC/H,CAAC;QACD,MAAM,OAAO,CAAC,yCAAyC,IAAI,aAAa,EAAE,0CAA0C,CAAC,CAAC;IACxH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,SAAS,CAAC,OAAgB;IACjC,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACtE,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACzD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,SAAS;QAChD,MAAM,CAAC,GAAG,IAAyK,CAAC;QACpL,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;YAAE,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC;aAC/D,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC;YAC7E,IAAI,GAAG;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QAChC,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,SAAS,CAAC;YAC5C,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;iBACtD,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,SAAS;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,SAAkB,EAAE,CAAC,CAAC;QACnH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1B,CAAC"}