lua-cli 3.29.0 → 3.29.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -686,6 +686,64 @@ function buildDefaultPersona(agentName) {
686
686
  function buildPersonalSpaceStartingPersona(agentName) {
687
687
  return PERSONAL_SPACE_STARTING_PERSONA.replace(new RegExp(AGENT_NAME_TOKEN.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g"), () => agentName || "Your assistant");
688
688
  }
689
+ function isRecord(value) {
690
+ return typeof value === "object" && value !== null;
691
+ }
692
+ function isCoreDrainingErrorResponse(value) {
693
+ if (!isRecord(value) || !isRecord(value.error)) return false;
694
+ return value.error.code === CORE_DRAINING_CODE && typeof value.error.message === "string" && value.error.retryable === true;
695
+ }
696
+ function coreDrainingRetryDelayMs(retryAfter, nowMs = Date.now()) {
697
+ if (retryAfter === null) return CORE_DRAINING_DEFAULT_RETRY_MS;
698
+ const seconds = /^\d+$/.test(retryAfter.trim()) ? Number(retryAfter) : Number.NaN;
699
+ const delayMs = Number.isFinite(seconds) ? seconds * 1e3 : Date.parse(retryAfter) - nowMs;
700
+ if (!Number.isFinite(delayMs)) return CORE_DRAINING_DEFAULT_RETRY_MS;
701
+ return Math.min(Math.max(0, delayMs), CORE_DRAINING_MAX_RETRY_MS);
702
+ }
703
+ async function readCoreDrainingRetryDelayMs(response) {
704
+ if (response.status !== 503) return null;
705
+ try {
706
+ const payload = await response.clone().json();
707
+ if (!isCoreDrainingErrorResponse(payload)) return null;
708
+ } catch {
709
+ return null;
710
+ }
711
+ return coreDrainingRetryDelayMs(response.headers.get("Retry-After"));
712
+ }
713
+ function waitForCoreDrain(delayMs, signal) {
714
+ return new Promise((resolve7, reject) => {
715
+ if (signal?.aborted) {
716
+ reject(signal.reason ?? new DOMException("Aborted", "AbortError"));
717
+ return;
718
+ }
719
+ const timer = setTimeout(() => {
720
+ signal?.removeEventListener("abort", onAbort);
721
+ resolve7();
722
+ }, delayMs);
723
+ function onAbort() {
724
+ clearTimeout(timer);
725
+ reject(signal?.reason ?? new DOMException("Aborted", "AbortError"));
726
+ }
727
+ __name(onAbort, "onAbort");
728
+ __name2(onAbort, "onAbort");
729
+ signal?.addEventListener("abort", onAbort, {
730
+ once: true
731
+ });
732
+ });
733
+ }
734
+ async function fetchWithCoreDrainRetry(run, options = {}) {
735
+ const first = await run();
736
+ const delayMs = await readCoreDrainingRetryDelayMs(first);
737
+ if (delayMs === null) return first;
738
+ options.onRetry?.({
739
+ attempt: 1,
740
+ maxAttempts: 2,
741
+ delayMs
742
+ });
743
+ await first.body?.cancel();
744
+ await waitForCoreDrain(delayMs, options.signal);
745
+ return run();
746
+ }
689
747
  function resolveLuaJobTimeoutSeconds(timeout) {
690
748
  const resolved = timeout ?? LUA_JOB_DEFAULT_TIMEOUT_SECONDS;
691
749
  if (!Number.isInteger(resolved)) {
@@ -794,7 +852,7 @@ function isKnownProfile(profiles, profileId) {
794
852
  function hasCapability(profiles, profileId, required) {
795
853
  return capabilitiesFor(profiles, profileId).includes(required);
796
854
  }
797
- var __defProp2, __name2, REVIEWABLE_ACTION_EXECUTE_TOOL_ALLOWLIST, REVIEWABLE_MCP_SEND_TOOL_SUFFIX, MCP_TOOL_READ_VERB_RE, MCP_DRAFT_CREATE_VERBS, NON_INTERACTIVE_CHANNELS, RICH_PARTS_MESSAGE_ID_PREFIX, SCREENSHOT_MESSAGE_ID_PREFIX, BROWSER_COMMANDS, BROWSER_COMMAND_NAMES, DESKTOP_FILE_COMMANDS, DESKTOP_FILE_COMMAND_SET, REASONING_EFFORT_VALUES, IMPLICIT_MODEL_SELECTION_SOURCES, AGENT_NAME_TOKEN, DEFAULT_PERSONA_GUIDE, PERSONAL_SPACE_STARTING_PERSONA, AGENT_LOG_SOURCES, VoiceNameSchema, PluginProviderSchema, RealtimeProviderSchema, PluginClassSchema, ModelDescriptorSchema, InferenceModelSchema, PluginModelSchema, RealtimeModelSchema, LuaVoiceModelSchema, TurnDetectionSchema, InterruptionSchema, BuiltinAudioClipSchema, AudioConfigSchema, BackgroundAudioEntrySchema, BackgroundAudioSchema, LuaVoiceConfigInnerSchema, LuaVoiceConfigSchema, LuaVoiceRefSchema, LUA_JOB_DEFAULT_TIMEOUT_SECONDS, LUA_JOB_MIN_TIMEOUT_SECONDS, LUA_JOB_MAX_TIMEOUT_SECONDS, TEMPLATE_TRIGGER_URL_ENV_PREFIX, SUBJECT_TYPES, SubjectTypeSchema, CREDENTIAL_TYPES, CredentialTypeSchema, DEVICE_OPERATIONS, DeviceOperationSchema, DEVICE_SCOPE_BY_OPERATION, DeviceBindingSchema, TYPED_API_KEY, IdSchema, PrincipalDescriptorSchema, ActorDescriptorSchema, PrincipalOwnerSchema, CredentialLifecycleSchema, GeneralCredentialDescriptorSchema, DeviceCredentialDescriptorSchema, GeneralPrincipalContextSchema, DeviceCredentialPrincipalContextSchema, RawPrincipalContextSchema, PrincipalContextSchema, DeviceCredentialClaimSchema, LUA_CLIENT_HEADER, LUA_CLIENT_APPS, SEMVER_PATTERN, WEB_RELEASE_PATTERN, CLIENT_HEADER_PATTERN, AUTHZ_PROJECTION_VERSION, ProjectedScopeSchema, DisplayRoleSchema, AuthorizationPrincipalSchema, CredentialContextSchema, ProjectionAnomalySchema, ProjectedOrgSchema, ProjectedResourceSchema, CapabilityProfilesSchema, RoleCatalogSchema, EffectiveAuthorizationSchema, ResourcePageSchema;
855
+ var __defProp2, __name2, REVIEWABLE_ACTION_EXECUTE_TOOL_ALLOWLIST, REVIEWABLE_MCP_SEND_TOOL_SUFFIX, MCP_TOOL_READ_VERB_RE, MCP_DRAFT_CREATE_VERBS, NON_INTERACTIVE_CHANNELS, RICH_PARTS_MESSAGE_ID_PREFIX, SCREENSHOT_MESSAGE_ID_PREFIX, BROWSER_COMMANDS, BROWSER_COMMAND_NAMES, DESKTOP_FILE_COMMANDS, DESKTOP_FILE_COMMAND_SET, REASONING_EFFORT_VALUES, IMPLICIT_MODEL_SELECTION_SOURCES, AGENT_NAME_TOKEN, DEFAULT_PERSONA_GUIDE, PERSONAL_SPACE_STARTING_PERSONA, AGENT_LOG_SOURCES, CORE_DRAINING_CODE, CORE_DRAINING_DEFAULT_RETRY_MS, CORE_DRAINING_MAX_RETRY_MS, VoiceNameSchema, PluginProviderSchema, RealtimeProviderSchema, PluginClassSchema, ModelDescriptorSchema, InferenceModelSchema, PluginModelSchema, RealtimeModelSchema, LuaVoiceModelSchema, TurnDetectionSchema, InterruptionSchema, BuiltinAudioClipSchema, AudioConfigSchema, BackgroundAudioEntrySchema, BackgroundAudioSchema, LuaVoiceConfigInnerSchema, LuaVoiceConfigSchema, LuaVoiceRefSchema, LUA_JOB_DEFAULT_TIMEOUT_SECONDS, LUA_JOB_MIN_TIMEOUT_SECONDS, LUA_JOB_MAX_TIMEOUT_SECONDS, TEMPLATE_TRIGGER_URL_ENV_PREFIX, SUBJECT_TYPES, SubjectTypeSchema, CREDENTIAL_TYPES, CredentialTypeSchema, DEVICE_OPERATIONS, DeviceOperationSchema, DEVICE_SCOPE_BY_OPERATION, DeviceBindingSchema, TYPED_API_KEY, IdSchema, PrincipalDescriptorSchema, ActorDescriptorSchema, PrincipalOwnerSchema, CredentialLifecycleSchema, GeneralCredentialDescriptorSchema, DeviceCredentialDescriptorSchema, GeneralPrincipalContextSchema, DeviceCredentialPrincipalContextSchema, RawPrincipalContextSchema, PrincipalContextSchema, DeviceCredentialClaimSchema, LUA_CLIENT_HEADER, LUA_CLIENT_APPS, SEMVER_PATTERN, WEB_RELEASE_PATTERN, CLIENT_HEADER_PATTERN, AUTHZ_PROJECTION_VERSION, ProjectedScopeSchema, DisplayRoleSchema, AuthorizationPrincipalSchema, CredentialContextSchema, ProjectionAnomalySchema, ProjectedOrgSchema, ProjectedResourceSchema, CapabilityProfilesSchema, RoleCatalogSchema, EffectiveAuthorizationSchema, ResourcePageSchema;
798
856
  var init_dist = __esm({
799
857
  "../shared-types/dist/index.mjs"() {
800
858
  "use strict";
@@ -1216,6 +1274,21 @@ This text is who you are for this person. As you learn them, their name, their w
1216
1274
  "device-trigger",
1217
1275
  "model-resolver"
1218
1276
  ];
1277
+ CORE_DRAINING_CODE = "CORE_DRAINING";
1278
+ CORE_DRAINING_DEFAULT_RETRY_MS = 1e3;
1279
+ CORE_DRAINING_MAX_RETRY_MS = 5e3;
1280
+ __name(isRecord, "isRecord");
1281
+ __name2(isRecord, "isRecord");
1282
+ __name(isCoreDrainingErrorResponse, "isCoreDrainingErrorResponse");
1283
+ __name2(isCoreDrainingErrorResponse, "isCoreDrainingErrorResponse");
1284
+ __name(coreDrainingRetryDelayMs, "coreDrainingRetryDelayMs");
1285
+ __name2(coreDrainingRetryDelayMs, "coreDrainingRetryDelayMs");
1286
+ __name(readCoreDrainingRetryDelayMs, "readCoreDrainingRetryDelayMs");
1287
+ __name2(readCoreDrainingRetryDelayMs, "readCoreDrainingRetryDelayMs");
1288
+ __name(waitForCoreDrain, "waitForCoreDrain");
1289
+ __name2(waitForCoreDrain, "waitForCoreDrain");
1290
+ __name(fetchWithCoreDrainRetry, "fetchWithCoreDrainRetry");
1291
+ __name2(fetchWithCoreDrainRetry, "fetchWithCoreDrainRetry");
1219
1292
  VoiceNameSchema = z.string().regex(/^[a-zA-Z0-9_-]+$/, "Voice name must contain only alphanumeric characters, underscores, or hyphens").min(1).max(64);
1220
1293
  PluginProviderSchema = z.enum([
1221
1294
  "deepgram",
@@ -1809,20 +1882,40 @@ var init_lua_fetch = __esm({
1809
1882
  });
1810
1883
 
1811
1884
  // src/services/firebase-session.ts
1885
+ import { z as z4 } from "zod";
1812
1886
  function requireFirebaseWebApiKey() {
1813
1887
  if (!FIREBASE_WEB_API_KEY) {
1814
1888
  throw new Error("Firebase sign-in is not configured for this CLI build.");
1815
1889
  }
1816
1890
  return FIREBASE_WEB_API_KEY;
1817
1891
  }
1892
+ function uidFromFirebaseIdToken(idToken) {
1893
+ const segments = idToken.split(".");
1894
+ if (segments.length !== 3 || !segments[1]) throw new Error(INVALID_FIREBASE_SESSION);
1895
+ let payload;
1896
+ try {
1897
+ payload = JSON.parse(Buffer.from(segments[1], "base64url").toString("utf8"));
1898
+ } catch {
1899
+ throw new Error(INVALID_FIREBASE_SESSION);
1900
+ }
1901
+ const parsed = firebaseIdTokenPayloadSchema.safeParse(payload);
1902
+ if (parsed.success) return parsed.data.sub;
1903
+ throw new Error(INVALID_FIREBASE_SESSION);
1904
+ }
1818
1905
  function parseFirebaseSession(json, now = Date.now()) {
1819
- const idToken = json.idToken ?? json.id_token;
1820
- const refreshToken = json.refreshToken ?? json.refresh_token;
1821
- const expiresIn = Number(json.expiresIn ?? json.expires_in);
1822
- const uid = json.localId ?? json.user_id;
1823
- if (typeof idToken !== "string" || idToken.length === 0 || typeof refreshToken !== "string" || refreshToken.length === 0 || typeof uid !== "string" || uid.length === 0 || !Number.isFinite(expiresIn) || expiresIn <= 0) {
1824
- throw new Error("Sign-in failed because Firebase returned an invalid session.");
1906
+ const customTokenResponse = customTokenResponseSchema.safeParse(json);
1907
+ if (customTokenResponse.success) {
1908
+ const { idToken: idToken2, refreshToken: refreshToken2, expiresIn: expiresIn2, localId } = customTokenResponse.data;
1909
+ return {
1910
+ idToken: idToken2,
1911
+ refreshToken: refreshToken2,
1912
+ expiresAt: now + expiresIn2 * 1e3,
1913
+ uid: localId ?? uidFromFirebaseIdToken(idToken2)
1914
+ };
1825
1915
  }
1916
+ const refreshResponse = refreshResponseSchema.safeParse(json);
1917
+ if (!refreshResponse.success) throw new Error(INVALID_FIREBASE_SESSION);
1918
+ const { id_token: idToken, refresh_token: refreshToken, expires_in: expiresIn, user_id: uid } = refreshResponse.data;
1826
1919
  return {
1827
1920
  idToken,
1828
1921
  refreshToken,
@@ -1896,7 +1989,7 @@ async function refreshFirebaseSession(session) {
1896
1989
  if (refreshed.uid !== session.uid) throw new Error("Firebase session refresh returned a different identity.");
1897
1990
  return refreshed;
1898
1991
  }
1899
- var FIREBASE_CUSTOM_TOKEN_URL, FIREBASE_REFRESH_URL, FIREBASE_REQUEST_TIMEOUT_MS;
1992
+ var FIREBASE_CUSTOM_TOKEN_URL, FIREBASE_REFRESH_URL, FIREBASE_REQUEST_TIMEOUT_MS, INVALID_FIREBASE_SESSION, customTokenResponseSchema, refreshResponseSchema, firebaseIdTokenPayloadSchema;
1900
1993
  var init_firebase_session = __esm({
1901
1994
  "src/services/firebase-session.ts"() {
1902
1995
  "use strict";
@@ -1904,7 +1997,24 @@ var init_firebase_session = __esm({
1904
1997
  FIREBASE_CUSTOM_TOKEN_URL = "https://identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken";
1905
1998
  FIREBASE_REFRESH_URL = "https://securetoken.googleapis.com/v1/token";
1906
1999
  FIREBASE_REQUEST_TIMEOUT_MS = 15e3;
2000
+ INVALID_FIREBASE_SESSION = "Sign-in failed because Firebase returned an invalid session.";
2001
+ customTokenResponseSchema = z4.object({
2002
+ idToken: z4.string().min(1),
2003
+ refreshToken: z4.string().min(1),
2004
+ expiresIn: z4.coerce.number().positive().finite(),
2005
+ localId: z4.string().min(1).optional()
2006
+ });
2007
+ refreshResponseSchema = z4.object({
2008
+ id_token: z4.string().min(1),
2009
+ refresh_token: z4.string().min(1),
2010
+ expires_in: z4.coerce.number().positive().finite(),
2011
+ user_id: z4.string().min(1)
2012
+ });
2013
+ firebaseIdTokenPayloadSchema = z4.object({
2014
+ sub: z4.string().min(1)
2015
+ });
1907
2016
  __name(requireFirebaseWebApiKey, "requireFirebaseWebApiKey");
2017
+ __name(uidFromFirebaseIdToken, "uidFromFirebaseIdToken");
1908
2018
  __name(parseFirebaseSession, "parseFirebaseSession");
1909
2019
  __name(parseFirebaseError, "parseFirebaseError");
1910
2020
  __name(fetchFirebase, "fetchFirebase");
@@ -1917,7 +2027,7 @@ var init_firebase_session = __esm({
1917
2027
  import { createHash, randomUUID } from "crypto";
1918
2028
  import { mkdir, open, readFile, rename, unlink } from "fs/promises";
1919
2029
  import { join as join3 } from "path";
1920
- import { z as z4 } from "zod";
2030
+ import { z as z5 } from "zod";
1921
2031
  function environmentKey(environment) {
1922
2032
  return createHash("sha256").update(`${environment.apiUrl}
1923
2033
  ${environment.authUrl}
@@ -1931,15 +2041,15 @@ var init_firebase_session_store = __esm({
1931
2041
  "src/services/firebase-session-store.ts"() {
1932
2042
  "use strict";
1933
2043
  init_constants();
1934
- storedFirebaseSessionSchema = z4.object({
1935
- version: z4.literal(1),
1936
- kind: z4.literal("firebase-session"),
1937
- generation: z4.string().min(1),
1938
- refreshToken: z4.string().min(1),
1939
- firebaseUid: z4.string().min(1),
1940
- apiUrl: z4.string().url(),
1941
- authUrl: z4.string().url(),
1942
- firebaseWebApiKey: z4.string().min(1)
2044
+ storedFirebaseSessionSchema = z5.object({
2045
+ version: z5.literal(1),
2046
+ kind: z5.literal("firebase-session"),
2047
+ generation: z5.string().min(1),
2048
+ refreshToken: z5.string().min(1),
2049
+ firebaseUid: z5.string().min(1),
2050
+ apiUrl: z5.string().url(),
2051
+ authUrl: z5.string().url(),
2052
+ firebaseWebApiKey: z5.string().min(1)
1943
2053
  });
1944
2054
  currentFirebaseSessionEnvironment = /* @__PURE__ */ __name(() => ({
1945
2055
  apiUrl: BASE_URLS.API,
@@ -2329,12 +2439,25 @@ import { randomUUID as randomUUID3 } from "crypto";
2329
2439
  function parseRetryAfter(raw) {
2330
2440
  if (!raw) return void 0;
2331
2441
  const seconds = Number.parseInt(raw, 10);
2332
- return Number.isFinite(seconds) && seconds > 0 ? seconds : void 0;
2442
+ return Number.isFinite(seconds) && seconds >= 0 ? seconds : void 0;
2443
+ }
2444
+ function isCoreDrainApiError(error) {
2445
+ if (!error || error.statusCode !== 503) return false;
2446
+ return isCoreDrainingErrorResponse({
2447
+ error: error.error
2448
+ });
2449
+ }
2450
+ function coreDrainApiRetryDelayMs(error) {
2451
+ const retryAfterSeconds = error?.retryAfterSeconds;
2452
+ if (retryAfterSeconds === void 0) return CORE_DRAINING_DEFAULT_RETRY_MS;
2453
+ const delayMs = retryAfterSeconds * 1e3;
2454
+ return Math.min(Math.max(0, delayMs), CORE_DRAINING_MAX_RETRY_MS);
2333
2455
  }
2334
2456
  var HttpClient;
2335
2457
  var init_http_client = __esm({
2336
2458
  "src/api/http.client.ts"() {
2337
2459
  "use strict";
2460
+ init_dist();
2338
2461
  init_auth_error();
2339
2462
  init_lua_fetch();
2340
2463
  init_request_credential();
@@ -2553,6 +2676,12 @@ Check that your Lua login has access to this agent or organization.`);
2553
2676
  headers
2554
2677
  }, 0);
2555
2678
  }
2679
+ async httpPostCoreDrainRetry(url, data, headers) {
2680
+ const first = await this.httpPostOnce(url, data, headers);
2681
+ if (!isCoreDrainApiError(first.error)) return first;
2682
+ await new Promise((resolve7) => setTimeout(resolve7, coreDrainApiRetryDelayMs(first.error)));
2683
+ return this.httpPostOnce(url, data, headers);
2684
+ }
2556
2685
  /**
2557
2686
  * Performs an HTTP PUT request
2558
2687
  * @param url - The relative URL path to request (will be appended to baseUrl)
@@ -2598,6 +2727,8 @@ Check that your Lua login has access to this agent or organization.`);
2598
2727
  }
2599
2728
  };
2600
2729
  __name(parseRetryAfter, "parseRetryAfter");
2730
+ __name(isCoreDrainApiError, "isCoreDrainApiError");
2731
+ __name(coreDrainApiRetryDelayMs, "coreDrainApiRetryDelayMs");
2601
2732
  }
2602
2733
  });
2603
2734
 
@@ -5434,7 +5565,7 @@ async function ensureSchemaConverterReady() {
5434
5565
  await loadVendor();
5435
5566
  }
5436
5567
  async function zodToJsonSchema(schemaNode) {
5437
- const { z: z5, zodToJsonSchema: convertSchema } = await loadVendor();
5568
+ const { z: z6, zodToJsonSchema: convertSchema } = await loadVendor();
5438
5569
  try {
5439
5570
  const sourceFile = schemaNode.getSourceFile();
5440
5571
  const project = sourceFile.getProject();
@@ -5447,7 +5578,7 @@ async function zodToJsonSchema(schemaNode) {
5447
5578
  environment: {
5448
5579
  preset: "NODE",
5449
5580
  extra: {
5450
- z: z5
5581
+ z: z6
5451
5582
  }
5452
5583
  },
5453
5584
  policy: {
@@ -5495,10 +5626,10 @@ function cleanJsonSchema(schema) {
5495
5626
  return cleanSchema;
5496
5627
  }
5497
5628
  async function zodStringToJsonSchema(zodSchemaCode) {
5498
- const { z: z5, zodToJsonSchema: convertSchema } = await loadVendor();
5629
+ const { z: z6, zodToJsonSchema: convertSchema } = await loadVendor();
5499
5630
  try {
5500
5631
  const evalFunction = new Function("z", `return ${zodSchemaCode}`);
5501
- const zodSchema = evalFunction(z5);
5632
+ const zodSchema = evalFunction(z6);
5502
5633
  const jsonSchema = convertSchema(zodSchema, {
5503
5634
  target: "jsonSchema7"
5504
5635
  });
@@ -13988,7 +14119,7 @@ var init_agents_api_service = __esm({
13988
14119
  });
13989
14120
  if (body.identifier) query.set("identifier", body.identifier);
13990
14121
  const chatBody = this.toChatGenerateBody(body);
13991
- return this.httpPost(`/chat/generate/${targetAgentId}?${query.toString()}`, chatBody, {});
14122
+ return this.httpPostCoreDrainRetry(`/chat/generate/${targetAgentId}?${query.toString()}`, chatBody, {});
13992
14123
  }
13993
14124
  /**
13994
14125
  * Sandbox overload: mirrors the `AI.generate` pattern where the simplified
@@ -15699,6 +15830,7 @@ init_auth();
15699
15830
  init_request_credential();
15700
15831
  var MAX_TYPED_CREDENTIAL_ORGS = 100;
15701
15832
  var MAX_TYPED_CREDENTIAL_RESOURCE_PAGES = 500;
15833
+ var ORGANIZATION_REQUEST_CONCURRENCY = 10;
15702
15834
  function projectionError(message, reason = "invalid_credentials") {
15703
15835
  return new AuthenticationError(message, reason);
15704
15836
  }
@@ -15761,21 +15893,22 @@ function typedAgent(resource) {
15761
15893
  __name(typedAgent, "typedAgent");
15762
15894
  async function listTypedCredentialOrganizations(credential, authorization) {
15763
15895
  const apiKey = await bearerFor(credential);
15764
- if (authorization.orgs.length > MAX_TYPED_CREDENTIAL_ORGS) {
15896
+ const firstPartySession = isRequestCredential(credential) && credential.descriptor.kind === "first-party-session";
15897
+ if (!firstPartySession && authorization.orgs.length > MAX_TYPED_CREDENTIAL_ORGS) {
15765
15898
  throw new Error(`Lua CLI can request at most ${MAX_TYPED_CREDENTIAL_ORGS} organizations at once.`);
15766
15899
  }
15767
15900
  const api = new CliCredentialsApi(BASE_URLS.API);
15768
15901
  const organizations = [];
15769
15902
  let resourcePageCount = 0;
15770
- for (const org of authorization.orgs) {
15903
+ const loadOrganization = /* @__PURE__ */ __name(async (org) => {
15771
15904
  const agents = /* @__PURE__ */ new Map();
15772
15905
  const cursors = /* @__PURE__ */ new Set();
15773
15906
  let cursor;
15774
15907
  do {
15775
- if (resourcePageCount >= MAX_TYPED_CREDENTIAL_RESOURCE_PAGES) {
15908
+ resourcePageCount += 1;
15909
+ if (resourcePageCount > MAX_TYPED_CREDENTIAL_RESOURCE_PAGES) {
15776
15910
  throw new Error(`Lua CLI can request at most ${MAX_TYPED_CREDENTIAL_RESOURCE_PAGES} resource pages at once.`);
15777
15911
  }
15778
- resourcePageCount += 1;
15779
15912
  const result = await api.getAuthorizationResourcePage(apiKey, {
15780
15913
  orgId: org.orgId,
15781
15914
  kind: "agent",
@@ -15795,7 +15928,9 @@ async function listTypedCredentialOrganizations(credential, authorization) {
15795
15928
  throw new Error("Lua returned an authorization resource page for the wrong organization.");
15796
15929
  }
15797
15930
  for (const resource of result.data.resources) {
15798
- if (resource.orgId !== org.orgId) {
15931
+ const belongsToOrganization = resource.orgId === org.orgId;
15932
+ const isOrgLessPlatformAgent = resource.orgId === null && resource.visibility === "platform" && resource.kind === "agent" && resource.discoveredVia === "platform-allowlist";
15933
+ if (!belongsToOrganization && !isOrgLessPlatformAgent) {
15799
15934
  throw new Error("Lua returned an authorization resource for the wrong organization.");
15800
15935
  }
15801
15936
  if (!agents.has(resource.resourceId)) agents.set(resource.resourceId, typedAgent(resource));
@@ -15807,7 +15942,7 @@ async function listTypedCredentialOrganizations(credential, authorization) {
15807
15942
  if (nextCursor) cursors.add(nextCursor);
15808
15943
  cursor = nextCursor;
15809
15944
  } while (cursor);
15810
- organizations.push({
15945
+ return {
15811
15946
  orgId: org.orgId,
15812
15947
  ...org.name ? {
15813
15948
  name: org.name
@@ -15817,7 +15952,11 @@ async function listTypedCredentialOrganizations(credential, authorization) {
15817
15952
  agents: [
15818
15953
  ...agents.values()
15819
15954
  ]
15820
- });
15955
+ };
15956
+ }, "loadOrganization");
15957
+ for (let offset = 0; offset < authorization.orgs.length; offset += ORGANIZATION_REQUEST_CONCURRENCY) {
15958
+ const batch = authorization.orgs.slice(offset, offset + ORGANIZATION_REQUEST_CONCURRENCY);
15959
+ organizations.push(...await Promise.all(batch.map(loadOrganization)));
15821
15960
  }
15822
15961
  return organizations;
15823
15962
  }
@@ -27161,6 +27300,7 @@ import inquirer9 from "inquirer";
27161
27300
 
27162
27301
  // src/api/chat.api.service.ts
27163
27302
  init_http_client();
27303
+ init_dist();
27164
27304
  init_lua_fetch();
27165
27305
  init_request_credential();
27166
27306
  var ChatApi = class extends HttpClient {
@@ -27185,7 +27325,7 @@ var ChatApi = class extends HttpClient {
27185
27325
  * @throws Error if the agent is not found or the chat request fails
27186
27326
  */
27187
27327
  async sendMessage(agentId, chatData) {
27188
- return this.httpPost(`/chat/generate/${agentId}?channel=dev`, chatData, {});
27328
+ return this.httpPostCoreDrainRetry(`/chat/generate/${agentId}?channel=dev`, chatData, {});
27189
27329
  }
27190
27330
  /**
27191
27331
  * Streams a message to an agent and receives chunked responses
@@ -27198,16 +27338,22 @@ var ChatApi = class extends HttpClient {
27198
27338
  async sendMessageStream(agentId, chatData, onChunk, onPostprocessComplete, onPreprocessorBlocked, onBatchAbort, onBatchHandled) {
27199
27339
  const controller = new AbortController();
27200
27340
  const timeoutId = setTimeout(() => controller.abort(), 5 * 60 * 1e3);
27201
- const response = await luaFetch(`${this.baseUrl}/chat/stream/${agentId}?channel=dev`, {
27202
- method: "POST",
27203
- signal: controller.signal,
27204
- headers: {
27205
- "Content-Type": "application/json",
27206
- Authorization: `Bearer ${await bearerFor(this.credential)}`
27207
- },
27208
- body: JSON.stringify(chatData)
27209
- });
27210
- clearTimeout(timeoutId);
27341
+ let response;
27342
+ try {
27343
+ response = await fetchWithCoreDrainRetry(async () => luaFetch(`${this.baseUrl}/chat/stream/${agentId}?channel=dev`, {
27344
+ method: "POST",
27345
+ signal: controller.signal,
27346
+ headers: {
27347
+ Authorization: `Bearer ${await bearerFor(this.credential)}`,
27348
+ "Content-Type": "application/json"
27349
+ },
27350
+ body: JSON.stringify(chatData)
27351
+ }), {
27352
+ signal: controller.signal
27353
+ });
27354
+ } finally {
27355
+ clearTimeout(timeoutId);
27356
+ }
27211
27357
  if (!response.ok) {
27212
27358
  throw new Error(`HTTP error! status: ${response.status}`);
27213
27359
  }