lua-cli 3.29.0 → 3.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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, EventType, 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",
@@ -1460,6 +1533,26 @@ This text is who you are for this person. As you learn them, their name, their w
1460
1533
  voiceId: z.string().min(1),
1461
1534
  version: z.string().optional()
1462
1535
  });
1536
+ EventType = /* @__PURE__ */ (function(EventType2) {
1537
+ EventType2["AGENT_CREATED"] = "agent.created";
1538
+ EventType2["CHANNEL_ADDED"] = "channel.added";
1539
+ EventType2["MESSAGE_RECEIVED"] = "message.received";
1540
+ EventType2["INQUIRY_CREATED"] = "inquiry.created";
1541
+ EventType2["USER_LOGIN"] = "user.login";
1542
+ EventType2["CREDIT_UPDATED"] = "credit.updated";
1543
+ EventType2["CREDIT_PURCHASED"] = "credit.purchased";
1544
+ EventType2["CREDIT_THRESHOLD_50"] = "credit.threshold.50";
1545
+ EventType2["CREDIT_THRESHOLD_20"] = "credit.threshold.20";
1546
+ EventType2["CREDIT_THRESHOLD_0"] = "credit.threshold.0";
1547
+ EventType2["USER_SIGNUP"] = "user.signup";
1548
+ EventType2["ORG_CREATED"] = "org.created";
1549
+ EventType2["MESSAGE_SENT"] = "message.sent";
1550
+ EventType2["MESSAGE_DELIVERED"] = "message.delivered";
1551
+ EventType2["MESSAGE_READ"] = "message.read";
1552
+ EventType2["MESSAGE_FAILED"] = "message.failed";
1553
+ EventType2["MESSAGE_PLAYED"] = "message.played";
1554
+ return EventType2;
1555
+ })({});
1463
1556
  LUA_JOB_DEFAULT_TIMEOUT_SECONDS = 300;
1464
1557
  LUA_JOB_MIN_TIMEOUT_SECONDS = 1;
1465
1558
  LUA_JOB_MAX_TIMEOUT_SECONDS = 600;
@@ -1809,20 +1902,40 @@ var init_lua_fetch = __esm({
1809
1902
  });
1810
1903
 
1811
1904
  // src/services/firebase-session.ts
1905
+ import { z as z4 } from "zod";
1812
1906
  function requireFirebaseWebApiKey() {
1813
1907
  if (!FIREBASE_WEB_API_KEY) {
1814
1908
  throw new Error("Firebase sign-in is not configured for this CLI build.");
1815
1909
  }
1816
1910
  return FIREBASE_WEB_API_KEY;
1817
1911
  }
1912
+ function uidFromFirebaseIdToken(idToken) {
1913
+ const segments = idToken.split(".");
1914
+ if (segments.length !== 3 || !segments[1]) throw new Error(INVALID_FIREBASE_SESSION);
1915
+ let payload;
1916
+ try {
1917
+ payload = JSON.parse(Buffer.from(segments[1], "base64url").toString("utf8"));
1918
+ } catch {
1919
+ throw new Error(INVALID_FIREBASE_SESSION);
1920
+ }
1921
+ const parsed = firebaseIdTokenPayloadSchema.safeParse(payload);
1922
+ if (parsed.success) return parsed.data.sub;
1923
+ throw new Error(INVALID_FIREBASE_SESSION);
1924
+ }
1818
1925
  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.");
1926
+ const customTokenResponse = customTokenResponseSchema.safeParse(json);
1927
+ if (customTokenResponse.success) {
1928
+ const { idToken: idToken2, refreshToken: refreshToken2, expiresIn: expiresIn2, localId } = customTokenResponse.data;
1929
+ return {
1930
+ idToken: idToken2,
1931
+ refreshToken: refreshToken2,
1932
+ expiresAt: now + expiresIn2 * 1e3,
1933
+ uid: localId ?? uidFromFirebaseIdToken(idToken2)
1934
+ };
1825
1935
  }
