lua-cli 3.36.0 → 3.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -218,19 +218,6 @@ declare interface AgentInvocationInput {
218
218
  };
219
219
  }
220
220
 
221
- /**
222
- * LUA-724 (PR 7) — the billed turn's pricing inputs, exactly as chat's settlement event carries
223
- * them (`chat.service.trackLlmInferenceUsage`): the model that ACTUALLY served the turn (the
224
- * resolver's code, not the caller's pin), the de-paged `contextInputTokens` (largest single
225
- * step's prompt — never the whole-turn sum), the tool-call COUNT, and whether the turn ran on
226
- * the org's own key. `chargedCredits` echoes the gate's answer (true ⇒ the legacy pool deducted
227
- * in real time; false ⇒ seat org / free turn — settlement meters it).
228
- *
229
- * Stamped by the serving pod ONLY on internal-auth turns that carry a billing `operationId`
230
- * (the workflow agent-step loopback), as the enumerable `luaMeter` top-level field of the
231
- * generate envelope — never on a Bearer turn, so the public wire is byte-identical. The
232
- * workflow executor prices the step's `run.budget.spent` from it with `priceModelCall`.
233
- */
234
221
  declare interface AgentInvocationMeter {
235
222
  model?: string;
236
223
  contextInputTokens?: number;
@@ -1457,6 +1444,18 @@ export declare type ChatMessage = TextMessage | ImageMessage | FileMessage;
1457
1444
  */
1458
1445
  export declare type ContainerArm = StepRef | [LuaMapConfig, StepRef];
1459
1446
 
1447
+ /** Teams: resource-specific permissions are granted per chat by whoever adds the app; file access is a tenant-wide grant. */
1448
+ declare interface ConversationAccess {
1449
+ /** False when only messages that mention the agent are delivered. */
1450
+ canReadAllMessages: boolean;
1451
+ /** False when people are known only once they speak. */
1452
+ canReadMembers: boolean;
1453
+ /** False when files attached in the conversation cannot be opened. */
1454
+ canReadFiles: boolean;
1455
+ /** Provider permission names the conversation has not granted, e.g. `ChatMessage.Read.Chat`. */
1456
+ missing: string[];
1457
+ }
1458
+
1460
1459
  /**
1461
1460
  * Who is in the conversation this turn runs in.
1462
1461
  */
@@ -1501,6 +1500,11 @@ export declare interface ConversationRef {
1501
1500
  agentId: string;
1502
1501
  name?: string;
1503
1502
  }>;
1503
+ /**
1504
+ * What the channel lets the agent do in this conversation. Absent when the
1505
+ * platform could not determine it (a shared bot outside Lua's tenant).
1506
+ */
1507
+ access?: ConversationAccess;
1504
1508
  }
1505
1509
 
1506
1510
  /**
@@ -7740,6 +7744,14 @@ declare interface WorkflowRun {
7740
7744
  * `lua workflows status` prints the roll-up when it is there and says nothing when it is not.
7741
7745
  */
7742
7746
  byModel?: WorkflowRunModelUsageRow[];
7747
+ /**
7748
+ * [WJB-B5] (BAC-671) — the run's token components, summed by the server from the usage rows its charges
7749
+ * were written from (per-call `workflow:job` rows on the Job tier, `llm:inference` rows off it).
7750
+ * `inputTokens` is the UNCACHED prompt; the two cache figures are read and write. Present only once the
7751
+ * server projects it (a metered run on a server that has this change) — the CLI prints nothing otherwise,
7752
+ * and never adds the members together: cache reads are a SUBSET of input on OpenAI-compatible providers.
7753
+ */
7754
+ tokens?: WorkflowRunTokensDto;
7743
7755
  };
7744
7756
  /**
7745
7757
  * R4: the run's caps and settled spend. `maxCredits` and `remaining` are both absent on an uncapped run (`0` = unset);
@@ -7757,6 +7769,12 @@ declare interface WorkflowRun {
7757
7769
  };
7758
7770
  reserved?: number;
7759
7771
  remaining?: number;
7772
+ /**
7773
+ * [WJB-B5] (BAC-677): the run went PAST its cap and finished anyway — the crossing step was terminal for
7774
+ * the run, so it completed rather than parking for a raise nobody could act on. `true` or ABSENT on the
7775
+ * wire, never `false`; the CLI prints it and never derives it from `spent > maxCredits`.
7776
+ */
7777
+ exceeded?: boolean;
7760
7778
  };
