@desplega.ai/agent-swarm 1.119.4 → 1.119.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 (91) hide show
  1. package/dist/{actions-cvcf510b.js → actions-qe5zjcbr.js} +5 -5
  2. package/dist/{anthropic-messages-kq3pjhbp.js → anthropic-messages-qjxzsabf.js} +94 -46
  3. package/dist/{app-05ksvyna.js → app-31x7k3vj.js} +3 -3
  4. package/dist/{assistant-wqr7nmqv.js → assistant-4crt9dve.js} +8 -8
  5. package/dist/{azure-openai-responses-f57n5qy7.js → azure-openai-responses-ntfd05zd.js} +10 -7
  6. package/dist/{boot-reembed-v0q84hej.js → boot-reembed-8g69ttz4.js} +3 -3
  7. package/dist/{boot-reembed-dx3zweeh.js → boot-reembed-q648j733.js} +4 -4
  8. package/dist/{boot-scrub-logs-3am4xegg.js → boot-scrub-logs-sfmzd2hj.js} +2 -2
  9. package/dist/{claude-adapter-3csn5bks.js → claude-adapter-9n3nzt65.js} +2 -2
  10. package/dist/{claude-managed-adapter-kysmkz89.js → claude-managed-adapter-pv2nbqy4.js} +2 -2
  11. package/dist/{cli-m6pzzhqr.js → cli-1arw00dp.js} +251 -122
  12. package/dist/{cli-pc276yqz.js → cli-2gv8ygwr.js} +1 -1
  13. package/dist/{cli-rk6fkhkk.js → cli-433c0f4b.js} +5 -5
  14. package/dist/{cli-kmtp1rg9.js → cli-4s84mw72.js} +2 -2
  15. package/dist/{cli-ttb3pty1.js → cli-59jy217p.js} +16 -16
  16. package/dist/{cli-qfp17rw8.js → cli-6rvm3jkk.js} +1 -1
  17. package/dist/{cli-bzjncaf6.js → cli-8hhms4hp.js} +1 -1
  18. package/dist/{cli-h1bffz9b.js → cli-96feg24n.js} +1 -1
  19. package/dist/{cli-0y66mw72.js → cli-bpvgs2y6.js} +2 -2
  20. package/dist/{cli-jfc1jm13.js → cli-d1reabed.js} +1 -1
  21. package/dist/{cli-dh9eb7tt.js → cli-da3x3btq.js} +5 -3
  22. package/dist/{cli-bsyka9ta.js → cli-e0y603nn.js} +30 -16
  23. package/dist/{cli-chfh8r6f.js → cli-fkxxh5d4.js} +2 -2
  24. package/dist/{cli-7mvmqemc.js → cli-g6qz2kts.js} +1 -1
  25. package/dist/{cli-pyagab0x.js → cli-gdqdkr3j.js} +2 -2
  26. package/dist/{cli-67e8g7bj.js → cli-gg5bd32n.js} +4 -4
  27. package/dist/{cli-zrxpz200.js → cli-h6cf69x5.js} +1 -1
  28. package/dist/{cli-xw7p4wkq.js → cli-mg280wsv.js} +1 -1
  29. package/dist/{cli-hcpm1e90.js → cli-n61x2aph.js} +2488 -18718
  30. package/dist/{cli-4xtzqzv4.js → cli-ner6af7m.js} +18 -18
  31. package/dist/{cli-zm2jjaq6.js → cli-pasyk3vc.js} +6 -6
  32. package/dist/{cli-758zm6xy.js → cli-q8dway4w.js} +1 -1
  33. package/dist/cli-qs7nb3zn.js +76 -0
  34. package/dist/{cli-fhmhjjh4.js → cli-qw1ccvxm.js} +8 -7
  35. package/dist/{cli-8jjrc3ww.js → cli-r93nz80j.js} +1 -1
  36. package/dist/{cli-cs5g429e.js → cli-sbkwvn5e.js} +1 -1
  37. package/dist/cli-v1mwc5v2.js +68 -0
  38. package/dist/cli-vfcth11k.js +36 -0
  39. package/dist/{cli-k0x0fvh5.js → cli-vg1jxfqz.js} +5 -5
  40. package/dist/{cli-qe43w9a5.js → cli-vx0y68jv.js} +2 -2
  41. package/dist/{cli-kc3h8mnm.js → cli-w6rhc30s.js} +1 -1
  42. package/dist/{cli-sdpnhajn.js → cli-wr706gez.js} +56 -7
  43. package/dist/{cli-1c5zhw9z.js → cli-wxbnjgce.js} +3 -3
  44. package/dist/{cli-0qy7bk86.js → cli-xeatwfbe.js} +25 -16
  45. package/dist/{cli-hx1dcevq.js → cli-z9gzq07x.js} +1 -23
  46. package/dist/cli.js +21 -20
  47. package/dist/{codex-adapter-efskwfc4.js → codex-adapter-6j2b38tg.js} +8 -6
  48. package/dist/{codex-session-runner-n7ad0jdv.js → codex-session-runner-vz215wgw.js} +8 -6
  49. package/dist/{commands-3ke60h4e.js → commands-6xr20jbe.js} +2 -2
  50. package/dist/{db-a1e1nj43.js → db-1mmvk1z4.js} +2 -2
  51. package/dist/{google-generative-ai-hyrra2jm.js → google-generative-ai-n1d3xt4n.js} +9 -7
  52. package/dist/{google-vertex-9hhq68sw.js → google-vertex-mxst23gy.js} +9 -7
  53. package/dist/{handlers-d86a4ypy.js → handlers-xvrknk8w.js} +8 -8
  54. package/dist/{hook-teegt6h5.js → hook-qm7he8wn.js} +7 -5
  55. package/dist/{http-64jvxqnz.js → http-hj08zq67.js} +39 -38
  56. package/dist/{index-z39ch6n5.js → index-688jph6a.js} +9 -9
  57. package/dist/{index-a95n0ay5.js → index-etz7d8md.js} +8 -8
  58. package/dist/{index-hb9j1aqr.js → index-gze4fg2w.js} +6 -6
  59. package/dist/{index-bndzxk11.js → index-wj8dfpwh.js} +10 -10
  60. package/dist/{keepalive-ab1qpqrm.js → keepalive-94wn9yxw.js} +4 -4
  61. package/dist/{lead-852gtrsa.js → lead-rvcqkp11.js} +32 -30
  62. package/dist/{maintenance-fke93wqq.js → maintenance-qhfc4dnp.js} +4 -4
  63. package/dist/{mistral-conversations-tn4sj5qv.js → mistral-conversations-ykcg66za.js} +5 -3
  64. package/dist/{oauth-refresh-sweep-a139pm5w.js → oauth-refresh-sweep-rj8wgvsw.js} +3 -3
  65. package/dist/{onboard-vcd22m9e.js → onboard-8bv8q1wc.js} +2 -2
  66. package/dist/{openai-codex-responses-bex0bpn6.js → openai-codex-responses-zy0907j9.js} +68 -39
  67. package/dist/{openai-completions-gygw5cxt.js → openai-completions-xk4p56n9.js} +73 -14
  68. package/dist/{openai-responses-8c0dgmty.js → openai-responses-4gv3ca5d.js} +38 -16
  69. package/dist/{opencode-adapter-p6bxnbm4.js → opencode-adapter-5bwzvbwj.js} +2 -2
  70. package/dist/{otel-impl-88egk5hc.js → otel-impl-1kf6fr2m.js} +1 -1
  71. package/dist/pi-messages-zb8v76wx.js +313 -0
  72. package/dist/{pi-mono-adapter-erghwha0.js → pi-mono-adapter-9sg69kg3.js} +15711 -12608
  73. package/dist/{pricing-refresh-bbg7s7qs.js → pricing-refresh-e84tar2s.js} +4 -4
  74. package/dist/{rbac-roles-kc9t08gp.js → rbac-roles-atytq5ch.js} +3 -3
  75. package/dist/{rbac-roles-e169ndy2.js → rbac-roles-pg0zvnwn.js} +2 -2
  76. package/dist/{seed-pricing-3zhtw483.js → seed-pricing-xd6nxq7k.js} +3 -3
  77. package/dist/{setup-6m99ne8y.js → setup-4z389yk0.js} +2 -2
  78. package/dist/{worker-pwg46aav.js → worker-m61r0t7m.js} +32 -30
  79. package/openapi.json +1 -1
  80. package/package.json +6 -6
  81. package/src/providers/pi-mono-adapter.ts +14 -20
  82. package/src/tests/internal-ai/credentials.test.ts +22 -0
  83. package/src/tests/pi-mono-adapter.test.ts +28 -20
  84. package/src/tests/scripts-only-gating.test.ts +93 -31
  85. package/src/tests/workflow-engine-v2.test.ts +26 -0
  86. package/src/utils/internal-ai/credentials.ts +53 -5
  87. package/src/workflows/engine.ts +12 -2
  88. package/dist/{cli-sznberje.js → cli-2r7s8jhp.js} +3 -3
  89. package/dist/{cli-bc89my0z.js → cli-branks1w.js} +3 -3
  90. package/dist/{cli-mnbgv3w7.js → cli-mw3xpgwb.js} +3 -3
  91. package/dist/{openrouter-images-537nmn1r.js → openrouter-images-4fsrrzes.js} +3 -3
