lua-cli 3.36.0 → 3.37.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;
@@ -7740,6 +7727,14 @@ declare interface WorkflowRun {
7740
7727
  * `lua workflows status` prints the roll-up when it is there and says nothing when it is not.
7741
7728
  */
7742
7729
  byModel?: WorkflowRunModelUsageRow[];
7730
+ /**
7731
+ * [WJB-B5] (BAC-671) — the run's token components, summed by the server from the usage rows its charges
7732
+ * were written from (per-call `workflow:job` rows on the Job tier, `llm:inference` rows off it).
7733
+ * `inputTokens` is the UNCACHED prompt; the two cache figures are read and write. Present only once the
7734
+ * server projects it (a metered run on a server that has this change) — the CLI prints nothing otherwise,
7735
+ * and never adds the members together: cache reads are a SUBSET of input on OpenAI-compatible providers.
7736
+ */
7737
+ tokens?: WorkflowRunTokensDto;
7743
7738
  };
7744
7739
  /**
7745
7740
  * R4: the run's caps and settled spend. `maxCredits` and `remaining` are both absent on an uncapped run (`0` = unset);
@@ -7757,6 +7752,12 @@ declare interface WorkflowRun {
7757
7752
  };
7758
7753
  reserved?: number;
7759
7754
  remaining?: number;
7755
+ /**
7756
+ * [WJB-B5] (BAC-677): the run went PAST its cap and finished anyway — the crossing step was terminal for
7757
+ * the run, so it completed rather than parking for a raise nobody could act on. `true` or ABSENT on the
7758
+ * wire, never `false`; the CLI prints it and never derives it from `spent > maxCredits`.
7759
+ */
7760
+ exceeded?: boolean;
7760
7761
  };
7761
7762
  createdAt: string;
7762
7763
  startedAt?: string;
@@ -7787,6 +7788,18 @@ declare interface WorkflowRunModelUsageRow {
7787
7788
  /** §02 §2.4 run statuses (one union across every section). */
7788
7789
  declare type WorkflowRunStatus = 'queued' | 'running' | 'cancellation_requested' | 'gated' | 'suspended' | 'waiting' | 'completed' | 'failed' | 'cancelled' | 'abandoned' | 'timed_out';
7789
7790
 
7791
+ /**
7792
+ * [WJB-B5] (BAC-671) — the four token figures the server sums per run and per step (`WorkflowRunTokens` in
7793
+ * `@lua/shared-types`). Every member optional: the CLI is a reader of whatever the server sends, and a figure
7794
+ * a server does not project must print as nothing rather than as a zero the run never reported.
7795
+ */
7796
+ declare interface WorkflowRunTokensDto {
7797
+ inputTokens?: number;
7798
+ cacheReadTokens?: number;
7799
+ cacheCreationTokens?: number;
7800
+ outputTokens?: number;
7801
+ }
7802
+
7790
7803
  export declare type WorkflowRunTrigger = 'chat' | 'sdk' | 'api' | 'schedule' | 'webhook' | 'template' | 'workflow' | 'device';
7791
7804
 
7792
7805
  /**
@@ -944,6 +944,9 @@ function workflowOccurrenceId(lineageId, stepId) {
944
944
  function workflowOrgSlotKey(orgId, kind) {
945
945
  return `wf:org:${orgId}:${kind}`;
946
946
  }
947
+ function workflowJobModelSourceLabel(source) {
948
+ return WORKFLOW_JOB_MODEL_SOURCE_LABELS[source];
949
+ }
947
950
  function scheduledTimeKey(scheduledTime) {
948
951
  return scheduledTime.replace(/[^0-9TZ]/g, "");
949
952
  }
@@ -1254,7 +1257,7 @@ function effectiveAgentFeatures(base, override, rule) {
1254
1257
  if (rule === "wholesale") return override || base || void 0;
1255
1258
  return effectiveAgentFeatureRows(base, override).rows;
1256
1259
  }
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;
1260
+ 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_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
1261
  var init_dist = __esm({
1259
1262
  "../shared-types/dist/index.mjs"() {
1260
1263
  "use strict";
@@ -2623,6 +2626,16 @@ This text is who you are for this person. As you learn them, their name, their w
2623
2626
  __name(workflowOrgSlotKey, "workflowOrgSlotKey");
2624
2627
  __name2(workflowOrgSlotKey, "workflowOrgSlotKey");
2625
2628
  WORKFLOW_CONNECTION_KEY_RE = /^[a-z][a-z0-9_-]{0,63}$/;
2629
+ WORKFLOW_JOB_MODEL_SOURCE_LABELS = {
2630
+ stamp: "lease stamp",
2631
+ initData: "run input",
2632
+ default: "placeholder default",
2633
+ node: "node.model",
2634
+ env: "platform default",
2635
+ org: "org default"
2636
+ };
2637
+ __name(workflowJobModelSourceLabel, "workflowJobModelSourceLabel");
2638
+ __name2(workflowJobModelSourceLabel, "workflowJobModelSourceLabel");
2626
2639
  __name(scheduledTimeKey, "scheduledTimeKey");
2627
2640
  __name2(scheduledTimeKey, "scheduledTimeKey");
2628
2641
  __name(scheduledWorkflowRunIdForTime, "scheduledWorkflowRunIdForTime");
@@ -2856,7 +2869,23 @@ This text is who you are for this person. As you learn them, their name, their w
2856
2869
  * gated and nobody approved it, and conflating the two would make "who approved this run"
2857
2870
  * unanswerable for every run of either kind (§H2 "Audit").
2858
2871
  */
2859
- "workflow.run.autonomy_applied"
2872
+ "workflow.run.autonomy_applied",
2873
+ // --- run budget cap enforcement (Job-tier billing plan D4; BAC-677) ---
2874
+ /**
2875
+ * The audit twin of the `run.budget_exceeded` run event (WJB-B2a): the run overshot its
2876
+ * `budget.maxCredits` on its LAST step and completed anyway, `budget.exceeded: true`. The budget family
2877
+ * already mirrors run events here — `workflow.run.budget_parked` / `workflow.run.budget_raised` are the
2878
+ * twins of `run.budget_parked` / `run.budget_raised` — and an organisation reviewing what it was charged
2879
+ * needs the overshoot in the audit store beside the raise that preceded it, not only in the run's own
2880
+ * event stream.
2881
+ *
2882
+ * Declared with the run event rather than after it because the emitter port
2883
+ * (`WorkflowAuditPort.action`, typed `workflow.run.${string}`) does not check against this tuple: a name
2884
+ * that is NOT declared here is written to the audit store all the same and no compiler says so.
2885
+ * Declaring it is what makes the later emitter checkable. `workflow.run.budget_parked` is likewise
2886
+ * declared and not yet emitted.
2887
+ */
2888
+ "workflow.run.budget_exceeded"
2860
2889
  ];
