lua-cli 3.48.0 → 3.49.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.
@@ -943,6 +943,24 @@ function aiGenerateInputFromSimplified(prompt, content) {
943
943
  ]
944
944
  };
945
945
  }
946
+ function formatDecisionSandboxPrimitive(name, tool) {
947
+ return tool ? `${name}${DECISION_SANDBOX_TOOL_SEPARATOR}${tool}` : name;
948
+ }
949
+ function parseDecisionSandboxPrimitive(value3) {
950
+ const at = value3.indexOf(DECISION_SANDBOX_TOOL_SEPARATOR);
951
+ const name = at < 0 ? value3 : value3.slice(0, at);
952
+ const tool = at < 0 ? "" : value3.slice(at + DECISION_SANDBOX_TOOL_SEPARATOR.length);
953
+ if (name.length === 0) return void 0;
954
+ return tool.length > 0 ? {
955
+ name,
956
+ tool
957
+ } : {
958
+ name
959
+ };
960
+ }
961
+ function decisionPublishStampKey(agentId2) {
962
+ return `decisions:stamp:${agentId2}`;
963
+ }
946
964
  function isIntegrationPassthroughReadMethod(method) {
947
965
  return typeof method === "string" && INTEGRATION_PASSTHROUGH_READ_METHODS.includes(method.toUpperCase());
948
966
  }
