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/api-exports.d.ts +166 -36
- package/dist/api-exports.js +199 -20
- package/dist/api-exports.js.map +1 -1
- package/dist/index.js +259 -50
- package/dist/index.js.map +1 -1
- package/dist/voice/test/index.d.ts +36 -36
- package/docs/README.md +4 -4
- package/package.json +3 -3
- package/template/package.json +1 -1
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
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
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
|
|
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 =
|
|
1935
|
-
version:
|
|
1936
|
-
kind:
|
|
1937
|
-
generation:
|
|
1938
|
-
refreshToken:
|
|
1939
|
-
firebaseUid:
|
|
1940
|
-
apiUrl:
|
|
1941
|
-
authUrl:
|
|
1942
|
-
firebaseWebApiKey:
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
5649
|
+
const { z: z6, zodToJsonSchema: convertSchema } = await loadVendor();
|
|
5499
5650
|
try {
|
|
5500
5651
|
const evalFunction = new Function("z", `return ${zodSchemaCode}`);
|
|
5501
|
-
const zodSchema = evalFunction(
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
27202
|
-
|
|
27203
|
-
|
|
27204
|
-
|
|
27205
|
-
|
|
27206
|
-
|
|
27207
|
-
|
|
27208
|
-
|
|
27209
|
-
|
|
27210
|
-
|
|
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
|
-
|
|
34413
|
-
|
|
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 = {
|