7761
7779
  createdAt: string;
7762
7780
  startedAt?: string;
@@ -7787,6 +7805,18 @@ declare interface WorkflowRunModelUsageRow {
7787
7805
  /** §02 §2.4 run statuses (one union across every section). */
7788
7806
  declare type WorkflowRunStatus = 'queued' | 'running' | 'cancellation_requested' | 'gated' | 'suspended' | 'waiting' | 'completed' | 'failed' | 'cancelled' | 'abandoned' | 'timed_out';
7789
7807
 
7808
+ /**
7809
+ * [WJB-B5] (BAC-671) — the four token figures the server sums per run and per step (`WorkflowRunTokens` in
7810
+ * `@lua/shared-types`). Every member optional: the CLI is a reader of whatever the server sends, and a figure
7811
+ * a server does not project must print as nothing rather than as a zero the run never reported.
7812
+ */
7813
+ declare interface WorkflowRunTokensDto {
7814
+ inputTokens?: number;
7815
+ cacheReadTokens?: number;
7816
+ cacheCreationTokens?: number;
7817
+ outputTokens?: number;
7818
+ }
7819
+
7790
7820
  export declare type WorkflowRunTrigger = 'chat' | 'sdk' | 'api' | 'schedule' | 'webhook' | 'template' | 'workflow' | 'device';
7791
7821
 
7792
7822
  /**
@@ -18,6 +18,12 @@ var __export = (target, all) => {
18
18
  import { z } from "zod";
19
19
  import { z as z2 } from "zod";
20
20
  import { z as z3 } from "zod";
21
+ function isChannelConversationChannel(channel) {
22
+ return !!channel && CHANNEL_CONVERSATION_CHANNELS.includes(channel);
23
+ }
24
+ function isChannelConversationThread(threadId, channel) {
25
+ return !!threadId && isChannelConversationChannel(channel);
26
+ }
21
27
  function isPersonaTextObject(value3) {
22
28
  if (value3 === null || typeof value3 !== "object" || Array.isArray(value3)) return false;
23
29
  const obj = value3;
@@ -580,6 +586,101 @@ function buildDefaultPersona(agentName) {
580
586
  function buildPersonalSpaceStartingPersona(agentName) {
581
587
  return PERSONAL_SPACE_STARTING_PERSONA.replace(new RegExp(AGENT_NAME_TOKEN.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g"), () => agentName || "Your assistant");
582
588
  }
589
+ function maxDrainsForTier(tier) {
590
+ return tier === "enterprise" ? LOG_DRAIN_MAX_PER_ORG_ENTERPRISE : LOG_DRAIN_MAX_PER_ORG;
591
+ }
592
+ function resolvePresetEndpoint(type, site) {
593
+ const template3 = LOG_DRAIN_ENDPOINT_TEMPLATES[type];
594
+ if (!template3 || !site) return void 0;
595
+ return template3.replace("{site}", site);
596
+ }
597
+ function nextLogDrainQuotaResetAt(now) {
598
+ return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() + 1)).toISOString();
599
+ }
600
+ function logDrainQuotaWindowExpired(usage, now) {
601
+ const resetsAt = Date.parse(usage?.resetsAt ?? "");
602
+ if (!Number.isFinite(resetsAt)) return true;
603
+ return now.getTime() >= resetsAt;
604
+ }
605
+ function logDrainQuotaRatio(usage, now) {
606
+ if (!usage) return 0;
607
+ if (now && logDrainQuotaWindowExpired(usage, now)) return 0;
608
+ const dimension = /* @__PURE__ */ __name2((used, limit) => {
609
+ if (!Number.isFinite(limit) || limit <= 0) return 0;
610
+ if (!Number.isFinite(used) || used <= 0) return 0;
611
+ return used / limit;
612
+ }, "dimension");
613
+ return Math.max(dimension(usage.usedEvents, usage.eventsPerDay), dimension(usage.usedBytes, usage.bytesPerDay));
614
+ }
615
+ function logDrainQuotaDegradationForRatio(ratio) {
616
+ if (!Number.isFinite(ratio)) return "none";
617
+ if (ratio >= LOG_DRAIN_QUOTA_PAUSE_RATIO) return "paused";
618
+ if (ratio >= LOG_DRAIN_QUOTA_DROP_INFO_RATIO) return "info_dropped";
619
+ if (ratio >= LOG_DRAIN_QUOTA_DROP_DEBUG_RATIO) return "debug_dropped";
620
+ return "none";
621
+ }
622
+ function logDrainQuotaDegradation(usage, now) {
623
+ return logDrainQuotaDegradationForRatio(logDrainQuotaRatio(usage, now));
624
+ }
625
+ function logDrainQuotaWarned(usage, now) {
626
+ return logDrainQuotaRatio(usage, now) >= LOG_DRAIN_QUOTA_WARN_RATIO;
627
+ }
628
+ function logDrainQuotaDroppedSeverities(degradation) {
629
+ switch (degradation) {
630
+ case "debug_dropped":
631
+ return [
632
+ 5
633
+ ];
634
+ case "info_dropped":
635
+ return [
636
+ 5,
637
+ 9
638
+ ];
639
+ default:
640
+ return [];
641
+ }
642
+ }
643
+ function encodeLogCursor(c) {
644
+ return Buffer.from(JSON.stringify({
645
+ t: c.t,
646
+ id: c.id
647
+ }), "utf8").toString("base64url");
648
+ }
649
+ function decodeLogCursor(raw) {
650
+ if (typeof raw !== "string") return null;
651
+ const trimmed = raw.trim();
652
+ if (!trimmed || trimmed.length > LOG_CURSOR_MAX_LENGTH) return null;
653
+ let parsed;
654
+ try {
655
+ parsed = JSON.parse(Buffer.from(trimmed, "base64url").toString("utf8"));
656
+ } catch {
657
+ return null;
658
+ }
659
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return null;
660
+ const { t, id } = parsed;
661
+ if (typeof t !== "number" || !Number.isSafeInteger(t) || t < 0) return null;
662
+ if (typeof id !== "string" || !id || id.length > LOG_CURSOR_MAX_ID_LENGTH) return null;
663
+ return {
664
+ t,
665
+ id
666
+ };
667
+ }
668
+ function parseLogTimeBound(raw, now = /* @__PURE__ */ new Date()) {
669
+ if (typeof raw !== "string") return null;
670
+ const value3 = raw.trim();
671
+ if (!value3) return null;
672
+ const relative = LOG_RELATIVE_TIME_PATTERN.exec(value3);
673
+ if (relative) {
674
+ const amount = Number(relative[1]);
675
+ const unitMs = RELATIVE_UNIT_MS[relative[2]];
676
+ if (!Number.isFinite(amount) || unitMs === void 0) return null;
677
+ const at2 = now.getTime() - amount * unitMs;
678
+ return Number.isFinite(at2) ? new Date(at2) : null;
679
+ }
680
+ if (!LOG_ISO_TIME_PATTERN.test(value3)) return null;
681
+ const at = Date.parse(value3);
682
+ return Number.isNaN(at) ? null : new Date(at);
683
+ }
583
684
  function isRecord(value3) {
584
685
  return typeof value3 === "object" && value3 !== null;
585
686
  }
