linkque-cli-v2 1.0.5 → 1.0.6

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 (50) hide show
  1. package/README.md +1 -1
  2. package/linkquejs.js +27 -2212
  3. package/package.json +4 -1
  4. package/vendor/linkque-agent-appwrite-integrate/dist/esm/anthropic-messages-B5T6TFD2.js +7172 -0
  5. package/vendor/linkque-agent-appwrite-integrate/dist/esm/azure-openai-responses-S7HNQOSE.js +229 -0
  6. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-2NGJGNYB.js +1765 -0
  7. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-3S3TOEBZ.js +608 -0
  8. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-46SEH6ER.js +78 -0
  9. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-52BVDZQ2.js +60299 -0
  10. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-6MHDOBWO.js +12 -0
  11. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-6WHNFJT4.js +31278 -0
  12. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-7BQRUS4C.js +671 -0
  13. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-7QWAKKTY.js +7054 -0
  14. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-CT4G24PS.js +8 -0
  15. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-DYEQRE6N.js +343 -0
  16. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-E2P6TIFG.js +31 -0
  17. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-FHNQ6DPF.js +14 -0
  18. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-HTG7JBF2.js +38 -0
  19. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-I64V3ICJ.js +11166 -0
  20. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-IKZ25GJD.js +497 -0
  21. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-MKS245OU.js +3570 -0
  22. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-NKEOCGYU.js +76 -0
  23. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-NQM5ZCTR.js +12015 -0
  24. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-OXGCUIKV.js +33 -0
  25. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-RYONFGPP.js +317 -0
  26. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-UEVQXSKG.js +4765 -0
  27. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-UFVAKOTZ.js +17 -0
  28. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-VS2QQHAK.js +46 -0
  29. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-XMVFOHGJ.js +31 -0
  30. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-XUFLSZM4.js +5319 -0
  31. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-Y6UTJIT4.js +23 -0
  32. package/vendor/linkque-agent-appwrite-integrate/dist/esm/chunk-YDKZZ6EH.js +3584 -0
  33. package/vendor/linkque-agent-appwrite-integrate/dist/esm/dist-QD3CV4KC.js +1224 -0
  34. package/vendor/linkque-agent-appwrite-integrate/dist/esm/google-generative-ai-IOXNKFEV.js +412 -0
  35. package/vendor/linkque-agent-appwrite-integrate/dist/esm/google-vertex-U4ZV5IXZ.js +461 -0
  36. package/vendor/linkque-agent-appwrite-integrate/dist/esm/mistral-conversations-G3K7SSWR.js +30344 -0
  37. package/vendor/linkque-agent-appwrite-integrate/dist/esm/multipart-parser-2VJ7LVQD.js +170 -0
  38. package/vendor/linkque-agent-appwrite-integrate/dist/esm/multipart-parser-AJMV6U6H.js +178 -0
  39. package/vendor/linkque-agent-appwrite-integrate/dist/esm/multipart-parser-PULXGNYO.js +368 -0
  40. package/vendor/linkque-agent-appwrite-integrate/dist/esm/openai-codex-responses-4JJLPTCS.js +1308 -0
  41. package/vendor/linkque-agent-appwrite-integrate/dist/esm/openai-completions-PH4WW6E7.js +977 -0
  42. package/vendor/linkque-agent-appwrite-integrate/dist/esm/openai-responses-KGWAX6HR.js +264 -0
  43. package/vendor/linkque-agent-appwrite-integrate/dist/esm/openrouter-images-LMBZZQ76.js +138 -0
  44. package/vendor/linkque-agent-appwrite-integrate/dist/esm/otel-7GSG7QQO.js +6657 -0
  45. package/vendor/linkque-agent-appwrite-integrate/dist/esm/pi-messages-ZX3KUWSZ.js +309 -0
  46. package/vendor/linkque-agent-appwrite-integrate/dist/esm/runtime/handler/chat.js +2354 -0
  47. package/vendor/linkque-agent-appwrite-integrate/dist/esm/runtime/handler/clientCapability.js +16 -0
  48. package/vendor/linkque-agent-appwrite-integrate/dist/esm/runtime/protocol.js +17 -0
  49. package/vendor/linkque-agent-appwrite-integrate/dist/esm/src-NGZW4JXI.js +1396 -0
  50. package/vendor/linkque-agent-appwrite-integrate/package.json +1 -0