@@ -993,6 +1011,79 @@ function isPlatformInvocationCaller(v) {
993
1011
  function supervisionSubjectId(agentId2) {
994
1012
  return `agent:${agentId2}`;
995
1013
  }
1014
+ function isModelCallCategory(category) {
1015
+ return category.startsWith("llm:") || category.startsWith("voice:") || category === "embedding" || category === "workflow:job" || category === "decision:ask" || category.startsWith("tool:image-");
1016
+ }
1017
+ function deriveUsageSurface(row) {
1018
+ const { category, channel } = row;
1019
+ const data = row.data;
1020
+ if (!isModelCallCategory(category)) return void 0;
1021
+ if (category === "workflow:job") return "workflow-job";
1022
+ if (category === "llm:sandbox") return "tool-code";
1023
+ if (category === "llm:builder") return "builder";
1024
+ if (category === "llm:website") return "website";
1025
+ if (category.startsWith("voice:") || category === "llm:voice") return "voice";
1026
+ if (category.startsWith("llm:tool:") || AGENT_TOOL_CATEGORIES.has(category)) return "agent-tool";
1027
+ if (!TURN_CATEGORIES.has(category)) return "background";
1028
+ if (channel === "workflow") return "workflow-step";
1029
+ if (data?.gateway === "livekit-inference") return "voice";
1030
+ if (channel === "dev") return "dev";
1031
+ if (channel && VOICE_CHANNELS.has(channel)) return "voice";
1032
+ if (channel && MESSAGING_CHANNELS.has(channel)) return "channel";
1033
+ return "chat";
1034
+ }
1035
+ function fromRaw(raw, id2, model) {
1036
+ const fiveMin = count(raw.cache_creation?.ephemeral_5m_input_tokens);
1037
+ const oneHour = count(raw.cache_creation?.ephemeral_1h_input_tokens);
1038
+ const split = !!(fiveMin || oneHour);
1039
+ const flatWrite = count(raw.cache_creation_input_tokens);
1040
+ const read = count(raw.cache_read_input_tokens);
1041
+ return {
1042
+ ...typeof id2 === "string" && id2 ? {
1043
+ id: id2
1044
+ } : {},
1045
+ ...typeof model === "string" && model ? {
1046
+ model
1047
+ } : {},
1048
+ inputTokens: count(raw.input_tokens) ?? 0,
1049
+ outputTokens: count(raw.output_tokens) ?? 0,
1050
+ ...read ? {
1051
+ cacheReadTokens: read
1052
+ } : {},
1053
+ ...split ? {
1054
+ ...fiveMin ? {
1055
+ cacheCreationTokens5m: fiveMin
1056
+ } : {},
1057
+ ...oneHour ? {
1058
+ cacheCreationTokens1h: oneHour
1059
+ } : {}
1060
+ } : flatWrite ? {
1061
+ cacheCreationTokens: flatWrite
1062
+ } : {},
1063
+ ...typeof raw.service_tier === "string" && raw.service_tier && raw.service_tier !== "standard" ? {
1064
+ serviceTier: raw.service_tier
1065
+ } : {}
1066
+ };
1067
+ }
1068
+ function anthropicMessageUsage(message) {
1069
+ if (!message || typeof message !== "object") return void 0;
1070
+ const m = message;
1071
+ if (!m.usage || typeof m.usage !== "object") return void 0;
1072
+ return fromRaw(m.usage, m.id, m.model);
1073
+ }
1074
+ function parseAnthropicReplyUsage(body) {
1075
+ const start = body.trimStart();
1076
+ if (start.startsWith("{")) {
1077
+ try {
1078
+ return anthropicMessageUsage(JSON.parse(start));
1079
+ } catch {
1080
+ return void 0;
1081
+ }
1082
+ }
1083
+ const reader = new AnthropicSseUsageReader();
1084
+ reader.push(body);
1085
+ return reader.result();
1086
+ }
996
1087
  function isSupervisionOp(op) {
997
1088
  return typeof op === "string" && Object.prototype.hasOwnProperty.call(SUPERVISION_OPS, op);
998
1089
  }
@@ -2164,24 +2255,24 @@ function addresses(text2) {
2164
2255
  function recordFacts(value3) {
2165
2256
  const senders = [];
2166
2257
  const labels = [];
2167
- let isRecord22 = false;
2258
+ let isRecord32 = false;
2168
2259
  if (isPlainObject(value3.author_member)) {
2169
- isRecord22 = true;
2260
+ isRecord32 = true;
2170
2261
  const email = lower(value3.author_member.email);
2171
2262
  if (email) senders.push(email);
2172
2263
  const userId = lower(value3.author_member.user_id);
2173
2264
  if (userId) senders.push(userId);
2174
2265
  }
2175
2266
  if (typeof value3.channel_id === "string") {
2176
- isRecord22 = true;
2267
+ isRecord32 = true;
2177
2268
  labels.push(...idOrName(value3.channel_id));
2178
2269
  }
2179
2270
  if (Array.isArray(value3.channel_ids)) {
2180
- isRecord22 = true;
2271
+ isRecord32 = true;
2181
2272
  for (const id2 of value3.channel_ids) labels.push(...idOrName(id2));
2182
2273
  }
2183
2274
  if (Array.isArray(value3.channels) && (value3.author_member || value3.message !== void 0)) {
2184
- isRecord22 = true;
2275
+ isRecord32 = true;
2185
2276
  for (const channel of value3.channels) labels.push(...idOrName(channel));
2186
2277
  }
2187
2278
  for (const key of [
@@ -2190,11 +2281,11 @@ function recordFacts(value3) {
2190
2281
  ]) {
2191
2282
  const field = value3[key];
2192
2283
  if (isPlainObject(field) && isPlainObject(field.emailAddress)) {
2193
- isRecord22 = true;
2284
+ isRecord32 = true;
2194
2285
  const address = lower(field.emailAddress.address);
2195
2286
  if (address) senders.push(address);
2196
2287
  } else if (key === "from" && typeof field === "string" && field.includes("@")) {
2197
- isRecord22 = true;
2288
+ isRecord32 = true;
2198
2289
  senders.push(...addresses(field));
2199
2290
  }
2200
2291
  }
@@ -2202,12 +2293,12 @@ function recordFacts(value3) {
2202
2293
  const organizer = value3.organizer;
2203
2294
  const address = isPlainObject(organizer.emailAddress) ? lower(organizer.emailAddress.address) : lower(organizer.email);
2204
2295
  if (address) {
2205
- isRecord22 = true;
2296
+ isRecord32 = true;
2206
2297
  senders.push(address);
2207
2298
  }
2208
2299
  }
2209
2300
  if (Array.isArray(value3.categories)) {
2210
- isRecord22 = true;
2301
+ isRecord32 = true;
2211
2302
  for (const category of value3.categories) labels.push(...idOrName(category));
2212
2303
  }
2213
2304
  if (isPlainObject(value3.from)) {
@@ -2218,13 +2309,13 @@ function recordFacts(value3) {
2218
2309
  ]) {
2219
2310
  const identity = value3.from[key];
2220
2311
  if (!isPlainObject(identity)) continue;
2221
- isRecord22 = true;
2312
+ isRecord32 = true;
2222
2313
  const id2 = lower(identity.id);
2223
2314
  if (id2) senders.push(id2);
2224
2315
  }
2225
2316
  }
2226
2317
  if (isPlainObject(value3.channelIdentity)) {
2227
- isRecord22 = true;
2318
+ isRecord32 = true;
2228
2319
  for (const key of [
2229
2320
  "channelId",
2230
2321
  "teamId"
@@ -2234,21 +2325,21 @@ function recordFacts(value3) {
2234
2325
  }
2235
2326
  }
2236
2327
  if (typeof value3.chatId === "string") {
2237
- isRecord22 = true;
2328
+ isRecord32 = true;
2238
2329
  labels.push(...idOrName(value3.chatId));
2239
2330
  }
2240
2331
  if (typeof value3.parentFolderId === "string") {
2241
- isRecord22 = true;
2332
+ isRecord32 = true;
2242
2333
  labels.push(...idOrName(value3.parentFolderId));
2243
2334
  }
2244
2335
  let gmailSenderUnknown = false;
2245
2336
  const gmailMessage = typeof value3.threadId === "string" && (Array.isArray(value3.labelIds) || "payload" in value3 || "raw" in value3) || isPlainObject(value3.payload) && Array.isArray(value3.payload.headers);
2246
2337
  if (Array.isArray(value3.labelIds)) {
2247
- isRecord22 = true;
2338
+ isRecord32 = true;
2248
2339
  for (const id2 of value3.labelIds) labels.push(...idOrName(id2));
2249
2340
  }
2250
2341
  if (gmailMessage) {
2251
- isRecord22 = true;
2342
+ isRecord32 = true;
2252
2343
  const headers = isPlainObject(value3.payload) && Array.isArray(value3.payload.headers) ? value3.payload.headers : [];
2253
2344
  const from = headers.find((header) => isPlainObject(header) && lower(header.name) === "from");
2254
2345
  const fromAddresses = addresses(from?.value);
@@ -2256,11 +2347,11 @@ function recordFacts(value3) {
2256
2347
  else gmailSenderUnknown = true;
2257
2348
  }
2258
2349
  if (Array.isArray(value3.labels)) {
2259
- isRecord22 = true;
2350
+ isRecord32 = true;
2260
2351
  for (const label of value3.labels) labels.push(...idOrName(label));
2261
2352
  }
2262
2353
  if (typeof value3.ts === "string" && (typeof value3.user === "string" || typeof value3.bot_id === "string")) {
2263
- isRecord22 = true;
2354
+ isRecord32 = true;
2264
2355
  for (const id2 of [
2265
2356
  value3.user,
2266
2357
  value3.bot_id,
@@ -2276,7 +2367,7 @@ function recordFacts(value3) {
2276
2367
  labels.push(...idOrName(value3.channel));
2277
2368
  }
2278
2369
  return {
2279
- isRecord: isRecord22,
2370
+ isRecord: isRecord32,
2280
2371
  senders,
2281
2372
  labels,
2282
2373
  gmailSenderUnknown
@@ -3764,13 +3855,13 @@ function channelSettingsGroups(channel, config) {
3764
3855
  const groups = [];
3765
3856
  for (const def of channelSettingDefinitions(channel, config)) {
3766
3857
  const { tunableDefault: _tunable, ...shown } = def;
3767
- const unavailable2 = channelSettingUnavailable(channel, def);
3858
+ const unavailable3 = channelSettingUnavailable(channel, def);
3768
3859
  const view = {
3769
3860
  ...shown,
3770
3861
  ...effectiveChannelSetting(channel, def),
3771
3862
  resettable: channelSettingResettable(def),
3772
- ...unavailable2 && {
3773
- unavailable: unavailable2
3863
+ ...unavailable3 && {
3864
+ unavailable: unavailable3
3774
3865
  }
3775
3866
  };
3776
3867
  const group = groups.find((candidate) => candidate.key === def.group);
@@ -4164,6 +4255,36 @@ function mutationWithoutWorkItems(mutation) {
4164
4255
  } : {}
4165
4256
  };
4166
4257
  }
4258
+ function isServerTriggeredBrowserSource(logSource) {
4259
+ return SERVER_TRIGGERED_BROWSER_SOURCES.includes(logSource);
4260
+ }
4261
+ function resolveBrowserFallback(raw) {
4262
+ return BROWSER_FALLBACKS.includes(raw) ? raw : DEFAULT_BROWSER_FALLBACK;
4263
+ }
4264
+ function resolveBrowserProxyCountry(raw) {
4265
+ if (typeof raw !== "string") return void 0;
4266
+ const code = raw.trim().toLowerCase();
4267
+ return PROXY_COUNTRY_CODE.test(code) ? code : void 0;
4268
+ }
4269
+ function resolveBrowserLogOptions(raw) {
4270
+ const logContent = BROWSER_LOG_CONTENT_MODES.includes(raw.logContent) ? raw.logContent : DEFAULT_BROWSER_LOG_CONTENT;
4271
+ const screenshots = BROWSER_SCREENSHOT_POLICIES.includes(raw.screenshots) ? raw.screenshots : DEFAULT_BROWSER_SCREENSHOT_POLICY;
4272
+ return {
4273
+ logContent,
4274
+ screenshots
4275
+ };
4276
+ }
4277
+ function browserProfileNotFoundMessage(name) {
4278
+ return `No browser named '${name}' is attached to this agent. Add it to the agent's \`browsers\` list and push again.`;
4279
+ }
4280
+ function resolveBrowserLimits(pick) {
4281
+ const limits = {};
4282
+ for (const key of BROWSER_LIMIT_KEYS) {
4283
+ const value3 = pick(key);
4284
+ if (typeof value3 === "number" && Number.isInteger(value3) && value3 > 0) limits[key] = value3;
4285
+ }
4286
+ return limits;
4287
+ }
4167
4288
  function utf8WidthAt(value3, index) {
4168
4289
  const code = value3.charCodeAt(index);
4169
4290
  if (code < 128) return {
@@ -4319,6 +4440,338 @@ function isDesktopFileCommandName(value3) {
4319
4440
  function isDesktopFileSessionId(value3) {
4320
4441
  return typeof value3 === "string" && /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value3);
4321
4442
  }
4443
+ function browserError(code, message, status) {
4444
+ return Object.assign(new Error(message), {
4445
+ name: BROWSER_ERROR_NAME,
4446
+ code,
4447
+ ...typeof status === "number" ? {
4448
+ status
4449
+ } : {}
4450
+ });
4451
+ }
4452
+ function isRecord(value3) {
4453
+ return typeof value3 === "object" && value3 !== null && !Array.isArray(value3);
4454
+ }
4455
+ function optionalString(raw, field) {
4456
+ const value3 = raw[field];
4457
+ if (value3 === void 0 || value3 === null || value3 === "") return void 0;
4458
+ if (typeof value3 !== "string") throw new TypeError(`${field} must be a string`);
4459
+ if (value3.startsWith("-")) throw new TypeError(`${field} may not start with '-'`);
4460
+ if (value3.includes("\0")) throw new TypeError(`${field} may not contain NUL`);
4461
+ return value3;
4462
+ }
4463
+ function readUrl(value3) {
4464
+ if (typeof value3 !== "string" || !/^https?:\/\//i.test(value3.trim()) || value3.includes("\0")) {
4465
+ throw new TypeError("url must be an absolute http(s) URL");
4466
+ }
4467
+ return value3.trim();
4468
+ }
4469
+ function readFormat(value3) {
4470
+ if (value3 === void 0 || value3 === null || value3 === "") return "text";
4471
+ if (!BROWSER_READ_FORMATS.includes(value3)) {
4472
+ throw new TypeError(`format must be one of: ${BROWSER_READ_FORMATS.join(", ")}`);
4473
+ }
4474
+ return value3;
4475
+ }
4476
+ function readTimeout(value3) {
4477
+ if (value3 === void 0 || value3 === null) return BROWSER_READ_DEFAULT_TIMEOUT_MS;
4478
+ if (typeof value3 !== "number" || !Number.isFinite(value3)) throw new TypeError("timeoutMs must be a number");
4479
+ return Math.min(BROWSER_READ_MAX_TIMEOUT_MS, Math.max(BROWSER_READ_MIN_TIMEOUT_MS, Math.round(value3)));
4480
+ }
4481
+ function parseBrowserReadPayload(raw) {
4482
+ try {
4483
+ const input = isRecord(raw) ? raw : {};
4484
+ const waitFor = optionalString(input, "waitFor");
4485
+ return {
4486
+ payload: {
4487
+ url: readUrl(input.url),
4488
+ ...waitFor ? {
4489
+ waitFor
4490
+ } : {},
4491
+ selector: optionalString(input, "selector") ?? BROWSER_READ_DEFAULT_SELECTOR,
4492
+ format: readFormat(input.format),
4493
+ timeoutMs: readTimeout(input.timeoutMs)
4494
+ }
4495
+ };
4496
+ } catch (error) {
4497
+ return {
4498
+ error: {
4499
+ code: "invalid_argument",
4500
+ message: `read: ${error.message}`
4501
+ }
4502
+ };
4503
+ }
4504
+ }
4505
+ function clampBrowserReadContent(content, maxChars = BROWSER_READ_MAX_CONTENT_CHARS) {
4506
+ if (content.length <= maxChars) return {
4507
+ content,
4508
+ truncated: false
4509
+ };
4510
+ return {
4511
+ content: content.slice(0, maxChars),
4512
+ truncated: true
4513
+ };
4514
+ }
4515
+ function joinBrowserReadMatches(parts, maxChars = BROWSER_READ_MAX_CONTENT_CHARS) {
4516
+ const kept = parts.map((part) => part.trim()).filter((part) => part.length > 0);
4517
+ return clampBrowserReadContent(kept.join(BROWSER_READ_MATCH_SEPARATOR), maxChars);
4518
+ }
4519
+ function isBrowserReadHttpFailure(message) {
4520
+ return HTTP_STATUS_FAILURE.test(message ?? "");
4521
+ }
4522
+ function browserReadHttpErrorMessage(url, status) {
4523
+ const answered = status === void 0 ? "an HTTP error status" : `HTTP ${status}`;
4524
+ return `read: ${url} answered ${answered} with no page to read`;
4525
+ }
4526
+ function urlOf(value3) {
4527
+ if (!value3) return void 0;
4528
+ try {
4529
+ return new URL(value3);
4530
+ } catch {
4531
+ return void 0;
4532
+ }
4533
+ }
4534
+ function answeredDocuments(requests) {
4535
+ if (!Array.isArray(requests)) return [];
4536
+ const answered = [];
4537
+ for (const entry of requests) {
4538
+ if (!isRecord(entry) || typeof entry.status !== "number" || typeof entry.url !== "string") continue;
4539
+ const url = urlOf(entry.url);
4540
+ if (url) answered.unshift({
4541
+ url,
4542
+ status: entry.status
4543
+ });
4544
+ }
4545
+ return answered;
4546
+ }
4547
+ function documentStatusOf(requests, requestedUrl, finalUrl) {
4548
+ const latestFirst = answeredDocuments(requests);
4549
+ const final = urlOf(finalUrl);
4550
+ const requested = urlOf(requestedUrl);
4551
+ const match = latestFirst.find((doc) => doc.url.href === final?.href) ?? latestFirst.find((doc) => doc.url.href === requested?.href) ?? latestFirst.find((doc) => doc.url.host === final?.host);
4552
+ return match?.status;
4553
+ }
4554
+ function isLoginUrl(url) {
4555
+ const segments = url.pathname.toLowerCase().split("/");
4556
+ return segments.some((segment) => LOGIN_PATH_SEGMENTS.has(segment)) || LOGIN_HOST_LABELS.has(url.hostname.split(".")[0]);
4557
+ }
4558
+ function isLoginRedirect(requestedUrl, finalUrl) {
4559
+ const requested = urlOf(requestedUrl);
4560
+ const final = urlOf(finalUrl);
4561
+ return Boolean(requested && final && !isLoginUrl(requested) && isLoginUrl(final));
4562
+ }
4563
+ function browserReadLoginBlock() {
4564
+ return {
4565
+ blocked: true,
4566
+ blocker: BROWSER_READ_LOGIN_BLOCKER,
4567
+ blockerKind: "login",
4568
+ blockerGuidance: "This URL redirected to a sign-in page, so the content is the sign-in form, not the page you asked for. The page needs a signed-in session: read it on the desktop browser where the user is signed in, or use a public URL."
4569
+ };
4570
+ }
4571
+ function utf8Bytes(value3) {
4572
+ let bytes = 0;
4573
+ for (let i = 0; i < value3.length; ) {
4574
+ const code = value3.charCodeAt(i);
4575
+ if (code < 128) {
4576
+ bytes += 1;
4577
+ i += 1;
4578
+ } else if (code < 2048) {
4579
+ bytes += 2;
4580
+ i += 1;
4581
+ } else if (code >= 55296 && code <= 56319) {
4582
+ const next = value3.charCodeAt(i + 1);
4583
+ if (next >= 56320 && next <= 57343) {
4584
+ bytes += 4;
4585
+ i += 2;
4586
+ } else {
4587
+ bytes += 3;
4588
+ i += 1;
4589
+ }
4590
+ } else {
4591
+ bytes += 3;
4592
+ i += 1;
4593
+ }
4594
+ }
4595
+ return bytes;
4596
+ }
4597
+ function isPlainFieldKey(key) {
4598
+ if (!LOG_FIELD_KEY_PATTERN.test(key)) return false;
4599
+ if (key === LOG_FIELDS_CLAMPED_KEY) return false;
4600
+ return !LOG_FIELD_SECRET_SHAPED_KEY_PATTERNS.some((pattern) => pattern.test(key));
4601
+ }
4602
+ function describeAgentLogFieldsViolation(value3) {
4603
+ if (typeof value3 !== "object" || value3 === null || Array.isArray(value3)) {
4604
+ return "fields must be an object";
4605
+ }
4606
+ const entries = Object.entries(value3);
4607
+ let userKeys = 0;
4608
+ for (const [key, entry] of entries) {
4609
+ if (key === LOG_FIELDS_CLAMPED_KEY) {
4610
+ if (entry !== true) return `fields.${key} must be true`;
4611
+ continue;
4612
+ }
4613
+ userKeys += 1;
4614
+ if (key.endsWith(LOG_FIELD_ARRAY_COUNT_SUFFIX)) {
4615
+ const base = key.slice(0, -LOG_FIELD_ARRAY_COUNT_SUFFIX.length);
4616
+ if (!isPlainFieldKey(base)) return `fields key \`${key}\` is not a legal field key`;
4617
+ if (typeof entry !== "number" || !Number.isFinite(entry)) {
4618
+ return `fields.${key} must be a finite number`;
4619
+ }
4620
+ continue;
4621
+ }
4622
+ if (!isPlainFieldKey(key)) return `fields key \`${key}\` is not a legal field key`;
4623
+ if (typeof entry === "string") {
4624
+ if (utf8Bytes(entry) > LOG_FIELD_MAX_VALUE_BYTES) {
4625
+ return `fields.${key} exceeds ${LOG_FIELD_MAX_VALUE_BYTES} bytes`;
4626
+ }
4627
+ continue;
4628
+ }
4629
+ if (typeof entry === "boolean") continue;
4630
+ if (typeof entry === "number") {
4631
+ if (!Number.isFinite(entry)) return `fields.${key} must be a finite number`;
4632
+ continue;
4633
+ }
4634
+ return `fields.${key} must be a string, number or boolean`;
4635
+ }
4636
+ if (userKeys > LOG_FIELDS_MAX_KEYS) {
4637
+ return `fields has ${userKeys} keys, over the cap of ${LOG_FIELDS_MAX_KEYS}`;
4638
+ }
4639
+ if (utf8Bytes(JSON.stringify(value3)) > LOG_FIELDS_MAX_BYTES) {
4640
+ return `fields exceeds ${LOG_FIELDS_MAX_BYTES} bytes`;
4641
+ }
4642
+ return void 0;
4643
+ }
4644
+ function isAgentLogFields(value3) {
4645
+ return describeAgentLogFieldsViolation(value3) === void 0;
4646
+ }
4647
+ function describeBaseViolation(event) {
4648
+ if (!BROWSER_LOG_EVENT_KINDS.includes(event.event)) return "event is not a known kind";
4649
+ if (typeof event.sessionId !== "string" || event.sessionId.length === 0) return "sessionId must be a string";
4650
+ if (event.sessionId.length > BROWSER_LOG_ID_MAX_CHARS) return "sessionId is too long";
4651
+ if (!BROWSER_LOG_ENGINES.includes(event.engine)) return "engine is not a known engine";
4652
+ if (typeof event.at !== "string" || Number.isNaN(Date.parse(event.at))) return "at must be an ISO timestamp";
4653
+ return void 0;
4654
+ }
4655
+ function describeFieldViolation(key, value3, check) {
4656
+ if (!check) return `${key} is not a field of this event`;
4657
+ if (!check(value3)) return `${key} has the wrong type`;
4658
+ if (typeof value3 === "string" && value3.length > BROWSER_LOG_TEXT_MAX_CHARS) return `${key} is too long`;
4659
+ return void 0;
4660
+ }
4661
+ function describeBrowserLogEventViolation(value3) {
4662
+ if (!isPlainObject2(value3)) return "event must be an object";
4663
+ const event = value3;
4664
+ const base = describeBaseViolation(event);
4665
+ if (base) return base;
4666
+ const shape = EVENT_SHAPES[event.event];
4667
+ for (const key of Object.keys(shape.required)) {
4668
+ if (event[key] === void 0) return `${key} is required`;
4669
+ }
4670
+ for (const [key, entry] of Object.entries(event)) {
4671
+ if (BASE_KEYS.has(key) || entry === void 0) continue;
4672
+ const violation = describeFieldViolation(key, entry, shape.required[key] ?? shape.optional[key]);
4673
+ if (violation) return violation;
4674
+ }
4675
+ return void 0;
4676
+ }
4677
+ function isBrowserLogEvent(value3) {
4678
+ return describeBrowserLogEventViolation(value3) === void 0;
4679
+ }
4680
+ function describeBrowserLogContextViolation(value3) {
4681
+ if (value3 === void 0) return void 0;
4682
+ if (!isPlainObject2(value3)) return "logContext must be an object";
4683
+ for (const [key, entry] of Object.entries(value3)) {
4684
+ if (!BROWSER_LOG_CONTEXT_KEYS.includes(key)) return `logContext.${key} is not allowed`;
4685
+ if (entry === void 0) continue;
4686
+ if (typeof entry !== "string") return `logContext.${key} must be a string`;
4687
+ if (entry.length > BROWSER_LOG_ID_MAX_CHARS) return `logContext.${key} is too long`;
4688
+ if (key === "environment" && !AGENT_LOG_ENVIRONMENTS.includes(entry)) {
4689
+ return "logContext.environment is not a known environment";
4690
+ }
4691
+ }
4692
+ return void 0;
4693
+ }
4694
+ function browserWorkerSessionId(ref) {
4695
+ return [
4696
+ ref.agentId,
4697
+ ref.userId,
4698
+ ref.sessionKey
4699
+ ].join(BROWSER_WORKER_SESSION_ID_SEPARATOR);
4700
+ }
4701
+ function browserLogContextOfWorkerContext(context) {
4702
+ const out = {};
4703
+ if (context?.runId) out.runId = context.runId;
4704
+ if (context?.primitiveId) out.primitiveId = context.primitiveId;
4705
+ if (context?.primitiveName) out.primitiveName = context.primitiveName;
4706
+ if (context?.channel) out.channel = context.channel;
4707
+ return out;
4708
+ }
4709
+ function browserLogEventOfWorkerEvent(event, mapping = {}) {
4710
+ const base = {
4711
+ sessionId: mapping.sessionId ?? event.sessionId,
4712
+ engine: "agent-browser",
4713
+ at: event.at
4714
+ };
4715
+ switch (event.event) {
4716
+ case "session.opened":
4717
+ return {
4718
+ ...base,
4719
+ event: "session.opened",
4720
+ reason: mapping.reason ?? "stepwise-cloud",
4721
+ limits: {
4722
+ ...event.limits
4723
+ }
4724
+ };
4725
+ case "session.closed":
4726
+ return {
4727
+ ...base,
4728
+ event: "session.closed",
4729
+ reason: event.reason,
4730
+ durationMs: event.durationMs,
4731
+ pagesVisited: event.pagesVisited,
4732
+ bytes: event.bytes
4733
+ };
4734
+ case "command":
4735
+ return {
4736
+ ...base,
4737
+ event: "command",
4738
+ name: event.name,
4739
+ ok: event.ok,
4740
+ durationMs: event.durationMs,
4741
+ resultBytes: event.resultBytes,
4742
+ urlAfter: event.urlAfter,
4743
+ title: event.title,
4744
+ errorCode: event.errorCode,
4745
+ errorMessage: event.errorMessage
4746
+ };
4747
+ case "navigation":
4748
+ if (!event.ok) return void 0;
4749
+ return {
4750
+ ...base,
4751
+ event: "navigation",
4752
+ url: event.url,
4753
+ finalUrl: event.finalUrl
4754
+ };
4755
+ case "blocked":
4756
+ return {
4757
+ ...base,
4758
+ event: "blocked",
4759
+ kind: event.kind,
4760
+ rule: event.rule,
4761
+ target: event.target,
4762
+ command: event.command,
4763
+ reason: event.detail ? event.detail.slice(0, BROWSER_WORKER_BLOCK_REASON_MAX_CHARS) : void 0
4764
+ };
4765
+ case "wall":
4766
+ return {
4767
+ ...base,
4768
+ event: "wall",
4769
+ kind: event.kind,
4770
+ url: event.url,
4771
+ nextAction: event.nextAction
4772
+ };
4773
+ }
4774
+ }
4322
4775
  function workflowRetryMaxAttemptsMessage(got) {
4323
4776
  const tail = got === void 0 ? "" : ` (got ${JSON.stringify(got)})`;
4324
4777
  return `\`retry.maxAttempts\` must be an integer ${WORKFLOW_RETRY_MIN_ATTEMPTS}..${WORKFLOW_RETRY_MAX_ATTEMPTS}${tail}`;
@@ -4532,98 +4985,22 @@ function buildDefaultPersona(agentName) {
4532
4985
  function buildPersonalSpaceStartingPersona(agentName) {
4533
4986
  return PERSONAL_SPACE_STARTING_PERSONA.replace(new RegExp(AGENT_NAME_TOKEN.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g"), () => agentName || "Your assistant");
4534
4987
  }
4535
- function utf8Bytes(value3) {
4536
- let bytes = 0;
4537
- for (let i = 0; i < value3.length; ) {
4538
- const code = value3.charCodeAt(i);
4539
- if (code < 128) {
4540
- bytes += 1;
4541
- i += 1;
4542
- } else if (code < 2048) {
4543
- bytes += 2;
4544
- i += 1;
4545
- } else if (code >= 55296 && code <= 56319) {
4546
- const next = value3.charCodeAt(i + 1);
4547
- if (next >= 56320 && next <= 57343) {
4548
- bytes += 4;
4549
- i += 2;
4550
- } else {
4551
- bytes += 3;
4552
- i += 1;
4553
- }
4554
- } else {
4555
- bytes += 3;
4556
- i += 1;
4557
- }
4558
- }
4559
- return bytes;
4988
+ function maxDrainsForTier(tier) {
4989
+ return tier === "enterprise" ? LOG_DRAIN_MAX_PER_ORG_ENTERPRISE : LOG_DRAIN_MAX_PER_ORG;
4560
4990
  }
4561
- function isPlainFieldKey(key) {
4562
- if (!LOG_FIELD_KEY_PATTERN.test(key)) return false;
4563
- if (key === LOG_FIELDS_CLAMPED_KEY) return false;
4564
- return !LOG_FIELD_SECRET_SHAPED_KEY_PATTERNS.some((pattern) => pattern.test(key));
4991
+ function resolvePresetEndpoint(type, site) {
4992
+ const template3 = LOG_DRAIN_ENDPOINT_TEMPLATES[type];
4993
+ if (!template3 || !site) return void 0;
4994
+ return template3.replace("{site}", site);
4565
4995
  }
4566
- function describeAgentLogFieldsViolation(value3) {
4567
- if (typeof value3 !== "object" || value3 === null || Array.isArray(value3)) {
4568
- return "fields must be an object";
4569
- }
4570
- const entries = Object.entries(value3);
4571
- let userKeys = 0;
4572
- for (const [key, entry] of entries) {
4573
- if (key === LOG_FIELDS_CLAMPED_KEY) {
4574
- if (entry !== true) return `fields.${key} must be true`;
4575
- continue;
4576
- }
4577
- userKeys += 1;
4578
- if (key.endsWith(LOG_FIELD_ARRAY_COUNT_SUFFIX)) {
4579
- const base = key.slice(0, -LOG_FIELD_ARRAY_COUNT_SUFFIX.length);
4580
- if (!isPlainFieldKey(base)) return `fields key \`${key}\` is not a legal field key`;
4581
- if (typeof entry !== "number" || !Number.isFinite(entry)) {
4582
- return `fields.${key} must be a finite number`;
4583
- }
4584
- continue;
4585
- }
4586
- if (!isPlainFieldKey(key)) return `fields key \`${key}\` is not a legal field key`;
4587
- if (typeof entry === "string") {
4588
- if (utf8Bytes(entry) > LOG_FIELD_MAX_VALUE_BYTES) {
4589
- return `fields.${key} exceeds ${LOG_FIELD_MAX_VALUE_BYTES} bytes`;
4590
- }
4591
- continue;
4592
- }
4593
- if (typeof entry === "boolean") continue;
4594
- if (typeof entry === "number") {
4595
- if (!Number.isFinite(entry)) return `fields.${key} must be a finite number`;
4596
- continue;
4597
- }
4598
- return `fields.${key} must be a string, number or boolean`;
4599
- }
4600
- if (userKeys > LOG_FIELDS_MAX_KEYS) {
4601
- return `fields has ${userKeys} keys, over the cap of ${LOG_FIELDS_MAX_KEYS}`;
4602
- }
4603
- if (utf8Bytes(JSON.stringify(value3)) > LOG_FIELDS_MAX_BYTES) {
4604
- return `fields exceeds ${LOG_FIELDS_MAX_BYTES} bytes`;
4605
- }
4606
- return void 0;
4607
- }
4608
- function isAgentLogFields(value3) {
4609
- return describeAgentLogFieldsViolation(value3) === void 0;
4610
- }
4611
- function maxDrainsForTier(tier) {
4612
- return tier === "enterprise" ? LOG_DRAIN_MAX_PER_ORG_ENTERPRISE : LOG_DRAIN_MAX_PER_ORG;
4613
- }
4614
- function resolvePresetEndpoint(type, site) {
4615
- const template3 = LOG_DRAIN_ENDPOINT_TEMPLATES[type];
4616
- if (!template3 || !site) return void 0;
4617
- return template3.replace("{site}", site);
4618
- }
4619
- function isLogDrainBucketHostAllowed(provider, host) {
4620
- const normalized = host.trim().toLowerCase().replace(/^\[|\]$/g, "");
4621
- if (!normalized) return false;
4622
- return (LOG_DRAIN_BUCKET_HOST_PATTERNS[provider] ?? []).some((pattern) => pattern.test(normalized));
4623
- }
4624
- function resolveDrainBucketEndpoint(bucket) {
4625
- if (!LOG_DRAIN_BUCKET_NAME_PATTERN.test(bucket.bucket)) {
4626
- throw new Error("log drain bucket name is not a valid S3 bucket label");
4996
+ function isLogDrainBucketHostAllowed(provider, host) {
4997
+ const normalized = host.trim().toLowerCase().replace(/^\[|\]$/g, "");
4998
+ if (!normalized) return false;
4999
+ return (LOG_DRAIN_BUCKET_HOST_PATTERNS[provider] ?? []).some((pattern) => pattern.test(normalized));
5000
+ }
5001
+ function resolveDrainBucketEndpoint(bucket) {
5002
+ if (!LOG_DRAIN_BUCKET_NAME_PATTERN.test(bucket.bucket)) {
5003
+ throw new Error("log drain bucket name is not a valid S3 bucket label");
4627
5004
  }
4628
5005
  if (bucket.provider === "aws") {
4629
5006
  const region = bucket.region.trim().toLowerCase();
@@ -5103,11 +5480,11 @@ function parseLogTimeBound(raw, now = /* @__PURE__ */ new Date()) {
5103
5480
  const at = Date.parse(value3);
5104
5481
  return Number.isNaN(at) ? null : new Date(at);
5105
5482
  }
5106
- function isRecord(value3) {
5483
+ function isRecord2(value3) {
5107
5484
  return typeof value3 === "object" && value3 !== null;
5108
5485
  }
5109
5486
  function isCoreDrainingErrorResponse(value3) {
5110
- if (!isRecord(value3) || !isRecord(value3.error)) return false;
5487
+ if (!isRecord2(value3) || !isRecord2(value3.error)) return false;
5111
5488
  return value3.error.code === CORE_DRAINING_CODE && typeof value3.error.message === "string" && value3.error.retryable === true;
5112
5489
  }
5113
5490
  function coreDrainingRetryDelayMs(retryAfter, nowMs = Date.now()) {
@@ -6304,11 +6681,11 @@ function recentRefs(lists) {
6304
6681
  function confidenceOf(n2) {
6305
6682
  return n2 < EVIDENCE_LOW_CONFIDENCE_N ? "low" : "ok";
6306
6683
  }
6307
- function rateOf(count, conversations) {
6684
+ function rateOf(count2, conversations) {
6308
6685
  return {
6309
- count,
6310
- rate: conversations > 0 ? count / conversations : null,
6311
- confidence: confidenceOf(count)
6686
+ count: count2,
6687
+ rate: conversations > 0 ? count2 / conversations : null,
6688
+ confidence: confidenceOf(count2)
6312
6689
  };
6313
6690
  }
6314
6691
  function evidenceDays(from, to) {
@@ -7130,7 +7507,7 @@ function maskMcpServerHeaders(server) {
7130
7507
  headersSet: headerNames.length > 0
7131
7508
  };
7132
7509
  }
7133
- var __defProp4, __name4, PLUMBING_THREAD_CHANNELS, CHANNEL_CONVERSATION_CHANNELS, HIDDEN_THREAD_CHANNELS, CHOICE_PERSON_TURN_CHANNELS, CHOICE_REPLAY_CLIENT_CAPABILITIES, CHOICE_REPLAY_CLIENT_SURFACES, DECISION_PROVIDERS, DECISION_QUESTION_TYPES, DECISION_NAME_PATTERN, DECISION_LIMITS, DECISION_ERROR_CODES, MAX_NAME_CHARS, InstructionsSchema, NameSchema, OddsQuestionSchema, ChoiceQuestionSchema, ScoreQuestionSchema, DecisionQuestionSchema, DecisionOptionsSchema, DecisionQuestionsSchema, DecisionDefinitionSchema, INTEGRATION_PASSTHROUGH_READ_METHODS, URL_REINTERPRETED_PATH_CHARACTERS, PERCENT_ENCODED_DOT, PERCENT_ESCAPE, DECODED_PATH_SEPARATORS, DECODED_LEADING_SEPARATOR, MAX_PERCENT_DECODE_ROUNDS, URL_RESOLUTION_PROBE_BASE, PLATFORM_INVOCATION_CALLERS, SUPERVISION_OPS, SUPERVISION_OPS_WAVE2, SUPERVISION_WATCHDOG_OPS, SUPERVISION_WATCHDOG_ERRORS, SUPERVISION_ROLLBACK_REFUSAL_CODES, SUPERVISION_ROLLBACK_LINEAGE_MAX, SUPERVISION_UNTARGETED_OPS, SUPERVISED_WORKFLOW_VERSIONS_MAX, SUPERVISION_EVENT_KINDS, AGENT_PROVISIONING_LIMITS, AGENT_PROVISIONING_APPROVAL_PAYLOAD_KEY, AGENT_PROVISIONING_ERRORS, PROVISIONED_SUPERVISION_ACTIONS, isNonEmptyString, uniqueStrings, sameSet, AGENT_PROVISIONING_APPROVAL_CARD_MAX_CHARS, APPROVAL_PAYLOAD_MEMBERS, AGENT_CONNECTION_POLICIES, AGENT_CONNECTION_POLICY_DEFAULT, AGENT_CONNECTION_MOUNT_MODES, AGENT_CONNECTION_GOVERNANCE_ERRORS, AGENT_CONNECTION_OPERATION_RULES_MAX, AGENT_CONNECTION_OPERATION_PATTERN_MAX_LENGTH, OPERATION_RULE_METHODS, PATH_SEPARATOR, PATH_SINGLE_SEGMENT_WILDCARD, PATH_REST_WILDCARD, METHOD_OVERRIDE_HEADER_NAMES, METHOD_OVERRIDE_QUERY_NAMES, ODATA_BATCH_SEGMENT, GOOGLE_BATCH_FIRST_SEGMENT, CONNECTION_CHECK_RESULTS, CONNECTION_CHECK_CATALOGUE_V1, CONNECTION_CHECK_NAME_PATTERN, CONNECTION_CHECK_NAME_MAX, CONNECT_OUTCOME_STATUSES, SECRET_TEST_RESULTS, SECRET_DATADOG_REGIONS, SECRET_PROVIDER_CATALOGUE_V1, SECRET_TEST_MAX_RESPONSE_BYTES, SECRET_ENV_KEY_PATTERN, SECRET_REQUEST_ERRORS, SECRET_OUTCOME_STATUSES, CLIENT_OUTCOME_TURNS_MAX, SHORT_TEXT_MAX, SLUG_MAX, shortText, optionalShortText, CONNECTION_REQUEST_TERMINAL_STATES, CONNECTION_USE_ORIGINS, AGENT_CONNECTION_OPERATION_LIMITS_BOUNDS, CURRENCY_CODE, LIMITS_KEYS, CAPS_KEYS, EXCLUSIONS_KEYS, EMAIL_IN_TEXT, MAX_EXCLUSION_DEPTH, PROJECTION_PARAMETER_KEYS, CHANNEL_PARAMETER_KEYS, GMAIL_SYSTEM_LABEL_IDS, ZERO_DECIMAL_CURRENCIES, THREE_DECIMAL_CURRENCIES, DECIMAL_AMOUNT, REDACTED_PLACEHOLDER, PROVIDER_MESSAGE_MAX_CHARS, ERROR_MESSAGE_MAX_CHARS, SECRET_LITERAL_PATTERNS, SECRET_NAME, SECRET_PAIR_PATTERNS, GROUP_COUNT, WORKFLOW_SECRET_KEY_RE, WORKFLOW_RESERVED_SECRET_KEYS, SCRUB_INPUT_MAX_CHARS, SCRUB_CUT_BACKOFF_CHARS, TEST_SESSION_ID_PATTERN, TEST_SESSION_COLLECTION_PREFIX, TEST_EFFECT_BODY_MAX_BYTES, TEST_EFFECT_DROPPED_HEADERS, EVAL_CREDITS_PER_1K_TOKENS, EVAL_RESERVED_TOOL_ID_PREFIXES, CONNECTION_HANDOVER_APPROVAL_PAYLOAD_KEY, CONNECTION_HANDOVER_APPROVAL_CARD_MAX_CHARS, CONNECTION_HANDOVER_LIMITS, MEMBERS, FORMAT_CHARS, oneLine, boundedString, AGENT_METRIC_NAME_PATTERN, AGENT_METRIC_LIMITS, AGENT_OBJECTIVE_ERRORS, CHANGE_LEASE_TTL_MINUTES_MIN, CHANGE_LEASE_TTL_MINUTES_MAX, CHANGE_LEASE_REASON_MAX, CHANGE_LEASE_ERRORS, AGENT_CONFIG_SET_LIMITS, SECRET_ENV_KEY_SUFFIXES, DEFAULT_OWNER_DEPARTURE_POLICY, AGENT_LIFECYCLE_ERRORS, USER_COST_COUNTER_TTL_SECONDS, USER_COST_ATTRIBUTION_CHANNELS, CALLER_DEDUPE_KEY_MAX, FOLLOW_UP_IDEMPOTENCY_TTL_SECONDS, THREAD_FOLLOW_UP_LIMITS, THREAD_FOLLOW_UP_ERRORS, PROGRESS_UPDATE_LIMITS, PAUSABLE_CAPABILITY_KINDS, UNIFIED_CATCH_UP_MAX_WINDOW_HOURS, UNIFIED_CATCH_UP_EVENTS, UNIFIED_CATCH_UP_FILTERABLE_OBJECT_TYPES, AGENT_NEVER_RULES_MAX, AGENT_NEVER_RULE_FIELD_MAX, AGENT_NEVER_RULE_INPUT_MATCH_MAX, NEVER_RULE_ID_PATTERN, NEVER_RULE_HTTP_METHODS, TEMPLATE_DISTRIBUTION_MODES, CHANNEL_SEND_CHANNELS, TAKEOVER_MAX_IDLE_MINUTES, MINUTES_PER_DAY, DEFAULT_IDLE_RELEASE_MINUTES, FALLBACK_IDLE_RELEASE_MINUTES, VARIATION_SELECTORS, SLACK_EMOJI_NAMES, SLACK_SHORTCODE, PLAIN_EMAIL_ADDRESS, DOMAIN, UNSAFE_TEXT, SLACK_CONVERSATION_ID, CHANNEL_SETTING_GROUPS, THREAD_SCOPING_NOUN, TAKEOVER_CHANNEL_TYPES, EMAIL_SETTINGS, SLACK_SETTING_DEFAULTS, SLACK_REACTION_MAX, SLACK_INTRO_MAX, SLACK_EXAMPLE_PROMPTS_MAX, SLACK_EXAMPLE_PROMPT_MAX, SLACK_SUPPORT_CONTACT_MAX, SLACK_SETTINGS, CHANNEL_SETTINGS, REVIEWABLE_ACTION_EXECUTE_TOOL_ALLOWLIST, REVIEWABLE_STANDING_START_TOOLS, 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, WORK_ITEMS_KEY, MAX_WORK_ITEMS, LIMITS, BROWSER_COMMANDS, BROWSER_COMMAND_NAMES, LOG_FIELDS_MAX_KEYS, LOG_FIELD_MAX_VALUE_BYTES, LOG_FIELDS_MAX_BYTES, LOG_FIELD_KEY_PATTERN, LOG_FIELD_SECRET_SHAPED_KEY_PATTERNS, LOG_FIELDS_CLAMPED_KEY, LOG_FIELD_ARRAY_COUNT_SUFFIX, LuaLogFieldsError, DESKTOP_FILE_COMMANDS, DESKTOP_FILE_COMMAND_SET, WORKFLOW_RETRY_BACKOFFS, WORKFLOW_RETRY_MIN_ATTEMPTS, WORKFLOW_RETRY_POLICY_KEYS, WORKFLOW_RETRY_MAX_ATTEMPTS, WORKFLOW_RETRY_ENGINE_KEYS, WORKFLOW_JOB_RESOURCES, WORKFLOW_SIDE_EFFECTS, WORKFLOW_MODEL_CLASSES, WORKFLOW_DEFAULT_TASK_CLASS_MAP, WORKFLOW_MODELS_MAX_CLASS_DEFAULT, WORKFLOW_AUTONOMY_NUMERIC_KEYS, WORKFLOW_AUTONOMY_ENVELOPE_KEYS, WORKFLOW_AUTONOMY_DEFAULTS, WORKFLOW_AUTONOMY_CEILINGS, WORKFLOW_AUTONOMY_MAX_RUNS_PER_HOUR_ENV, WORKFLOW_AUTONOMY_MAX_RUNS_PER_HOUR_CEILING, WORKFLOW_AUTONOMY_FORMS_DEFAULT, WORKFLOW_AUTONOMY_MIN_VALUE, WORKFLOW_JOB_RANGES, WORKFLOW_JOB_RANGE_MEMBERS, WORKFLOW_SINGLE_STEP_TYPES, WORKFLOW_HITL_ENTRY_TYPES, WORKFLOW_ARM_ENTRY_TYPES, WORKFLOW_HITL_ARM_CONTAINERS, WORKFLOW_GRAPH_ENTRY_STEP_KINDS, WORKFLOW_ARM_ENTRY_STEP_KINDS, WORKFLOW_BUDGET_MAX_DURATION_SECONDS, MODEL_ID_BYOK_PROVIDERS, MODEL_CLASS_REF_PREFIX, MODEL_SNAPSHOT_SUFFIX, REASONING_EFFORT_VALUES, IMPLICIT_MODEL_SELECTION_SOURCES, PLATFORM_FALLBACK_MODEL_SOURCE, AGENT_NAME_TOKEN, DEFAULT_PERSONA_GUIDE, PERSONAL_SPACE_STARTING_PERSONA, AGENT_LOG_SOURCES, AGENT_LOG_FIELDS_MAX_WIRE_KEYS, LOG_DRAIN_TYPES_PHASE1, LOG_DRAIN_TYPES_PHASE2, LOG_DRAIN_TYPES_IMPLEMENTED, LOG_DRAIN_SOURCES, LOG_DRAIN_MAX_PER_ORG, LOG_DRAIN_MAX_PER_ORG_ENTERPRISE, LOG_DRAIN_DATADOG_SITES, LOG_DRAIN_NEWRELIC_SITES, LOG_DRAIN_ENDPOINT_TEMPLATES, LOG_DRAIN_PRESET_SITES, LOG_DRAIN_BUCKET_NAME_PATTERN, LOG_DRAIN_BUCKET_HOST_PATTERNS, LOG_DRAIN_PRESET_HOST_SUFFIXES, DRAIN_CONTENT_ACK_ERROR_CODE, DRAIN_CONTENT_ACK_FIELD, DrainContentAckRequiredError, LOG_DRAIN_PRESET_PATHS, PRESET_SEGMENT_RE, LOG_DRAIN_QUOTAS, LOG_DRAIN_QUOTA_WARN_RATIO, LOG_DRAIN_QUOTA_DROP_DEBUG_RATIO, LOG_DRAIN_QUOTA_DROP_INFO_RATIO, LOG_DRAIN_QUOTA_PAUSE_RATIO, LOG_EXPORT_SOURCES, LOG_EXPORT_MAX_WINDOW_DAYS, LOG_EXPORT_MAX_WINDOW_MS, LOG_EXPORT_URL_TTL_SECONDS, LOG_EXPORT_FILE_RETENTION_DAYS, LOG_EXPORT_FILE_RETENTION_MS, LOG_EXPORT_PART_MAX_BYTES, LOG_DRAIN_NOTICE_RATE_LIMIT_MS, LOG_DRAIN_VERIFICATION_STALE_MS, LOG_DRAIN_DIGEST_INTERVAL_MS, LOG_DRAIN_DIGEST_MAX_ENTRIES, LOG_DRAIN_NOTICE_ERROR_MAX_CHARS, LOG_DRAIN_USAGE_LINE_ITEM, LOG_DRAIN_BYTES_PER_GIB, DEFAULT_LOG_DRAIN_PLAN_CONFIG, TIERS, LOG_CURSOR_MAX_LENGTH, LOG_CURSOR_MAX_ID_LENGTH, LOG_RELATIVE_TIME_PATTERN, LOG_ISO_TIME_PATTERN, RELATIVE_UNIT_MS, 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, KEYS, MAX_BODY_BYTES, MAX_ID_LENGTH, UTC_ISO, TEMPLATE_TRIGGER_URL_ENV_PREFIX, TEMPLATE_INSTALL_POLICY_PER_WORKSPACE_VALUES, SUBJECT_TYPES, SubjectTypeSchema, CREDENTIAL_TYPES, CredentialTypeSchema, DEVICE_OPERATIONS, DeviceOperationSchema, DEVICE_SCOPE_BY_OPERATION, DeviceBindingSchema, IdSchema, SESSION_AUTH_TIME_MAX_S, 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, LUA_SESSION_ID_CLAIM, SESSION_REVOKED_CODE, AUTHZ_PROJECTION_VERSION, ProjectedScopeSchema, DisplayRoleSchema, AuthorizationPrincipalSchema, CredentialContextSchema, ProjectionAnomalySchema, ProjectedOrgSchema, ProjectedResourceSchema, CapabilityProfilesSchema, RoleCatalogSchema, EffectiveAuthorizationSchema, ResourcePageSchema, SYSTEM_USER_PREFIX, WORKFLOW_RUN_IN_FLIGHT, WORKFLOW_RUN_IDLE, WORKFLOW_RUN_TERMINAL, WORKFLOW_RUN_STATUSES, WORKFLOW_RUN_GATE_KINDS, WORKFLOW_STEP_STATUSES, WORKFLOW_STEP_IN_FLIGHT, WORKFLOW_SIGNAL_EVENT_SITES, ARCHIVE_WINDOW_MARGIN_DAYS, WORKFLOW_ORG_PURGING_TTL_S, WORKFLOW_ORG_PURGE_FORCE_AFTER_MS, IDEMPOTENCY_HOLDING_STATUSES, WORKFLOW_SCHEDULED_RUN_ID_PREFIX, CLOUD_TASK_RUN_ID_PREFIX, WORKFLOW_SCHEDULE_KEY_MAX, WORKFLOW_SCHEDULE_IDEMPOTENCY_KEY_PREFIX, WORKFLOW_OPERATION_ID_PREFIX, WORKFLOW_CONNECTION_KEY_RE, WORKFLOW_AGENT_APP_CONNECTION_PREFIX, WORKFLOW_JOB_MODEL_SOURCE_LABELS, WORKFLOW_SUSPEND_KINDS, WORKFLOW_RUN_NOTIFICATION_SUSPENDED_KINDS, WORKFLOW_SIGNAL_PAYLOAD_MAX_BYTES, WORKFLOW_SIGNAL_NAME_RE, WORKFLOW_SUSPEND_DEFAULT_TIMEOUT_HOURS, WORKFLOW_RESOLVE_OUTPUT_MAX_BYTES, SCHEDULE_HEALTH_NOTIFY_CHANNELS, SCHEDULE_HEALTH_DEFAULT_NOTIFY, SCHEDULE_HEALTH_LIMITS, KNOWN_KEYS, WORKFLOW_GOAL_JUDGE_SELF, APPROVAL_ARGS_MAX_CHARS, APPROVAL_ARG_STRING_MAX_CHARS, APPROVAL_ARGS_SUMMARY_MAX_CHARS, MAX_DEPTH, MAX_KEYS, MAX_ITEMS, MAX_NODES, MAX_KEY_CHARS, KEY_SCRUB_INPUT_MAX_CHARS, STRING_SCRUB_INPUT_MAX_CHARS, ELLIPSIS, SKIP, SCRUB_SECRETS_BEFORE_PERSIST_ENV, PERSIST_SCRUB_MAX_CHARS, PERSIST_SCRUB_REF_MAX_CHARS, WORKFLOW_AUDIT_EVENTS, WORKFLOW_AUDIT_METADATA_MAX_BYTES, INDENT, WRAP_WIDTH, NOUNS, GET_TOOL_NAMES, PREAMBLE, WORKFLOW_APPROVAL_OUTPUT_DECISIONS, WORKFLOW_APPROVAL_OUTPUT_SCHEMA, JSON_FENCE_RE, DEFAULT_ON_AGENT_FEATURES, SUBAGENT_PER_KEY_FLAG_ENV, PER_KEY_FLAG_VALUES, ONBOARDING_FLOW_KEY, ONBOARDING_SCHEMA_VERSION, id, copy, onboardingHeadingSchema, onboardingRichTextInlineSchema, onboardingRichTextSchema, onboardingDestinationSchema, onboardingArtworkSchema, onboardingAnswerSchema, onboardingQuestionSchema, onboardingTemplateSectionSchema, onboardingInstallScreenSchema, onboardingResultScreenSchema, onboardingConnectScreenSchema, onboardingTemplateContentSchema, onboardingUnavailableOutcomeSchema, onboardingFlowSchema, onboardingActorSchema, onboardingEditorSchema, onboardingPublicationSummarySchema, onboardingValidationIssueSchema, onboardingValidationResponseSchema, onboardingAssetSchema, onboardingPublicAssetSchema, getOnboardingConfigResponseSchema, saveOnboardingDraftRequestSchema, validateOnboardingRequestSchema, publishOnboardingRequestSchema, rollbackOnboardingRequestSchema, onboardingTemplateCatalogItemSchema, getPublishedOnboardingResponseSchema, WEB_ROUTE_PROTOCOL_VERSION, WEB_ROUTE_METHODS, WEB_ROUTE_REQUEST_HEADER_ALLOWLIST, WEB_ROUTE_RESPONSE_HEADER_ALLOWLIST, WEB_ROUTE_MAX_REQUEST_BODY_BYTES, WEB_ROUTE_MAX_RESPONSE_BYTES, WEB_APP_NAME_PATTERN, WEB_APP_ENTRY_HTML_MAX_CHARS, WEB_APP_MAX_ASSET_BYTES, EVIDENCE_SESSION_IDLE_MS, EVIDENCE_MIN_CONVERSATIONS, EVIDENCE_LOW_CONFIDENCE_N, EVIDENCE_SNIPPET_MAX_CHARS, EVIDENCE_EXAMPLES_PER_ITEM, EVIDENCE_SHOWN_ITEMS, EVIDENCE_LATENCY_BOUNDS_MS, EVIDENCE_WORD_BOUNDS, BAD_CONVERSATION_REASONS, ATTACHMENT_LINES, REVIEW_VERDICT_REASON_ORDER, ENV_TEMPLATE_SECRET_KEY_RE, CONNECTION_SEND_NOT_ALLOWED, CONNECTION_RECIPIENT_NOT_ALLOWED, NOT_SEND, PLAIN_ADDRESS, RecipientSet, MCP_MESSAGING_CREATE, MCP_CALENDAR_EVENT_WRITE, REPLY_KEYS, DEDICATED_MAIL_SLUGS, FULL_SUITE_SLUGS, WELL_KNOWN_MAIL_FOLDERS, MEMBER_KEYS, CANONICAL_ORIGIN, CANONICAL_PREFIX, STRICT_BASE64, GMAIL_PREFIX, GMAIL_MESSAGES_SEND, GMAIL_DRAFTS_SEND, GOOGLE_BATCH, GRAPH_VERSION, GRAPH_PRINCIPAL, GRAPH_SEND_MAIL, GRAPH_MESSAGE_ACTION, GRAPH_OWNER, GRAPH_EVENTS, GRAPH_EVENT_COLLECTION, GRAPH_EVENT_ID, GRAPH_EVENT_ITEM, GRAPH_EVENT_ACTION, GRAPH_BATCH, GRAPH_TEAMS_MESSAGE, GRAPH_ACTIVITY_NOTIFICATION, GRAPH_GROUP_CONVERSATION, GCAL_EVENTS, GRAPH_READ_KEYS, MALFORMED_POLICY, BILLING_REJECTION_TEXT_CREDITS, BILLING_REJECTION_TEXT_SEAT, BILLING_REJECTION_TEXT_USER_QUOTA, CUSTOM_MCP_CONNECTION_ID_PREFIX, CUSTOM_MCP_SOURCE, CUSTOM_MCP_TRANSPORT, CUSTOM_MCP_CONNECTION_ID_PATTERN, customMcpConnectionIdSchema, CONNECTION_BACKED_MCP_SOURCES, CUSTOM_MCP_REFERENCE_ID_PATTERN, customMcpReferenceIdSchema, CUSTOM_MCP_AUTH_KINDS, customMcpAuthKindSchema, CUSTOM_MCP_OAUTH_REGISTRATIONS, customMcpOAuthRegistrationSchema, CUSTOM_MCP_HEALTH_STATES, customMcpHealthStateSchema, CUSTOM_MCP_FAILURE_STEPS, customMcpFailureStepSchema, CUSTOM_MCP_CONNECT_STEPS, customMcpConnectStepSchema, customMcpFailureCodeSchema, WORKFLOW_KEY_MAX_LENGTH, CUSTOM_MCP_URL_MAX_LENGTH, CUSTOM_MCP_DISPLAY_NAME_MAX_LENGTH, CUSTOM_MCP_MAX_HEADERS, CUSTOM_MCP_HEADER_NAME_MAX_LENGTH, CUSTOM_MCP_HEADER_VALUE_MAX_LENGTH, CUSTOM_MCP_MAX_TOOLS, CUSTOM_MCP_TOOL_NAME_MAX_LENGTH, CUSTOM_MCP_TOOL_TEXT_MAX_LENGTH, CUSTOM_MCP_MIN_TIMEOUT_MS, CUSTOM_MCP_MAX_TIMEOUT_MS, CUSTOM_MCP_OAUTH_PENDING_TTL_MS, isoDateTime, agentId, nonNegativeInt, customMcpUrlInputSchema, customMcpDisplayNameSchema, customMcpTimeoutSchema, CUSTOM_MCP_RESERVED_HEADER_NAMES, HEADER_NAME, HEADER_VALUE_FORBIDDEN, customMcpHeaderNameSchema, headerValue, customMcpHeadersSchema, customMcpHeadersPatchSchema, customMcpToolNameSchema, customMcpToolSchema, customMcpServerInfoSchema, customMcpToolSelectionSchema, customMcpToolsResponseSchema, customMcpFailureSchema, customMcpHealthSchema, customMcpErrorBodySchema, customMcpConnectionBlockSchema, customMcpConnectionViewSchema, customMcpConnectionResponseSchema, customMcpProbeBodySchema, customMcpOAuthDiscoverySchema, customMcpProbeResponseSchema, createFields, mountAgentField, customMcpCreateAgentBodySchema, customMcpCreateUserBodySchema, customMcpOAuthClientSchema, startFields, customMcpOAuthStartAgentBodySchema, customMcpOAuthStartUserBodySchema, customMcpOAuthStartResponseSchema, nonce, customMcpOAuthSuccessRedirectQuerySchema, CUSTOM_MCP_OAUTH_CALLBACK_ERRORS, customMcpOAuthFailureRedirectQuerySchema, customMcpOAuthFinalizeBodySchema, customMcpCimdDocumentSchema, customMcpPatchBodySchema, customMcpCredentialRequestSchema, customMcpCredentialAuthSchema, customMcpCredentialResponseSchema, CUSTOM_MCP_CREDENTIAL_ERRORS, customMcpCredentialErrorBodySchema, customMcpHealthReportSchema, customMcpProbeRequestSchema, customMcpProbeResultSchema, customMcpOriginUrlSchema, customMcpServerProjectionSchema, customMcpMountUpsertBodySchema;
7510
+ var __defProp4, __name4, PLUMBING_THREAD_CHANNELS, CHANNEL_CONVERSATION_CHANNELS, HIDDEN_THREAD_CHANNELS, CHOICE_PERSON_TURN_CHANNELS, CHOICE_REPLAY_CLIENT_CAPABILITIES, CHOICE_REPLAY_CLIENT_SURFACES, DECISION_PROVIDERS, DECISION_QUESTION_TYPES, DECISION_NAME_PATTERN, DECISION_SANDBOX_SITE_HEADER, DECISION_SANDBOX_PRIMITIVE_HEADER, DECISION_SANDBOX_TOOL_SEPARATOR, DECISION_LIMITS, DECISION_ERROR_CODES, MAX_NAME_CHARS, InstructionsSchema, NameSchema, OddsQuestionSchema, ChoiceQuestionSchema, ScoreQuestionSchema, DecisionQuestionSchema, DecisionOptionsSchema, DecisionQuestionsSchema, DecisionDefinitionSchema, INTEGRATION_PASSTHROUGH_READ_METHODS, URL_REINTERPRETED_PATH_CHARACTERS, PERCENT_ENCODED_DOT, PERCENT_ESCAPE, DECODED_PATH_SEPARATORS, DECODED_LEADING_SEPARATOR, MAX_PERCENT_DECODE_ROUNDS, URL_RESOLUTION_PROBE_BASE, PLATFORM_INVOCATION_CALLERS, MESSAGING_CHANNELS, VOICE_CHANNELS, TURN_CATEGORIES, AGENT_TOOL_CATEGORIES, count, AnthropicSseUsageReader, SUPERVISION_OPS, SUPERVISION_OPS_WAVE2, SUPERVISION_WATCHDOG_OPS, SUPERVISION_WATCHDOG_ERRORS, SUPERVISION_ROLLBACK_REFUSAL_CODES, SUPERVISION_ROLLBACK_LINEAGE_MAX, SUPERVISION_UNTARGETED_OPS, SUPERVISED_WORKFLOW_VERSIONS_MAX, SUPERVISION_EVENT_KINDS, AGENT_PROVISIONING_LIMITS, AGENT_PROVISIONING_APPROVAL_PAYLOAD_KEY, AGENT_PROVISIONING_ERRORS, PROVISIONED_SUPERVISION_ACTIONS, isNonEmptyString, uniqueStrings, sameSet, AGENT_PROVISIONING_APPROVAL_CARD_MAX_CHARS, APPROVAL_PAYLOAD_MEMBERS, AGENT_CONNECTION_POLICIES, AGENT_CONNECTION_POLICY_DEFAULT, AGENT_CONNECTION_MOUNT_MODES, AGENT_CONNECTION_GOVERNANCE_ERRORS, AGENT_CONNECTION_OPERATION_RULES_MAX, AGENT_CONNECTION_OPERATION_PATTERN_MAX_LENGTH, OPERATION_RULE_METHODS, PATH_SEPARATOR, PATH_SINGLE_SEGMENT_WILDCARD, PATH_REST_WILDCARD, METHOD_OVERRIDE_HEADER_NAMES, METHOD_OVERRIDE_QUERY_NAMES, ODATA_BATCH_SEGMENT, GOOGLE_BATCH_FIRST_SEGMENT, CONNECTION_CHECK_RESULTS, CONNECTION_CHECK_CATALOGUE_V1, CONNECTION_CHECK_NAME_PATTERN, CONNECTION_CHECK_NAME_MAX, CONNECT_OUTCOME_STATUSES, SECRET_TEST_RESULTS, SECRET_DATADOG_REGIONS, SECRET_PROVIDER_CATALOGUE_V1, SECRET_TEST_MAX_RESPONSE_BYTES, SECRET_ENV_KEY_PATTERN, SECRET_REQUEST_ERRORS, SECRET_OUTCOME_STATUSES, CLIENT_OUTCOME_TURNS_MAX, SHORT_TEXT_MAX, SLUG_MAX, shortText, optionalShortText, CONNECTION_REQUEST_TERMINAL_STATES, CONNECTION_USE_ORIGINS, AGENT_CONNECTION_OPERATION_LIMITS_BOUNDS, CURRENCY_CODE, LIMITS_KEYS, CAPS_KEYS, EXCLUSIONS_KEYS, EMAIL_IN_TEXT, MAX_EXCLUSION_DEPTH, PROJECTION_PARAMETER_KEYS, CHANNEL_PARAMETER_KEYS, GMAIL_SYSTEM_LABEL_IDS, ZERO_DECIMAL_CURRENCIES, THREE_DECIMAL_CURRENCIES, DECIMAL_AMOUNT, REDACTED_PLACEHOLDER, PROVIDER_MESSAGE_MAX_CHARS, ERROR_MESSAGE_MAX_CHARS, SECRET_LITERAL_PATTERNS, SECRET_NAME, SECRET_PAIR_PATTERNS, GROUP_COUNT, WORKFLOW_SECRET_KEY_RE, WORKFLOW_RESERVED_SECRET_KEYS, SCRUB_INPUT_MAX_CHARS, SCRUB_CUT_BACKOFF_CHARS, TEST_SESSION_ID_PATTERN, TEST_SESSION_COLLECTION_PREFIX, TEST_EFFECT_BODY_MAX_BYTES, TEST_EFFECT_DROPPED_HEADERS, EVAL_CREDITS_PER_1K_TOKENS, EVAL_RESERVED_TOOL_ID_PREFIXES, CONNECTION_HANDOVER_APPROVAL_PAYLOAD_KEY, CONNECTION_HANDOVER_APPROVAL_CARD_MAX_CHARS, CONNECTION_HANDOVER_LIMITS, MEMBERS, FORMAT_CHARS, oneLine, boundedString, AGENT_METRIC_NAME_PATTERN, AGENT_METRIC_LIMITS, AGENT_OBJECTIVE_ERRORS, CHANGE_LEASE_TTL_MINUTES_MIN, CHANGE_LEASE_TTL_MINUTES_MAX, CHANGE_LEASE_REASON_MAX, CHANGE_LEASE_ERRORS, AGENT_CONFIG_SET_LIMITS, SECRET_ENV_KEY_SUFFIXES, DEFAULT_OWNER_DEPARTURE_POLICY, AGENT_LIFECYCLE_ERRORS, USER_COST_COUNTER_TTL_SECONDS, USER_COST_ATTRIBUTION_CHANNELS, CALLER_DEDUPE_KEY_MAX, FOLLOW_UP_IDEMPOTENCY_TTL_SECONDS, THREAD_FOLLOW_UP_LIMITS, THREAD_FOLLOW_UP_ERRORS, PROGRESS_UPDATE_LIMITS, PAUSABLE_CAPABILITY_KINDS, UNIFIED_CATCH_UP_MAX_WINDOW_HOURS, UNIFIED_CATCH_UP_EVENTS, UNIFIED_CATCH_UP_FILTERABLE_OBJECT_TYPES, AGENT_NEVER_RULES_MAX, AGENT_NEVER_RULE_FIELD_MAX, AGENT_NEVER_RULE_INPUT_MATCH_MAX, NEVER_RULE_ID_PATTERN, NEVER_RULE_HTTP_METHODS, TEMPLATE_DISTRIBUTION_MODES, CHANNEL_SEND_CHANNELS, TAKEOVER_MAX_IDLE_MINUTES, MINUTES_PER_DAY, DEFAULT_IDLE_RELEASE_MINUTES, FALLBACK_IDLE_RELEASE_MINUTES, VARIATION_SELECTORS, SLACK_EMOJI_NAMES, SLACK_SHORTCODE, PLAIN_EMAIL_ADDRESS, DOMAIN, UNSAFE_TEXT, SLACK_CONVERSATION_ID, CHANNEL_SETTING_GROUPS, THREAD_SCOPING_NOUN, TAKEOVER_CHANNEL_TYPES, EMAIL_SETTINGS, SLACK_SETTING_DEFAULTS, SLACK_REACTION_MAX, SLACK_INTRO_MAX, SLACK_EXAMPLE_PROMPTS_MAX, SLACK_EXAMPLE_PROMPT_MAX, SLACK_SUPPORT_CONTACT_MAX, SLACK_SETTINGS, CHANNEL_SETTINGS, REVIEWABLE_ACTION_EXECUTE_TOOL_ALLOWLIST, REVIEWABLE_STANDING_START_TOOLS, 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, WORK_ITEMS_KEY, MAX_WORK_ITEMS, LIMITS, BROWSER_COMMANDS, BROWSER_COMMAND_NAMES, SERVER_TRIGGERED_BROWSER_SOURCES, BROWSER_FALLBACKS, DEFAULT_BROWSER_FALLBACK, PROXY_COUNTRY_CODE, BROWSER_LOG_CONTENT_MODES, DEFAULT_BROWSER_LOG_CONTENT, BROWSER_SCREENSHOT_POLICIES, DEFAULT_BROWSER_SCREENSHOT_POLICY, BROWSER_PROFILE_NAME_PATTERN, BROWSER_LIMIT_KEYS, BROWSER_LIMIT_MAX, BROWSER_EXECUTE_METHOD, BROWSER_GLOBAL_METHODS, BROWSER_EXECUTE_DEFAULT_TIMEOUT_MS, BROWSER_EXECUTE_MAX_TIMEOUT_MS, LOG_FIELDS_MAX_KEYS, LOG_FIELD_MAX_VALUE_BYTES, LOG_FIELDS_MAX_BYTES, LOG_FIELD_KEY_PATTERN, LOG_FIELD_SECRET_SHAPED_KEY_PATTERNS, LOG_FIELDS_CLAMPED_KEY, LOG_FIELD_ARRAY_COUNT_SUFFIX, LuaLogFieldsError, DESKTOP_FILE_COMMANDS, DESKTOP_FILE_COMMAND_SET, BROWSER_READ_FORMATS, BROWSER_READ_DEFAULT_TIMEOUT_MS, BROWSER_READ_MIN_TIMEOUT_MS, BROWSER_READ_MAX_TIMEOUT_MS, BROWSER_READ_MAX_CONTENT_CHARS, BROWSER_READ_DEFAULT_SELECTOR, BROWSER_READ_MATCH_SEPARATOR, BROWSER_READ_LOGIN_BLOCKER, BROWSER_ERROR_NAME, HTTP_STATUS_FAILURE, LOGIN_PATH_SEGMENTS, LOGIN_HOST_LABELS, AGENT_LOG_SOURCES, AGENT_LOG_ENVIRONMENTS, AGENT_LOG_FIELDS_MAX_WIRE_KEYS, BROWSER_LOG_EVENT_KINDS, BROWSER_LOG_ENGINES, BROWSER_SESSION_OPEN_REASONS, BROWSER_BLOCK_KINDS, BROWSER_WALL_KINDS, BROWSER_WALL_NEXT_ACTIONS, BROWSER_CONFIRM_DECISIONS, BROWSER_SESSION_CLOSE_REASONS, BROWSER_LOG_CONTEXT_KEYS, BROWSER_LOG_ID_MAX_CHARS, BROWSER_LOG_TEXT_MAX_CHARS, isString, isBoolean, isCount, isPlainObject2, oneOf, isLimits, EVENT_SHAPES, BASE_KEYS, BROWSER_WORKER_SESSION_ID_SEPARATOR, BROWSER_WORKER_BLOCK_REASON_MAX_CHARS, WORKFLOW_RETRY_BACKOFFS, WORKFLOW_RETRY_MIN_ATTEMPTS, WORKFLOW_RETRY_POLICY_KEYS, WORKFLOW_RETRY_MAX_ATTEMPTS, WORKFLOW_RETRY_ENGINE_KEYS, WORKFLOW_JOB_RESOURCES, WORKFLOW_SIDE_EFFECTS, WORKFLOW_MODEL_CLASSES, WORKFLOW_DEFAULT_TASK_CLASS_MAP, WORKFLOW_MODELS_MAX_CLASS_DEFAULT, WORKFLOW_AUTONOMY_NUMERIC_KEYS, WORKFLOW_AUTONOMY_ENVELOPE_KEYS, WORKFLOW_AUTONOMY_DEFAULTS, WORKFLOW_AUTONOMY_CEILINGS, WORKFLOW_AUTONOMY_MAX_RUNS_PER_HOUR_ENV, WORKFLOW_AUTONOMY_MAX_RUNS_PER_HOUR_CEILING, WORKFLOW_AUTONOMY_FORMS_DEFAULT, WORKFLOW_AUTONOMY_MIN_VALUE, WORKFLOW_JOB_RANGES, WORKFLOW_JOB_RANGE_MEMBERS, WORKFLOW_SINGLE_STEP_TYPES, WORKFLOW_HITL_ENTRY_TYPES, WORKFLOW_ARM_ENTRY_TYPES, WORKFLOW_HITL_ARM_CONTAINERS, WORKFLOW_GRAPH_ENTRY_STEP_KINDS, WORKFLOW_ARM_ENTRY_STEP_KINDS, WORKFLOW_BUDGET_MAX_DURATION_SECONDS, MODEL_ID_BYOK_PROVIDERS, MODEL_CLASS_REF_PREFIX, MODEL_SNAPSHOT_SUFFIX, REASONING_EFFORT_VALUES, IMPLICIT_MODEL_SELECTION_SOURCES, PLATFORM_FALLBACK_MODEL_SOURCE, AGENT_NAME_TOKEN, DEFAULT_PERSONA_GUIDE, PERSONAL_SPACE_STARTING_PERSONA, LOG_DRAIN_TYPES_PHASE1, LOG_DRAIN_TYPES_PHASE2, LOG_DRAIN_TYPES_IMPLEMENTED, LOG_DRAIN_SOURCES, LOG_DRAIN_MAX_PER_ORG, LOG_DRAIN_MAX_PER_ORG_ENTERPRISE, LOG_DRAIN_DATADOG_SITES, LOG_DRAIN_NEWRELIC_SITES, LOG_DRAIN_ENDPOINT_TEMPLATES, LOG_DRAIN_PRESET_SITES, LOG_DRAIN_BUCKET_NAME_PATTERN, LOG_DRAIN_BUCKET_HOST_PATTERNS, LOG_DRAIN_PRESET_HOST_SUFFIXES, DRAIN_CONTENT_ACK_ERROR_CODE, DRAIN_CONTENT_ACK_FIELD, DrainContentAckRequiredError, LOG_DRAIN_PRESET_PATHS, PRESET_SEGMENT_RE, LOG_DRAIN_QUOTAS, LOG_DRAIN_QUOTA_WARN_RATIO, LOG_DRAIN_QUOTA_DROP_DEBUG_RATIO, LOG_DRAIN_QUOTA_DROP_INFO_RATIO, LOG_DRAIN_QUOTA_PAUSE_RATIO, LOG_EXPORT_SOURCES, LOG_EXPORT_MAX_WINDOW_DAYS, LOG_EXPORT_MAX_WINDOW_MS, LOG_EXPORT_URL_TTL_SECONDS, LOG_EXPORT_FILE_RETENTION_DAYS, LOG_EXPORT_FILE_RETENTION_MS, LOG_EXPORT_PART_MAX_BYTES, LOG_DRAIN_NOTICE_RATE_LIMIT_MS, LOG_DRAIN_VERIFICATION_STALE_MS, LOG_DRAIN_DIGEST_INTERVAL_MS, LOG_DRAIN_DIGEST_MAX_ENTRIES, LOG_DRAIN_NOTICE_ERROR_MAX_CHARS, LOG_DRAIN_USAGE_LINE_ITEM, LOG_DRAIN_BYTES_PER_GIB, DEFAULT_LOG_DRAIN_PLAN_CONFIG, TIERS, LOG_CURSOR_MAX_LENGTH, LOG_CURSOR_MAX_ID_LENGTH, LOG_RELATIVE_TIME_PATTERN, LOG_ISO_TIME_PATTERN, RELATIVE_UNIT_MS, 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, KEYS, MAX_BODY_BYTES, MAX_ID_LENGTH, UTC_ISO, TEMPLATE_TRIGGER_URL_ENV_PREFIX, TEMPLATE_INSTALL_POLICY_PER_WORKSPACE_VALUES, SUBJECT_TYPES, SubjectTypeSchema, CREDENTIAL_TYPES, CredentialTypeSchema, DEVICE_OPERATIONS, DeviceOperationSchema, DEVICE_SCOPE_BY_OPERATION, DeviceBindingSchema, IdSchema, SESSION_AUTH_TIME_MAX_S, 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, LUA_SESSION_ID_CLAIM, SESSION_REVOKED_CODE, AUTHZ_PROJECTION_VERSION, ProjectedScopeSchema, DisplayRoleSchema, AuthorizationPrincipalSchema, CredentialContextSchema, ProjectionAnomalySchema, ProjectedOrgSchema, ProjectedResourceSchema, CapabilityProfilesSchema, RoleCatalogSchema, EffectiveAuthorizationSchema, ResourcePageSchema, SYSTEM_USER_PREFIX, WORKFLOW_RUN_IN_FLIGHT, WORKFLOW_RUN_IDLE, WORKFLOW_RUN_TERMINAL, WORKFLOW_RUN_STATUSES, WORKFLOW_RUN_GATE_KINDS, WORKFLOW_STEP_STATUSES, WORKFLOW_STEP_IN_FLIGHT, WORKFLOW_SIGNAL_EVENT_SITES, ARCHIVE_WINDOW_MARGIN_DAYS, WORKFLOW_ORG_PURGING_TTL_S, WORKFLOW_ORG_PURGE_FORCE_AFTER_MS, IDEMPOTENCY_HOLDING_STATUSES, WORKFLOW_SCHEDULED_RUN_ID_PREFIX, CLOUD_TASK_RUN_ID_PREFIX, WORKFLOW_SCHEDULE_KEY_MAX, WORKFLOW_SCHEDULE_IDEMPOTENCY_KEY_PREFIX, WORKFLOW_OPERATION_ID_PREFIX, WORKFLOW_CONNECTION_KEY_RE, WORKFLOW_AGENT_APP_CONNECTION_PREFIX, WORKFLOW_JOB_MODEL_SOURCE_LABELS, WORKFLOW_SUSPEND_KINDS, WORKFLOW_RUN_NOTIFICATION_SUSPENDED_KINDS, WORKFLOW_SIGNAL_PAYLOAD_MAX_BYTES, WORKFLOW_SIGNAL_NAME_RE, WORKFLOW_SUSPEND_DEFAULT_TIMEOUT_HOURS, WORKFLOW_RESOLVE_OUTPUT_MAX_BYTES, SCHEDULE_HEALTH_NOTIFY_CHANNELS, SCHEDULE_HEALTH_DEFAULT_NOTIFY, SCHEDULE_HEALTH_LIMITS, KNOWN_KEYS, WORKFLOW_GOAL_JUDGE_SELF, APPROVAL_ARGS_MAX_CHARS, APPROVAL_ARG_STRING_MAX_CHARS, APPROVAL_ARGS_SUMMARY_MAX_CHARS, MAX_DEPTH, MAX_KEYS, MAX_ITEMS, MAX_NODES, MAX_KEY_CHARS, KEY_SCRUB_INPUT_MAX_CHARS, STRING_SCRUB_INPUT_MAX_CHARS, ELLIPSIS, SKIP, SCRUB_SECRETS_BEFORE_PERSIST_ENV, PERSIST_SCRUB_MAX_CHARS, PERSIST_SCRUB_REF_MAX_CHARS, WORKFLOW_AUDIT_EVENTS, WORKFLOW_AUDIT_METADATA_MAX_BYTES, INDENT, WRAP_WIDTH, NOUNS, GET_TOOL_NAMES, PREAMBLE, WORKFLOW_APPROVAL_OUTPUT_DECISIONS, WORKFLOW_APPROVAL_OUTPUT_SCHEMA, JSON_FENCE_RE, DEFAULT_ON_AGENT_FEATURES, SUBAGENT_PER_KEY_FLAG_ENV, PER_KEY_FLAG_VALUES, ONBOARDING_FLOW_KEY, ONBOARDING_SCHEMA_VERSION, id, copy, onboardingHeadingSchema, onboardingRichTextInlineSchema, onboardingRichTextSchema, onboardingDestinationSchema, onboardingArtworkSchema, onboardingAnswerSchema, onboardingQuestionSchema, onboardingTemplateSectionSchema, onboardingInstallScreenSchema, onboardingResultScreenSchema, onboardingConnectScreenSchema, onboardingTemplateContentSchema, onboardingUnavailableOutcomeSchema, onboardingFlowSchema, onboardingActorSchema, onboardingEditorSchema, onboardingPublicationSummarySchema, onboardingValidationIssueSchema, onboardingValidationResponseSchema, onboardingAssetSchema, onboardingPublicAssetSchema, getOnboardingConfigResponseSchema, saveOnboardingDraftRequestSchema, validateOnboardingRequestSchema, publishOnboardingRequestSchema, rollbackOnboardingRequestSchema, onboardingTemplateCatalogItemSchema, getPublishedOnboardingResponseSchema, WEB_ROUTE_PROTOCOL_VERSION, WEB_ROUTE_METHODS, WEB_ROUTE_REQUEST_HEADER_ALLOWLIST, WEB_ROUTE_RESPONSE_HEADER_ALLOWLIST, WEB_ROUTE_MAX_REQUEST_BODY_BYTES, WEB_ROUTE_MAX_RESPONSE_BYTES, WEB_APP_NAME_PATTERN, WEB_APP_ENTRY_HTML_MAX_CHARS, WEB_APP_MAX_ASSET_BYTES, EVIDENCE_SESSION_IDLE_MS, EVIDENCE_MIN_CONVERSATIONS, EVIDENCE_LOW_CONFIDENCE_N, EVIDENCE_SNIPPET_MAX_CHARS, EVIDENCE_EXAMPLES_PER_ITEM, EVIDENCE_SHOWN_ITEMS, EVIDENCE_LATENCY_BOUNDS_MS, EVIDENCE_WORD_BOUNDS, BAD_CONVERSATION_REASONS, ATTACHMENT_LINES, REVIEW_VERDICT_REASON_ORDER, ENV_TEMPLATE_SECRET_KEY_RE, CONNECTION_SEND_NOT_ALLOWED, CONNECTION_RECIPIENT_NOT_ALLOWED, NOT_SEND, PLAIN_ADDRESS, RecipientSet, MCP_MESSAGING_CREATE, MCP_CALENDAR_EVENT_WRITE, REPLY_KEYS, DEDICATED_MAIL_SLUGS, FULL_SUITE_SLUGS, WELL_KNOWN_MAIL_FOLDERS, MEMBER_KEYS, CANONICAL_ORIGIN, CANONICAL_PREFIX, STRICT_BASE64, GMAIL_PREFIX, GMAIL_MESSAGES_SEND, GMAIL_DRAFTS_SEND, GOOGLE_BATCH, GRAPH_VERSION, GRAPH_PRINCIPAL, GRAPH_SEND_MAIL, GRAPH_MESSAGE_ACTION, GRAPH_OWNER, GRAPH_EVENTS, GRAPH_EVENT_COLLECTION, GRAPH_EVENT_ID, GRAPH_EVENT_ITEM, GRAPH_EVENT_ACTION, GRAPH_BATCH, GRAPH_TEAMS_MESSAGE, GRAPH_ACTIVITY_NOTIFICATION, GRAPH_GROUP_CONVERSATION, GCAL_EVENTS, GRAPH_READ_KEYS, MALFORMED_POLICY, BILLING_REJECTION_TEXT_CREDITS, BILLING_REJECTION_TEXT_SEAT, BILLING_REJECTION_TEXT_USER_QUOTA, CUSTOM_MCP_CONNECTION_ID_PREFIX, CUSTOM_MCP_SOURCE, CUSTOM_MCP_TRANSPORT, CUSTOM_MCP_CONNECTION_ID_PATTERN, customMcpConnectionIdSchema, CONNECTION_BACKED_MCP_SOURCES, CUSTOM_MCP_REFERENCE_ID_PATTERN, customMcpReferenceIdSchema, CUSTOM_MCP_AUTH_KINDS, customMcpAuthKindSchema, CUSTOM_MCP_OAUTH_REGISTRATIONS, customMcpOAuthRegistrationSchema, CUSTOM_MCP_HEALTH_STATES, customMcpHealthStateSchema, CUSTOM_MCP_FAILURE_STEPS, customMcpFailureStepSchema, CUSTOM_MCP_CONNECT_STEPS, customMcpConnectStepSchema, customMcpFailureCodeSchema, WORKFLOW_KEY_MAX_LENGTH, CUSTOM_MCP_URL_MAX_LENGTH, CUSTOM_MCP_DISPLAY_NAME_MAX_LENGTH, CUSTOM_MCP_MAX_HEADERS, CUSTOM_MCP_HEADER_NAME_MAX_LENGTH, CUSTOM_MCP_HEADER_VALUE_MAX_LENGTH, CUSTOM_MCP_MAX_TOOLS, CUSTOM_MCP_TOOL_NAME_MAX_LENGTH, CUSTOM_MCP_TOOL_TEXT_MAX_LENGTH, CUSTOM_MCP_MIN_TIMEOUT_MS, CUSTOM_MCP_MAX_TIMEOUT_MS, CUSTOM_MCP_OAUTH_PENDING_TTL_MS, isoDateTime, agentId, nonNegativeInt, customMcpUrlInputSchema, customMcpDisplayNameSchema, customMcpTimeoutSchema, CUSTOM_MCP_RESERVED_HEADER_NAMES, HEADER_NAME, HEADER_VALUE_FORBIDDEN, customMcpHeaderNameSchema, headerValue, customMcpHeadersSchema, customMcpHeadersPatchSchema, customMcpToolNameSchema, customMcpToolSchema, customMcpServerInfoSchema, customMcpToolSelectionSchema, customMcpToolsResponseSchema, customMcpFailureSchema, customMcpHealthSchema, customMcpErrorBodySchema, customMcpConnectionBlockSchema, customMcpConnectionViewSchema, customMcpConnectionResponseSchema, customMcpProbeBodySchema, customMcpOAuthDiscoverySchema, customMcpProbeResponseSchema, createFields, mountAgentField, customMcpCreateAgentBodySchema, customMcpCreateUserBodySchema, customMcpOAuthClientSchema, startFields, customMcpOAuthStartAgentBodySchema, customMcpOAuthStartUserBodySchema, customMcpOAuthStartResponseSchema, nonce, customMcpOAuthSuccessRedirectQuerySchema, CUSTOM_MCP_OAUTH_CALLBACK_ERRORS, customMcpOAuthFailureRedirectQuerySchema, customMcpOAuthFinalizeBodySchema, customMcpCimdDocumentSchema, customMcpPatchBodySchema, customMcpCredentialRequestSchema, customMcpCredentialAuthSchema, customMcpCredentialResponseSchema, CUSTOM_MCP_CREDENTIAL_ERRORS, customMcpCredentialErrorBodySchema, customMcpHealthReportSchema, customMcpProbeRequestSchema, customMcpProbeResultSchema, customMcpOriginUrlSchema, customMcpServerProjectionSchema, customMcpMountUpsertBodySchema;
7134
7511
  var init_dist = __esm({
7135
7512
  "../shared-types/dist/index.mjs"() {
7136
7513
  "use strict";
@@ -7212,6 +7589,15 @@ var init_dist = __esm({
7212
7589
  "score"
7213
7590
  ];
7214
7591
  DECISION_NAME_PATTERN = /^[a-zA-Z0-9_-]{1,64}$/;
7592
+ DECISION_SANDBOX_SITE_HEADER = "x-lua-sandbox-site";
7593
+ DECISION_SANDBOX_PRIMITIVE_HEADER = "x-lua-sandbox-primitive";
7594
+ DECISION_SANDBOX_TOOL_SEPARATOR = "#";
7595
+ __name(formatDecisionSandboxPrimitive, "formatDecisionSandboxPrimitive");
7596
+ __name4(formatDecisionSandboxPrimitive, "formatDecisionSandboxPrimitive");
7597
+ __name(parseDecisionSandboxPrimitive, "parseDecisionSandboxPrimitive");
7598
+ __name4(parseDecisionSandboxPrimitive, "parseDecisionSandboxPrimitive");
7599
+ __name(decisionPublishStampKey, "decisionPublishStampKey");
7600
+ __name4(decisionPublishStampKey, "decisionPublishStampKey");
7215
7601
  DECISION_LIMITS = {
7216
7602
  maxQuestions: 64,
7217
7603
  minOptions: 2,
@@ -7219,6 +7605,7 @@ var init_dist = __esm({
7219
7605
  minLevels: 2,
7220
7606
  maxLevels: 10,
7221
7607
  maxInstructionChars: 4e3,
7608
+ maxQuestionsChars: 1e5,
7222
7609
  maxStateChars: 12e4,
7223
7610
  maxImages: 4,
7224
7611
  maxImageBytes: 5 * 1024 * 1024,
@@ -7236,7 +7623,8 @@ var init_dist = __esm({
7236
7623
  UNAVAILABLE: "decision_unavailable",
7237
7624
  DISABLED: "decision_disabled",
7238
7625
  INSUFFICIENT_CREDITS: "decision_insufficient_credits",
7239
- NOT_FOUND: "decision_not_found"
7626
+ NOT_FOUND: "decision_not_found",
7627
+ CANCELLED: "decision_cancelled"
7240
7628
  };
7241
7629
  MAX_NAME_CHARS = 64;
7242
7630
  InstructionsSchema = z.string().trim().min(1).max(DECISION_LIMITS.maxInstructionChars);
@@ -7293,7 +7681,14 @@ var init_dist = __esm({
7293
7681
  "none"
7294
7682
  ]).optional()
7295
7683
  });
7296
- DecisionQuestionsSchema = z.record(NameSchema, DecisionQuestionSchema).refine((questions) => Object.keys(questions).length >= 1 && Object.keys(questions).length <= DECISION_LIMITS.maxQuestions, `a decision needs between 1 and ${DECISION_LIMITS.maxQuestions} questions`);
7684
+ DecisionQuestionsSchema = z.record(NameSchema, DecisionQuestionSchema).refine((questions) => Object.keys(questions).length >= 1 && Object.keys(questions).length <= DECISION_LIMITS.maxQuestions, `a decision needs between 1 and ${DECISION_LIMITS.maxQuestions} questions`).superRefine((questions, ctx) => {
7685
+ const chars = JSON.stringify(questions).length;
7686
+ if (chars <= DECISION_LIMITS.maxQuestionsChars) return;
7687
+ ctx.addIssue({
7688
+ code: z.ZodIssueCode.custom,
7689
+ message: `the questions take ${chars} characters as JSON, more than the ${DECISION_LIMITS.maxQuestionsChars} characters a decision may hold`
7690
+ });
7691
+ });
7297
7692
  DecisionDefinitionSchema = DecisionOptionsSchema.extend({
7298
7693
  name: z.string().regex(DECISION_NAME_PATTERN, "a decision name is 1 to 64 letters, digits, underscores or hyphens"),
7299
7694
  description: z.string().max(DECISION_LIMITS.maxInstructionChars).optional(),
@@ -7334,6 +7729,85 @@ var init_dist = __esm({
7334
7729
  __name4(isPlatformInvocationCaller, "isPlatformInvocationCaller");
7335
7730
  __name(supervisionSubjectId, "supervisionSubjectId");
7336
7731
  __name4(supervisionSubjectId, "supervisionSubjectId");
7732
+ MESSAGING_CHANNELS = new Set(CHANNEL_CONVERSATION_CHANNELS);
7733
+ VOICE_CHANNELS = /* @__PURE__ */ new Set([
7734
+ "phone",
7735
+ "meeting",
7736
+ "voice"
7737
+ ]);
7738
+ TURN_CATEGORIES = /* @__PURE__ */ new Set([
7739
+ "llm:inference",
7740
+ "llm:chat-modes",
7741
+ "llm:delegation",
7742
+ "decision:ask"
7743
+ ]);
7744
+ AGENT_TOOL_CATEGORIES = /* @__PURE__ */ new Set([
7745
+ "llm:media:describe",
7746
+ "tool:image-generate",
7747
+ "tool:image-edit"
7748
+ ]);
7749
+ __name(isModelCallCategory, "isModelCallCategory");
7750
+ __name4(isModelCallCategory, "isModelCallCategory");
7751
+ __name(deriveUsageSurface, "deriveUsageSurface");
7752
+ __name4(deriveUsageSurface, "deriveUsageSurface");
7753
+ count = /* @__PURE__ */ __name4((v) => typeof v === "number" && Number.isFinite(v) && v >= 0 ? Math.floor(v) : void 0, "count");
7754
+ __name(fromRaw, "fromRaw");
7755
+ __name4(fromRaw, "fromRaw");
7756
+ __name(anthropicMessageUsage, "anthropicMessageUsage");
7757
+ __name4(anthropicMessageUsage, "anthropicMessageUsage");
7758
+ AnthropicSseUsageReader = class {
7759
+ static {
7760
+ __name(this, "AnthropicSseUsageReader");
7761
+ }
7762
+ static {
7763
+ __name4(this, "AnthropicSseUsageReader");
7764
+ }
7765
+ pending = "";
7766
+ raw;
7767
+ id;
7768
+ model;
7769
+ push(chunk) {
7770
+ const text2 = this.pending + chunk;
7771
+ const lines = text2.split("\n");
7772
+ this.pending = lines.pop() ?? "";
7773
+ for (const line of lines) this.line(line);
7774
+ }
7775
+ result() {
7776
+ if (this.pending) {
7777
+ this.line(this.pending);
7778
+ this.pending = "";
7779
+ }
7780
+ return this.raw ? fromRaw(this.raw, this.id, this.model) : void 0;
7781
+ }
7782
+ line(line) {
7783
+ const trimmed = line.trim();
7784
+ if (!trimmed.startsWith("data:")) return;
7785
+ let event;
7786
+ try {
7787
+ event = JSON.parse(trimmed.slice(5).trim());
7788
+ } catch {
7789
+ return;
7790
+ }
7791
+ if (event.type === "message_start" && event.message) {
7792
+ this.id = event.message.id;
7793
+ this.model = event.message.model;
7794
+ this.raw = {
7795
+ ...event.message.usage ?? {}
7796
+ };
7797
+ } else if (event.type === "message_delta" && event.usage && typeof event.usage === "object") {
7798
+ const delta = event.usage;
7799
+ const merged = {
7800
+ ...this.raw ?? {}
7801
+ };
7802
+ for (const [key, value3] of Object.entries(delta)) {
7803
+ if (value3 !== null && value3 !== void 0) merged[key] = value3;
7804
+ }
7805
+ this.raw = merged;
7806
+ }
7807
+ }
7808
+ };
7809
+ __name(parseAnthropicReplyUsage, "parseAnthropicReplyUsage");
7810
+ __name4(parseAnthropicReplyUsage, "parseAnthropicReplyUsage");
7337
7811
  SUPERVISION_OPS = {
7338
7812
  "agents.list": "discover",
7339
7813
  "agents.get": "discover",
@@ -9317,6 +9791,10 @@ var init_dist = __esm({
9317
9791
  name: "close",
9318
9792
  description: "Close the session\u2019s browser."
9319
9793
  },
9794
+ {
9795
+ name: "read",
9796
+ description: "Read one page in a fresh session that is closed afterwards: open the URL, wait, return its title and content. Args: url, waitFor?(load|networkidle|selector), selector?, format?(text|html|markdown), timeoutMs?."
9797
+ },
9320
9798
  // perception
9321
9799
  {
9322
9800
  name: "snapshot",
@@ -9490,6 +9968,62 @@ var init_dist = __esm({
9490
9968
  }
9491
9969
  ];
9492
9970
  BROWSER_COMMAND_NAMES = BROWSER_COMMANDS.map((c) => c.name);
9971
+ SERVER_TRIGGERED_BROWSER_SOURCES = [
9972
+ "job",
9973
+ "webhook",
9974
+ "web-route",
9975
+ "trigger",
9976
+ "workflow-step",
9977
+ "workflow-script"
9978
+ ];
9979
+ __name(isServerTriggeredBrowserSource, "isServerTriggeredBrowserSource");
9980
+ __name4(isServerTriggeredBrowserSource, "isServerTriggeredBrowserSource");
9981
+ BROWSER_FALLBACKS = [
9982
+ "browser-use",
9983
+ "none"
9984
+ ];
9985
+ DEFAULT_BROWSER_FALLBACK = "browser-use";
9986
+ __name(resolveBrowserFallback, "resolveBrowserFallback");
9987
+ __name4(resolveBrowserFallback, "resolveBrowserFallback");
9988
+ PROXY_COUNTRY_CODE = /^[a-z]{2}$/;
9989
+ __name(resolveBrowserProxyCountry, "resolveBrowserProxyCountry");
9990
+ __name4(resolveBrowserProxyCountry, "resolveBrowserProxyCountry");
9991
+ BROWSER_LOG_CONTENT_MODES = [
9992
+ "summary",
9993
+ "full",
9994
+ "none"
9995
+ ];
9996
+ DEFAULT_BROWSER_LOG_CONTENT = "summary";
9997
+ BROWSER_SCREENSHOT_POLICIES = [
9998
+ "always",
9999
+ "onError",
10000
+ "never"
10001
+ ];
10002
+ DEFAULT_BROWSER_SCREENSHOT_POLICY = "onError";
10003
+ __name(resolveBrowserLogOptions, "resolveBrowserLogOptions");
10004
+ __name4(resolveBrowserLogOptions, "resolveBrowserLogOptions");
10005
+ BROWSER_PROFILE_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/;
10006
+ __name(browserProfileNotFoundMessage, "browserProfileNotFoundMessage");
10007
+ __name4(browserProfileNotFoundMessage, "browserProfileNotFoundMessage");
10008
+ BROWSER_LIMIT_KEYS = [
10009
+ "maxSessionMinutes",
10010
+ "idleTimeoutSeconds",
10011
+ "maxConcurrentSessions"
10012
+ ];
10013
+ BROWSER_LIMIT_MAX = {
10014
+ maxSessionMinutes: 60,
10015
+ idleTimeoutSeconds: 15 * 60,
10016
+ maxConcurrentSessions: 100
10017
+ };
10018
+ __name(resolveBrowserLimits, "resolveBrowserLimits");
10019
+ __name4(resolveBrowserLimits, "resolveBrowserLimits");
10020
+ BROWSER_EXECUTE_METHOD = "execute";
10021
+ BROWSER_GLOBAL_METHODS = [
10022
+ ...BROWSER_COMMAND_NAMES,
10023
+ BROWSER_EXECUTE_METHOD
10024
+ ];
10025
+ BROWSER_EXECUTE_DEFAULT_TIMEOUT_MS = 5 * 60 * 1e3;
10026
+ BROWSER_EXECUTE_MAX_TIMEOUT_MS = 15 * 60 * 1e3;
9493
10027
  LOG_FIELDS_MAX_KEYS = 32;
9494
10028
  LOG_FIELD_MAX_VALUE_BYTES = 1024;
9495
10029
  LOG_FIELDS_MAX_BYTES = 8192;
@@ -9555,6 +10089,308 @@ var init_dist = __esm({
9555
10089
  __name4(isDesktopFileCommandName, "isDesktopFileCommandName");
9556
10090
  __name(isDesktopFileSessionId, "isDesktopFileSessionId");
9557
10091
  __name4(isDesktopFileSessionId, "isDesktopFileSessionId");
10092
+ BROWSER_READ_FORMATS = [
10093
+ "text",
10094
+ "html",
10095
+ "markdown"
10096
+ ];
10097
+ BROWSER_READ_DEFAULT_TIMEOUT_MS = 6e4;
10098
+ BROWSER_READ_MIN_TIMEOUT_MS = 1e3;
10099
+ BROWSER_READ_MAX_TIMEOUT_MS = 1e5;
10100
+ BROWSER_READ_MAX_CONTENT_CHARS = 1e5;
10101
+ BROWSER_READ_DEFAULT_SELECTOR = "body";
10102
+ BROWSER_READ_MATCH_SEPARATOR = "\n\n";
10103
+ BROWSER_READ_LOGIN_BLOCKER = "login_required";
10104
+ BROWSER_ERROR_NAME = "BrowserError";
10105
+ __name(browserError, "browserError");
10106
+ __name4(browserError, "browserError");
10107
+ __name(isRecord, "isRecord");
10108
+ __name4(isRecord, "isRecord");
10109
+ __name(optionalString, "optionalString");
10110
+ __name4(optionalString, "optionalString");
10111
+ __name(readUrl, "readUrl");
10112
+ __name4(readUrl, "readUrl");
10113
+ __name(readFormat, "readFormat");
10114
+ __name4(readFormat, "readFormat");
10115
+ __name(readTimeout, "readTimeout");
10116
+ __name4(readTimeout, "readTimeout");
10117
+ __name(parseBrowserReadPayload, "parseBrowserReadPayload");
10118
+ __name4(parseBrowserReadPayload, "parseBrowserReadPayload");
10119
+ __name(clampBrowserReadContent, "clampBrowserReadContent");
10120
+ __name4(clampBrowserReadContent, "clampBrowserReadContent");
10121
+ __name(joinBrowserReadMatches, "joinBrowserReadMatches");
10122
+ __name4(joinBrowserReadMatches, "joinBrowserReadMatches");
10123
+ HTTP_STATUS_FAILURE = /ERR_HTTP_RESPONSE_CODE_FAILURE/;
10124
+ __name(isBrowserReadHttpFailure, "isBrowserReadHttpFailure");
10125
+ __name4(isBrowserReadHttpFailure, "isBrowserReadHttpFailure");
10126
+ __name(browserReadHttpErrorMessage, "browserReadHttpErrorMessage");
10127
+ __name4(browserReadHttpErrorMessage, "browserReadHttpErrorMessage");
10128
+ __name(urlOf, "urlOf");
10129
+ __name4(urlOf, "urlOf");
10130
+ __name(answeredDocuments, "answeredDocuments");
10131
+ __name4(answeredDocuments, "answeredDocuments");
10132
+ __name(documentStatusOf, "documentStatusOf");
10133
+ __name4(documentStatusOf, "documentStatusOf");
10134
+ LOGIN_PATH_SEGMENTS = /* @__PURE__ */ new Set([
10135
+ "login",
10136
+ "log-in",
10137
+ "logon",
10138
+ "signin",
10139
+ "sign-in",
10140
+ "sign_in",
10141
+ "auth",
10142
+ "authenticate",
10143
+ "authorize",
10144
+ "sso"
10145
+ ]);
10146
+ LOGIN_HOST_LABELS = /* @__PURE__ */ new Set([
10147
+ "login",
10148
+ "signin",
10149
+ "auth",
10150
+ "sso"
10151
+ ]);
10152
+ __name(isLoginUrl, "isLoginUrl");
10153
+ __name4(isLoginUrl, "isLoginUrl");
10154
+ __name(isLoginRedirect, "isLoginRedirect");
10155
+ __name4(isLoginRedirect, "isLoginRedirect");
10156
+ __name(browserReadLoginBlock, "browserReadLoginBlock");
10157
+ __name4(browserReadLoginBlock, "browserReadLoginBlock");
10158
+ AGENT_LOG_SOURCES = [
10159
+ "skill",
10160
+ "job",
10161
+ "webhook",
10162
+ "web-route",
10163
+ "trigger",
10164
+ "preprocessor",
10165
+ "postprocessor",
10166
+ "user_message",
10167
+ "agent_response",
10168
+ "agent_error",
10169
+ "runtime",
10170
+ "mcp",
10171
+ "rag",
10172
+ "device",
10173
+ "device-trigger",
10174
+ "model-resolver",
10175
+ "workflow-step",
10176
+ "workflow-script",
10177
+ "workflow",
10178
+ "supervision",
10179
+ "browser",
10180
+ "decisions"
10181
+ ];
10182
+ AGENT_LOG_ENVIRONMENTS = [
10183
+ "production",
10184
+ "sandbox"
10185
+ ];
10186
+ AGENT_LOG_FIELDS_MAX_WIRE_KEYS = LOG_FIELDS_MAX_KEYS + 1;
10187
+ __name(utf8Bytes, "utf8Bytes");
10188
+ __name4(utf8Bytes, "utf8Bytes");
10189
+ __name(isPlainFieldKey, "isPlainFieldKey");
10190
+ __name4(isPlainFieldKey, "isPlainFieldKey");
10191
+ __name(describeAgentLogFieldsViolation, "describeAgentLogFieldsViolation");
10192
+ __name4(describeAgentLogFieldsViolation, "describeAgentLogFieldsViolation");
10193
+ __name(isAgentLogFields, "isAgentLogFields");
10194
+ __name4(isAgentLogFields, "isAgentLogFields");
10195
+ BROWSER_LOG_EVENT_KINDS = [
10196
+ "session.opened",
10197
+ "command",
10198
+ "navigation",
10199
+ "blocked",
10200
+ "wall",
10201
+ "fallback",
10202
+ "confirm",
10203
+ "agent.step",
10204
+ "session.closed"
10205
+ ];
10206
+ BROWSER_LOG_ENGINES = [
10207
+ "desktop",
10208
+ "agent-browser",
10209
+ "browser-use",
10210
+ "none"
10211
+ ];
10212
+ BROWSER_SESSION_OPEN_REASONS = [
10213
+ "desktop-online",
10214
+ "cloud-fallback",
10215
+ "stepwise-cloud",
10216
+ "pinned",
10217
+ "none"
10218
+ ];
10219
+ BROWSER_BLOCK_KINDS = [
10220
+ "domain",
10221
+ "private-network",
10222
+ "policy",
10223
+ "concurrency",
10224
+ "bot-block"
10225
+ ];
10226
+ BROWSER_WALL_KINDS = [
10227
+ "captcha",
10228
+ "bot-block",
10229
+ "consent",
10230
+ "login",
10231
+ "empty-content"
10232
+ ];
10233
+ BROWSER_WALL_NEXT_ACTIONS = [
10234
+ "fallback",
10235
+ "retry",
10236
+ "ask-user",
10237
+ "gave-up"
10238
+ ];
10239
+ BROWSER_CONFIRM_DECISIONS = [
10240
+ "pending",
10241
+ "approved",
10242
+ "denied",
10243
+ "expired"
10244
+ ];
10245
+ BROWSER_SESSION_CLOSE_REASONS = [
10246
+ "done",
10247
+ "idle",
10248
+ "max-minutes",
10249
+ "max-steps",
10250
+ "cost-cap",
10251
+ "error",
10252
+ "reaped"
10253
+ ];
10254
+ BROWSER_LOG_CONTEXT_KEYS = [
10255
+ "runId",
10256
+ "executionId",
10257
+ "primitiveId",
10258
+ "primitiveName",
10259
+ "channel",
10260
+ "orgId",
10261
+ "environment",
10262
+ "agentVersion"
10263
+ ];
10264
+ BROWSER_LOG_ID_MAX_CHARS = 256;
10265
+ BROWSER_LOG_TEXT_MAX_CHARS = 64 * 1024;
10266
+ isString = /* @__PURE__ */ __name4((value3) => typeof value3 === "string", "isString");
10267
+ isBoolean = /* @__PURE__ */ __name4((value3) => typeof value3 === "boolean", "isBoolean");
10268
+ isCount = /* @__PURE__ */ __name4((value3) => typeof value3 === "number" && Number.isFinite(value3) && value3 >= 0, "isCount");
10269
+ isPlainObject2 = /* @__PURE__ */ __name4((value3) => typeof value3 === "object" && value3 !== null && !Array.isArray(value3), "isPlainObject");
10270
+ oneOf = /* @__PURE__ */ __name4((values) => (value3) => typeof value3 === "string" && values.includes(value3), "oneOf");
10271
+ isLimits = /* @__PURE__ */ __name4((value3) => isPlainObject2(value3) && Object.values(value3).every((entry) => isCount(entry)), "isLimits");
10272
+ EVENT_SHAPES = {
10273
+ "session.opened": {
10274
+ required: {
10275
+ reason: oneOf(BROWSER_SESSION_OPEN_REASONS)
10276
+ },
10277
+ optional: {
10278
+ limits: isLimits,
10279
+ region: isString,
10280
+ liveUrl: isString
10281
+ }
10282
+ },
10283
+ command: {
10284
+ required: {
10285
+ name: oneOf(BROWSER_COMMAND_NAMES),
10286
+ durationMs: isCount,
10287
+ ok: isBoolean
10288
+ },
10289
+ optional: {
10290
+ args: isPlainObject2,
10291
+ urlBefore: isString,
10292
+ urlAfter: isString,
10293
+ resultBytes: isCount,
10294
+ errorCode: isString,
10295
+ errorMessage: isString,
10296
+ title: isString,
10297
+ pageText: isString,
10298
+ screenshotRef: isString
10299
+ }
10300
+ },
10301
+ navigation: {
10302
+ required: {
10303
+ url: isString
10304
+ },
10305
+ optional: {
10306
+ finalUrl: isString,
10307
+ status: isCount,
10308
+ redirects: isCount
10309
+ }
10310
+ },
10311
+ blocked: {
10312
+ required: {
10313
+ kind: oneOf(BROWSER_BLOCK_KINDS)
10314
+ },
10315
+ optional: {
10316
+ rule: isString,
10317
+ target: isString,
10318
+ command: oneOf(BROWSER_COMMAND_NAMES),
10319
+ reason: isString
10320
+ }
10321
+ },
10322
+ wall: {
10323
+ required: {
10324
+ kind: oneOf(BROWSER_WALL_KINDS),
10325
+ url: isString,
10326
+ nextAction: oneOf(BROWSER_WALL_NEXT_ACTIONS)
10327
+ },
10328
+ optional: {}
10329
+ },
10330
+ fallback: {
10331
+ required: {
10332
+ from: oneOf(BROWSER_LOG_ENGINES),
10333
+ to: oneOf(BROWSER_LOG_ENGINES),
10334
+ reason: isString,
10335
+ provider: isString
10336
+ },
10337
+ optional: {}
10338
+ },
10339
+ confirm: {
10340
+ required: {
10341
+ action: isString,
10342
+ decision: oneOf(BROWSER_CONFIRM_DECISIONS)
10343
+ },
10344
+ optional: {
10345
+ decidedBy: isString
10346
+ }
10347
+ },
10348
+ "agent.step": {
10349
+ required: {
10350
+ step: isCount,
10351
+ action: isString
10352
+ },
10353
+ optional: {
10354
+ intent: isString,
10355
+ url: isString
10356
+ }
10357
+ },
10358
+ "session.closed": {
10359
+ required: {
10360
+ reason: oneOf(BROWSER_SESSION_CLOSE_REASONS),
10361
+ durationMs: isCount,
10362
+ pagesVisited: isCount,
10363
+ bytes: isCount
10364
+ },
10365
+ optional: {
10366
+ costUsd: isCount
10367
+ }
10368
+ }
10369
+ };
10370
+ BASE_KEYS = /* @__PURE__ */ new Set([
10371
+ "event",
10372
+ "sessionId",
10373
+ "engine",
10374
+ "at"
10375
+ ]);
10376
+ __name(describeBaseViolation, "describeBaseViolation");
10377
+ __name4(describeBaseViolation, "describeBaseViolation");
10378
+ __name(describeFieldViolation, "describeFieldViolation");
10379
+ __name4(describeFieldViolation, "describeFieldViolation");
10380
+ __name(describeBrowserLogEventViolation, "describeBrowserLogEventViolation");
10381
+ __name4(describeBrowserLogEventViolation, "describeBrowserLogEventViolation");
10382
+ __name(isBrowserLogEvent, "isBrowserLogEvent");
10383
+ __name4(isBrowserLogEvent, "isBrowserLogEvent");
10384
+ __name(describeBrowserLogContextViolation, "describeBrowserLogContextViolation");
10385
+ __name4(describeBrowserLogContextViolation, "describeBrowserLogContextViolation");
10386
+ BROWSER_WORKER_SESSION_ID_SEPARATOR = ":";
10387
+ __name(browserWorkerSessionId, "browserWorkerSessionId");
10388
+ __name4(browserWorkerSessionId, "browserWorkerSessionId");
10389
+ BROWSER_WORKER_BLOCK_REASON_MAX_CHARS = 1024;
10390
+ __name(browserLogContextOfWorkerContext, "browserLogContextOfWorkerContext");
10391
+ __name4(browserLogContextOfWorkerContext, "browserLogContextOfWorkerContext");
10392
+ __name(browserLogEventOfWorkerEvent, "browserLogEventOfWorkerEvent");
10393
+ __name4(browserLogEventOfWorkerEvent, "browserLogEventOfWorkerEvent");
9558
10394
  WORKFLOW_RETRY_BACKOFFS = [
9559
10395
  "fixed",
9560
10396
  "exponential"
@@ -9856,38 +10692,6 @@ This text is who you are for this person. As you learn them, their name, their w
9856
10692
  `;
9857
10693
  __name(buildPersonalSpaceStartingPersona, "buildPersonalSpaceStartingPersona");
9858
10694
  __name4(buildPersonalSpaceStartingPersona, "buildPersonalSpaceStartingPersona");
9859
- AGENT_LOG_SOURCES = [
9860
- "skill",
9861
- "job",
9862
- "webhook",
9863
- "web-route",
9864
- "trigger",
9865
- "preprocessor",
9866
- "postprocessor",
9867
- "user_message",
9868
- "agent_response",
9869
- "agent_error",
9870
- "runtime",
9871
- "mcp",
9872
- "rag",
9873
- "device",
9874
- "device-trigger",
9875
- "model-resolver",
9876
- "workflow-step",
9877
- "workflow-script",
9878
- "workflow",
9879
- "supervision",
9880
- "decisions"
9881
- ];
9882
- AGENT_LOG_FIELDS_MAX_WIRE_KEYS = LOG_FIELDS_MAX_KEYS + 1;
9883
- __name(utf8Bytes, "utf8Bytes");
9884
- __name4(utf8Bytes, "utf8Bytes");
9885
- __name(isPlainFieldKey, "isPlainFieldKey");
9886
- __name4(isPlainFieldKey, "isPlainFieldKey");
9887
- __name(describeAgentLogFieldsViolation, "describeAgentLogFieldsViolation");
9888
- __name4(describeAgentLogFieldsViolation, "describeAgentLogFieldsViolation");
9889
- __name(isAgentLogFields, "isAgentLogFields");
9890
- __name4(isAgentLogFields, "isAgentLogFields");
9891
10695
  LOG_DRAIN_TYPES_PHASE1 = [
9892
10696
  "http",
9893
10697
  "otlp",
@@ -10180,8 +10984,8 @@ This text is who you are for this person. As you learn them, their name, their w
10180
10984
  CORE_DRAINING_CODE = "CORE_DRAINING";
10181
10985
  CORE_DRAINING_DEFAULT_RETRY_MS = 1e3;
10182
10986
  CORE_DRAINING_MAX_RETRY_MS = 5e3;
10183
- __name(isRecord, "isRecord");
10184
- __name4(isRecord, "isRecord");
10987
+ __name(isRecord2, "isRecord2");
10988
+ __name4(isRecord2, "isRecord");
10185
10989
  __name(isCoreDrainingErrorResponse, "isCoreDrainingErrorResponse");
10186
10990
  __name4(isCoreDrainingErrorResponse, "isCoreDrainingErrorResponse");
10187
10991
  __name(coreDrainingRetryDelayMs, "coreDrainingRetryDelayMs");
@@ -10211,7 +11015,7 @@ This text is who you are for this person. As you learn them, their name, their w
10211
11015
  ModelDescriptorSchema = z2.string().min(1).max(200);
10212
11016
  InferenceModelSchema = z2.object({
10213
11017
  kind: z2.literal("inference"),
10214
- /** Provider-prefixed model id (e.g. `'openai/gpt-5.2-chat-latest'`). */
11018
+ /** Provider-prefixed model id (e.g. `'openai/chat-latest'`). */
10215
11019
  model: ModelDescriptorSchema,
10216
11020
  /**
10217
11021
  * TTS-only — provider voice id. Inference's TTS API takes voice
@@ -12616,6 +13420,218 @@ var init_auth_error = __esm({
12616
13420
  }
12617
13421
  });
12618
13422
 
13423
+ // ../sandbox-runtime/dist/decisions-api.mjs
13424
+ function isRecord3(value3) {
13425
+ return typeof value3 === "object" && value3 !== null && !Array.isArray(value3);
13426
+ }
13427
+ function isProvider(value3) {
13428
+ return DECISION_PROVIDERS.includes(value3);
13429
+ }
13430
+ function invalid2(message) {
13431
+ return new DecisionError(message, {
13432
+ code: DECISION_ERROR_CODES.INVALID
13433
+ });
13434
+ }
13435
+ function assertInstructions(builder, instructions) {
13436
+ if (typeof instructions !== "string" || instructions.trim().length === 0) {
13437
+ throw invalid2(`Decisions.${builder} needs non-empty instructions`);
13438
+ }
13439
+ if (instructions.length > DECISION_LIMITS.maxInstructionChars) {
13440
+ throw invalid2(`Decisions.${builder} instructions must be at most ${DECISION_LIMITS.maxInstructionChars} characters`);
13441
+ }
13442
+ }
13443
+ function assertCount(what, count2, min, max) {
13444
+ if (count2 < min || count2 > max) {
13445
+ throw invalid2(`${what} must hold ${min} to ${max} entries, got ${count2}`);
13446
+ }
13447
+ }
13448
+ function odds(instructions, criteria) {
13449
+ assertInstructions("odds", instructions);
13450
+ if (criteria === void 0) return {
13451
+ type: "odds",
13452
+ instructions
13453
+ };
13454
+ if (!isRecord3(criteria)) throw invalid2("Decisions.odds criteria must be an object like { yes, no }");
13455
+ return {
13456
+ type: "odds",
13457
+ instructions,
13458
+ criteria
13459
+ };
13460
+ }
13461
+ function choice(instructions, options) {
13462
+ assertInstructions("choice", instructions);
13463
+ if (!isRecord3(options)) throw invalid2("Decisions.choice options must be an object of label to description");
13464
+ assertCount("Decisions.choice options", Object.keys(options).length, DECISION_LIMITS.minOptions, DECISION_LIMITS.maxOptions);
13465
+ return {
13466
+ type: "choice",
13467
+ instructions,
13468
+ options
13469
+ };
13470
+ }
13471
+ function score(instructions, levels) {
13472
+ assertInstructions("score", instructions);
13473
+ if (!Array.isArray(levels)) throw invalid2("Decisions.score levels must be an array");
13474
+ assertCount("Decisions.score levels", levels.length, DECISION_LIMITS.minLevels, DECISION_LIMITS.maxLevels);
13475
+ return {
13476
+ type: "score",
13477
+ instructions,
13478
+ levels
13479
+ };
13480
+ }
13481
+ function assertDecisionQuestion(name, question) {
13482
+ if (!isRecord3(question) || !DECISION_QUESTION_TYPES.includes(question.type)) {
13483
+ throw invalid2(`questions.${name} must be built with Decisions.odds, Decisions.choice or Decisions.score`);
13484
+ }
13485
+ if (typeof question.instructions !== "string" || question.instructions.trim().length === 0) {
13486
+ throw invalid2(`questions.${name}.instructions must be a non-empty string`);
13487
+ }
13488
+ }
13489
+ function checkDecisionRequest(request) {
13490
+ if (!isRecord3(request)) {
13491
+ throw invalid2("Decisions.ask needs { state, questions } or (state, question)");
13492
+ }
13493
+ if (request.state === void 0 || request.state === null) {
13494
+ throw invalid2("Decisions.ask needs a state");
13495
+ }
13496
+ if (!isRecord3(request.questions) || Object.keys(request.questions).length === 0) {
13497
+ throw invalid2("Decisions.ask needs at least one question in questions");
13498
+ }
13499
+ for (const [name, question] of Object.entries(request.questions)) assertDecisionQuestion(name, question);
13500
+ return request;
13501
+ }
13502
+ function checkDecisionRunRequest(request) {
13503
+ if (typeof request.name !== "string" || !DECISION_NAME_PATTERN.test(request.name)) {
13504
+ throw invalid2("Decisions.run needs the name of a decision declared on the agent");
13505
+ }
13506
+ if (request.state === void 0 || request.state === null) {
13507
+ throw invalid2("Decisions.run needs a state");
13508
+ }
13509
+ return request;
13510
+ }
13511
+ function toDecisionError(caught) {
13512
+ if (caught instanceof DecisionError) return caught;
13513
+ const raw = isRecord3(caught) ? caught : {};
13514
+ const detail = typeof raw.message === "string" && raw.message.length > 0 ? raw.message : "Decision failed";
13515
+ const code = typeof raw.code === "string" && raw.code.length > 0 ? raw.code : DECISION_ERROR_CODES.UNAVAILABLE;
13516
+ const message = detail.startsWith(`${code}: `) ? detail : `${code}: ${detail}`;
13517
+ return new DecisionError(message, {
13518
+ code,
13519
+ ...isProvider(raw.provider) && {
13520
+ provider: raw.provider
13521
+ },
13522
+ ...typeof raw.upstreamStatus === "number" && {
13523
+ upstreamStatus: raw.upstreamStatus
13524
+ },
13525
+ ...typeof raw.decisionId === "string" && {
13526
+ decisionId: raw.decisionId
13527
+ }
13528
+ });
13529
+ }
13530
+ function buildDecisionsApi(transport) {
13531
+ async function relay2(send) {
13532
+ if (!transport) {
13533
+ throw new DecisionError("Decisions is not available in this runtime", {
13534
+ code: DECISION_ERROR_CODES.UNAVAILABLE
13535
+ });
13536
+ }
13537
+ try {
13538
+ return await send(transport);
13539
+ } catch (caught) {
13540
+ throw toDecisionError(caught);
13541
+ }
13542
+ }
13543
+ __name(relay2, "relay");
13544
+ __name6(relay2, "relay");
13545
+ async function ask(requestOrState, question, options) {
13546
+ if (question === void 0) {
13547
+ const request2 = checkDecisionRequest(requestOrState);
13548
+ return relay2((t) => t.ask(request2));
13549
+ }
13550
+ const request = checkDecisionRequest({
13551
+ ...options,
13552
+ state: requestOrState,
13553
+ questions: {
13554
+ [SINGLE_DECISION_KEY]: question
13555
+ }
13556
+ });
13557
+ const result = await relay2((t) => t.ask(request));
13558
+ return result.answers[SINGLE_DECISION_KEY];
13559
+ }
13560
+ __name(ask, "ask");
13561
+ __name6(ask, "ask");
13562
+ async function run(name, state3, options) {
13563
+ const request = checkDecisionRunRequest({
13564
+ ...options,
13565
+ name,
13566
+ state: state3
13567
+ });
13568
+ return await relay2((t) => t.run(request));
13569
+ }
13570
+ __name(run, "run");
13571
+ __name6(run, "run");
13572
+ return {
13573
+ ask,
13574
+ run,
13575
+ odds,
13576
+ choice,
13577
+ score
13578
+ };
13579
+ }
13580
+ var __defProp6, __name6, DECISION_ERROR_NAME, SINGLE_DECISION_KEY, DecisionError;
13581
+ var init_decisions_api = __esm({
13582
+ "../sandbox-runtime/dist/decisions-api.mjs"() {
13583
+ "use strict";
13584
+ init_dist();
13585
+ __defProp6 = Object.defineProperty;
13586
+ __name6 = /* @__PURE__ */ __name((target, value3) => __defProp6(target, "name", { value: value3, configurable: true }), "__name");
13587
+ DECISION_ERROR_NAME = "DecisionError";
13588
+ SINGLE_DECISION_KEY = "answer";
13589
+ DecisionError = class extends Error {
13590
+ static {
13591
+ __name(this, "DecisionError");
13592
+ }
13593
+ static {
13594
+ __name6(this, "DecisionError");
13595
+ }
13596
+ code;
13597
+ constructor(message, fields) {
13598
+ super(message);
13599
+ this.name = DECISION_ERROR_NAME;
13600
+ this.code = fields.code;
13601
+ if (fields.provider !== void 0) this.provider = fields.provider;
13602
+ if (fields.upstreamStatus !== void 0) this.upstreamStatus = fields.upstreamStatus;
13603
+ if (fields.decisionId !== void 0) this.decisionId = fields.decisionId;
13604
+ }
13605
+ };
13606
+ __name(isRecord3, "isRecord");
13607
+ __name6(isRecord3, "isRecord");
13608
+ __name(isProvider, "isProvider");
13609
+ __name6(isProvider, "isProvider");
13610
+ __name(invalid2, "invalid");
13611
+ __name6(invalid2, "invalid");
13612
+ __name(assertInstructions, "assertInstructions");
13613
+ __name6(assertInstructions, "assertInstructions");
13614
+ __name(assertCount, "assertCount");
13615
+ __name6(assertCount, "assertCount");
13616
+ __name(odds, "odds");
13617
+ __name6(odds, "odds");
13618
+ __name(choice, "choice");
13619
+ __name6(choice, "choice");
13620
+ __name(score, "score");
13621
+ __name6(score, "score");
13622
+ __name(assertDecisionQuestion, "assertDecisionQuestion");
13623
+ __name6(assertDecisionQuestion, "assertDecisionQuestion");
13624
+ __name(checkDecisionRequest, "checkDecisionRequest");
13625
+ __name6(checkDecisionRequest, "checkDecisionRequest");
13626
+ __name(checkDecisionRunRequest, "checkDecisionRunRequest");
13627
+ __name6(checkDecisionRunRequest, "checkDecisionRunRequest");
13628
+ __name(toDecisionError, "toDecisionError");
13629
+ __name6(toDecisionError, "toDecisionError");
13630
+ __name(buildDecisionsApi, "buildDecisionsApi");
13631
+ __name6(buildDecisionsApi, "buildDecisionsApi");
13632
+ }
13633
+ });
13634
+
12619
13635
  // src/errors/cli.error.ts
12620
13636
  function apiErrorDetail(error) {
12621
13637
  return {
@@ -12696,6 +13712,41 @@ function numericStatus(error) {
12696
13712
  const candidate = error.statusCode ?? error.status;
12697
13713
  return typeof candidate === "number" && Number.isFinite(candidate) ? candidate : void 0;
12698
13714
  }
13715
+ function statusClass(status) {
13716
+ if (status === 401) return {
13717
+ code: "auth",
13718
+ exitCode: CLI_EXIT.AUTH
13719
+ };
13720
+ if (status === 403) return {
13721
+ code: "forbidden",
13722
+ exitCode: CLI_EXIT.FORBIDDEN
13723
+ };
13724
+ if (status === 404) return {
13725
+ code: "not_found",
13726
+ exitCode: CLI_EXIT.NOT_FOUND
13727
+ };
13728
+ if (status >= 400 && status < 500) return {
13729
+ code: `http_${status}`,
13730
+ exitCode: CLI_EXIT.FORBIDDEN
13731
+ };
13732
+ if (status >= 500 || status === 0) return {
13733
+ code: "unavailable",
13734
+ exitCode: CLI_EXIT.UNAVAILABLE
13735
+ };
13736
+ return void 0;
13737
+ }
13738
+ function decisionErrorClass(error, message) {
13739
+ if (error.name !== DECISION_ERROR_NAME || typeof error.code !== "string" || error.code.length === 0) return void 0;
13740
+ const status = Object.hasOwn(DECISION_STATUS, error.code) ? DECISION_STATUS[error.code] : void 0;
13741
+ return {
13742
+ code: error.code,
13743
+ exitCode: (status === void 0 ? void 0 : statusClass(status)?.exitCode) ?? CLI_EXIT.ERROR,
13744
+ message,
13745
+ ...typeof error.decisionId === "string" && error.decisionId.length > 0 ? {
13746
+ decisionId: error.decisionId
13747
+ } : {}
13748
+ };
13749
+ }
12699
13750
  function classifyCliError(error) {
12700
13751
  if (CliError.isCliError(error)) {
12701
13752
  return {
@@ -12725,40 +13776,15 @@ function classifyCliError(error) {
12725
13776
  message
12726
13777
  };
12727
13778
  }
13779
+ const decision = decisionErrorClass(e, message);
13780
+ if (decision) return decision;
12728
13781
  const status = numericStatus(e);
12729
- if (status !== void 0) {
12730
- const statusCode = status;
12731
- if (status === 401) return {
12732
- code: "auth",
12733
- exitCode: CLI_EXIT.AUTH,
12734
- message,
12735
- statusCode
12736
- };
12737
- if (status === 403) return {
12738
- code: "forbidden",
12739
- exitCode: CLI_EXIT.FORBIDDEN,
12740
- message,
12741
- statusCode
12742
- };
12743
- if (status === 404) return {
12744
- code: "not_found",
12745
- exitCode: CLI_EXIT.NOT_FOUND,
12746
- message,
12747
- statusCode
12748
- };
12749
- if (status >= 400 && status < 500) return {
12750
- code: `http_${status}`,
12751
- exitCode: CLI_EXIT.FORBIDDEN,
12752
- message,
12753
- statusCode
12754
- };
12755
- if (status >= 500 || status === 0) return {
12756
- code: "unavailable",
12757
- exitCode: CLI_EXIT.UNAVAILABLE,
12758
- message,
12759
- statusCode
12760
- };
12761
- }
13782
+ const byStatus = status === void 0 ? void 0 : statusClass(status);
13783
+ if (byStatus) return {
13784
+ ...byStatus,
13785
+ message,
13786
+ statusCode: status
13787
+ };
12762
13788
  const causeCode = e.cause?.code;
12763
13789
  if (typeof e.code === "string" && NETWORK_ERRNO.has(e.code) || typeof causeCode === "string" && NETWORK_ERRNO.has(causeCode) || e.name === "AbortError" || e.name === "TimeoutError" || NETWORK_MESSAGE.test(message)) {
12764
13790
  return {
@@ -12774,10 +13800,12 @@ function classifyCliError(error) {
12774
13800
  message
12775
13801
  };
12776
13802
  }
12777
- var CLI_EXIT, CliError, NETWORK_ERRNO, NETWORK_MESSAGE, UNAVAILABLE_HINT, VENDOR_RETRY_SOON_SECONDS, VENDOR_LABELS, PROVIDER_REJECTED_SERVER_CODE, PROVIDER_REJECTED_HTTP_STATUS, PROVIDER_REJECTION_REASONS, PROVIDER_REJECTED_NO_RETRY, PROVIDER_REJECTED_LUA_SIDE, MODEL_SETTINGS_URL;
13803
+ var CLI_EXIT, CliError, NETWORK_ERRNO, NETWORK_MESSAGE, UNAVAILABLE_HINT, VENDOR_RETRY_SOON_SECONDS, VENDOR_LABELS, PROVIDER_REJECTED_SERVER_CODE, PROVIDER_REJECTED_HTTP_STATUS, PROVIDER_REJECTION_REASONS, PROVIDER_REJECTED_NO_RETRY, PROVIDER_REJECTED_LUA_SIDE, MODEL_SETTINGS_URL, DECISION_STATUS;
12778
13804
  var init_cli_error = __esm({
12779
13805
  "src/errors/cli.error.ts"() {
12780
13806
  "use strict";
13807
+ init_dist();
13808
+ init_decisions_api();
12781
13809
  init_auth_error();
12782
13810
  CLI_EXIT = {
12783
13811
  OK: 0,
@@ -12930,6 +13958,18 @@ var init_cli_error = __esm({
12930
13958
  __name(providerRejectedHint, "providerRejectedHint");
12931
13959
  __name(authHint, "authHint");
12932
13960
  __name(numericStatus, "numericStatus");
13961
+ __name(statusClass, "statusClass");
13962
+ DECISION_STATUS = {
13963
+ [DECISION_ERROR_CODES.INVALID]: 400,
13964
+ [DECISION_ERROR_CODES.INSUFFICIENT_CREDITS]: 402,
13965
+ [DECISION_ERROR_CODES.NOT_FOUND]: 404,
13966
+ [DECISION_ERROR_CODES.REJECTED]: 422,
13967
+ [DECISION_ERROR_CODES.TIMEOUT]: 503,
13968
+ [DECISION_ERROR_CODES.UNAVAILABLE]: 503,
13969
+ [DECISION_ERROR_CODES.DISABLED]: 503,
13970
+ [DECISION_ERROR_CODES.CANCELLED]: 400
13971
+ };
13972
+ __name(decisionErrorClass, "decisionErrorClass");
12933
13973
  __name(classifyCliError, "classifyCliError");
12934
13974
  }
12935
13975
  });
@@ -14186,217 +15226,6 @@ var init_connection_requests_api_service = __esm({
14186
15226
  }
14187
15227
  });
14188
15228
 
14189
- // ../sandbox-runtime/dist/decisions-api.mjs
14190
- function isRecord2(value3) {
14191
- return typeof value3 === "object" && value3 !== null && !Array.isArray(value3);
14192
- }
14193
- function isProvider(value3) {
14194
- return DECISION_PROVIDERS.includes(value3);
14195
- }
14196
- function invalid2(message) {
14197
- return new DecisionError(message, {
14198
- code: DECISION_ERROR_CODES.INVALID
14199
- });
14200
- }
14201
- function assertInstructions(builder, instructions) {
14202
- if (typeof instructions !== "string" || instructions.trim().length === 0) {
14203
- throw invalid2(`Decisions.${builder} needs non-empty instructions`);
14204
- }
14205
- if (instructions.length > DECISION_LIMITS.maxInstructionChars) {
14206
- throw invalid2(`Decisions.${builder} instructions must be at most ${DECISION_LIMITS.maxInstructionChars} characters`);
14207
- }
14208
- }
14209
- function assertCount(what, count, min, max) {
14210
- if (count < min || count > max) {
14211
- throw invalid2(`${what} must hold ${min} to ${max} entries, got ${count}`);
14212
- }
14213
- }
14214
- function odds(instructions, criteria) {
14215
- assertInstructions("odds", instructions);
14216
- if (criteria === void 0) return {
14217
- type: "odds",
14218
- instructions
14219
- };
14220
- if (!isRecord2(criteria)) throw invalid2("Decisions.odds criteria must be an object like { yes, no }");
14221
- return {
14222
- type: "odds",
14223
- instructions,
14224
- criteria
14225
- };
14226
- }
14227
- function choice(instructions, options) {
14228
- assertInstructions("choice", instructions);
14229
- if (!isRecord2(options)) throw invalid2("Decisions.choice options must be an object of label to description");
14230
- assertCount("Decisions.choice options", Object.keys(options).length, DECISION_LIMITS.minOptions, DECISION_LIMITS.maxOptions);
14231
- return {
14232
- type: "choice",
14233
- instructions,
14234
- options
14235
- };
14236
- }
14237
- function score(instructions, levels) {
14238
- assertInstructions("score", instructions);
14239
- if (!Array.isArray(levels)) throw invalid2("Decisions.score levels must be an array");
14240
- assertCount("Decisions.score levels", levels.length, DECISION_LIMITS.minLevels, DECISION_LIMITS.maxLevels);
14241
- return {
14242
- type: "score",
14243
- instructions,
14244
- levels
14245
- };
14246
- }
14247
- function assertDecisionQuestion(name, question) {
14248
- if (!isRecord2(question) || !DECISION_QUESTION_TYPES.includes(question.type)) {
14249
- throw invalid2(`questions.${name} must be built with Decisions.odds, Decisions.choice or Decisions.score`);
14250
- }
14251
- if (typeof question.instructions !== "string" || question.instructions.trim().length === 0) {
14252
- throw invalid2(`questions.${name}.instructions must be a non-empty string`);
14253
- }
14254
- }
14255
- function checkDecisionRequest(request) {
14256
- if (!isRecord2(request)) {
14257
- throw invalid2("Decisions.ask needs { state, questions } or (state, question)");
14258
- }
14259
- if (request.state === void 0 || request.state === null) {
14260
- throw invalid2("Decisions.ask needs a state");
14261
- }
14262
- if (!isRecord2(request.questions) || Object.keys(request.questions).length === 0) {
14263
- throw invalid2("Decisions.ask needs at least one question in questions");
14264
- }
14265
- for (const [name, question] of Object.entries(request.questions)) assertDecisionQuestion(name, question);
14266
- return request;
14267
- }
14268
- function checkDecisionRunRequest(request) {
14269
- if (typeof request.name !== "string" || !DECISION_NAME_PATTERN.test(request.name)) {
14270
- throw invalid2("Decisions.run needs the name of a decision declared on the agent");
14271
- }
14272
- if (request.state === void 0 || request.state === null) {
14273
- throw invalid2("Decisions.run needs a state");
14274
- }
14275
- return request;
14276
- }
14277
- function toDecisionError(caught) {
14278
- if (caught instanceof DecisionError) return caught;
14279
- const raw = isRecord2(caught) ? caught : {};
14280
- const message = typeof raw.message === "string" && raw.message.length > 0 ? raw.message : "Decision failed";
14281
- const code = typeof raw.code === "string" && raw.code.length > 0 ? raw.code : DECISION_ERROR_CODES.UNAVAILABLE;
14282
- return new DecisionError(message, {
14283
- code,
14284
- ...isProvider(raw.provider) && {
14285
- provider: raw.provider
14286
- },
14287
- ...typeof raw.upstreamStatus === "number" && {
14288
- upstreamStatus: raw.upstreamStatus
14289
- },
14290
- ...typeof raw.decisionId === "string" && {
14291
- decisionId: raw.decisionId
14292
- }
14293
- });
14294
- }
14295
- function buildDecisionsApi(transport) {
14296
- async function relay2(send) {
14297
- if (!transport) {
14298
- throw new DecisionError("Decisions is not available in this runtime", {
14299
- code: DECISION_ERROR_CODES.UNAVAILABLE
14300
- });
14301
- }
14302
- try {
14303
- return await send(transport);
14304
- } catch (caught) {
14305
- throw toDecisionError(caught);
14306
- }
14307
- }
14308
- __name(relay2, "relay");
14309
- __name6(relay2, "relay");
14310
- async function ask(requestOrState, question, options) {
14311
- if (question === void 0) {
14312
- const request2 = checkDecisionRequest(requestOrState);
14313
- return relay2((t) => t.ask(request2));
14314
- }
14315
- const request = checkDecisionRequest({
14316
- ...options,
14317
- state: requestOrState,
14318
- questions: {
14319
- [SINGLE_DECISION_KEY]: question
14320
- }
14321
- });
14322
- const result = await relay2((t) => t.ask(request));
14323
- return result.answers[SINGLE_DECISION_KEY];
14324
- }
14325
- __name(ask, "ask");
14326
- __name6(ask, "ask");
14327
- async function run(name, state3, options) {
14328
- const request = checkDecisionRunRequest({
14329
- ...options,
14330
- name,
14331
- state: state3
14332
- });
14333
- return await relay2((t) => t.run(request));
14334
- }
14335
- __name(run, "run");
14336
- __name6(run, "run");
14337
- return {
14338
- ask,
14339
- run,
14340
- odds,
14341
- choice,
14342
- score
14343
- };
14344
- }
14345
- var __defProp6, __name6, DECISION_ERROR_NAME, SINGLE_DECISION_KEY, DecisionError;
14346
- var init_decisions_api = __esm({
14347
- "../sandbox-runtime/dist/decisions-api.mjs"() {
14348
- "use strict";
14349
- init_dist();
14350
- __defProp6 = Object.defineProperty;
14351
- __name6 = /* @__PURE__ */ __name((target, value3) => __defProp6(target, "name", { value: value3, configurable: true }), "__name");
14352
- DECISION_ERROR_NAME = "DecisionError";
14353
- SINGLE_DECISION_KEY = "answer";
14354
- DecisionError = class extends Error {
14355
- static {
14356
- __name(this, "DecisionError");
14357
- }
14358
- static {
14359
- __name6(this, "DecisionError");
14360
- }
14361
- code;
14362
- constructor(message, fields) {
14363
- super(message);
14364
- this.name = DECISION_ERROR_NAME;
14365
- this.code = fields.code;
14366
- if (fields.provider !== void 0) this.provider = fields.provider;
14367
- if (fields.upstreamStatus !== void 0) this.upstreamStatus = fields.upstreamStatus;
14368
- if (fields.decisionId !== void 0) this.decisionId = fields.decisionId;
14369
- }
14370
- };
14371
- __name(isRecord2, "isRecord");
14372
- __name6(isRecord2, "isRecord");
14373
- __name(isProvider, "isProvider");
14374
- __name6(isProvider, "isProvider");
14375
- __name(invalid2, "invalid");
14376
- __name6(invalid2, "invalid");
14377
- __name(assertInstructions, "assertInstructions");
14378
- __name6(assertInstructions, "assertInstructions");
14379
- __name(assertCount, "assertCount");
14380
- __name6(assertCount, "assertCount");
14381
- __name(odds, "odds");
14382
- __name6(odds, "odds");
14383
- __name(choice, "choice");
14384
- __name6(choice, "choice");
14385
- __name(score, "score");
14386
- __name6(score, "score");
14387
- __name(assertDecisionQuestion, "assertDecisionQuestion");
14388
- __name6(assertDecisionQuestion, "assertDecisionQuestion");
14389
- __name(checkDecisionRequest, "checkDecisionRequest");
14390
- __name6(checkDecisionRequest, "checkDecisionRequest");
14391
- __name(checkDecisionRunRequest, "checkDecisionRunRequest");
14392
- __name6(checkDecisionRunRequest, "checkDecisionRunRequest");
14393
- __name(toDecisionError, "toDecisionError");
14394
- __name6(toDecisionError, "toDecisionError");
14395
- __name(buildDecisionsApi, "buildDecisionsApi");
14396
- __name6(buildDecisionsApi, "buildDecisionsApi");
14397
- }
14398
- });
14399
-
14400
15229
  // src/api/decisions.api.service.ts
14401
15230
  function resultOf(response) {
14402
15231
  if (!response.success) throw toDecisionError(response.error);
@@ -14407,13 +15236,20 @@ function resultOf(response) {
14407
15236
  }
14408
15237
  return response.data;
14409
15238
  }
14410
- function buildOfflineDecisionsApi(getService) {
15239
+ function decisionTestSiteHeaders(site) {
15240
+ return {
15241
+ [DECISION_SANDBOX_SITE_HEADER]: DECISION_LUA_TEST_SITE,
15242
+ [DECISION_SANDBOX_PRIMITIVE_HEADER]: formatDecisionSandboxPrimitive(`${site.kind}:${site.name}`, site.tool)
15243
+ };
15244
+ }
15245
+ function buildOfflineDecisionsApi(getService, testSite) {
15246
+ const headers = testSite ? decisionTestSiteHeaders(testSite) : void 0;
14411
15247
  return buildDecisionsApi({
14412
- ask: /* @__PURE__ */ __name(async (request) => (await getService()).askForSandbox(request), "ask"),
14413
- run: /* @__PURE__ */ __name(async (request) => (await getService()).runForSandbox(request), "run")
15248
+ ask: /* @__PURE__ */ __name(async (request) => (await getService()).askForSandbox(request, headers), "ask"),
15249
+ run: /* @__PURE__ */ __name(async (request) => (await getService()).runForSandbox(request, headers), "run")
14414
15250
  });
14415
15251
  }
14416
- var DecisionsApiService;
15252
+ var DECISION_LUA_TEST_SITE, DecisionsApiService;
14417
15253
  var init_decisions_api_service = __esm({
14418
15254
  "src/api/decisions.api.service.ts"() {
14419
15255
  "use strict";
@@ -14421,6 +15257,8 @@ var init_decisions_api_service = __esm({
14421
15257
  init_decisions_api();
14422
15258
  init_http_client();
14423
15259
  __name(resultOf, "resultOf");
15260
+ DECISION_LUA_TEST_SITE = "lua-test";
15261
+ __name(decisionTestSiteHeaders, "decisionTestSiteHeaders");
14424
15262
  DecisionsApiService = class extends HttpClient {
14425
15263
  static {
14426
15264
  __name(this, "DecisionsApiService");
@@ -14429,17 +15267,17 @@ var init_decisions_api_service = __esm({
14429
15267
  constructor(baseUrl, credential, agentId2) {
14430
15268
  super(baseUrl, credential), this.agentId = agentId2;
14431
15269
  }
14432
- async ask(body) {
14433
- return this.httpPostOnce(`/developer/decisions/${this.agentId}/ask`, body, {});
15270
+ async ask(body, headers = {}) {
15271
+ return this.httpPostOnce(`/developer/decisions/${this.agentId}/ask`, body, headers);
14434
15272
  }
14435
- async run({ name, ...body }) {
14436
- return this.httpPostOnce(`/developer/decisions/${this.agentId}/run/${encodeURIComponent(name)}`, body, {});
15273
+ async run({ name, ...body }, headers = {}) {
15274
+ return this.httpPostOnce(`/developer/decisions/${this.agentId}/run/${encodeURIComponent(name)}`, body, headers);
14437
15275
  }
14438
- async askForSandbox(request) {
14439
- return resultOf(await this.ask(request));
15276
+ async askForSandbox(request, headers) {
15277
+ return resultOf(await this.ask(request, headers));
14440
15278
  }
14441
- async runForSandbox(request) {
14442
- return resultOf(await this.run(request));
15279
+ async runForSandbox(request, headers) {
15280
+ return resultOf(await this.run(request, headers));
14443
15281
  }
14444
15282
  async getDecisions() {
14445
15283
  return this.httpGet(`/developer/decisions/${this.agentId}/definitions`, {});
@@ -16795,7 +17633,7 @@ function resolvePlacements(calls) {
16795
17633
  function isConditionalJoinId(stepId) {
16796
17634
  return CONDITIONAL_JOIN_ID.test(stepId);
16797
17635
  }
16798
- function isPlainObject2(v) {
17636
+ function isPlainObject3(v) {
16799
17637
  return typeof v === "object" && v !== null && !Array.isArray(v);
16800
17638
  }
16801
17639
  function leafValue(row) {
@@ -16816,7 +17654,7 @@ function deriveRunOutput(steps) {
16816
17654
  if (leaves.length === 1) {
16817
17655
  const leaf = leaves[0];
16818
17656
  const value22 = leafValue(leaf);
16819
- if (isConditionalJoinId(leaf.stepId) && isPlainObject2(value22)) {
17657
+ if (isConditionalJoinId(leaf.stepId) && isPlainObject3(value22)) {
16820
17658
  const keys = Object.keys(value22);
16821
17659
  if (keys.length === 1) return {
16822
17660
  output: value22[keys[0]],
@@ -18159,7 +18997,7 @@ function estimateGraph(envelopeOrGraph) {
18159
18997
  };
18160
18998
  }
18161
18999
  function* singleStepsOf(entry) {
18162
- if (!isRecord3(entry)) return;
19000
+ if (!isRecord4(entry)) return;
18163
19001
  switch (entry.type) {
18164
19002
  case "step":
18165
19003
  case "agent":
@@ -18183,8 +19021,8 @@ function* singleStepsOf(entry) {
18183
19021
  }
18184
19022
  }
18185
19023
  function entriesOf(graph) {
18186
- const definition = isRecord3(graph) ? graph.definition : void 0;
18187
- const entries = isRecord3(definition) ? definition.graph : void 0;
19024
+ const definition = isRecord4(graph) ? graph.definition : void 0;
19025
+ const entries = isRecord4(definition) ? definition.graph : void 0;
18188
19026
  return Array.isArray(entries) ? entries : [];
18189
19027
  }
18190
19028
  function inheritTargets(graphs) {
@@ -18201,7 +19039,7 @@ function inheritTargets(graphs) {
18201
19039
  return targets;
18202
19040
  }
18203
19041
  function needsInheritedWorkspace(graph) {
18204
- if (!isRecord3(graph) || graph.workspace !== void 0) return false;
19042
+ if (!isRecord4(graph) || graph.workspace !== void 0) return false;
18205
19043
  for (const entry of entriesOf(graph)) {
18206
19044
  for (const node of singleStepsOf(entry)) {
18207
19045
  if (node.workspace !== void 0 && node.workspace !== "inherit") return true;
@@ -18282,7 +19120,7 @@ function collectJobTierSteps(entry, out) {
18282
19120
  return;
18283
19121
  }
18284
19122
  }
18285
- var __defProp8, __name8, WorkflowTemplateError, TEMPLATE_PLACEHOLDER, TEMPLATE_NAMESPACES, MAP_DESCRIPTOR_KEYS, MAP_MEMBER_MALFORMED_CODE, fromInit, fromStep, value, template, fromRequest, rows, fromKnowledge, SideEffectsSchema, JobResourcesSchema, WORKFLOW_MODEL_TEMPLATE_ROOT, WORKFLOW_MODEL_TEMPLATE_RE, PATH_SEGMENT_RE, APPROVER_SPEC_MAX_USERS, ESCALATION_MAX_HOPS, TemplateBindingSchema, ApproverSpecSchema, FourEyesSchema, EscalationHopSchema, TerminalOutcomeSchema, ApprovalOnTimeoutSchema, APPROVER_SPEC_SHAPES, APPROVER_WRITTEN_MAX, USER_ID_SHAPED_RE, BINDING_ROOTS, APPROVAL_REMIND_AFTER_HOURS_MIN, APPROVAL_REMIND_AFTER_HOURS_MAX, APPROVAL_TIMEOUT_HOURS_MIN, APPROVAL_TIMEOUT_HOURS_MAX, WORKSPACE_TEMPLATE_EXPR_RE, SLEEP_UNTIL_REPLACEMENT, WORKFLOW_WORKSPACE_TTL_MAX_HOURS_DEFAULT, WORKFLOW_CAPS_DEFAULT, WORKFLOW_STEP_DEFAULT_TIMEOUT_SECONDS, WORKFLOW_AGENT_DEFAULT_TIMEOUT_SECONDS, WORKFLOW_JOB_DEFAULT_TIMEOUT_SECONDS, WORKFLOW_FOREACH_DEFAULT_CONCURRENCY, WORKFLOW_FOREACH_DEFAULT_MAX_ITEMS, WORKFLOW_LOOP_DEFAULT_MAX_ITERATIONS, WORKFLOW_SUSPEND_DEFAULT_TIMEOUT_HOURS2, WORKFLOW_SIGNAL_DEFAULT_SOURCES, clone, CONNECTION_ID_HEX_RE, WORKFLOW_JOB_MAX_WORKTREE_ARMS, workspaceOf, mountsWorkspace, isJobTier, jobToolsOf, schemaIsArray, isHitlNode, isSingleStep, singleId, armId, TEMPLATE_STEP_REF, EDITABLE_PATH_RE, PREDICATE_OPS, isPredicateScalar, GRAPH_HASH_PREFIX, WorkflowPlanError, isArmStep, armStepId, armStepKind, joinIdOf, containerIdOf, PATH_PLACEHOLDER, MISSING, stepIdOf, cmp, eq, ne, gt, gte, lt, lte, inSet, notIn, exists, notExists, truthy, falsy, and, or, not, CONTINUED_FAILURE_TAG, CONTINUED_FAILURE_DEFAULT_CODE, CONTINUED_FAILURE_OUTPUT_SCHEMA, CONTINUED_FAILURE_LEAF_PATHS, isHitlNode2, nodeIdOf, GOAL_JUDGE_STEP_ID, NON_LEAF_KINDS, CONDITIONAL_JOIN_ID, branchArmId, canonical, sortKeys, JOIN, entryOfJoin, FORCE_CANCEL_STALE_MS, TERMINAL, WORKFLOW_INLINE_RUN_TAG, RUN_ERROR_ISSUES_MAX, IN_FLIGHT, n, SUSPENDED_FOR_DIMENSIONS, STEP_ERROR_DETAIL_KEYS, STEP_ERROR_DETAIL_MAX_BYTES, DETAIL_MAX_DEPTH, DETAIL_MAX_ITEMS, MAX_HOLIDAYS, MAX_WALK_DAYS, HHMM, YMD, MS_PER_MIN, MS_PER_DAY, MON_FRI, supportedTz, fmtCache, WEEKDAYS, JSON_PATCH_OPS, JSON_PATCH_MAX_OPS, JSON_PATCH_MAX_VALUE_BYTES, JSON_PATCH_MAX_TOTAL_BYTES, SEGMENT_RE, WORKFLOW_SCHEDULE_TYPES, WORKFLOW_SCHEDULE_SHAPE_ISSUE, WORKFLOW_SCHEDULE_SHAPES_HINT, WORKFLOW_SCHEDULE_RUN_AS, isObject, WORKFLOW_ENV_OVERLAY_MAX_KEYS, WORKFLOW_ENV_OVERLAY_MAX_VALUE_BYTES, WORKFLOW_ENV_TEMPLATE_SECRET_KEY_RE, isEnvRef, looksLikeEmbeddedJson, ZERO, isRecord3;
19123
+ var __defProp8, __name8, WorkflowTemplateError, TEMPLATE_PLACEHOLDER, TEMPLATE_NAMESPACES, MAP_DESCRIPTOR_KEYS, MAP_MEMBER_MALFORMED_CODE, fromInit, fromStep, value, template, fromRequest, rows, fromKnowledge, SideEffectsSchema, JobResourcesSchema, WORKFLOW_MODEL_TEMPLATE_ROOT, WORKFLOW_MODEL_TEMPLATE_RE, PATH_SEGMENT_RE, APPROVER_SPEC_MAX_USERS, ESCALATION_MAX_HOPS, TemplateBindingSchema, ApproverSpecSchema, FourEyesSchema, EscalationHopSchema, TerminalOutcomeSchema, ApprovalOnTimeoutSchema, APPROVER_SPEC_SHAPES, APPROVER_WRITTEN_MAX, USER_ID_SHAPED_RE, BINDING_ROOTS, APPROVAL_REMIND_AFTER_HOURS_MIN, APPROVAL_REMIND_AFTER_HOURS_MAX, APPROVAL_TIMEOUT_HOURS_MIN, APPROVAL_TIMEOUT_HOURS_MAX, WORKSPACE_TEMPLATE_EXPR_RE, SLEEP_UNTIL_REPLACEMENT, WORKFLOW_WORKSPACE_TTL_MAX_HOURS_DEFAULT, WORKFLOW_CAPS_DEFAULT, WORKFLOW_STEP_DEFAULT_TIMEOUT_SECONDS, WORKFLOW_AGENT_DEFAULT_TIMEOUT_SECONDS, WORKFLOW_JOB_DEFAULT_TIMEOUT_SECONDS, WORKFLOW_FOREACH_DEFAULT_CONCURRENCY, WORKFLOW_FOREACH_DEFAULT_MAX_ITEMS, WORKFLOW_LOOP_DEFAULT_MAX_ITERATIONS, WORKFLOW_SUSPEND_DEFAULT_TIMEOUT_HOURS2, WORKFLOW_SIGNAL_DEFAULT_SOURCES, clone, CONNECTION_ID_HEX_RE, WORKFLOW_JOB_MAX_WORKTREE_ARMS, workspaceOf, mountsWorkspace, isJobTier, jobToolsOf, schemaIsArray, isHitlNode, isSingleStep, singleId, armId, TEMPLATE_STEP_REF, EDITABLE_PATH_RE, PREDICATE_OPS, isPredicateScalar, GRAPH_HASH_PREFIX, WorkflowPlanError, isArmStep, armStepId, armStepKind, joinIdOf, containerIdOf, PATH_PLACEHOLDER, MISSING, stepIdOf, cmp, eq, ne, gt, gte, lt, lte, inSet, notIn, exists, notExists, truthy, falsy, and, or, not, CONTINUED_FAILURE_TAG, CONTINUED_FAILURE_DEFAULT_CODE, CONTINUED_FAILURE_OUTPUT_SCHEMA, CONTINUED_FAILURE_LEAF_PATHS, isHitlNode2, nodeIdOf, GOAL_JUDGE_STEP_ID, NON_LEAF_KINDS, CONDITIONAL_JOIN_ID, branchArmId, canonical, sortKeys, JOIN, entryOfJoin, FORCE_CANCEL_STALE_MS, TERMINAL, WORKFLOW_INLINE_RUN_TAG, RUN_ERROR_ISSUES_MAX, IN_FLIGHT, n, SUSPENDED_FOR_DIMENSIONS, STEP_ERROR_DETAIL_KEYS, STEP_ERROR_DETAIL_MAX_BYTES, DETAIL_MAX_DEPTH, DETAIL_MAX_ITEMS, MAX_HOLIDAYS, MAX_WALK_DAYS, HHMM, YMD, MS_PER_MIN, MS_PER_DAY, MON_FRI, supportedTz, fmtCache, WEEKDAYS, JSON_PATCH_OPS, JSON_PATCH_MAX_OPS, JSON_PATCH_MAX_VALUE_BYTES, JSON_PATCH_MAX_TOTAL_BYTES, SEGMENT_RE, WORKFLOW_SCHEDULE_TYPES, WORKFLOW_SCHEDULE_SHAPE_ISSUE, WORKFLOW_SCHEDULE_SHAPES_HINT, WORKFLOW_SCHEDULE_RUN_AS, isObject, WORKFLOW_ENV_OVERLAY_MAX_KEYS, WORKFLOW_ENV_OVERLAY_MAX_VALUE_BYTES, WORKFLOW_ENV_TEMPLATE_SECRET_KEY_RE, isEnvRef, looksLikeEmbeddedJson, ZERO, isRecord4;
18286
19124
  var init_dist2 = __esm({
18287
19125
  "../workflow-graph/dist/index.mjs"() {
18288
19126
  "use strict";
@@ -18806,8 +19644,8 @@ var init_dist2 = __esm({
18806
19644
  CONDITIONAL_JOIN_ID = /^conditional@\d+\.join$/;
18807
19645
  __name(isConditionalJoinId, "isConditionalJoinId");
18808
19646
  __name8(isConditionalJoinId, "isConditionalJoinId");
18809
- __name(isPlainObject2, "isPlainObject");
18810
- __name8(isPlainObject2, "isPlainObject");
19647
+ __name(isPlainObject3, "isPlainObject");
19648
+ __name8(isPlainObject3, "isPlainObject");
18811
19649
  __name(leafValue, "leafValue");
18812
19650
  __name8(leafValue, "leafValue");
18813
19651
  __name(runOutputLeaves, "runOutputLeaves");
@@ -19097,7 +19935,7 @@ var init_dist2 = __esm({
19097
19935
  __name8(ofEntry, "ofEntry");
19098
19936
  __name(estimateGraph, "estimateGraph");
19099
19937
  __name8(estimateGraph, "estimateGraph");
19100
- isRecord3 = /* @__PURE__ */ __name8((v) => !!v && typeof v === "object" && !Array.isArray(v), "isRecord");
19938
+ isRecord4 = /* @__PURE__ */ __name8((v) => !!v && typeof v === "object" && !Array.isArray(v), "isRecord");
19101
19939
  __name(singleStepsOf, "singleStepsOf");
19102
19940
  __name8(singleStepsOf, "singleStepsOf");
19103
19941
  __name(entriesOf, "entriesOf");
@@ -19239,6 +20077,10 @@ function createWorkflow(cfg) {
19239
20077
  const n2 = cfg.backfillOnEnable.maxOccurrences;
19240
20078
  if (!Number.isInteger(n2) || n2 < 1 || n2 > 200) throw new LuaWorkflowBuildError("invalid-envelope", "backfillOnEnable.maxOccurrences must be an integer in 1..200 (backfill-max-occurrences-out-of-range; the org maxBatchItems twin is checked at publish/R56)");
19241
20079
  }
20080
+ if (cfg.concurrencyKey !== void 0) {
20081
+ if (cfg.concurrencyKey !== "correlationKey") throw new LuaWorkflowBuildError("invalid-envelope", "concurrencyKey must be 'correlationKey'");
20082
+ if (cfg.concurrencyPolicy !== "forbid") throw new LuaWorkflowBuildError("concurrency-key-requires-forbid", `workflow "${cfg.name}": concurrencyKey requires concurrencyPolicy:'forbid'`, "set concurrencyPolicy:'forbid' or remove concurrencyKey");
20083
+ }
19242
20084
  if (cfg.health !== void 0) {
19243
20085
  const issues = validateScheduleHealth(cfg.health, {
19244
20086
  target: "workflow",
@@ -20181,6 +21023,7 @@ var init_types = __esm({
20181
21023
  PrimitiveKind2["VOICE"] = "voice";
20182
21024
  PrimitiveKind2["WORKFLOW"] = "workflow";
20183
21025
  PrimitiveKind2["WEB_APP"] = "web-app";
21026
+ PrimitiveKind2["BROWSER"] = "browser";
20184
21027
  PrimitiveKind2["DECISION"] = "decision";
20185
21028
  return PrimitiveKind2;
20186
21029
  })({});
@@ -21012,6 +21855,9 @@ var init_semver = __esm({
21012
21855
  });
21013
21856
 
21014
21857
  // src/primitives/base.handler.ts
21858
+ function nameFlagDeleteCommand(deleteCommand, displayName, name) {
21859
+ return `${deleteCommand} --${displayName.toLowerCase().replace(/\s+/g, "-")}-name ${name}`;
21860
+ }
21015
21861
  var DEFAULT_VERSION, BaseVersionedHandler;
21016
21862
  var init_base_handler = __esm({
21017
21863
  "src/primitives/base.handler.ts"() {
@@ -21024,10 +21870,14 @@ var init_base_handler = __esm({
21024
21870
  init_auth_error();
21025
21871
  init_cli_error();
21026
21872
  DEFAULT_VERSION = SKILL_DEFAULTS.VERSION;
21873
+ __name(nameFlagDeleteCommand, "nameFlagDeleteCommand");
21027
21874
  BaseVersionedHandler = class {
21028
21875
  static {
21029
21876
  __name(this, "BaseVersionedHandler");
21030
21877
  }
21878
+ serverDeleteCommand(name) {
21879
+ return nameFlagDeleteCommand(this.deleteCommand, this.displayName, name);
21880
+ }
21031
21881
  /**
21032
21882
  * Strip a YAML item to only the canonical fields: name, version, [idField].
21033
21883
  * Override if your YAML type has additional fields.
@@ -21148,7 +21998,7 @@ var init_base_handler = __esm({
21148
21998
  const { [idField]: goneId, ...rest } = stale;
21149
21999
  yamlItems[idx] = rest;
21150
22000
  yamlUpdated = true;
21151
- const msg = `\u2139\uFE0F ${this.displayName} "${stale.name}" (${goneId}) no longer exists on the server \u2014 re-registering it`;
22001
+ const msg = this.staleRowMessage(stale, String(goneId), serverData.serverItems);
21152
22002
  messages.push(msg);
21153
22003
  console.log(msg);
21154
22004
  }
@@ -21165,7 +22015,6 @@ var init_base_handler = __esm({
21165
22015
  }));
21166
22016
  yamlItems.push(...stubs);
21167
22017
  yamlUpdated = true;
21168
- const flagName = `--${this.displayName.toLowerCase().replace(/\s+/g, "-")}-name`;
21169
22018
  console.log(`
21170
22019
  \u26A0\uFE0F Found ${this.displayNamePlural} on server not in your local code:`);
21171
22020
  for (const item of orphans) {
@@ -21174,7 +22023,7 @@ var init_base_handler = __esm({
21174
22023
  console.log(msg);
21175
22024
  }
21176
22025
  console.log(` Added to lua.skill.yaml as server-only entries.`);
21177
- console.log(` To remove from server: ${this.deleteCommand} ${flagName} <name>`);
22026
+ console.log(` To remove from server: ${this.serverDeleteCommand("<name>")}`);
21178
22027
  console.log(` To restore source from backup: lua sync --accept
21179
22028
  `);
21180
22029
  orphanedCount = orphans.length;
@@ -21403,6 +22252,9 @@ var init_base_handler = __esm({
21403
22252
  staleYamlRows(_yamlItems, _serverItems, _manifestNames) {
21404
22253
  return [];
21405
22254
  }
22255
+ staleRowMessage(stale, goneId, _serverItems) {
22256
+ return `\u2139\uFE0F ${this.displayName} "${stale.name}" (${goneId}) no longer exists on the server \u2014 re-registering it`;
22257
+ }
21406
22258
  buildMaps(serverItems, yamlItems) {
21407
22259
  const yamlById = /* @__PURE__ */ new Map();
21408
22260
  const yamlByName = /* @__PURE__ */ new Map();
@@ -27824,6 +28676,7 @@ var LuaAgent = class {
27824
28676
  batching;
27825
28677
  governance;
27826
28678
  browser;
28679
+ browsers;
27827
28680
  /**
27828
28681
  * Creates a new LuaAgent instance.
27829
28682
  *
@@ -27870,6 +28723,7 @@ var LuaAgent = class {
27870
28723
  this.batching = config.batching;
27871
28724
  this.governance = config.governance;
27872
28725
  this.browser = config.browser;
28726
+ this.browsers = config.browsers;
27873
28727
  }
27874
28728
  getName() {
27875
28729
  return this.name;
@@ -27927,6 +28781,9 @@ var LuaAgent = class {
27927
28781
  getVoices() {
27928
28782
  return this.voices;
27929
28783
  }
28784
+ getBrowsers() {
28785
+ return this.browsers;
28786
+ }
27930
28787
  getDecisions() {
27931
28788
  return this.decisions;
27932
28789
  }
@@ -28045,6 +28902,51 @@ function defineVoice(config) {
28045
28902
  }
28046
28903
  __name(defineVoice, "defineVoice");
28047
28904
 
28905
+ // src/types/browser.ts
28906
+ init_dist();
28907
+ var LuaBrowser = class {
28908
+ static {
28909
+ __name(this, "LuaBrowser");
28910
+ }
28911
+ name;
28912
+ description;
28913
+ engine;
28914
+ fallback;
28915
+ proxyCountry;
28916
+ allowedDomains;
28917
+ confirmActions;
28918
+ maxSessionMinutes;
28919
+ idleTimeoutSeconds;
28920
+ maxConcurrentSessions;
28921
+ screenshots;
28922
+ logContent;
28923
+ persist;
28924
+ credentials;
28925
+ constructor(config) {
28926
+ if (!config.name || !BROWSER_PROFILE_NAME_PATTERN.test(config.name)) {
28927
+ throw new Error("LuaBrowser requires a `name` that starts with a letter or digit and uses only letters, digits, underscores or hyphens (max 64).");
28928
+ }
28929
+ this.name = config.name;
28930
+ this.description = config.description;
28931
+ this.engine = config.engine;
28932
+ this.fallback = config.fallback;
28933
+ this.proxyCountry = config.proxyCountry;
28934
+ this.allowedDomains = config.allowedDomains;
28935
+ this.confirmActions = config.confirmActions;
28936
+ this.maxSessionMinutes = config.maxSessionMinutes;
28937
+ this.idleTimeoutSeconds = config.idleTimeoutSeconds;
28938
+ this.maxConcurrentSessions = config.maxConcurrentSessions;
28939
+ this.screenshots = config.screenshots;
28940
+ this.logContent = config.logContent;
28941
+ this.persist = config.persist;
28942
+ this.credentials = config.credentials;
28943
+ }
28944
+ };
28945
+ function defineBrowser(config) {
28946
+ return new LuaBrowser(config);
28947
+ }
28948
+ __name(defineBrowser, "defineBrowser");
28949
+
28048
28950
  // src/types/decision.ts
28049
28951
  init_dist();
28050
28952
  init_decisions_api();
@@ -28228,6 +29130,26 @@ function createOfflineThreadsApi() {
28228
29130
  }
28229
29131
  __name(createOfflineThreadsApi, "createOfflineThreadsApi");
28230
29132
 
29133
+ // src/api/browser.offline.ts
29134
+ init_dist();
29135
+ function unavailable2(member) {
29136
+ return browserError("BROWSER_UNAVAILABLE", `Browser.${member} only runs on the Lua platform (deployed or sandbox agents with \`browser\` on), not in lua test / lua dev`);
29137
+ }
29138
+ __name(unavailable2, "unavailable");
29139
+ function createOfflineBrowserApi() {
29140
+ const members = Object.fromEntries([
29141
+ ...BROWSER_COMMAND_NAMES,
29142
+ BROWSER_EXECUTE_METHOD
29143
+ ].map((name) => [
29144
+ name,
29145
+ async () => {
29146
+ throw unavailable2(name);
29147
+ }
29148
+ ]));
29149
+ return members;
29150
+ }
29151
+ __name(createOfflineBrowserApi, "createOfflineBrowserApi");
29152
+
28231
29153
  // src/api/progress.api.service.ts
28232
29154
  function createOfflineProgressApi() {
28233
29155
  return Object.freeze({
@@ -29098,6 +30020,7 @@ var Secrets = {
29098
30020
  };
29099
30021
  var Metrics = offlineMetrics;
29100
30022
  var Threads = createOfflineThreadsApi();
30023
+ var Browser = createOfflineBrowserApi();
29101
30024
  var Progress = createOfflineProgressApi();
29102
30025
  function defineDevice(config) {
29103
30026
  return new LuaDevice(config);
@@ -29117,6 +30040,7 @@ export {
29117
30040
  BasketInstance,
29118
30041
  BasketStatus,
29119
30042
  Baskets,
30043
+ Browser,
29120
30044
  CDN,
29121
30045
  CHANNEL_SEND_CHANNELS,
29122
30046
  Channels,
@@ -29129,6 +30053,7 @@ export {
29129
30053
  Jobs,
29130
30054
  Lua,
29131
30055
  LuaAgent,
30056
+ LuaBrowser,
29132
30057
  LuaDecision,
29133
30058
  LuaDevice,
29134
30059
  LuaDeviceTrigger,
@@ -29162,11 +30087,14 @@ export {
29162
30087
  UserDataInstance,
29163
30088
  Voice,
29164
30089
  WEB_APP_NAME_PATTERN,
30090
+ WORKFLOW_DEFAULT_MAX_DURATION_SECONDS,
30091
+ WORKFLOW_HITL_MAX_DURATION_SECONDS,
29165
30092
  Workflows,
29166
30093
  and2 as and,
29167
30094
  checkAsUserRequiresUser,
29168
30095
  createStep,
29169
30096
  createWorkflow,
30097
+ defineBrowser,
29170
30098
  defineDecision,
29171
30099
  defineDevice,
29172
30100
  defineDeviceTrigger,