@@ -944,6 +1045,9 @@ function workflowOccurrenceId(lineageId, stepId) {
944
1045
  function workflowOrgSlotKey(orgId, kind) {
945
1046
  return `wf:org:${orgId}:${kind}`;
946
1047
  }
1048
+ function workflowJobModelSourceLabel(source) {
1049
+ return WORKFLOW_JOB_MODEL_SOURCE_LABELS[source];
1050
+ }
947
1051
  function scheduledTimeKey(scheduledTime) {
948
1052
  return scheduledTime.replace(/[^0-9TZ]/g, "");
949
1053
  }
@@ -1254,12 +1358,39 @@ function effectiveAgentFeatures(base, override, rule) {
1254
1358
  if (rule === "wholesale") return override || base || void 0;
1255
1359
  return effectiveAgentFeatureRows(base, override).rows;
1256
1360
  }
1257
- var __defProp2, __name2, CHANNEL_SEND_CHANNELS, 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, BROWSER_COMMANDS, BROWSER_COMMAND_NAMES, 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, 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_SUSPEND_KINDS, WORKFLOW_RUN_NOTIFICATION_SUSPENDED_KINDS, WORKFLOW_SIGNAL_PAYLOAD_MAX_BYTES, WORKFLOW_RESOLVE_OUTPUT_MAX_BYTES, WORKFLOW_GOAL_JUDGE_SELF, 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, 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;
1361
+ var __defProp2, __name2, PLUMBING_THREAD_CHANNELS, CHANNEL_CONVERSATION_CHANNELS, HIDDEN_THREAD_CHANNELS, CHANNEL_SEND_CHANNELS, 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, BROWSER_COMMANDS, BROWSER_COMMAND_NAMES, 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, LOG_DRAIN_SOURCES, LOG_DRAIN_MAX_PER_ORG, LOG_DRAIN_MAX_PER_ORG_ENTERPRISE, LOG_DRAIN_ENDPOINT_TEMPLATES, 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_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_JOB_MODEL_SOURCE_LABELS, WORKFLOW_SUSPEND_KINDS, WORKFLOW_RUN_NOTIFICATION_SUSPENDED_KINDS, WORKFLOW_SIGNAL_PAYLOAD_MAX_BYTES, WORKFLOW_RESOLVE_OUTPUT_MAX_BYTES, WORKFLOW_GOAL_JUDGE_SELF, 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, 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;
1258
1362
  var init_dist = __esm({
1259
1363
  "../shared-types/dist/index.mjs"() {
1260
1364
  "use strict";
1261
1365
  __defProp2 = Object.defineProperty;
1262
1366
  __name2 = /* @__PURE__ */ __name((target, value3) => __defProp2(target, "name", { value: value3, configurable: true }), "__name");
1367
+ PLUMBING_THREAD_CHANNELS = [
1368
+ "trigger",
1369
+ "template-install",
1370
+ "template-uninstall"
1371
+ ];
1372
+ CHANNEL_CONVERSATION_CHANNELS = [
1373
+ "whatsapp",
1374
+ "slack",
1375
+ "teams",
1376
+ "front",
1377
+ "email",
1378
+ "messagebird",
1379
+ "sms",
1380
+ "mms",
1381
+ "rcs",
1382
+ "instagram",
1383
+ "facebook",
1384
+ "imessage"
1385
+ ];
1386
+ HIDDEN_THREAD_CHANNELS = [
1387
+ ...PLUMBING_THREAD_CHANNELS,
1388
+ ...CHANNEL_CONVERSATION_CHANNELS
1389
+ ];
1390
+ __name(isChannelConversationChannel, "isChannelConversationChannel");
1391
+ __name2(isChannelConversationChannel, "isChannelConversationChannel");
1392
+ __name(isChannelConversationThread, "isChannelConversationThread");
1393
+ __name2(isChannelConversationThread, "isChannelConversationThread");
1263
1394
  __name(isPersonaTextObject, "isPersonaTextObject");
1264
1395
  __name2(isPersonaTextObject, "isPersonaTextObject");
1265
1396
  __name(flattenPersonaText, "flattenPersonaText");
@@ -1879,6 +2010,93 @@ This text is who you are for this person. As you learn them, their name, their w
1879
2010
  `;
1880
2011
  __name(buildPersonalSpaceStartingPersona, "buildPersonalSpaceStartingPersona");
1881
2012
  __name2(buildPersonalSpaceStartingPersona, "buildPersonalSpaceStartingPersona");
2013
+ AGENT_LOG_SOURCES = [
2014
+ "skill",
2015
+ "job",
2016
+ "webhook",
2017
+ "trigger",
2018
+ "preprocessor",
2019
+ "postprocessor",
2020
+ "user_message",
2021
+ "agent_response",
2022
+ "agent_error",
2023
+ "runtime",
2024
+ "mcp",
2025
+ "rag",
2026
+ "device",
2027
+ "device-trigger",
2028
+ "model-resolver",
2029
+ "workflow-step",
2030
+ "workflow-script",
2031
+ "workflow"
2032
+ ];
2033
+ LOG_DRAIN_SOURCES = [
2034
+ ...AGENT_LOG_SOURCES,
2035
+ "execution",
2036
+ // ── phase 2 ──
2037
+ "delivery",
2038
+ "trigger-execution",
2039
+ "job-execution",
2040
+ "workflow-run",
2041
+ "workflow-audit"
2042
+ ];
2043
+ LOG_DRAIN_MAX_PER_ORG = 5;
2044
+ LOG_DRAIN_MAX_PER_ORG_ENTERPRISE = 10;
2045
+ __name(maxDrainsForTier, "maxDrainsForTier");
2046
+ __name2(maxDrainsForTier, "maxDrainsForTier");
2047
+ LOG_DRAIN_ENDPOINT_TEMPLATES = {
2048
+ datadog: "https://http-intake.logs.{site}/api/v2/logs"
2049
+ };
2050
+ __name(resolvePresetEndpoint, "resolvePresetEndpoint");
2051
+ __name2(resolvePresetEndpoint, "resolvePresetEndpoint");
2052
+ LOG_DRAIN_QUOTAS = {
2053
+ team: {
2054
+ eventsPerDay: 1e6,
2055
+ bytesPerDay: 1 * 1024 ** 3
2056
+ },
2057
+ business: {
2058
+ eventsPerDay: 1e7,
2059
+ bytesPerDay: 10 * 1024 ** 3
2060
+ },
2061
+ enterprise: {
2062
+ eventsPerDay: Number.MAX_SAFE_INTEGER,
2063
+ bytesPerDay: Number.MAX_SAFE_INTEGER
2064
+ }
2065
+ };
2066
+ LOG_DRAIN_QUOTA_WARN_RATIO = 0.8;
2067
+ LOG_DRAIN_QUOTA_DROP_DEBUG_RATIO = 1;
2068
+ LOG_DRAIN_QUOTA_DROP_INFO_RATIO = 1.25;
2069
+ LOG_DRAIN_QUOTA_PAUSE_RATIO = 1.5;
2070
+ __name(nextLogDrainQuotaResetAt, "nextLogDrainQuotaResetAt");
2071
+ __name2(nextLogDrainQuotaResetAt, "nextLogDrainQuotaResetAt");
2072
+ __name(logDrainQuotaWindowExpired, "logDrainQuotaWindowExpired");
2073
+ __name2(logDrainQuotaWindowExpired, "logDrainQuotaWindowExpired");
2074
+ __name(logDrainQuotaRatio, "logDrainQuotaRatio");
2075
+ __name2(logDrainQuotaRatio, "logDrainQuotaRatio");
2076
+ __name(logDrainQuotaDegradationForRatio, "logDrainQuotaDegradationForRatio");
2077
+ __name2(logDrainQuotaDegradationForRatio, "logDrainQuotaDegradationForRatio");
2078
+ __name(logDrainQuotaDegradation, "logDrainQuotaDegradation");
2079
+ __name2(logDrainQuotaDegradation, "logDrainQuotaDegradation");
2080
+ __name(logDrainQuotaWarned, "logDrainQuotaWarned");
2081
+ __name2(logDrainQuotaWarned, "logDrainQuotaWarned");
2082
+ __name(logDrainQuotaDroppedSeverities, "logDrainQuotaDroppedSeverities");
2083
+ __name2(logDrainQuotaDroppedSeverities, "logDrainQuotaDroppedSeverities");
2084
+ LOG_CURSOR_MAX_LENGTH = 512;
2085
+ LOG_CURSOR_MAX_ID_LENGTH = 128;
2086
+ LOG_RELATIVE_TIME_PATTERN = /^(\d{1,9})([smhd])$/;
2087
+ LOG_ISO_TIME_PATTERN = /^\d{4}-\d{2}-\d{2}([Tt ]\d{2}:\d{2}(:\d{2}(\.\d{1,9})?)?([Zz]|[+-]\d{2}:?\d{2})?)?$/;
2088
+ RELATIVE_UNIT_MS = {
2089
+ s: 1e3,
2090
+ m: 6e4,
2091
+ h: 36e5,
2092
+ d: 864e5
2093
+ };
2094
+ __name(encodeLogCursor, "encodeLogCursor");
2095
+ __name2(encodeLogCursor, "encodeLogCursor");
2096
+ __name(decodeLogCursor, "decodeLogCursor");
2097
+ __name2(decodeLogCursor, "decodeLogCursor");
2098
+ __name(parseLogTimeBound, "parseLogTimeBound");
2099
+ __name2(parseLogTimeBound, "parseLogTimeBound");
1882
2100
  CORE_DRAINING_CODE = "CORE_DRAINING";
1883
2101
  CORE_DRAINING_DEFAULT_RETRY_MS = 1e3;
1884
2102
  CORE_DRAINING_MAX_RETRY_MS = 5e3;
@@ -2623,6 +2841,16 @@ This text is who you are for this person. As you learn them, their name, their w
2623
2841
  __name(workflowOrgSlotKey, "workflowOrgSlotKey");
2624
2842
  __name2(workflowOrgSlotKey, "workflowOrgSlotKey");
2625
2843
  WORKFLOW_CONNECTION_KEY_RE = /^[a-z][a-z0-9_-]{0,63}$/;
2844
+ WORKFLOW_JOB_MODEL_SOURCE_LABELS = {
2845
+ stamp: "lease stamp",
2846
+ initData: "run input",
2847
+ default: "placeholder default",
2848
+ node: "node.model",
2849
+ env: "platform default",
2850
+ org: "org default"
2851
+ };
2852
+ __name(workflowJobModelSourceLabel, "workflowJobModelSourceLabel");
2853
+ __name2(workflowJobModelSourceLabel, "workflowJobModelSourceLabel");
2626
2854
  __name(scheduledTimeKey, "scheduledTimeKey");
2627
2855
  __name2(scheduledTimeKey, "scheduledTimeKey");
2628
2856
  __name(scheduledWorkflowRunIdForTime, "scheduledWorkflowRunIdForTime");
@@ -2856,7 +3084,23 @@ This text is who you are for this person. As you learn them, their name, their w
2856
3084
  * gated and nobody approved it, and conflating the two would make "who approved this run"
2857
3085
  * unanswerable for every run of either kind (§H2 "Audit").
2858
3086
  */
2859
- "workflow.run.autonomy_applied"
3087
+ "workflow.run.autonomy_applied",
3088
+ // --- run budget cap enforcement (Job-tier billing plan D4; BAC-677) ---
3089
+ /**
3090
+ * The audit twin of the `run.budget_exceeded` run event (WJB-B2a): the run overshot its
3091
+ * `budget.maxCredits` on its LAST step and completed anyway, `budget.exceeded: true`. The budget family
3092
+ * already mirrors run events here — `workflow.run.budget_parked` / `workflow.run.budget_raised` are the
3093
+ * twins of `run.budget_parked` / `run.budget_raised` — and an organisation reviewing what it was charged
3094
+ * needs the overshoot in the audit store beside the raise that preceded it, not only in the run's own
3095
+ * event stream.
3096
+ *
3097
+ * Declared with the run event rather than after it because the emitter port
3098
+ * (`WorkflowAuditPort.action`, typed `workflow.run.${string}`) does not check against this tuple: a name
3099
+ * that is NOT declared here is written to the audit store all the same and no compiler says so.
3100
+ * Declaring it is what makes the later emitter checkable. `workflow.run.budget_parked` is likewise
3101
+ * declared and not yet emitted.
3102
+ */
3103
+ "workflow.run.budget_exceeded"
2860
3104
  ];
2861
3105
  WORKFLOW_AUDIT_METADATA_MAX_BYTES = 4 * 1024;
2862
3106
  __name(isWorkflowAuditEvent, "isWorkflowAuditEvent");
@@ -6494,6 +6738,49 @@ function graphHasJobTierStep(envelopeOrGraph) {
6494
6738
  const graph = Array.isArray(envelopeOrGraph) ? envelopeOrGraph : env2.definition?.graph ?? [];
6495
6739
  return Array.isArray(graph) && graph.some(entryHasJobTier);
6496
6740
  }
6741
+ function jobTierSteps(envelopeOrGraph) {
6742
+ const out = [];
6743
+ if (!envelopeOrGraph || typeof envelopeOrGraph !== "object") return out;
6744
+ const env2 = envelopeOrGraph;
6745
+ const graph = Array.isArray(envelopeOrGraph) ? envelopeOrGraph : env2.definition?.graph ?? [];
6746
+ if (!Array.isArray(graph)) return out;
6747
+ for (const entry of graph) collectJobTierSteps(entry, out);
6748
+ return out;
6749
+ }
6750
+ function jobTierStepIds(envelopeOrGraph) {
6751
+ return jobTierSteps(envelopeOrGraph).map((s) => s.stepId);
6752
+ }
6753
+ function collectJobTierSteps(entry, out) {
6754
+ const n2 = armEntry2(entry);
6755
+ if (!n2 || typeof n2 !== "object") return;
6756
+ const node = n2;
6757
+ const ws = node.workspace;
6758
+ if (node.tier === "job" || ws !== void 0 && ws !== "inherit") {
6759
+ const stepId = typeof node.id === "string" && node.id ? node.id : "(unnamed)";
6760
+ const model = typeof node.model === "string" && node.model.trim() ? node.model.trim() : void 0;
6761
+ out.push(model === void 0 ? {
6762
+ stepId
6763
+ } : {
6764
+ stepId,
6765
+ model
6766
+ });
6767
+ }
6768
+ switch (node.type) {
6769
+ case "parallel":
6770
+ if (Array.isArray(node.steps)) for (const s of node.steps) collectJobTierSteps(s, out);
6771
+ return;
6772
+ case "conditional":
6773
+ if (Array.isArray(node.steps)) for (const s of node.steps) collectJobTierSteps(s, out);
6774
+ if (node.otherwise !== void 0) collectJobTierSteps(node.otherwise, out);
6775
+ return;
6776
+ case "foreach":
6777
+ case "loop":
6778
+ collectJobTierSteps(node.step, out);
6779
+ return;
6780
+ default:
6781
+ return;
6782
+ }
6783
+ }
6497
6784
  var __defProp4, __name4, 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, WORKSPACE_TEMPLATE_EXPR_RE, SLEEP_UNTIL_REPLACEMENT, 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_HOURS, 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, 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, isRecord2;
6498
6785
  var init_dist2 = __esm({
6499
6786
  "../workflow-graph/dist/index.mjs"() {
@@ -7298,6 +7585,12 @@ var init_dist2 = __esm({
7298
7585
  __name4(entryHasJobTier, "entryHasJobTier");
7299
7586
  __name(graphHasJobTierStep, "graphHasJobTierStep");
7300
7587
  __name4(graphHasJobTierStep, "graphHasJobTierStep");
7588
+ __name(jobTierSteps, "jobTierSteps");
7589
+ __name4(jobTierSteps, "jobTierSteps");
7590
+ __name(jobTierStepIds, "jobTierStepIds");
7591
+ __name4(jobTierStepIds, "jobTierStepIds");
7592
+ __name(collectJobTierSteps, "collectJobTierSteps");
7593
+ __name4(collectJobTierSteps, "collectJobTierSteps");
7301
7594
  }
7302
7595
  });
7303
7596
 
@@ -8256,7 +8549,6 @@ var init_constants = __esm({
8256
8549
  API: process.env.LUA_API_URL || "https://api.heylua.ai",
8257
8550
  AUTH: process.env.LUA_AUTH_URL || "https://auth.heylua.ai",
8258
8551
  CHAT: process.env.LUA_API_URL || "https://api.heylua.ai",
8259
- WEBHOOK: process.env.LUA_WEBHOOK_URL || "https://webhook.heylua.ai",
8260
8552
  CDN: "https://cdn.heylua.ai"
8261
8553
  };
8262
8554
  CREDENTIALS_FILE = join(CLI_CONFIG_DIR, "credentials");