2861
2890
  WORKFLOW_AUDIT_METADATA_MAX_BYTES = 4 * 1024;
2862
2891
  __name(isWorkflowAuditEvent, "isWorkflowAuditEvent");
@@ -6494,6 +6523,49 @@ function graphHasJobTierStep(envelopeOrGraph) {
6494
6523
  const graph = Array.isArray(envelopeOrGraph) ? envelopeOrGraph : env2.definition?.graph ?? [];
6495
6524
  return Array.isArray(graph) && graph.some(entryHasJobTier);
6496
6525
  }
6526
+ function jobTierSteps(envelopeOrGraph) {
6527
+ const out = [];
6528
+ if (!envelopeOrGraph || typeof envelopeOrGraph !== "object") return out;
6529
+ const env2 = envelopeOrGraph;
6530
+ const graph = Array.isArray(envelopeOrGraph) ? envelopeOrGraph : env2.definition?.graph ?? [];
6531
+ if (!Array.isArray(graph)) return out;
6532
+ for (const entry of graph) collectJobTierSteps(entry, out);
6533
+ return out;
6534
+ }
6535
+ function jobTierStepIds(envelopeOrGraph) {
6536
+ return jobTierSteps(envelopeOrGraph).map((s) => s.stepId);
6537
+ }
6538
+ function collectJobTierSteps(entry, out) {
6539
+ const n2 = armEntry2(entry);
6540
+ if (!n2 || typeof n2 !== "object") return;
6541
+ const node = n2;
6542
+ const ws = node.workspace;
6543
+ if (node.tier === "job" || ws !== void 0 && ws !== "inherit") {
6544
+ const stepId = typeof node.id === "string" && node.id ? node.id : "(unnamed)";
6545
+ const model = typeof node.model === "string" && node.model.trim() ? node.model.trim() : void 0;
6546
+ out.push(model === void 0 ? {
6547
+ stepId
6548
+ } : {
6549
+ stepId,
6550
+ model
6551
+ });
6552
+ }
6553
+ switch (node.type) {
6554
+ case "parallel":
6555
+ if (Array.isArray(node.steps)) for (const s of node.steps) collectJobTierSteps(s, out);
6556
+ return;
6557
+ case "conditional":
6558
+ if (Array.isArray(node.steps)) for (const s of node.steps) collectJobTierSteps(s, out);
6559
+ if (node.otherwise !== void 0) collectJobTierSteps(node.otherwise, out);
6560
+ return;
6561
+ case "foreach":
6562
+ case "loop":
6563
+ collectJobTierSteps(node.step, out);
6564
+ return;
6565
+ default:
6566
+ return;
6567
+ }
6568
+ }
6497
6569
  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
6570
  var init_dist2 = __esm({
6499
6571
  "../workflow-graph/dist/index.mjs"() {
@@ -7298,6 +7370,12 @@ var init_dist2 = __esm({
7298
7370
  __name4(entryHasJobTier, "entryHasJobTier");
7299
7371
  __name(graphHasJobTierStep, "graphHasJobTierStep");
7300
7372
  __name4(graphHasJobTierStep, "graphHasJobTierStep");
7373
+ __name(jobTierSteps, "jobTierSteps");
7374
+ __name4(jobTierSteps, "jobTierSteps");
7375
+ __name(jobTierStepIds, "jobTierStepIds");
7376
+ __name4(jobTierStepIds, "jobTierStepIds");
7377
+ __name(collectJobTierSteps, "collectJobTierSteps");
7378
+ __name4(collectJobTierSteps, "collectJobTierSteps");
7301
7379
  }
7302
7380
  });
7303
7381