@@ -0,0 +1,608 @@
1
+ import {
2
+ AssistantMessageEventStream
3
+ } from "./chunk-46SEH6ER.js";
4
+
5
+ // ../../node_modules/@earendil-works/pi-ai/dist/api/lazy.js
6
+ function createSetupErrorMessage(model, error) {
7
+ return {
8
+ role: "assistant",
9
+ content: [],
10
+ api: model.api,
11
+ provider: model.provider,
12
+ model: model.id,
13
+ usage: {
14
+ input: 0,
15
+ output: 0,
16
+ cacheRead: 0,
17
+ cacheWrite: 0,
18
+ totalTokens: 0,
19
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 }
20
+ },
21
+ stopReason: "error",
22
+ errorMessage: error instanceof Error ? error.message : String(error),
23
+ timestamp: Date.now()
24
+ };
25
+ }
26
+ function hasResult(source) {
27
+ return typeof source.result === "function";
28
+ }
29
+ async function forwardStream(target, source) {
30
+ for await (const event of source) {
31
+ target.push(event);
32
+ }
33
+ target.end(hasResult(source) ? await source.result() : void 0);
34
+ }
35
+ function lazyStream(model, setup) {
36
+ const outer = new AssistantMessageEventStream();
37
+ setup().then((inner) => forwardStream(outer, inner)).catch((error) => {
38
+ const message = createSetupErrorMessage(model, error);
39
+ outer.push({ type: "error", reason: "error", error: message });
40
+ outer.end(message);
41
+ });
42
+ return outer;
43
+ }
44
+ function lazyApi(load) {
45
+ return {
46
+ stream: (model, context, options) => lazyStream(model, async () => (await load()).stream(model, context, options)),
47
+ streamSimple: (model, context, options) => lazyStream(model, async () => (await load()).streamSimple(model, context, options))
48
+ };
49
+ }
50
+
51
+ // ../../node_modules/@earendil-works/pi-ai/dist/auth/context.js
52
+ var __rewriteRelativeImportExtension = function(path, preserveJsx) {
53
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
54
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function(m, tsx, d, ext, cm) {
55
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : d + ext + "." + cm.toLowerCase() + "js";
56
+ });
57
+ }
58
+ return path;
59
+ };
60
+ var importNodeModule = (specifier) => import(__rewriteRelativeImportExtension(specifier));
61
+ function getProcessEnv() {
62
+ const proc = globalThis.process;
63
+ return proc?.env;
64
+ }
65
+ function defaultProviderAuthContext() {
66
+ return {
67
+ async env(name) {
68
+ const value = getProcessEnv()?.[name];
69
+ return typeof value === "string" && value.trim().length > 0 ? value : void 0;
70
+ },
71
+ async fileExists(path) {
72
+ try {
73
+ const fs = await importNodeModule("node:fs/promises");
74
+ let resolved = path;
75
+ if (resolved.startsWith("~")) {
76
+ const os = await importNodeModule("node:os");
77
+ resolved = os.homedir() + resolved.slice(1);
78
+ }
79
+ await fs.access(resolved);
80
+ return true;
81
+ } catch {
82
+ return false;
83
+ }
84
+ }
85
+ };
86
+ }
87
+
88
+ // ../../node_modules/@earendil-works/pi-ai/dist/auth/credential-store.js
89
+ var InMemoryCredentialStore = class {
90
+ credentials = /* @__PURE__ */ new Map();
91
+ chains = /* @__PURE__ */ new Map();
92
+ /** Serialize tasks per provider id. */
93
+ enqueue(providerId, task) {
94
+ const previous = this.chains.get(providerId) ?? Promise.resolve();
95
+ const next = (async () => {
96
+ await previous.catch(() => {
97
+ });
98
+ return task();
99
+ })();
100
+ this.chains.set(providerId, next.catch(() => {
101
+ }));
102
+ return next;
103
+ }
104
+ async read(providerId) {
105
+ return this.credentials.get(providerId);
106
+ }
107
+ async list() {
108
+ return [...this.credentials].map(([providerId, credential]) => ({ providerId, type: credential.type }));
109
+ }
110
+ modify(providerId, fn) {
111
+ return this.enqueue(providerId, async () => {
112
+ const current = this.credentials.get(providerId);
113
+ const next = await fn(current);
114
+ if (next !== void 0)
115
+ this.credentials.set(providerId, next);
116
+ return next ?? current;
117
+ });
118
+ }
119
+ delete(providerId) {
120
+ return this.enqueue(providerId, async () => {
121
+ this.credentials.delete(providerId);
122
+ });
123
+ }
124
+ };
125
+
126
+ // ../../node_modules/@earendil-works/pi-ai/dist/auth/resolve.js
127
+ var ModelsError = class extends Error {
128
+ code;
129
+ constructor(code, message, options) {
130
+ super(message, options);
131
+ this.name = "ModelsError";
132
+ this.code = code;
133
+ }
134
+ };
135
+ async function resolveProviderAuth(provider, credentials, authContext, overrides) {
136
+ const requestAuthContext = overrides?.env ? overlayEnvAuthContext(authContext, overrides.env) : authContext;
137
+ if (overrides?.apiKey !== void 0 && provider.auth.apiKey) {
138
+ return resolveApiKey(requestAuthContext, provider.auth.apiKey, provider.id, {
139
+ type: "api_key",
140
+ key: overrides.apiKey,
141
+ env: overrides.env
142
+ });
143
+ }
144
+ const stored = await readCredential(credentials, provider.id);
145
+ if (stored) {
146
+ if (stored.type === "oauth" && provider.auth.oauth) {
147
+ return resolveStoredOAuth(credentials, provider.id, provider.auth.oauth, stored);
148
+ }
149
+ if (stored.type === "api_key" && provider.auth.apiKey) {
150
+ const credential = overrides?.env ? { ...stored, env: { ...stored.env, ...overrides.env } } : stored;
151
+ return resolveApiKey(requestAuthContext, provider.auth.apiKey, provider.id, credential);
152
+ }
153
+ return void 0;
154
+ }
155
+ return provider.auth.apiKey ? resolveApiKey(requestAuthContext, provider.auth.apiKey, provider.id, void 0) : void 0;
156
+ }
157
+ function overlayEnvAuthContext(base, env) {
158
+ return {
159
+ env: async (name) => env[name] || await base.env(name),
160
+ fileExists: (path) => base.fileExists(path)
161
+ };
162
+ }
163
+ async function resolveStoredOAuth(credentials, providerId, oauth, stored) {
164
+ let credential = stored;
165
+ if (Date.now() >= credential.expires) {
166
+ let post;
167
+ try {
168
+ post = await credentials.modify(providerId, async (current) => {
169
+ if (current?.type !== "oauth")
170
+ return void 0;
171
+ if (Date.now() < current.expires)
172
+ return void 0;
173
+ try {
174
+ return await oauth.refresh(current);
175
+ } catch (error) {
176
+ throw new ModelsError("oauth", `OAuth refresh failed for ${providerId}`, { cause: error });
177
+ }
178
+ });
179
+ } catch (error) {
180
+ if (error instanceof ModelsError)
181
+ throw error;
182
+ throw new ModelsError("auth", `Credential store modify failed for ${providerId}`, { cause: error });
183
+ }
184
+ if (post?.type !== "oauth")
185
+ return void 0;
186
+ credential = post;
187
+ }
188
+ try {
189
+ return { auth: await oauth.toAuth(credential), source: "OAuth" };
190
+ } catch (error) {
191
+ throw new ModelsError("oauth", `OAuth auth derivation failed for ${providerId}`, { cause: error });
192
+ }
193
+ }
194
+ async function resolveApiKey(authContext, apiKey, providerId, credential) {
195
+ try {
196
+ return await apiKey.resolve({ ctx: authContext, credential });
197
+ } catch (error) {
198
+ throw new ModelsError("auth", `API key auth failed for provider ${providerId}`, { cause: error });
199
+ }
200
+ }
201
+ async function readCredential(credentials, providerId) {
202
+ try {
203
+ return await credentials.read(providerId);
204
+ } catch (error) {
205
+ throw new ModelsError("auth", `Credential store read failed for ${providerId}`, { cause: error });
206
+ }
207
+ }
208
+
209
+ // ../../node_modules/@earendil-works/pi-ai/dist/models-store.js
210
+ var InMemoryModelsStore = class {
211
+ entries = /* @__PURE__ */ new Map();
212
+ async read(providerId) {
213
+ const entry = this.entries.get(providerId);
214
+ return entry ? structuredClone(entry) : void 0;
215
+ }
216
+ async write(providerId, entry) {
217
+ this.entries.set(providerId, structuredClone(entry));
218
+ }
219
+ async delete(providerId) {
220
+ this.entries.delete(providerId);
221
+ }
222
+ };
223
+
224
+ // ../../node_modules/@earendil-works/pi-ai/dist/models.js
225
+ function mergeHeaders(base, override) {
226
+ if (!base && !override)
227
+ return void 0;
228
+ const merged = { ...base };
229
+ for (const [name, value] of Object.entries(override ?? {})) {
230
+ const lowerName = name.toLowerCase();
231
+ for (const existingName of Object.keys(merged)) {
232
+ if (existingName.toLowerCase() === lowerName)
233
+ delete merged[existingName];
234
+ }
235
+ merged[name] = value;
236
+ }
237
+ return merged;
238
+ }
239
+ var ModelsImpl = class {
240
+ providers = /* @__PURE__ */ new Map();
241
+ credentials;
242
+ modelsStore;
243
+ authContext;
244
+ constructor(options) {
245
+ this.credentials = options?.credentials ?? new InMemoryCredentialStore();
246
+ this.modelsStore = options?.modelsStore ?? new InMemoryModelsStore();
247
+ this.authContext = options?.authContext ?? defaultProviderAuthContext();
248
+ }
249
+ setProvider(provider) {
250
+ this.providers.set(provider.id, provider);
251
+ }
252
+ deleteProvider(id) {
253
+ this.providers.delete(id);
254
+ }
255
+ clearProviders() {
256
+ this.providers.clear();
257
+ }
258
+ getProviders() {
259
+ return Array.from(this.providers.values());
260
+ }
261
+ getProvider(id) {
262
+ return this.providers.get(id);
263
+ }
264
+ getModels(provider) {
265
+ if (provider !== void 0) {
266
+ const entry = this.providers.get(provider);
267
+ if (!entry)
268
+ return [];
269
+ try {
270
+ return entry.getModels();
271
+ } catch {
272
+ return [];
273
+ }
274
+ }
275
+ const models = [];
276
+ for (const entry of this.providers.values()) {
277
+ try {
278
+ models.push(...entry.getModels());
279
+ } catch {
280
+ }
281
+ }
282
+ return models;
283
+ }
284
+ getModel(provider, id) {
285
+ return this.getModels(provider).find((model) => model.id === id);
286
+ }
287
+ async refresh(options = {}) {
288
+ const allowNetwork = options.allowNetwork ?? true;
289
+ const errors = /* @__PURE__ */ new Map();
290
+ const refreshable = Array.from(this.providers.values()).filter((provider) => provider.refreshModels !== void 0);
291
+ await Promise.all(refreshable.map(async (provider) => {
292
+ if (options.signal?.aborted)
293
+ return;
294
+ const store = {
295
+ read: () => this.modelsStore.read(provider.id),
296
+ write: (entry) => this.modelsStore.write(provider.id, entry),
297
+ delete: () => this.modelsStore.delete(provider.id)
298
+ };
299
+ let stored;
300
+ try {
301
+ stored = await this.readCredential(provider.id);
302
+ const credential = await this.resolveRefreshCredential(provider, stored, allowNetwork, options.signal);
303
+ if (!credential)
304
+ return;
305
+ await provider.refreshModels({
306
+ credential,
307
+ store,
308
+ allowNetwork,
309
+ force: options.force,
310
+ signal: options.signal
311
+ });
312
+ } catch (error) {
313
+ if (!options.signal?.aborted) {
314
+ errors.set(provider.id, error instanceof Error ? error : new ModelsError("model_source", `Model refresh failed for ${provider.id}`, { cause: error }));
315
+ }
316
+ try {
317
+ await provider.refreshModels({
318
+ credential: stored,
319
+ store,
320
+ allowNetwork: false,
321
+ signal: options.signal
322
+ });
323
+ } catch {
324
+ }
325
+ }
326
+ }));
327
+ return { aborted: options.signal?.aborted ?? false, errors };
328
+ }
329
+ async resolveRefreshCredential(provider, stored, allowNetwork, signal) {
330
+ if (stored?.type === "oauth") {
331
+ const oauth = provider.auth.oauth;
332
+ if (!oauth)
333
+ return void 0;
334
+ if (!allowNetwork || Date.now() < stored.expires)
335
+ return stored;
336
+ if (signal?.aborted)
337
+ return void 0;
338
+ const post = await this.credentials.modify(provider.id, async (current) => {
339
+ if (current?.type !== "oauth" || Date.now() < current.expires)
340
+ return void 0;
341
+ return oauth.refresh(current, signal);
342
+ });
343
+ return post?.type === "oauth" ? post : void 0;
344
+ }
345
+ const apiKey = provider.auth.apiKey;
346
+ if (!apiKey)
347
+ return void 0;
348
+ const credential = stored?.type === "api_key" ? stored : void 0;
349
+ const result = await apiKey.resolve({ ctx: this.authContext, credential });
350
+ if (!result)
351
+ return void 0;
352
+ return { type: "api_key", key: result.auth.apiKey, env: result.env };
353
+ }
354
+ async readCredential(providerId) {
355
+ try {
356
+ return await this.credentials.read(providerId);
357
+ } catch (error) {
358
+ throw new ModelsError("auth", `Credential store read failed for ${providerId}`, { cause: error });
359
+ }
360
+ }
361
+ async checkProviderAuth(provider, credential) {
362
+ if (credential?.type === "oauth") {
363
+ return provider.auth.oauth ? { source: "OAuth", type: "oauth" } : void 0;
364
+ }
365
+ const apiKey = provider.auth.apiKey;
366
+ if (!apiKey)
367
+ return void 0;
368
+ if (apiKey.check) {
369
+ try {
370
+ return await apiKey.check({
371
+ ctx: this.authContext,
372
+ credential: credential?.type === "api_key" ? credential : void 0
373
+ });
374
+ } catch (error) {
375
+ throw new ModelsError("auth", `API key auth check failed for provider ${provider.id}`, { cause: error });
376
+ }
377
+ }
378
+ const resolution = await resolveProviderAuth(provider, this.credentials, this.authContext);
379
+ return resolution ? { source: resolution.source, type: "api_key" } : void 0;
380
+ }
381
+ async checkAuth(providerId) {
382
+ const provider = this.providers.get(providerId);
383
+ if (!provider)
384
+ return void 0;
385
+ return this.checkProviderAuth(provider, await this.readCredential(providerId));
386
+ }
387
+ async getAvailable(providerId) {
388
+ const providers = providerId ? [this.providers.get(providerId)].filter((entry) => entry !== void 0) : this.getProviders();
389
+ const checks = await Promise.all(providers.map(async (provider) => {
390
+ const credential = await this.readCredential(provider.id);
391
+ return { provider, credential, auth: await this.checkProviderAuth(provider, credential) };
392
+ }));
393
+ return checks.flatMap(({ provider, credential, auth }) => {
394
+ if (!auth)
395
+ return [];
396
+ const models = provider.getModels();
397
+ return provider.filterModels?.(models, credential) ?? models;
398
+ });
399
+ }
400
+ async getAuth(providerOrModel, overrides) {
401
+ const providerId = typeof providerOrModel === "string" ? providerOrModel : providerOrModel.provider;
402
+ const provider = this.providers.get(providerId);
403
+ if (!provider)
404
+ return void 0;
405
+ const result = await resolveProviderAuth(provider, this.credentials, this.authContext, overrides);
406
+ if (!result || typeof providerOrModel === "string" || !providerOrModel.headers)
407
+ return result;
408
+ return {
409
+ ...result,
410
+ auth: {
411
+ ...result.auth,
412
+ headers: mergeHeaders(result.auth.headers, providerOrModel.headers)
413
+ }
414
+ };
415
+ }
416
+ async login(providerId, type, interaction) {
417
+ const provider = this.providers.get(providerId);
418
+ if (!provider)
419
+ throw new ModelsError("provider", `Unknown provider: ${providerId}`);
420
+ const method = type === "oauth" ? provider.auth.oauth : provider.auth.apiKey;
421
+ if (!method?.login) {
422
+ throw new ModelsError("auth", `${provider.name} does not support ${type} login`);
423
+ }
424
+ const credential = await method.login(interaction);
425
+ try {
426
+ await this.credentials.modify(providerId, async () => credential);
427
+ } catch (error) {
428
+ throw new ModelsError("auth", `Credential store modify failed for ${providerId}`, { cause: error });
429
+ }
430
+ return credential;
431
+ }
432
+ async logout(providerId) {
433
+ try {
434
+ await this.credentials.delete(providerId);
435
+ } catch (error) {
436
+ throw new ModelsError("auth", `Credential store delete failed for ${providerId}`, { cause: error });
437
+ }
438
+ }
439
+ requireProvider(model) {
440
+ const provider = this.providers.get(model.provider);
441
+ if (!provider) {
442
+ throw new ModelsError("provider", `Unknown provider: ${model.provider}`);
443
+ }
444
+ return provider;
445
+ }
446
+ async applyAuth(model, options) {
447
+ this.requireProvider(model);
448
+ const resolution = await this.getAuth(model, {
449
+ apiKey: options?.apiKey,
450
+ env: options?.env
451
+ });
452
+ if (!resolution) {
453
+ throw new ModelsError("auth", `Provider is not configured: ${model.provider}`);
454
+ }
455
+ const auth = resolution.auth;
456
+ const apiKey = options?.apiKey ?? auth.apiKey;
457
+ let headers = mergeHeaders(auth.headers, options?.headers);
458
+ if (options?.transformHeaders)
459
+ headers = await options.transformHeaders(headers ?? {});
460
+ const env = resolution.env || options?.env ? { ...resolution.env ?? {}, ...options?.env ?? {} } : void 0;
461
+ const requestModel = auth.baseUrl ? { ...model, baseUrl: auth.baseUrl } : model;
462
+ const { transformHeaders: _transformHeaders, ...providerOptions } = options ?? {};
463
+ const requestOptions = { ...providerOptions, apiKey, headers, env };
464
+ return { requestModel, requestOptions };
465
+ }
466
+ stream(model, context, options) {
467
+ return lazyStream(model, async () => {
468
+ const provider = this.requireProvider(model);
469
+ const { requestModel, requestOptions } = await this.applyAuth(model, options);
470
+ return provider.stream(requestModel, context, requestOptions);
471
+ });
472
+ }
473
+ async complete(model, context, options) {
474
+ return this.stream(model, context, options).result();
475
+ }
476
+ streamSimple(model, context, options) {
477
+ return lazyStream(model, async () => {
478
+ const provider = this.requireProvider(model);
479
+ const { requestModel, requestOptions } = await this.applyAuth(model, options);
480
+ return provider.streamSimple(requestModel, context, requestOptions);
481
+ });
482
+ }
483
+ async completeSimple(model, context, options) {
484
+ return this.streamSimple(model, context, options).result();
485
+ }
486
+ };
487
+ function createModels(options) {
488
+ return new ModelsImpl(options);
489
+ }
490
+ function createProvider(input) {
491
+ const baselineModels = input.models;
492
+ let dynamicModels = [];
493
+ let inflightRefresh;
494
+ const fetchModels = input.fetchModels;
495
+ const currentModels = () => {
496
+ const merged = [...baselineModels];
497
+ for (const model of dynamicModels) {
498
+ const index = merged.findIndex((entry) => entry.id === model.id);
499
+ if (index >= 0)
500
+ merged[index] = model;
501
+ else
502
+ merged.push(model);
503
+ }
504
+ return merged;
505
+ };
506
+ const single = typeof input.api.stream === "function" ? input.api : void 0;
507
+ const byApi = single ? void 0 : input.api;
508
+ const apiFor = (model) => single ?? byApi?.[model.api];
509
+ const dispatch = (model, run) => {
510
+ const streams = apiFor(model);
511
+ if (!streams) {
512
+ return lazyStream(model, async () => {
513
+ throw new ModelsError("stream", `Provider ${input.id} has no API implementation for "${model.api}"`);
514
+ });
515
+ }
516
+ return run(streams);
517
+ };
518
+ return {
519
+ id: input.id,
520
+ name: input.name ?? input.id,
521
+ baseUrl: input.baseUrl,
522
+ headers: input.headers,
523
+ auth: input.auth,
524
+ getModels: currentModels,
525
+ refreshModels: fetchModels ? (context) => {
526
+ inflightRefresh ??= (async () => {
527
+ try {
528
+ const stored = await context.store.read();
529
+ if (stored) {
530
+ dynamicModels = stored.models.filter((model) => model.provider === input.id).map((model) => model);
531
+ }
532
+ if (!context.allowNetwork || context.signal?.aborted)
533
+ return;
534
+ const refreshed = await fetchModels(context);
535
+ if (context.signal?.aborted)
536
+ return;
537
+ dynamicModels = refreshed;
538
+ await context.store.write({ models: refreshed, checkedAt: Date.now() });
539
+ } finally {
540
+ inflightRefresh = void 0;
541
+ }
542
+ })();
543
+ return inflightRefresh;
544
+ } : void 0,
545
+ filterModels: input.filterModels,
546
+ stream: (model, context, options) => dispatch(model, (streams) => streams.stream(model, context, options)),
547
+ streamSimple: (model, context, options) => dispatch(model, (streams) => streams.streamSimple(model, context, options))
548
+ };
549
+ }
550
+ function calculateCost(model, usage) {
551
+ const inputTokens = usage.input + usage.cacheRead + usage.cacheWrite;
552
+ let rates = model.cost;
553
+ let matchedThreshold = -1;
554
+ for (const tier of model.cost.tiers ?? []) {
555
+ if (inputTokens > tier.inputTokensAbove && tier.inputTokensAbove > matchedThreshold) {
556
+ rates = tier;
557
+ matchedThreshold = tier.inputTokensAbove;
558
+ }
559
+ }
560
+ const longWrite = usage.cacheWrite1h ?? 0;
561
+ const shortWrite = usage.cacheWrite - longWrite;
562
+ usage.cost.input = rates.input / 1e6 * usage.input;
563
+ usage.cost.output = rates.output / 1e6 * usage.output;
564
+ usage.cost.cacheRead = rates.cacheRead / 1e6 * usage.cacheRead;
565
+ usage.cost.cacheWrite = (rates.cacheWrite * shortWrite + rates.input * 2 * longWrite) / 1e6;
566
+ usage.cost.total = usage.cost.input + usage.cost.output + usage.cost.cacheRead + usage.cost.cacheWrite;
567
+ return usage.cost;
568
+ }
569
+ var EXTENDED_THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
570
+ function getSupportedThinkingLevels(model) {
571
+ if (!model.reasoning)
572
+ return ["off"];
573
+ return EXTENDED_THINKING_LEVELS.filter((level) => {
574
+ const mapped = model.thinkingLevelMap?.[level];
575
+ if (mapped === null)
576
+ return false;
577
+ if (level === "xhigh" || level === "max")
578
+ return mapped !== void 0;
579
+ return true;
580
+ });
581
+ }
582
+ function clampThinkingLevel(model, level) {
583
+ const availableLevels = getSupportedThinkingLevels(model);
584
+ if (availableLevels.includes(level))
585
+ return level;
586
+ const requestedIndex = EXTENDED_THINKING_LEVELS.indexOf(level);
587
+ if (requestedIndex === -1)
588
+ return availableLevels[0] ?? "off";
589
+ for (let i = requestedIndex; i < EXTENDED_THINKING_LEVELS.length; i++) {
590
+ const candidate = EXTENDED_THINKING_LEVELS[i];
591
+ if (availableLevels.includes(candidate))
592
+ return candidate;
593
+ }
594
+ for (let i = requestedIndex - 1; i >= 0; i--) {
595
+ const candidate = EXTENDED_THINKING_LEVELS[i];
596
+ if (availableLevels.includes(candidate))
597
+ return candidate;
598
+ }
599
+ return availableLevels[0] ?? "off";
600
+ }
601
+
602
+ export {
603
+ lazyApi,
604
+ createModels,
605
+ createProvider,
606
+ calculateCost,
607
+ clampThinkingLevel
608
+ };
@@ -0,0 +1,78 @@
1
+ // ../../node_modules/@earendil-works/pi-ai/dist/utils/event-stream.js
2
+ var EventStream = class {
3
+ queue = [];
4
+ waiting = [];
5
+ done = false;
6
+ finalResultPromise;
7
+ resolveFinalResult;
8
+ isComplete;
9
+ extractResult;
10
+ constructor(isComplete, extractResult) {
11
+ this.isComplete = isComplete;
12
+ this.extractResult = extractResult;
13
+ this.finalResultPromise = new Promise((resolve) => {
14
+ this.resolveFinalResult = resolve;
15
+ });
16
+ }
17
+ push(event) {
18
+ if (this.done)
19
+ return;
20
+ if (this.isComplete(event)) {
21
+ this.done = true;
22
+ this.resolveFinalResult(this.extractResult(event));
23
+ }
24
+ const waiter = this.waiting.shift();
25
+ if (waiter) {
26
+ waiter({ value: event, done: false });
27
+ } else {
28
+ this.queue.push(event);
29
+ }
30
+ }
31
+ end(result) {
32
+ this.done = true;
33
+ if (result !== void 0) {
34
+ this.resolveFinalResult(result);
35
+ }
36
+ while (this.waiting.length > 0) {
37
+ const waiter = this.waiting.shift();
38
+ waiter({ value: void 0, done: true });
39
+ }
40
+ }
41
+ async *[Symbol.asyncIterator]() {
42
+ while (true) {
43
+ if (this.queue.length > 0) {
44
+ yield this.queue.shift();
45
+ } else if (this.done) {
46
+ return;
47
+ } else {
48
+ const result = await new Promise((resolve) => this.waiting.push(resolve));
49
+ if (result.done)
50
+ return;
51
+ yield result.value;
52
+ }
53
+ }
54
+ }
55
+ result() {
56
+ return this.finalResultPromise;
57
+ }
58
+ };
59
+ var AssistantMessageEventStream = class extends EventStream {
60
+ constructor() {
61
+ super((event) => event.type === "done" || event.type === "error", (event) => {
62
+ if (event.type === "done") {
63
+ return event.message;
64
+ } else if (event.type === "error") {
65
+ return event.error;
66
+ }
67
+ throw new Error("Unexpected event type for final result");
68
+ });
69
+ }
70
+ };
71
+ function createAssistantMessageEventStream() {
72
+ return new AssistantMessageEventStream();
73
+ }
74
+
75
+ export {
76
+ AssistantMessageEventStream,
77
+ createAssistantMessageEventStream
78
+ };