@@ -1,77 +1,6 @@
1
- // node_modules/@earendil-works/pi-ai/dist/utils/event-stream.js
2
- class EventStream {
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 !== undefined) {
34
- this.resolveFinalResult(result);
35
- }
36
- while (this.waiting.length > 0) {
37
- const waiter = this.waiting.shift();
38
- waiter({ value: undefined, 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
-
60
- class AssistantMessageEventStream extends EventStream {
61
- constructor() {
62
- super((event) => event.type === "done" || event.type === "error", (event) => {
63
- if (event.type === "done") {
64
- return event.message;
65
- } else if (event.type === "error") {
66
- return event.error;
67
- }
68
- throw new Error("Unexpected event type for final result");
69
- });
70
- }
71
- }
72
- function createAssistantMessageEventStream() {
73
- return new AssistantMessageEventStream;
74
- }
1
+ import {
2
+ AssistantMessageEventStream
3
+ } from "./cli-qs7nb3zn.js";
75
4
 
76
5
  // node_modules/@earendil-works/pi-ai/dist/api/lazy.js
77
6
  function createSetupErrorMessage(model, error) {
@@ -94,19 +23,18 @@ function createSetupErrorMessage(model, error) {
94
23
  timestamp: Date.now()
95
24
  };
96
25
  }
97
- function forwardStream(target, source) {
98
- (async () => {
99
- for await (const event of source) {
100
- target.push(event);
101
- }
102
- target.end();
103
- })();
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() : undefined);
104
34
  }
105
35
  function lazyStream(model, setup) {
106
36
  const outer = new AssistantMessageEventStream;
107
- setup().then((inner) => {
108
- forwardStream(outer, inner);
109
- }).catch((error) => {
37
+ setup().then((inner) => forwardStream(outer, inner)).catch((error) => {
110
38
  const message = createSetupErrorMessage(model, error);
111
39
  outer.push({ type: "error", reason: "error", error: message });
112
40
  outer.end(message);
@@ -173,6 +101,9 @@ class InMemoryCredentialStore {
173
101
  async read(providerId) {
174
102
  return this.credentials.get(providerId);
175
103
  }
104
+ async list() {
105
+ return [...this.credentials].map(([providerId, credential]) => ({ providerId, type: credential.type }));
106
+ }
176
107
  modify(providerId, fn) {
177
108
  return this.enqueue(providerId, async () => {
178
109
  const current = this.credentials.get(providerId);
@@ -198,10 +129,10 @@ class ModelsError extends Error {
198
129
  this.code = code;
199
130
  }
200
131
  }
201
- async function resolveProviderAuth(provider, model, credentials, authContext, overrides) {
132
+ async function resolveProviderAuth(provider, credentials, authContext, overrides) {
202
133
  const requestAuthContext = overrides?.env ? overlayEnvAuthContext(authContext, overrides.env) : authContext;
203
134
  if (overrides?.apiKey !== undefined && provider.auth.apiKey) {
204
- return resolveApiKey(requestAuthContext, provider.auth.apiKey, model, {
135
+ return resolveApiKey(requestAuthContext, provider.auth.apiKey, provider.id, {
205
136
  type: "api_key",
206
137
  key: overrides.apiKey,
207
138
  env: overrides.env
@@ -214,11 +145,11 @@ async function resolveProviderAuth(provider, model, credentials, authContext, ov
214
145
  }
215
146
  if (stored.type === "api_key" && provider.auth.apiKey) {
216
147
  const credential = overrides?.env ? { ...stored, env: { ...stored.env, ...overrides.env } } : stored;
217
- return resolveApiKey(requestAuthContext, provider.auth.apiKey, model, credential);
148
+ return resolveApiKey(requestAuthContext, provider.auth.apiKey, provider.id, credential);
218
149
  }
219
150
  return;
220
151
  }
221
- return provider.auth.apiKey ? resolveApiKey(requestAuthContext, provider.auth.apiKey, model, undefined) : undefined;
152
+ return provider.auth.apiKey ? resolveApiKey(requestAuthContext, provider.auth.apiKey, provider.id, undefined) : undefined;
222
153
  }
223
154
  function overlayEnvAuthContext(base, env) {
224
155
  return {
@@ -257,11 +188,11 @@ async function resolveStoredOAuth(credentials, providerId, oauth, stored) {
257
188
  throw new ModelsError("oauth", `OAuth auth derivation failed for ${providerId}`, { cause: error });
258
189
  }
259
190
  }
260
- async function resolveApiKey(authContext, apiKey, model, credential) {
191
+ async function resolveApiKey(authContext, apiKey, providerId, credential) {
261
192
  try {
262
- return await apiKey.resolve({ model, ctx: authContext, credential });
193
+ return await apiKey.resolve({ ctx: authContext, credential });
263
194
  } catch (error) {
264
- throw new ModelsError("auth", `API key auth failed for provider ${model.provider}`, { cause: error });
195
+ throw new ModelsError("auth", `API key auth failed for provider ${providerId}`, { cause: error });
265
196
  }
266
197
  }
267
198
  async function readCredential(credentials, providerId) {
@@ -272,13 +203,45 @@ async function readCredential(credentials, providerId) {
272
203
  }
273
204
  }
274
205
 
206
+ // node_modules/@earendil-works/pi-ai/dist/models-store.js
207
+ class InMemoryModelsStore {
208
+ entries = new Map;
209
+ async read(providerId) {
210
+ const entry = this.entries.get(providerId);
211
+ return entry ? structuredClone(entry) : undefined;
212
+ }
213
+ async write(providerId, entry) {
214
+ this.entries.set(providerId, structuredClone(entry));
215
+ }
216
+ async delete(providerId) {
217
+ this.entries.delete(providerId);
218
+ }
219
+ }
220
+
275
221
  // node_modules/@earendil-works/pi-ai/dist/models.js
222
+ function mergeHeaders(base, override) {
223
+ if (!base && !override)
224
+ return;
225
+ const merged = { ...base };
226
+ for (const [name, value] of Object.entries(override ?? {})) {
227
+ const lowerName = name.toLowerCase();
228
+ for (const existingName of Object.keys(merged)) {
229
+ if (existingName.toLowerCase() === lowerName)
230
+ delete merged[existingName];
231
+ }
232
+ merged[name] = value;
233
+ }
234
+ return merged;
235
+ }
236
+
276
237
  class ModelsImpl {
277
238
  providers = new Map;
278
239
  credentials;
240
+ modelsStore;
279
241
  authContext;
280
242
  constructor(options) {
281
243
  this.credentials = options?.credentials ?? new InMemoryCredentialStore;
244
+ this.modelsStore = options?.modelsStore ?? new InMemoryModelsStore;
282
245
  this.authContext = options?.authContext ?? defaultProviderAuthContext();
283
246
  }
284
247
  setProvider(provider) {
@@ -318,27 +281,156 @@ class ModelsImpl {
318
281
  getModel(provider, id) {
319
282
  return this.getModels(provider).find((model) => model.id === id);
320
283
  }
321
- async refresh(provider) {
322
- if (provider !== undefined) {
323
- const entry = this.providers.get(provider);
324
- if (!entry?.refreshModels)
284
+ async refresh(options = {}) {
285
+ const allowNetwork = options.allowNetwork ?? true;
286
+ const errors = new Map;
287
+ const refreshable = Array.from(this.providers.values()).filter((provider) => provider.refreshModels !== undefined);
288
+ await Promise.all(refreshable.map(async (provider) => {
289
+ if (options.signal?.aborted)
325
290
  return;
291
+ const store = {
292
+ read: () => this.modelsStore.read(provider.id),
293
+ write: (entry) => this.modelsStore.write(provider.id, entry),
294
+ delete: () => this.modelsStore.delete(provider.id)
295
+ };
296
+ let stored;
326
297
  try {
327
- await entry.refreshModels();
298
+ stored = await this.readCredential(provider.id);
299
+ const credential = await this.resolveRefreshCredential(provider, stored, allowNetwork, options.signal);
300
+ if (!credential)
301
+ return;
302
+ await provider.refreshModels({
303
+ credential,
304
+ store,
305
+ allowNetwork,
306
+ force: options.force,
307
+ signal: options.signal
308
+ });
328
309
  } catch (error) {
329
- if (error instanceof ModelsError)
330
- throw error;
331
- throw new ModelsError("model_source", `Model refresh failed for ${provider}`, { cause: error });
310
+ if (!options.signal?.aborted) {
311
+ errors.set(provider.id, error instanceof Error ? error : new ModelsError("model_source", `Model refresh failed for ${provider.id}`, { cause: error }));
312
+ }
313
+ try {
314
+ await provider.refreshModels({
315
+ credential: stored,
316
+ store,
317
+ allowNetwork: false,
318
+ signal: options.signal
319
+ });
320
+ } catch {}
332
321
  }
322
+ }));
323
+ return { aborted: options.signal?.aborted ?? false, errors };
324
+ }
325
+ async resolveRefreshCredential(provider, stored, allowNetwork, signal) {
326
+ if (stored?.type === "oauth") {
327
+ const oauth = provider.auth.oauth;
328
+ if (!oauth)
329
+ return;
330
+ if (!allowNetwork || Date.now() < stored.expires)
331
+ return stored;
332
+ if (signal?.aborted)
333
+ return;
334
+ const post = await this.credentials.modify(provider.id, async (current) => {
335
+ if (current?.type !== "oauth" || Date.now() < current.expires)
336
+ return;
337
+ return oauth.refresh(current, signal);
338
+ });
339
+ return post?.type === "oauth" ? post : undefined;
340
+ }
341
+ const apiKey = provider.auth.apiKey;
342
+ if (!apiKey)
333
343
  return;
344
+ const credential = stored?.type === "api_key" ? stored : undefined;
345
+ const result = await apiKey.resolve({ ctx: this.authContext, credential });
346
+ if (!result)
347
+ return;
348
+ return { type: "api_key", key: result.auth.apiKey, env: result.env };
349
+ }
350
+ async readCredential(providerId) {
351
+ try {
352
+ return await this.credentials.read(providerId);
353
+ } catch (error) {
354
+ throw new ModelsError("auth", `Credential store read failed for ${providerId}`, { cause: error });
334
355
  }
335
- await Promise.allSettled(Array.from(this.providers.values(), async (entry) => entry.refreshModels?.()));
336
356
  }
337
- async getAuth(model) {
338
- const provider = this.providers.get(model.provider);
357
+ async checkProviderAuth(provider, credential) {
358
+ if (credential?.type === "oauth") {
359
+ return provider.auth.oauth ? { source: "OAuth", type: "oauth" } : undefined;
360
+ }
361
+ const apiKey = provider.auth.apiKey;
362
+ if (!apiKey)
363
+ return;
364
+ if (apiKey.check) {
365
+ try {
366
+ return await apiKey.check({
367
+ ctx: this.authContext,
368
+ credential: credential?.type === "api_key" ? credential : undefined
369
+ });
370
+ } catch (error) {
371
+ throw new ModelsError("auth", `API key auth check failed for provider ${provider.id}`, { cause: error });
372
+ }
373
+ }
374
+ const resolution = await resolveProviderAuth(provider, this.credentials, this.authContext);
375
+ return resolution ? { source: resolution.source, type: "api_key" } : undefined;
376
+ }
377
+ async checkAuth(providerId) {
378
+ const provider = this.providers.get(providerId);
379
+ if (!provider)
380
+ return;
381
+ return this.checkProviderAuth(provider, await this.readCredential(providerId));
382
+ }
383
+ async getAvailable(providerId) {
384
+ const providers = providerId ? [this.providers.get(providerId)].filter((entry) => entry !== undefined) : this.getProviders();
385
+ const checks = await Promise.all(providers.map(async (provider) => {
386
+ const credential = await this.readCredential(provider.id);
387
+ return { provider, credential, auth: await this.checkProviderAuth(provider, credential) };
388
+ }));
389
+ return checks.flatMap(({ provider, credential, auth }) => {
390
+ if (!auth)
391
+ return [];
392
+ const models = provider.getModels();
393
+ return provider.filterModels?.(models, credential) ?? models;
394
+ });
395
+ }
396
+ async getAuth(providerOrModel, overrides) {
397
+ const providerId = typeof providerOrModel === "string" ? providerOrModel : providerOrModel.provider;
398
+ const provider = this.providers.get(providerId);
339
399
  if (!provider)
340
400
  return;
341
- return resolveProviderAuth(provider, model, this.credentials, this.authContext);
401
+ const result = await resolveProviderAuth(provider, this.credentials, this.authContext, overrides);
402
+ if (!result || typeof providerOrModel === "string" || !providerOrModel.headers)
403
+ return result;
404
+ return {
405
+ ...result,
406
+ auth: {
407
+ ...result.auth,
408
+ headers: mergeHeaders(result.auth.headers, providerOrModel.headers)
409
+ }
410
+ };
411
+ }
412
+ async login(providerId, type, interaction) {
413
+ const provider = this.providers.get(providerId);
414
+ if (!provider)
415
+ throw new ModelsError("provider", `Unknown provider: ${providerId}`);
416
+ const method = type === "oauth" ? provider.auth.oauth : provider.auth.apiKey;
417
+ if (!method?.login) {
418
+ throw new ModelsError("auth", `${provider.name} does not support ${type} login`);
419
+ }
420
+ const credential = await method.login(interaction);
421
+ try {
422
+ await this.credentials.modify(providerId, async () => credential);
423
+ } catch (error) {
424
+ throw new ModelsError("auth", `Credential store modify failed for ${providerId}`, { cause: error });
425
+ }
426
+ return credential;
427
+ }
428
+ async logout(providerId) {
429
+ try {
430
+ await this.credentials.delete(providerId);
431
+ } catch (error) {
432
+ throw new ModelsError("auth", `Credential store delete failed for ${providerId}`, { cause: error });
433
+ }
342
434
  }
343
435
  requireProvider(model) {
344
436
  const provider = this.providers.get(model.provider);
@@ -348,18 +440,23 @@ class ModelsImpl {
348
440
  return provider;
349
441
  }
350
442
  async applyAuth(model, options) {
351
- const resolution = await resolveProviderAuth(this.requireProvider(model), model, this.credentials, this.authContext, {
443
+ this.requireProvider(model);
444
+ const resolution = await this.getAuth(model, {
352
445
  apiKey: options?.apiKey,
353
446
  env: options?.env
354
447
  });
355
- const auth = resolution?.auth;
356
- if (!auth)
357
- return { requestModel: model, requestOptions: options };
358
- const requestModel = auth.baseUrl ? { ...model, baseUrl: auth.baseUrl } : model;
448
+ if (!resolution) {
449
+ throw new ModelsError("auth", `Provider is not configured: ${model.provider}`);
450
+ }
451
+ const auth = resolution.auth;
359
452
  const apiKey = options?.apiKey ?? auth.apiKey;
360
- const headers = auth.headers || options?.headers ? { ...auth.headers, ...options?.headers } : undefined;
453
+ let headers = mergeHeaders(auth.headers, options?.headers);
454
+ if (options?.transformHeaders)
455
+ headers = await options.transformHeaders(headers ?? {});
361
456
  const env = resolution.env || options?.env ? { ...resolution.env ?? {}, ...options?.env ?? {} } : undefined;
362
- const requestOptions = { ...options, apiKey, headers, env };
457
+ const requestModel = auth.baseUrl ? { ...model, baseUrl: auth.baseUrl } : model;
458
+ const { transformHeaders: _transformHeaders, ...providerOptions } = options ?? {};
459
+ const requestOptions = { ...providerOptions, apiKey, headers, env };
363
460
  return { requestModel, requestOptions };
364
461
  }
365
462
  stream(model, context, options) {
@@ -387,9 +484,21 @@ function createModels(options) {
387
484
  return new ModelsImpl(options);
388
485
  }
389
486
  function createProvider(input) {
390
- let models = input.models;
487
+ const baselineModels = input.models;
488
+ let dynamicModels = [];
391
489
  let inflightRefresh;
392
- const refreshModels = input.refreshModels;
490
+ const fetchModels = input.fetchModels;
491
+ const currentModels = () => {
492
+ const merged = [...baselineModels];
493
+ for (const model of dynamicModels) {
494
+ const index = merged.findIndex((entry) => entry.id === model.id);
495
+ if (index >= 0)
496
+ merged[index] = model;
497
+ else
498
+ merged.push(model);
499
+ }
500
+ return merged;
501
+ };
393
502
  const single = typeof input.api.stream === "function" ? input.api : undefined;
394
503
  const byApi = single ? undefined : input.api;
395
504
  const apiFor = (model) => single ?? byApi?.[model.api];
@@ -408,17 +517,28 @@ function createProvider(input) {
408
517
  baseUrl: input.baseUrl,
409
518
  headers: input.headers,
410
519
  auth: input.auth,
411
- getModels: () => models,
412
- refreshModels: refreshModels ? () => {
520
+ getModels: currentModels,
521
+ refreshModels: fetchModels ? (context) => {
413
522
  inflightRefresh ??= (async () => {
414
523
  try {
415
- models = await refreshModels();
524
+ const stored = await context.store.read();
525
+ if (stored) {
526
+ dynamicModels = stored.models.filter((model) => model.provider === input.id).map((model) => model);
527
+ }
528
+ if (!context.allowNetwork || context.signal?.aborted)
529
+ return;
530
+ const refreshed = await fetchModels(context);
531
+ if (context.signal?.aborted)
532
+ return;
533
+ dynamicModels = refreshed;
534
+ await context.store.write({ models: refreshed, checkedAt: Date.now() });
416
535
  } finally {
417
536
  inflightRefresh = undefined;
418
537
  }
419
538
  })();
420
539
  return inflightRefresh;
421
540
  } : undefined,
541
+ filterModels: input.filterModels,
422
542
  stream: (model, context, options) => dispatch(model, (streams) => streams.stream(model, context, options)),
423
543
  streamSimple: (model, context, options) => dispatch(model, (streams) => streams.streamSimple(model, context, options))
424
544
  };
@@ -427,16 +547,25 @@ function hasApi(model, api) {
427
547
  return model.api === api;
428
548
  }
429
549
  function calculateCost(model, usage) {
550
+ const inputTokens = usage.input + usage.cacheRead + usage.cacheWrite;
551
+ let rates = model.cost;
552
+ let matchedThreshold = -1;
553
+ for (const tier of model.cost.tiers ?? []) {
554
+ if (inputTokens > tier.inputTokensAbove && tier.inputTokensAbove > matchedThreshold) {
555
+ rates = tier;
556
+ matchedThreshold = tier.inputTokensAbove;
557
+ }
558
+ }
430
559
  const longWrite = usage.cacheWrite1h ?? 0;
431
560
  const shortWrite = usage.cacheWrite - longWrite;
432
- usage.cost.input = model.cost.input / 1e6 * usage.input;
433
- usage.cost.output = model.cost.output / 1e6 * usage.output;
434
- usage.cost.cacheRead = model.cost.cacheRead / 1e6 * usage.cacheRead;
435
- usage.cost.cacheWrite = (model.cost.cacheWrite * shortWrite + model.cost.input * 2 * longWrite) / 1e6;
561
+ usage.cost.input = rates.input / 1e6 * usage.input;
562
+ usage.cost.output = rates.output / 1e6 * usage.output;
563
+ usage.cost.cacheRead = rates.cacheRead / 1e6 * usage.cacheRead;
564
+ usage.cost.cacheWrite = (rates.cacheWrite * shortWrite + rates.input * 2 * longWrite) / 1e6;
436
565
  usage.cost.total = usage.cost.input + usage.cost.output + usage.cost.cacheRead + usage.cost.cacheWrite;
437
566
  return usage.cost;
438
567
  }
439
- var EXTENDED_THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh"];
568
+ var EXTENDED_THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
440
569
  function getSupportedThinkingLevels(model) {
441
570
  if (!model.reasoning)
442
571
  return ["off"];
@@ -444,7 +573,7 @@ function getSupportedThinkingLevels(model) {
444
573
  const mapped = model.thinkingLevelMap?.[level];
445
574
  if (mapped === null)
446
575
  return false;
447
- if (level === "xhigh")
576
+ if (level === "xhigh" || level === "max")
448
577
  return mapped !== undefined;
449
578
  return true;
450
579
  });
@@ -474,4 +603,4 @@ function modelsAreEqual(a, b) {
474
603
  return a.id === b.id && a.provider === b.provider;
475
604
  }
476
605
 
477
- export { EventStream, AssistantMessageEventStream, createAssistantMessageEventStream, lazyStream, lazyApi, defaultProviderAuthContext, InMemoryCredentialStore, ModelsError, resolveProviderAuth, createModels, createProvider, hasApi, calculateCost, getSupportedThinkingLevels, clampThinkingLevel, modelsAreEqual };
606
+ export { lazyStream, lazyApi, defaultProviderAuthContext, InMemoryCredentialStore, ModelsError, resolveProviderAuth, InMemoryModelsStore, createModels, createProvider, hasApi, calculateCost, getSupportedThinkingLevels, clampThinkingLevel, modelsAreEqual };
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  getDb,
6
6
  init_db
7
- } from "./cli-7mvmqemc.js";
7
+ } from "./cli-g6qz2kts.js";
8
8
 
9
9
  // src/be/rbac-roles.ts
10
10
  init_db();
@@ -1,17 +1,17 @@
1
1
  import {
2
2
  createAdditiveBuffer,
3
3
  extractSlackMessageText
4
- } from "./cli-jfc1jm13.js";
4
+ } from "./cli-d1reabed.js";
5
5
  import {
6
6
  getSlackApp,
7
7
  registerTreeMessage
8
- } from "./cli-k0x0fvh5.js";
8
+ } from "./cli-vg1jxfqz.js";
9
9
  import {
10
10
  rewriteSlackMentions
11
- } from "./cli-pyagab0x.js";
11
+ } from "./cli-gdqdkr3j.js";
12
12
  import {
13
13
  createTaskWithSiblingAwareness
14
- } from "./cli-758zm6xy.js";
14
+ } from "./cli-q8dway4w.js";
15
15
  import {
16
16
  buildBufferFlushBlocks
17
17
  } from "./cli-ma04faw5.js";
@@ -24,7 +24,7 @@ import {
24
24
  init_registry,
25
25
  registerTemplate,
26
26
  slackContextKey
27
- } from "./cli-7mvmqemc.js";
27
+ } from "./cli-g6qz2kts.js";
28
28
 
29
29
  // src/slack/event-dedup.ts
30
30
  var DEFAULT_TTL_MS = 300000;
@@ -4,11 +4,11 @@ import {
4
4
  getEmbeddingProvider,
5
5
  init_embedding,
6
6
  serializeEmbedding
7
- } from "./cli-8jjrc3ww.js";
7
+ } from "./cli-r93nz80j.js";
8
8
  import {
9
9
  getDb,
10
10
  init_db
11
- } from "./cli-7mvmqemc.js";
11
+ } from "./cli-g6qz2kts.js";
12
12
  import {
13
13
  init_secret_scrubber,
14
14
  scrubSecrets
@@ -1,15 +1,15 @@
1
+ import {
2
+ checkCodexCredentials
3
+ } from "./cli-da3x3btq.js";
1
4
  import {
2
5
  checkClaudeManagedCredentials
3
- } from "./cli-sznberje.js";
6
+ } from "./cli-2r7s8jhp.js";
4
7
  import {
5
8
  checkDevinCredentials
6
9
  } from "./cli-tyfxrrdd.js";
7
10
  import {
8
11
  checkOpencodeCredentials
9
- } from "./cli-bc89my0z.js";
10
- import {
11
- checkCodexCredentials
12
- } from "./cli-dh9eb7tt.js";
12
+ } from "./cli-branks1w.js";
13
13
  import {
14
14
  initOtel,
15
15
  injectTraceContext,
@@ -19,7 +19,7 @@ import {
19
19
  withSpan,
20
20
  withSpanContext,
21
21
  writeSkillsToFilesystem
22
- } from "./cli-4xtzqzv4.js";
22
+ } from "./cli-ner6af7m.js";
23
23
  import {
24
24
  authJsonToCredentialSelection,
25
25
  credentialsToAuthJson,
@@ -27,7 +27,7 @@ import {
27
27
  } from "./cli-tk9vyqzh.js";
28
28
  import {
29
29
  checkClaudeCredentials
30
- } from "./cli-mnbgv3w7.js";
30
+ } from "./cli-mw3xpgwb.js";
31
31
  import {
32
32
  MAX_RATE_LIMIT_RESET_MS,
33
33
  isCodexCreditsExhaustedMessage,
@@ -41,10 +41,10 @@ import {
41
41
  import {
42
42
  ensure,
43
43
  initialize
44
- } from "./cli-67e8g7bj.js";
44
+ } from "./cli-gg5bd32n.js";
45
45
  import {
46
46
  validateJsonSchema
47
- } from "./cli-fhmhjjh4.js";
47
+ } from "./cli-qw1ccvxm.js";
48
48
  import {
49
49
  getApiKey
50
50
  } from "./cli-f14fvzag.js";
@@ -80,7 +80,7 @@ import {
80
80
  resolveTaskModelSelection,
81
81
  resolveTemplateAsync,
82
82
  telemetry
83
- } from "./cli-7mvmqemc.js";
83
+ } from "./cli-g6qz2kts.js";
84
84
  import {
85
85
  init_credentials,
86
86
  resolveCredentialPools
@@ -449,19 +449,19 @@ async function materializeCodexAuthJson(_slot, creds, deps = {}) {
449
449
  async function createProviderAdapter(provider) {
450
450
  switch (provider) {
451
451
  case "claude": {
452
- const { ClaudeAdapter } = await import("./claude-adapter-3csn5bks.js");
452
+ const { ClaudeAdapter } = await import("./claude-adapter-9n3nzt65.js");
453
453
  return new ClaudeAdapter;
454
454
  }
455
455
  case "pi": {
456
- const { PiMonoAdapter } = await import("./pi-mono-adapter-erghwha0.js");
456
+ const { PiMonoAdapter } = await import("./pi-mono-adapter-9sg69kg3.js");
457
457
  return new PiMonoAdapter;
458
458
  }
459
459
  case "codex": {
460
- const { CodexAdapter } = await import("./codex-adapter-efskwfc4.js");
460
+ const { CodexAdapter } = await import("./codex-adapter-6j2b38tg.js");
461
461
  return new CodexAdapter;
462
462
  }
463
463
  case "claude-managed": {
464
- const { ClaudeManagedAdapter } = await import("./claude-managed-adapter-kysmkz89.js");
464
+ const { ClaudeManagedAdapter } = await import("./claude-managed-adapter-pv2nbqy4.js");
465
465
  return new ClaudeManagedAdapter;
466
466
  }
467
467
  case "devin": {
@@ -469,7 +469,7 @@ async function createProviderAdapter(provider) {
469
469
  return new DevinAdapter;
470
470
  }
471
471
  case "opencode": {
472
- const { OpencodeAdapter } = await import("./opencode-adapter-p6bxnbm4.js");
472
+ const { OpencodeAdapter } = await import("./opencode-adapter-5bwzvbwj.js");
473
473
  return new OpencodeAdapter;
474
474
  }
475
475
  default:
@@ -1117,7 +1117,7 @@ async function checkProviderCredentials(provider, env, opts) {
1117
1117
  case "opencode":
1118
1118
  return checkOpencodeCredentials(env, opts);
1119
1119
  case "pi": {
1120
- const { checkPiMonoCredentials } = await import("./pi-mono-adapter-erghwha0.js");
1120
+ const { checkPiMonoCredentials } = await import("./pi-mono-adapter-9sg69kg3.js");
1121
1121
  return checkPiMonoCredentials(env, opts);
1122
1122
  }
1123
1123
  default:
@@ -18,7 +18,7 @@ import {
18
18
  init_templates1 as init_templates,
19
19
  normalizeDateRequired,
20
20
  resolveTemplate
21
- } from "./cli-7mvmqemc.js";
21
+ } from "./cli-g6qz2kts.js";
22
22
 
23
23
  // src/be/db-queries/tracker.ts
24
24
  init_date_utils();
@@ -8,7 +8,7 @@ import {
8
8
  init_date_utils,
9
9
  init_db,
10
10
  normalizeDateRequired
11
- } from "./cli-7mvmqemc.js";
11
+ } from "./cli-g6qz2kts.js";
12
12
 
13
13
  // src/be/db-queries/oauth.ts
14
14
  init_date_utils();