1936
+ const refreshResponse = refreshResponseSchema.safeParse(json);
1937
+ if (!refreshResponse.success) throw new Error(INVALID_FIREBASE_SESSION);
1938
+ const { id_token: idToken, refresh_token: refreshToken, expires_in: expiresIn, user_id: uid } = refreshResponse.data;
1826
1939
  return {
1827
1940
  idToken,
1828
1941
  refreshToken,
@@ -1896,7 +2009,7 @@ async function refreshFirebaseSession(session) {
1896
2009
  if (refreshed.uid !== session.uid) throw new Error("Firebase session refresh returned a different identity.");
1897
2010
  return refreshed;
1898
2011
  }
1899
- var FIREBASE_CUSTOM_TOKEN_URL, FIREBASE_REFRESH_URL, FIREBASE_REQUEST_TIMEOUT_MS;
2012
+ var FIREBASE_CUSTOM_TOKEN_URL, FIREBASE_REFRESH_URL, FIREBASE_REQUEST_TIMEOUT_MS, INVALID_FIREBASE_SESSION, customTokenResponseSchema, refreshResponseSchema, firebaseIdTokenPayloadSchema;
1900
2013
  var init_firebase_session = __esm({
1901
2014
  "src/services/firebase-session.ts"() {
1902
2015
  "use strict";
@@ -1904,7 +2017,24 @@ var init_firebase_session = __esm({
1904
2017
  FIREBASE_CUSTOM_TOKEN_URL = "https://identitytoolkit.googleapis.com/v1/accounts:signInWithCustomToken";
1905
2018
  FIREBASE_REFRESH_URL = "https://securetoken.googleapis.com/v1/token";
1906
2019
  FIREBASE_REQUEST_TIMEOUT_MS = 15e3;
2020
+ INVALID_FIREBASE_SESSION = "Sign-in failed because Firebase returned an invalid session.";
2021
+ customTokenResponseSchema = z4.object({
2022
+ idToken: z4.string().min(1),
2023
+ refreshToken: z4.string().min(1),
2024
+ expiresIn: z4.coerce.number().positive().finite(),
2025
+ localId: z4.string().min(1).optional()
2026
+ });
2027
+ refreshResponseSchema = z4.object({
2028
+ id_token: z4.string().min(1),
2029
+ refresh_token: z4.string().min(1),
2030
+ expires_in: z4.coerce.number().positive().finite(),
2031
+ user_id: z4.string().min(1)
2032
+ });
2033
+ firebaseIdTokenPayloadSchema = z4.object({
2034
+ sub: z4.string().min(1)
2035
+ });
1907
2036
  __name(requireFirebaseWebApiKey, "requireFirebaseWebApiKey");
2037
+ __name(uidFromFirebaseIdToken, "uidFromFirebaseIdToken");
1908
2038
  __name(parseFirebaseSession, "parseFirebaseSession");
1909
2039
  __name(parseFirebaseError, "parseFirebaseError");
1910
2040
  __name(fetchFirebase, "fetchFirebase");
@@ -1917,7 +2047,7 @@ var init_firebase_session = __esm({
1917
2047
  import { createHash, randomUUID } from "crypto";
1918
2048
  import { mkdir, open, readFile, rename, unlink } from "fs/promises";
1919
2049
  import { join as join3 } from "path";
1920
- import { z as z4 } from "zod";
2050
+ import { z as z5 } from "zod";
1921
2051
  function environmentKey(environment) {
1922
2052
  return createHash("sha256").update(`${environment.apiUrl}
1923
2053
  ${environment.authUrl}
@@ -1931,15 +2061,15 @@ var init_firebase_session_store = __esm({
1931
2061
  "src/services/firebase-session-store.ts"() {
1932
2062
  "use strict";
1933
2063
  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)
2064
+ storedFirebaseSessionSchema = z5.object({
2065
+ version: z5.literal(1),
2066
+ kind: z5.literal("firebase-session"),
2067
+ generation: z5.string().min(1),
2068
+ refreshToken: z5.string().min(1),
2069
+ firebaseUid: z5.string().min(1),
2070
+ apiUrl: z5.string().url(),
2071
+ authUrl: z5.string().url(),
2072
+ firebaseWebApiKey: z5.string().min(1)
1943
2073
  });
1944
2074
  currentFirebaseSessionEnvironment = /* @__PURE__ */ __name(() => ({
1945
2075
  apiUrl: BASE_URLS.API,
@@ -2329,12 +2459,25 @@ import { randomUUID as randomUUID3 } from "crypto";
2329
2459
  function parseRetryAfter(raw) {
2330
2460
  if (!raw) return void 0;
2331
2461
  const seconds = Number.parseInt(raw, 10);
2332
- return Number.isFinite(seconds) && seconds > 0 ? seconds : void 0;
2462
+ return Number.isFinite(seconds) && seconds >= 0 ? seconds : void 0;
2463
+ }
2464
+ function isCoreDrainApiError(error) {
2465
+ if (!error || error.statusCode !== 503) return false;
2466
+ return isCoreDrainingErrorResponse({
2467
+ error: error.error
2468
+ });
2469
+ }
2470
+ function coreDrainApiRetryDelayMs(error) {
2471
+ const retryAfterSeconds = error?.retryAfterSeconds;
2472
+ if (retryAfterSeconds === void 0) return CORE_DRAINING_DEFAULT_RETRY_MS;
2473
+ const delayMs = retryAfterSeconds * 1e3;
2474
+ return Math.min(Math.max(0, delayMs), CORE_DRAINING_MAX_RETRY_MS);
2333
2475
  }
2334
2476
  var HttpClient;
2335
2477
  var init_http_client = __esm({
2336
2478
  "src/api/http.client.ts"() {
2337
2479
  "use strict";
2480
+ init_dist();
2338
2481
  init_auth_error();
2339
2482
  init_lua_fetch();
2340
2483
  init_request_credential();
@@ -2553,6 +2696,12 @@ Check that your Lua login has access to this agent or organization.`);
2553
2696
  headers
2554
2697
  }, 0);
2555
2698
  }
2699
+ async httpPostCoreDrainRetry(url, data, headers) {
2700
+ const first = await this.httpPostOnce(url, data, headers);
2701
+ if (!isCoreDrainApiError(first.error)) return first;
2702
+ await new Promise((resolve7) => setTimeout(resolve7, coreDrainApiRetryDelayMs(first.error)));
2703
+ return this.httpPostOnce(url, data, headers);
2704
+ }
2556
2705
  /**
2557
2706
  * Performs an HTTP PUT request
2558
2707
  * @param url - The relative URL path to request (will be appended to baseUrl)
@@ -2598,6 +2747,8 @@ Check that your Lua login has access to this agent or organization.`);
2598
2747
  }
2599
2748
  };
2600
2749
  __name(parseRetryAfter, "parseRetryAfter");
2750
+ __name(isCoreDrainApiError, "isCoreDrainApiError");
2751
+ __name(coreDrainApiRetryDelayMs, "coreDrainApiRetryDelayMs");
2601
2752
  }
2602
2753
  });
2603
2754
 
@@ -5434,7 +5585,7 @@ async function ensureSchemaConverterReady() {
5434
5585
  await loadVendor();
5435
5586
  }
5436
5587
  async function zodToJsonSchema(schemaNode) {
5437
- const { z: z5, zodToJsonSchema: convertSchema } = await loadVendor();
5588
+ const { z: z6, zodToJsonSchema: convertSchema } = await loadVendor();
5438
5589
  try {
5439
5590
  const sourceFile = schemaNode.getSourceFile();
5440
5591
  const project = sourceFile.getProject();
@@ -5447,7 +5598,7 @@ async function zodToJsonSchema(schemaNode) {
5447
5598
  environment: {
5448
5599
  preset: "NODE",
5449
5600
  extra: {
5450
- z: z5
5601
+ z: z6
5451
5602
  }
5452
5603
  },
5453
5604
  policy: {
@@ -5495,10 +5646,10 @@ function cleanJsonSchema(schema) {
5495
5646
  return cleanSchema;
5496
5647
  }
5497
5648
  async function zodStringToJsonSchema(zodSchemaCode) {
5498
- const { z: z5, zodToJsonSchema: convertSchema } = await loadVendor();
5649
+ const { z: z6, zodToJsonSchema: convertSchema } = await loadVendor();
5499
5650
  try {
5500
5651
  const evalFunction = new Function("z", `return ${zodSchemaCode}`);
5501
- const zodSchema = evalFunction(z5);
5652
+ const zodSchema = evalFunction(z6);
5502
5653
  const jsonSchema = convertSchema(zodSchema, {
5503
5654
  target: "jsonSchema7"
5504
5655
  });
@@ -13988,7 +14139,7 @@ var init_agents_api_service = __esm({
13988
14139
  });
13989
14140
  if (body.identifier) query.set("identifier", body.identifier);
13990
14141
  const chatBody = this.toChatGenerateBody(body);
13991
- return this.httpPost(`/chat/generate/${targetAgentId}?${query.toString()}`, chatBody, {});
14142
+ return this.httpPostCoreDrainRetry(`/chat/generate/${targetAgentId}?${query.toString()}`, chatBody, {});
13992
14143
  }
13993
14144
  /**
13994
14145
  * Sandbox overload: mirrors the `AI.generate` pattern where the simplified
@@ -14407,11 +14558,22 @@ var init_voice_api_service = __esm({
14407
14558
  });
14408
14559
 
14409
14560
  // src/api/channels-send.api.service.ts
14561
+ function deliveryQuery(filter) {
14562
+ const params = new URLSearchParams();
14563
+ if (filter?.userId) params.set("userId", filter.userId);
14564
+ if (filter?.status) params.set("status", filter.status);
14565
+ if (filter?.channel) params.set("channel", filter.channel);
14566
+ if (filter?.since) params.set("since", new Date(filter.since).toISOString());
14567
+ if (filter?.limit !== void 0) params.set("limit", String(filter.limit));
14568
+ const query = params.toString();
14569
+ return query ? `?${query}` : "";
14570
+ }
14410
14571
  var ChannelsSendApiService;
14411
14572
  var init_channels_send_api_service = __esm({
14412
14573
  "src/api/channels-send.api.service.ts"() {
14413
14574
  "use strict";
14414
14575
  init_http_client();
14576
+ __name(deliveryQuery, "deliveryQuery");
14415
14577
  ChannelsSendApiService = class extends HttpClient {
14416
14578
  static {
14417
14579
  __name(this, "ChannelsSendApiService");
@@ -14483,6 +14645,33 @@ var init_channels_send_api_service = __esm({
14483
14645
  }
14484
14646
  return result.data;
14485
14647
  }
14648
+ /** GET /developer/agents/:agentId/channels/deliveries/:deliveryId */
14649
+ async getDeliveryStatus(deliveryId) {
14650
+ return this.httpGet(`/developer/agents/${this.agentId}/channels/deliveries/${encodeURIComponent(deliveryId)}`);
14651
+ }
14652
+ /** GET /developer/agents/:agentId/channels/deliveries */
14653
+ async listDeliveries(filter) {
14654
+ return this.httpGet(`/developer/agents/${this.agentId}/channels/deliveries${deliveryQuery(filter)}`);
14655
+ }
14656
+ /** Sandbox helper for a single delivery read. */
14657
+ async getDeliveryStatusForSandbox(deliveryId) {
14658
+ const result = await this.getDeliveryStatus(deliveryId);
14659
+ if (!result.success) {
14660
+ throw new Error(result.error?.message || "Delivery status lookup failed");
14661
+ }
14662
+ if (!result.data) {
14663
+ throw new Error("Delivery status lookup failed: empty response");
14664
+ }
14665
+ return result.data;
14666
+ }
14667
+ /** Sandbox helper for the delivery list read. */
14668
+ async listDeliveriesForSandbox(filter) {
14669
+ const result = await this.listDeliveries(filter);
14670
+ if (!result.success) {
14671
+ throw new Error(result.error?.message || "Delivery list failed");
14672
+ }
14673
+ return result.data ?? [];
14674
+ }
14486
14675
  };
14487
14676
  }
14488
14677
  });
@@ -15699,6 +15888,7 @@ init_auth();
15699
15888
  init_request_credential();
15700
15889
  var MAX_TYPED_CREDENTIAL_ORGS = 100;
15701
15890
  var MAX_TYPED_CREDENTIAL_RESOURCE_PAGES = 500;
15891
+ var ORGANIZATION_REQUEST_CONCURRENCY = 10;
15702
15892
  function projectionError(message, reason = "invalid_credentials") {
15703
15893
  return new AuthenticationError(message, reason);
15704
15894
  }
@@ -15761,21 +15951,22 @@ function typedAgent(resource) {
15761
15951
  __name(typedAgent, "typedAgent");
15762
15952
  async function listTypedCredentialOrganizations(credential, authorization) {
15763
15953
  const apiKey = await bearerFor(credential);
15764
- if (authorization.orgs.length > MAX_TYPED_CREDENTIAL_ORGS) {
15954
+ const firstPartySession = isRequestCredential(credential) && credential.descriptor.kind === "first-party-session";
15955
+ if (!firstPartySession && authorization.orgs.length > MAX_TYPED_CREDENTIAL_ORGS) {
15765
15956
  throw new Error(`Lua CLI can request at most ${MAX_TYPED_CREDENTIAL_ORGS} organizations at once.`);
15766
15957
  }
15767
15958
  const api = new CliCredentialsApi(BASE_URLS.API);
15768
15959
  const organizations = [];
15769
15960
  let resourcePageCount = 0;
15770
- for (const org of authorization.orgs) {
15961
+ const loadOrganization = /* @__PURE__ */ __name(async (org) => {
15771
15962
  const agents = /* @__PURE__ */ new Map();
15772
15963
  const cursors = /* @__PURE__ */ new Set();
15773
15964
  let cursor;
15774
15965
  do {
15775
- if (resourcePageCount >= MAX_TYPED_CREDENTIAL_RESOURCE_PAGES) {
15966
+ resourcePageCount += 1;
15967
+ if (resourcePageCount > MAX_TYPED_CREDENTIAL_RESOURCE_PAGES) {
15776
15968
  throw new Error(`Lua CLI can request at most ${MAX_TYPED_CREDENTIAL_RESOURCE_PAGES} resource pages at once.`);
15777
15969
  }
15778
- resourcePageCount += 1;
15779
15970
  const result = await api.getAuthorizationResourcePage(apiKey, {
15780
15971
  orgId: org.orgId,
15781
15972
  kind: "agent",
@@ -15795,7 +15986,9 @@ async function listTypedCredentialOrganizations(credential, authorization) {
15795
15986
  throw new Error("Lua returned an authorization resource page for the wrong organization.");
15796
15987
  }
15797
15988
  for (const resource of result.data.resources) {
15798
- if (resource.orgId !== org.orgId) {
15989
+ const belongsToOrganization = resource.orgId === org.orgId;
15990
+ const isOrgLessPlatformAgent = resource.orgId === null && resource.visibility === "platform" && resource.kind === "agent" && resource.discoveredVia === "platform-allowlist";
15991
+ if (!belongsToOrganization && !isOrgLessPlatformAgent) {
15799
15992
  throw new Error("Lua returned an authorization resource for the wrong organization.");
15800
15993
  }
15801
15994
  if (!agents.has(resource.resourceId)) agents.set(resource.resourceId, typedAgent(resource));
@@ -15807,7 +16000,7 @@ async function listTypedCredentialOrganizations(credential, authorization) {
15807
16000
  if (nextCursor) cursors.add(nextCursor);
15808
16001
  cursor = nextCursor;
15809
16002
  } while (cursor);
15810
- organizations.push({
16003
+ return {
15811
16004
  orgId: org.orgId,
15812
16005
  ...org.name ? {
15813
16006
  name: org.name
@@ -15817,7 +16010,11 @@ async function listTypedCredentialOrganizations(credential, authorization) {
15817
16010
  agents: [
15818
16011
  ...agents.values()
15819
16012
  ]
15820
- });
16013
+ };
16014
+ }, "loadOrganization");
16015
+ for (let offset = 0; offset < authorization.orgs.length; offset += ORGANIZATION_REQUEST_CONCURRENCY) {
16016
+ const batch = authorization.orgs.slice(offset, offset + ORGANIZATION_REQUEST_CONCURRENCY);
16017
+ organizations.push(...await Promise.all(batch.map(loadOrganization)));
15821
16018
  }
15822
16019
  return organizations;
15823
16020
  }
@@ -22714,7 +22911,17 @@ function createSandbox(options) {
22714
22911
  const channels = await getChannelsSendInstance2();
22715
22912
  return channels.sendEmailForSandbox(input);
22716
22913
  }, "send")
22717
- }
22914
+ },
22915
+ getStatus: /* @__PURE__ */ __name(async (deliveryId) => {
22916
+ const { getChannelsSendInstance: getChannelsSendInstance2 } = await Promise.resolve().then(() => (init_lazy_instances(), lazy_instances_exports));
22917
+ const channels = await getChannelsSendInstance2();
22918
+ return channels.getDeliveryStatusForSandbox(deliveryId);
22919
+ }, "getStatus"),
22920
+ listDeliveries: /* @__PURE__ */ __name(async (filter) => {
22921
+ const { getChannelsSendInstance: getChannelsSendInstance2 } = await Promise.resolve().then(() => (init_lazy_instances(), lazy_instances_exports));
22922
+ const channels = await getChannelsSendInstance2();
22923
+ return channels.listDeliveriesForSandbox(filter);
22924
+ }, "listDeliveries")
22718
22925
  },
22719
22926
  // Workspace directory. Resolve a teammate by name within the agent's org and
22720
22927
  // get the channel handles they opted to share — feed the result straight into
@@ -27161,6 +27368,7 @@ import inquirer9 from "inquirer";
27161
27368
 
27162
27369
  // src/api/chat.api.service.ts
27163
27370
  init_http_client();
27371
+ init_dist();
27164
27372
  init_lua_fetch();
27165
27373
  init_request_credential();
27166
27374
  var ChatApi = class extends HttpClient {
@@ -27185,7 +27393,7 @@ var ChatApi = class extends HttpClient {
27185
27393
  * @throws Error if the agent is not found or the chat request fails
27186
27394
  */
27187
27395
  async sendMessage(agentId, chatData) {
27188
- return this.httpPost(`/chat/generate/${agentId}?channel=dev`, chatData, {});
27396
+ return this.httpPostCoreDrainRetry(`/chat/generate/${agentId}?channel=dev`, chatData, {});
27189
27397
  }
27190
27398
  /**
27191
27399
  * Streams a message to an agent and receives chunked responses
@@ -27198,16 +27406,22 @@ var ChatApi = class extends HttpClient {
27198
27406
  async sendMessageStream(agentId, chatData, onChunk, onPostprocessComplete, onPreprocessorBlocked, onBatchAbort, onBatchHandled) {
27199
27407
  const controller = new AbortController();
27200
27408
  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);
27409
+ let response;
27410
+ try {
27411
+ response = await fetchWithCoreDrainRetry(async () => luaFetch(`${this.baseUrl}/chat/stream/${agentId}?channel=dev`, {
27412
+ method: "POST",
27413
+ signal: controller.signal,
27414
+ headers: {
27415
+ Authorization: `Bearer ${await bearerFor(this.credential)}`,
27416
+ "Content-Type": "application/json"
27417
+ },
27418
+ body: JSON.stringify(chatData)
27419
+ }), {
27420
+ signal: controller.signal
27421
+ });
27422
+ } finally {
27423
+ clearTimeout(timeoutId);
27424
+ }
27211
27425
  if (!response.ok) {
27212
27426
  throw new Error(`HTTP error! status: ${response.status}`);
27213
27427
  }
@@ -34409,13 +34623,8 @@ init_constants();
34409
34623
  init_command_utils();
34410
34624
  init_webhook_api_service();
34411
34625
  init_analytics();
34412
- var AVAILABLE_EVENT_TYPES = [
34413
- "message.sent",
34414
- "message.delivered",
34415
- "message.read",
34416
- "message.failed",
34417
- "message.played"
34418
- ];
34626
+ init_dist();
34627
+ var AVAILABLE_EVENT_TYPES = Object.values(EventType).filter((event) => event.startsWith("message."));
34419
34628
  async function webhooksCommand(action, cmdObj) {
34420
34629
  return withErrorHandling(async () => {
34421
34630
  const options = {