lua-cli 3.39.4 → 3.40.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.
@@ -1,6 +1,85 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __name = (target, value3) => __defProp(target, "name", { value: value3, configurable: true });
3
3
 
4
+ // ../shared-types/dist/workflow-job-tools.mjs
5
+ var __defProp2 = Object.defineProperty;
6
+ var __name2 = /* @__PURE__ */ __name((target, value3) => __defProp2(target, "name", { value: value3, configurable: true }), "__name");
7
+ var WORKFLOW_JOB_TOOLS = [
8
+ "shell",
9
+ "read",
10
+ "write",
11
+ "edit",
12
+ "glob",
13
+ "grep",
14
+ "git",
15
+ "gh",
16
+ "fetch",
17
+ "ripwire"
18
+ ];
19
+ var WORKFLOW_JOB_READ_ONLY_DROPPED = [
20
+ "write",
21
+ "edit",
22
+ "git",
23
+ "shell"
24
+ ];
25
+ var WORKFLOW_JOB_DEFAULT_TOOLS = [
26
+ "shell",
27
+ "read",
28
+ "write",
29
+ "edit",
30
+ "glob",
31
+ "grep",
32
+ "git"
33
+ ];
34
+ function effectiveJobTools(jobTools, readOnly) {
35
+ const base = jobTools?.length ? jobTools : WORKFLOW_JOB_DEFAULT_TOOLS;
36
+ const out = [];
37
+ for (const id2 of base) {
38
+ if (readOnly && WORKFLOW_JOB_READ_ONLY_DROPPED.includes(id2)) continue;
39
+ if (!out.includes(id2)) out.push(id2);
40
+ }
41
+ return out;
42
+ }
43
+ __name(effectiveJobTools, "effectiveJobTools");
44
+ __name2(effectiveJobTools, "effectiveJobTools");
45
+ var WORKFLOW_JOB_PLUGINS = [
46
+ "lua-agent-builder"
47
+ ];
48
+ var WORKFLOW_JOB_PLUGIN_ROOT = "/opt/lua/plugins";
49
+ var WORKFLOW_JOB_PLUGINS_MAX = 4;
50
+ function isWorkflowJobPluginId(id2) {
51
+ return typeof id2 === "string" && WORKFLOW_JOB_PLUGINS.includes(id2);
52
+ }
53
+ __name(isWorkflowJobPluginId, "isWorkflowJobPluginId");
54
+ __name2(isWorkflowJobPluginId, "isWorkflowJobPluginId");
55
+ function workflowJobPluginDir(id2) {
56
+ return `${WORKFLOW_JOB_PLUGIN_ROOT}/${id2}`;
57
+ }
58
+ __name(workflowJobPluginDir, "workflowJobPluginDir");
59
+ __name2(workflowJobPluginDir, "workflowJobPluginDir");
60
+ function workflowJobPluginsProblem(plugins) {
61
+ if (plugins === void 0) return null;
62
+ if (!Array.isArray(plugins)) return "plugins must be an array of plugin ids";
63
+ if (plugins.length > WORKFLOW_JOB_PLUGINS_MAX) return `at most ${WORKFLOW_JOB_PLUGINS_MAX} plugins per step`;
64
+ const unknown = plugins.filter((p) => !isWorkflowJobPluginId(p));
65
+ if (unknown.length) return `unknown plugin ${unknown.map((u) => JSON.stringify(u)).join(", ")} (allowed: ${WORKFLOW_JOB_PLUGINS.join(", ")})`;
66
+ if (new Set(plugins).size !== plugins.length) return "plugins must not repeat";
67
+ return null;
68
+ }
69
+ __name(workflowJobPluginsProblem, "workflowJobPluginsProblem");
70
+ __name2(workflowJobPluginsProblem, "workflowJobPluginsProblem");
71
+ function workflowJobTargetProblem(target, plugins) {
72
+ if (target === void 0) return null;
73
+ if (!target || typeof target !== "object" || Array.isArray(target)) return "target must be { agentId }";
74
+ const keys = Object.keys(target);
75
+ const agentId = target.agentId;
76
+ if (keys.length !== 1 || typeof agentId !== "string" || !agentId.trim() || agentId.length > 256) return "target must be exactly { agentId: <non-empty string> }";
77
+ if (!Array.isArray(plugins) || plugins.length === 0) return "`target` is legal only beside `plugins`";
78
+ return null;
79
+ }
80
+ __name(workflowJobTargetProblem, "workflowJobTargetProblem");
81
+ __name2(workflowJobTargetProblem, "workflowJobTargetProblem");
82
+
4
83
  // src/types/workflow.ts
5
84
  import { zodToJsonSchema } from "zod-to-json-schema";
6
85
 
@@ -9,8 +88,8 @@ import { z } from "zod";
9
88
  import { z as z2 } from "zod";
10
89
  import { z as z3 } from "zod";
11
90
  import { z as z4 } from "zod";
12
- var __defProp2 = Object.defineProperty;
13
- var __name2 = /* @__PURE__ */ __name((target, value3) => __defProp2(target, "name", { value: value3, configurable: true }), "__name");
91
+ var __defProp3 = Object.defineProperty;
92
+ var __name3 = /* @__PURE__ */ __name((target, value3) => __defProp3(target, "name", { value: value3, configurable: true }), "__name");
14
93
  var PLUMBING_THREAD_CHANNELS = [
15
94
  "trigger",
16
95
  "template-install",
@@ -38,12 +117,12 @@ function isChannelConversationChannel(channel) {
38
117
  return !!channel && CHANNEL_CONVERSATION_CHANNELS.includes(channel);
39
118
  }
40
119
  __name(isChannelConversationChannel, "isChannelConversationChannel");
41
- __name2(isChannelConversationChannel, "isChannelConversationChannel");
120
+ __name3(isChannelConversationChannel, "isChannelConversationChannel");
42
121
  function isChannelConversationThread(threadId, channel) {
43
122
  return !!threadId && isChannelConversationChannel(channel);
44
123
  }
45
124
  __name(isChannelConversationThread, "isChannelConversationThread");
46
- __name2(isChannelConversationThread, "isChannelConversationThread");
125
+ __name3(isChannelConversationThread, "isChannelConversationThread");
47
126
  function isPersonaTextObject(value3) {
48
127
  if (value3 === null || typeof value3 !== "object" || Array.isArray(value3)) return false;
49
128
  const obj = value3;
@@ -54,7 +133,7 @@ function isPersonaTextObject(value3) {
54
133
  return true;
55
134
  }
56
135
  __name(isPersonaTextObject, "isPersonaTextObject");
57
- __name2(isPersonaTextObject, "isPersonaTextObject");
136
+ __name3(isPersonaTextObject, "isPersonaTextObject");
58
137
  function flattenPersonaText(input, isVoice = false) {
59
138
  if (input == null) return "";
60
139
  if (typeof input === "string") return input;
@@ -65,7 +144,7 @@ function flattenPersonaText(input, isVoice = false) {
65
144
  return parts.join("\n\n");
66
145
  }
67
146
  __name(flattenPersonaText, "flattenPersonaText");
68
- __name2(flattenPersonaText, "flattenPersonaText");
147
+ __name3(flattenPersonaText, "flattenPersonaText");
69
148
  function flattenPersonaTextAll(input) {
70
149
  if (input == null) return "";
71
150
  if (typeof input === "string") return input;
@@ -76,16 +155,16 @@ function flattenPersonaTextAll(input) {
76
155
  return parts.join("\n\n");
77
156
  }
78
157
  __name(flattenPersonaTextAll, "flattenPersonaTextAll");
79
- __name2(flattenPersonaTextAll, "flattenPersonaTextAll");
158
+ __name3(flattenPersonaTextAll, "flattenPersonaTextAll");
80
159
  function hasPersonaTextContent(input) {
81
160
  if (input == null) return false;
82
161
  if (typeof input === "string") return input.trim().length > 0;
83
162
  return Boolean(input.base?.trim() || input.voice?.trim() || input.text?.trim());
84
163
  }
85
164
  __name(hasPersonaTextContent, "hasPersonaTextContent");
86
- __name2(hasPersonaTextContent, "hasPersonaTextContent");
165
+ __name3(hasPersonaTextContent, "hasPersonaTextContent");
87
166
  function personaToLiteral(persona) {
88
- const formatValue = /* @__PURE__ */ __name2((v) => {
167
+ const formatValue = /* @__PURE__ */ __name3((v) => {
89
168
  if (v.includes("\n")) {
90
169
  return "`" + v.replace(/\\/g, "\\\\").replace(/`/g, "\\`").replace(/\$/g, "\\$") + "`";
91
170
  }
@@ -99,7 +178,7 @@ function personaToLiteral(persona) {
99
178
  return `{ ${parts.join(", ")} }`;
100
179
  }
101
180
  __name(personaToLiteral, "personaToLiteral");
102
- __name2(personaToLiteral, "personaToLiteral");
181
+ __name3(personaToLiteral, "personaToLiteral");
103
182
  function aiGenerateInputFromSimplified(prompt, content) {
104
183
  if (content === void 0) {
105
184
  return {
@@ -117,7 +196,45 @@ function aiGenerateInputFromSimplified(prompt, content) {
117
196
  };
118
197
  }
119
198
  __name(aiGenerateInputFromSimplified, "aiGenerateInputFromSimplified");
120
- __name2(aiGenerateInputFromSimplified, "aiGenerateInputFromSimplified");
199
+ __name3(aiGenerateInputFromSimplified, "aiGenerateInputFromSimplified");
200
+ var PLATFORM_INVOCATION_CALLERS = [
201
+ "workflow-step",
202
+ "supervision-preview"
203
+ ];
204
+ function isPlatformInvocationCaller(v) {
205
+ return typeof v === "string" && PLATFORM_INVOCATION_CALLERS.includes(v);
206
+ }
207
+ __name(isPlatformInvocationCaller, "isPlatformInvocationCaller");
208
+ __name3(isPlatformInvocationCaller, "isPlatformInvocationCaller");
209
+ function supervisionSubjectId(agentId) {
210
+ return `agent:${agentId}`;
211
+ }
212
+ __name(supervisionSubjectId, "supervisionSubjectId");
213
+ __name3(supervisionSubjectId, "supervisionSubjectId");
214
+ var SUPERVISION_OPS = {
215
+ "agents.list": "discover",
216
+ "agents.get": "discover",
217
+ logs: "observe",
218
+ "runs.list": "observe",
219
+ "runs.get": "observe",
220
+ "data.get": "observe",
221
+ "data.query": "observe",
222
+ "versions.list": "observe",
223
+ "versions.get": "observe",
224
+ "versions.diff": "observe",
225
+ "versions.preview": "preview",
226
+ "versions.promote": "release",
227
+ "persona.versions": "observe",
228
+ "persona.activate": "release",
229
+ "source.list": "observe",
230
+ "source.get": "observe",
231
+ "env.keys": "observe"
232
+ };
233
+ function isSupervisionOp(op) {
234
+ return typeof op === "string" && Object.prototype.hasOwnProperty.call(SUPERVISION_OPS, op);
235
+ }
236
+ __name(isSupervisionOp, "isSupervisionOp");
237
+ __name3(isSupervisionOp, "isSupervisionOp");
121
238
  var REVIEWABLE_ACTION_EXECUTE_TOOL_ALLOWLIST = [
122
239
  "sendChannelMessage",
123
240
  "sendWhatsappTemplate",
@@ -133,7 +250,7 @@ function isAllowedReviewableExecuteTool(tool) {
133
250
  return REVIEWABLE_ACTION_EXECUTE_TOOL_ALLOWLIST.includes(tool);
134
251
  }
135
252
  __name(isAllowedReviewableExecuteTool, "isAllowedReviewableExecuteTool");
136
- __name2(isAllowedReviewableExecuteTool, "isAllowedReviewableExecuteTool");
253
+ __name3(isAllowedReviewableExecuteTool, "isAllowedReviewableExecuteTool");
137
254
  var REVIEWABLE_STANDING_START_TOOLS = [
138
255
  "scheduleWorkflow"
139
256
  ];
@@ -141,19 +258,19 @@ function isReviewableStandingStartTool(tool) {
141
258
  return REVIEWABLE_STANDING_START_TOOLS.includes(tool);
142
259
  }
143
260
  __name(isReviewableStandingStartTool, "isReviewableStandingStartTool");
144
- __name2(isReviewableStandingStartTool, "isReviewableStandingStartTool");
261
+ __name3(isReviewableStandingStartTool, "isReviewableStandingStartTool");
145
262
  var REVIEWABLE_MCP_SEND_TOOL_SUFFIX = "_create_messaging_message";
146
263
  function isReviewableMcpSendTool(tool) {
147
264
  return tool.length > REVIEWABLE_MCP_SEND_TOOL_SUFFIX.length && tool.endsWith(REVIEWABLE_MCP_SEND_TOOL_SUFFIX);
148
265
  }
149
266
  __name(isReviewableMcpSendTool, "isReviewableMcpSendTool");
150
- __name2(isReviewableMcpSendTool, "isReviewableMcpSendTool");
267
+ __name3(isReviewableMcpSendTool, "isReviewableMcpSendTool");
151
268
  var MCP_TOOL_READ_VERB_RE = /(?:^|_)(list|get|search|read|fetch|find|query|describe|count|retrieve|lookup|show|view)(_|[A-Z0-9]|$)/;
152
269
  function mcpActionTokens(action) {
153
270
  return action.replace(/([a-z0-9])([A-Z])/g, "$1 $2").toLowerCase().split(/[^a-z0-9]+/).filter(Boolean);
154
271
  }
155
272
  __name(mcpActionTokens, "mcpActionTokens");
156
- __name2(mcpActionTokens, "mcpActionTokens");
273
+ __name3(mcpActionTokens, "mcpActionTokens");
157
274
  function isReviewableMcpDraftTool(tool) {
158
275
  const sep = tool.indexOf("_");
159
276
  if (sep <= 0 || sep >= tool.length - 1) return false;
@@ -163,7 +280,7 @@ function isReviewableMcpDraftTool(tool) {
163
280
  return !MCP_TOOL_READ_VERB_RE.test(action);
164
281
  }
165
282
  __name(isReviewableMcpDraftTool, "isReviewableMcpDraftTool");
166
- __name2(isReviewableMcpDraftTool, "isReviewableMcpDraftTool");
283
+ __name3(isReviewableMcpDraftTool, "isReviewableMcpDraftTool");
167
284
  var MCP_DRAFT_CREATE_VERBS = /* @__PURE__ */ new Set([
168
285
  "create",
169
286
  "compose",
@@ -181,7 +298,7 @@ function isMcpDraftCreateTool(tool) {
181
298
  return tokens[0] === "draft" || tokens.some((t) => MCP_DRAFT_CREATE_VERBS.has(t));
182
299
  }
183
300
  __name(isMcpDraftCreateTool, "isMcpDraftCreateTool");
184
- __name2(isMcpDraftCreateTool, "isMcpDraftCreateTool");
301
+ __name3(isMcpDraftCreateTool, "isMcpDraftCreateTool");
185
302
  function mcpSendSiblingForDraftTool(tool, availableToolIds) {
186
303
  const candidates = [
187
304
  ...availableToolIds
@@ -192,12 +309,12 @@ function mcpSendSiblingForDraftTool(tool, availableToolIds) {
192
309
  return candidates[0]?.id;
193
310
  }
194
311
  __name(mcpSendSiblingForDraftTool, "mcpSendSiblingForDraftTool");
195
- __name2(mcpSendSiblingForDraftTool, "mcpSendSiblingForDraftTool");
312
+ __name3(mcpSendSiblingForDraftTool, "mcpSendSiblingForDraftTool");
196
313
  function isReviewableExecuteTool(tool) {
197
314
  return isAllowedReviewableExecuteTool(tool) || isReviewableMcpSendTool(tool) || isReviewableStandingStartTool(tool);
198
315
  }
199
316
  __name(isReviewableExecuteTool, "isReviewableExecuteTool");
200
- __name2(isReviewableExecuteTool, "isReviewableExecuteTool");
317
+ __name3(isReviewableExecuteTool, "isReviewableExecuteTool");
201
318
  var NON_INTERACTIVE_CHANNELS = [
202
319
  "trigger",
203
320
  "agent-invocation",
@@ -209,23 +326,23 @@ function isInteractiveChannel(channel) {
209
326
  return !NON_INTERACTIVE_CHANNELS.includes(channel);
210
327
  }
211
328
  __name(isInteractiveChannel, "isInteractiveChannel");
212
- __name2(isInteractiveChannel, "isInteractiveChannel");
329
+ __name3(isInteractiveChannel, "isInteractiveChannel");
213
330
  function isInteractiveTurn(turn) {
214
331
  if (typeof turn.interactive === "boolean") return turn.interactive;
215
332
  return isInteractiveChannel(turn.channel);
216
333
  }
217
334
  __name(isInteractiveTurn, "isInteractiveTurn");
218
- __name2(isInteractiveTurn, "isInteractiveTurn");
335
+ __name3(isInteractiveTurn, "isInteractiveTurn");
219
336
  function removeNavigateBlock(input) {
220
337
  return input.replace(/::: navigate[\s\S]*?:::/g, "").trim();
221
338
  }
222
339
  __name(removeNavigateBlock, "removeNavigateBlock");
223
- __name2(removeNavigateBlock, "removeNavigateBlock");
340
+ __name3(removeNavigateBlock, "removeNavigateBlock");
224
341
  function removeHiddenBlocks(input) {
225
342
  return input.replace(/::: hide\b[\s\S]*?:::/gi, "").replace(/::: hide\b[\s\S]*$/gi, "").trim();
226
343
  }
227
344
  __name(removeHiddenBlocks, "removeHiddenBlocks");
228
- __name2(removeHiddenBlocks, "removeHiddenBlocks");
345
+ __name3(removeHiddenBlocks, "removeHiddenBlocks");
229
346
  function transformChatHistoryContentParts(parts) {
230
347
  const content = [];
231
348
  for (const rawPart of parts ?? []) {
@@ -370,14 +487,14 @@ function transformChatHistoryContentParts(parts) {
370
487
  return content;
371
488
  }
372
489
  __name(transformChatHistoryContentParts, "transformChatHistoryContentParts");
373
- __name2(transformChatHistoryContentParts, "transformChatHistoryContentParts");
490
+ __name3(transformChatHistoryContentParts, "transformChatHistoryContentParts");
374
491
  var RICH_PARTS_MESSAGE_ID_PREFIX = "rich-parts:";
375
492
  var SCREENSHOT_MESSAGE_ID_PREFIX = "screenshot:";
376
493
  function isSyntheticSideRow(id2) {
377
494
  return id2.startsWith(SCREENSHOT_MESSAGE_ID_PREFIX) || id2.startsWith(RICH_PARTS_MESSAGE_ID_PREFIX);
378
495
  }
379
496
  __name(isSyntheticSideRow, "isSyntheticSideRow");
380
- __name2(isSyntheticSideRow, "isSyntheticSideRow");
497
+ __name3(isSyntheticSideRow, "isSyntheticSideRow");
381
498
  function mergeRichPartMirrorMessages(messages, sameTurnGroup) {
382
499
  const merged = [];
383
500
  for (const message of messages) {
@@ -416,7 +533,7 @@ function mergeRichPartMirrorMessages(messages, sameTurnGroup) {
416
533
  return merged;
417
534
  }
418
535
  __name(mergeRichPartMirrorMessages, "mergeRichPartMirrorMessages");
419
- __name2(mergeRichPartMirrorMessages, "mergeRichPartMirrorMessages");
536
+ __name3(mergeRichPartMirrorMessages, "mergeRichPartMirrorMessages");
420
537
  function citationDedupeKeys(part) {
421
538
  if (part.type !== "source-url" && part.type !== "source-document") return [];
422
539
  const keys = [];
@@ -425,10 +542,10 @@ function citationDedupeKeys(part) {
425
542
  return keys;
426
543
  }
427
544
  __name(citationDedupeKeys, "citationDedupeKeys");
428
- __name2(citationDedupeKeys, "citationDedupeKeys");
545
+ __name3(citationDedupeKeys, "citationDedupeKeys");
429
546
  function foldRichPartsIntoMessages(messages, records, makeMessage, sameTurnGroup) {
430
547
  if (messages.length === 0 || records.length === 0) return messages;
431
- const messageTime = /* @__PURE__ */ __name2((m) => m.createdAt ? new Date(m.createdAt).getTime() : Number.NEGATIVE_INFINITY, "messageTime");
548
+ const messageTime = /* @__PURE__ */ __name3((m) => m.createdAt ? new Date(m.createdAt).getTime() : Number.NEGATIVE_INFINITY, "messageTime");
432
549
  const finiteTimes = messages.map(messageTime).filter(Number.isFinite);
433
550
  const oldest = finiteTimes.length > 0 ? Math.min(...finiteTimes) : Number.NEGATIVE_INFINITY;
434
551
  const synthetic = [];
@@ -462,7 +579,7 @@ function foldRichPartsIntoMessages(messages, records, makeMessage, sameTurnGroup
462
579
  return mergeRichPartMirrorMessages(combined, sameTurnGroup);
463
580
  }
464
581
  __name(foldRichPartsIntoMessages, "foldRichPartsIntoMessages");
465
- __name2(foldRichPartsIntoMessages, "foldRichPartsIntoMessages");
582
+ __name3(foldRichPartsIntoMessages, "foldRichPartsIntoMessages");
466
583
  var BROWSER_COMMANDS = [
467
584
  // health + lifecycle / navigation
468
585
  {
@@ -688,7 +805,7 @@ var LuaLogFieldsError = class _LuaLogFieldsError extends Error {
688
805
  __name(this, "_LuaLogFieldsError");
689
806
  }
690
807
  static {
691
- __name2(this, "LuaLogFieldsError");
808
+ __name3(this, "LuaLogFieldsError");
692
809
  }
693
810
  constructor(message) {
694
811
  super(message);
@@ -719,7 +836,7 @@ function utf8WidthAt(value3, index) {
719
836
  };
720
837
  }
721
838
  __name(utf8WidthAt, "utf8WidthAt");
722
- __name2(utf8WidthAt, "utf8WidthAt");
839
+ __name3(utf8WidthAt, "utf8WidthAt");
723
840
  function utf8ByteLength(value3) {
724
841
  let bytes = 0;
725
842
  for (let i = 0; i < value3.length; ) {
@@ -730,7 +847,7 @@ function utf8ByteLength(value3) {
730
847
  return bytes;
731
848
  }
732
849
  __name(utf8ByteLength, "utf8ByteLength");
733
- __name2(utf8ByteLength, "utf8ByteLength");
850
+ __name3(utf8ByteLength, "utf8ByteLength");
734
851
  function clampUtf8(value3, maxBytes) {
735
852
  let bytes = 0;
736
853
  for (let i = 0; i < value3.length; ) {
@@ -742,7 +859,7 @@ function clampUtf8(value3, maxBytes) {
742
859
  return value3;
743
860
  }
744
861
  __name(clampUtf8, "clampUtf8");
745
- __name2(clampUtf8, "clampUtf8");
862
+ __name3(clampUtf8, "clampUtf8");
746
863
  function mapBytes(fields, withMark) {
747
864
  return utf8ByteLength(JSON.stringify(withMark ? {
748
865
  ...fields,
@@ -750,7 +867,7 @@ function mapBytes(fields, withMark) {
750
867
  } : fields));
751
868
  }
752
869
  __name(mapBytes, "mapBytes");
753
- __name2(mapBytes, "mapBytes");
870
+ __name3(mapBytes, "mapBytes");
754
871
  function withValueCap(fields, capBytes) {
755
872
  const out = {};
756
873
  for (const [key, value3] of Object.entries(fields)) {
@@ -759,7 +876,7 @@ function withValueCap(fields, capBytes) {
759
876
  return out;
760
877
  }
761
878
  __name(withValueCap, "withValueCap");
762
- __name2(withValueCap, "withValueCap");
879
+ __name3(withValueCap, "withValueCap");
763
880
  function describeValue(value3) {
764
881
  if (value3 === null) return "null";
765
882
  if (value3 === void 0) return "undefined";
@@ -767,7 +884,7 @@ function describeValue(value3) {
767
884
  return typeof value3 === "object" ? "an object" : `a ${typeof value3}`;
768
885
  }
769
886
  __name(describeValue, "describeValue");
770
- __name2(describeValue, "describeValue");
887
+ __name3(describeValue, "describeValue");
771
888
  function assertValidLogFieldKey(key) {
772
889
  if (!LOG_FIELD_KEY_PATTERN.test(key)) {
773
890
  throw new LuaLogFieldsError(`log fields: key \`${key}\` is not allowed \u2014 a key must match ${LOG_FIELD_KEY_PATTERN.source} (lower-case, starts with a letter, then letters/digits/underscore, at most 64 characters)`);
@@ -780,7 +897,7 @@ function assertValidLogFieldKey(key) {
780
897
  }
781
898
  }
782
899
  __name(assertValidLogFieldKey, "assertValidLogFieldKey");
783
- __name2(assertValidLogFieldKey, "assertValidLogFieldKey");
900
+ __name3(assertValidLogFieldKey, "assertValidLogFieldKey");
784
901
  function normalizeLogFields(fields) {
785
902
  if (fields === void 0 || fields === null) return void 0;
786
903
  if (typeof fields !== "object" || Array.isArray(fields)) {
@@ -830,7 +947,7 @@ function normalizeLogFields(fields) {
830
947
  return out;
831
948
  }
832
949
  __name(normalizeLogFields, "normalizeLogFields");
833
- __name2(normalizeLogFields, "normalizeLogFields");
950
+ __name3(normalizeLogFields, "normalizeLogFields");
834
951
  function clampLogFields(out) {
835
952
  let clamped = false;
836
953
  for (const [key, value3] of Object.entries(out)) {
@@ -862,7 +979,7 @@ function clampLogFields(out) {
862
979
  return true;
863
980
  }
864
981
  __name(clampLogFields, "clampLogFields");
865
- __name2(clampLogFields, "clampLogFields");
982
+ __name3(clampLogFields, "clampLogFields");
866
983
  var DESKTOP_FILE_COMMANDS = [
867
984
  "files_roots",
868
985
  "files_stat",
@@ -884,12 +1001,12 @@ function isDesktopFileCommandName(value3) {
884
1001
  return typeof value3 === "string" && DESKTOP_FILE_COMMAND_SET.has(value3);
885
1002
  }
886
1003
  __name(isDesktopFileCommandName, "isDesktopFileCommandName");
887
- __name2(isDesktopFileCommandName, "isDesktopFileCommandName");
1004
+ __name3(isDesktopFileCommandName, "isDesktopFileCommandName");
888
1005
  function isDesktopFileSessionId(value3) {
889
1006
  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);
890
1007
  }
891
1008
  __name(isDesktopFileSessionId, "isDesktopFileSessionId");
892
- __name2(isDesktopFileSessionId, "isDesktopFileSessionId");
1009
+ __name3(isDesktopFileSessionId, "isDesktopFileSessionId");
893
1010
  var WORKFLOW_RETRY_BACKOFFS = [
894
1011
  "fixed",
895
1012
  "exponential"
@@ -907,12 +1024,12 @@ function workflowRetryMaxAttemptsMessage(got) {
907
1024
  return `\`retry.maxAttempts\` must be an integer ${WORKFLOW_RETRY_MIN_ATTEMPTS}..${WORKFLOW_RETRY_MAX_ATTEMPTS}${tail}`;
908
1025
  }
909
1026
  __name(workflowRetryMaxAttemptsMessage, "workflowRetryMaxAttemptsMessage");
910
- __name2(workflowRetryMaxAttemptsMessage, "workflowRetryMaxAttemptsMessage");
1027
+ __name3(workflowRetryMaxAttemptsMessage, "workflowRetryMaxAttemptsMessage");
911
1028
  function isWithinWorkflowRetryAttempts(value3) {
912
1029
  return typeof value3 === "number" && Number.isInteger(value3) && value3 >= WORKFLOW_RETRY_MIN_ATTEMPTS && value3 <= WORKFLOW_RETRY_MAX_ATTEMPTS;
913
1030
  }
914
1031
  __name(isWithinWorkflowRetryAttempts, "isWithinWorkflowRetryAttempts");
915
- __name2(isWithinWorkflowRetryAttempts, "isWithinWorkflowRetryAttempts");
1032
+ __name3(isWithinWorkflowRetryAttempts, "isWithinWorkflowRetryAttempts");
916
1033
  var WORKFLOW_RETRY_ENGINE_KEYS = [
917
1034
  "budgetBaseAttempt"
918
1035
  ];
@@ -924,13 +1041,13 @@ function workflowRetryUnknownMembersMessage(keys) {
924
1041
  return `\`retry\` has no member ${named.join(", ")}; members: ${WORKFLOW_RETRY_POLICY_KEYS.join(", ")}`;
925
1042
  }
926
1043
  __name(workflowRetryUnknownMembersMessage, "workflowRetryUnknownMembersMessage");
927
- __name2(workflowRetryUnknownMembersMessage, "workflowRetryUnknownMembersMessage");
1044
+ __name3(workflowRetryUnknownMembersMessage, "workflowRetryUnknownMembersMessage");
928
1045
  function unknownWorkflowRetryMembers(retry) {
929
1046
  if (!retry || typeof retry !== "object" || Array.isArray(retry)) return [];
930
1047
  return Object.keys(retry).filter((k) => !WORKFLOW_RETRY_POLICY_KEYS.includes(k));
931
1048
  }
932
1049
  __name(unknownWorkflowRetryMembers, "unknownWorkflowRetryMembers");
933
- __name2(unknownWorkflowRetryMembers, "unknownWorkflowRetryMembers");
1050
+ __name3(unknownWorkflowRetryMembers, "unknownWorkflowRetryMembers");
934
1051
  function authoredRetryPolicy(retry) {
935
1052
  if (!retry || typeof retry !== "object" || Array.isArray(retry)) return void 0;
936
1053
  const src = retry;
@@ -939,34 +1056,34 @@ function authoredRetryPolicy(retry) {
939
1056
  return Object.keys(out).length ? out : void 0;
940
1057
  }
941
1058
  __name(authoredRetryPolicy, "authoredRetryPolicy");
942
- __name2(authoredRetryPolicy, "authoredRetryPolicy");
1059
+ __name3(authoredRetryPolicy, "authoredRetryPolicy");
943
1060
  function retryBudgetBaseAttempt(row) {
944
1061
  const base = row.retry?.budgetBaseAttempt;
945
1062
  return typeof base === "number" && Number.isSafeInteger(base) && base > 0 ? base : 0;
946
1063
  }
947
1064
  __name(retryBudgetBaseAttempt, "retryBudgetBaseAttempt");
948
- __name2(retryBudgetBaseAttempt, "retryBudgetBaseAttempt");
1065
+ __name3(retryBudgetBaseAttempt, "retryBudgetBaseAttempt");
949
1066
  function retryBudgetAttempt(row) {
950
1067
  return Math.max(0, row.attempt - retryBudgetBaseAttempt(row));
951
1068
  }
952
1069
  __name(retryBudgetAttempt, "retryBudgetAttempt");
953
- __name2(retryBudgetAttempt, "retryBudgetAttempt");
1070
+ __name3(retryBudgetAttempt, "retryBudgetAttempt");
954
1071
  function retryBudgetMaxAttempts(row) {
955
1072
  const max = row.retry?.maxAttempts;
956
1073
  return typeof max === "number" && Number.isFinite(max) && max >= 1 ? max : 1;
957
1074
  }
958
1075
  __name(retryBudgetMaxAttempts, "retryBudgetMaxAttempts");
959
- __name2(retryBudgetMaxAttempts, "retryBudgetMaxAttempts");
1076
+ __name3(retryBudgetMaxAttempts, "retryBudgetMaxAttempts");
960
1077
  function retryBudgetRemaining(row) {
961
1078
  return retryBudgetAttempt(row) < retryBudgetMaxAttempts(row);
962
1079
  }
963
1080
  __name(retryBudgetRemaining, "retryBudgetRemaining");
964
- __name2(retryBudgetRemaining, "retryBudgetRemaining");
1081
+ __name3(retryBudgetRemaining, "retryBudgetRemaining");
965
1082
  function retriesRemaining(row) {
966
1083
  return Math.max(0, retryBudgetMaxAttempts(row) - retryBudgetAttempt(row));
967
1084
  }
968
1085
  __name(retriesRemaining, "retriesRemaining");
969
- __name2(retriesRemaining, "retriesRemaining");
1086
+ __name3(retriesRemaining, "retriesRemaining");
970
1087
  var WORKFLOW_JOB_RESOURCES = [
971
1088
  "small",
972
1089
  "medium",
@@ -987,7 +1104,7 @@ function workflowModelCostComparison(estimate, onAgentModel, agentModel) {
987
1104
  return `\u2248 ${ratio}\xD7 the cost of running every step on ${agentModel}`;
988
1105
  }
989
1106
  __name(workflowModelCostComparison, "workflowModelCostComparison");
990
- __name2(workflowModelCostComparison, "workflowModelCostComparison");
1107
+ __name3(workflowModelCostComparison, "workflowModelCostComparison");
991
1108
  var WORKFLOW_DEFAULT_TASK_CLASS_MAP = Object.freeze({
992
1109
  classify: "fast",
993
1110
  extract: "fast",
@@ -1003,13 +1120,13 @@ function modelClassRank(modelClass) {
1003
1120
  return WORKFLOW_MODEL_CLASSES.indexOf(modelClass);
1004
1121
  }
1005
1122
  __name(modelClassRank, "modelClassRank");
1006
- __name2(modelClassRank, "modelClassRank");
1123
+ __name3(modelClassRank, "modelClassRank");
1007
1124
  function modelClassesAtOrBelow(maxClass) {
1008
1125
  const ceiling = modelClassRank(maxClass);
1009
1126
  return WORKFLOW_MODEL_CLASSES.filter((c) => modelClassRank(c) <= ceiling);
1010
1127
  }
1011
1128
  __name(modelClassesAtOrBelow, "modelClassesAtOrBelow");
1012
- __name2(modelClassesAtOrBelow, "modelClassesAtOrBelow");
1129
+ __name3(modelClassesAtOrBelow, "modelClassesAtOrBelow");
1013
1130
  var WORKFLOW_AUTONOMY_NUMERIC_KEYS = [
1014
1131
  "maxCredits",
1015
1132
  "maxSteps",
@@ -1039,7 +1156,7 @@ function workflowAutonomyMaxRunsPerHourCeiling(env) {
1039
1156
  return Number.isFinite(raw) && raw > 0 ? raw : WORKFLOW_AUTONOMY_MAX_RUNS_PER_HOUR_CEILING;
1040
1157
  }
1041
1158
  __name(workflowAutonomyMaxRunsPerHourCeiling, "workflowAutonomyMaxRunsPerHourCeiling");
1042
- __name2(workflowAutonomyMaxRunsPerHourCeiling, "workflowAutonomyMaxRunsPerHourCeiling");
1159
+ __name3(workflowAutonomyMaxRunsPerHourCeiling, "workflowAutonomyMaxRunsPerHourCeiling");
1043
1160
  var WORKFLOW_AUTONOMY_FORMS_DEFAULT = Object.freeze([
1044
1161
  "graph",
1045
1162
  "static"
@@ -1049,12 +1166,12 @@ function isWithinWorkflowAutonomyRange(value3, ceiling) {
1049
1166
  return typeof value3 === "number" && Number.isInteger(value3) && value3 >= WORKFLOW_AUTONOMY_MIN_VALUE && value3 <= ceiling;
1050
1167
  }
1051
1168
  __name(isWithinWorkflowAutonomyRange, "isWithinWorkflowAutonomyRange");
1052
- __name2(isWithinWorkflowAutonomyRange, "isWithinWorkflowAutonomyRange");
1169
+ __name3(isWithinWorkflowAutonomyRange, "isWithinWorkflowAutonomyRange");
1053
1170
  function workflowAutonomyRangeMessage(key, ceiling) {
1054
1171
  return `\`${key}\` must be an integer ${WORKFLOW_AUTONOMY_MIN_VALUE}..${ceiling}`;
1055
1172
  }
1056
1173
  __name(workflowAutonomyRangeMessage, "workflowAutonomyRangeMessage");
1057
- __name2(workflowAutonomyRangeMessage, "workflowAutonomyRangeMessage");
1174
+ __name3(workflowAutonomyRangeMessage, "workflowAutonomyRangeMessage");
1058
1175
  var WORKFLOW_JOB_RANGES = Object.freeze({
1059
1176
  /** Coding-turn cap (`claude -p --max-turns`); absent ⇒ the cluster default (LUA_WF_JOB_MAX_TURNS). */
1060
1177
  maxTurns: Object.freeze({
@@ -1078,13 +1195,13 @@ function isWithinWorkflowJobRange(member, value3) {
1078
1195
  return typeof value3 === "number" && Number.isInteger(value3) && value3 >= min && value3 <= max;
1079
1196
  }
1080
1197
  __name(isWithinWorkflowJobRange, "isWithinWorkflowJobRange");
1081
- __name2(isWithinWorkflowJobRange, "isWithinWorkflowJobRange");
1198
+ __name3(isWithinWorkflowJobRange, "isWithinWorkflowJobRange");
1082
1199
  function workflowJobRangeMessage(member) {
1083
1200
  const { min, max } = WORKFLOW_JOB_RANGES[member];
1084
1201
  return `\`${member}\` must be an integer ${min}..${max}`;
1085
1202
  }
1086
1203
  __name(workflowJobRangeMessage, "workflowJobRangeMessage");
1087
- __name2(workflowJobRangeMessage, "workflowJobRangeMessage");
1204
+ __name3(workflowJobRangeMessage, "workflowJobRangeMessage");
1088
1205
  var WORKFLOW_SINGLE_STEP_TYPES = [
1089
1206
  "agent",
1090
1207
  "tool",
@@ -1108,33 +1225,33 @@ function isWorkflowSingleStepType(type) {
1108
1225
  return typeof type === "string" && WORKFLOW_SINGLE_STEP_TYPES.includes(type);
1109
1226
  }
1110
1227
  __name(isWorkflowSingleStepType, "isWorkflowSingleStepType");
1111
- __name2(isWorkflowSingleStepType, "isWorkflowSingleStepType");
1228
+ __name3(isWorkflowSingleStepType, "isWorkflowSingleStepType");
1112
1229
  function isWorkflowHitlEntryType(type) {
1113
1230
  return typeof type === "string" && WORKFLOW_HITL_ENTRY_TYPES.includes(type);
1114
1231
  }
1115
1232
  __name(isWorkflowHitlEntryType, "isWorkflowHitlEntryType");
1116
- __name2(isWorkflowHitlEntryType, "isWorkflowHitlEntryType");
1233
+ __name3(isWorkflowHitlEntryType, "isWorkflowHitlEntryType");
1117
1234
  function isWorkflowArmEntryType(type) {
1118
1235
  return typeof type === "string" && WORKFLOW_ARM_ENTRY_TYPES.includes(type);
1119
1236
  }
1120
1237
  __name(isWorkflowArmEntryType, "isWorkflowArmEntryType");
1121
- __name2(isWorkflowArmEntryType, "isWorkflowArmEntryType");
1238
+ __name3(isWorkflowArmEntryType, "isWorkflowArmEntryType");
1122
1239
  function workflowContainerRunsHitlArm(container) {
1123
1240
  return typeof container === "string" && WORKFLOW_HITL_ARM_CONTAINERS.includes(container);
1124
1241
  }
1125
1242
  __name(workflowContainerRunsHitlArm, "workflowContainerRunsHitlArm");
1126
- __name2(workflowContainerRunsHitlArm, "workflowContainerRunsHitlArm");
1243
+ __name3(workflowContainerRunsHitlArm, "workflowContainerRunsHitlArm");
1127
1244
  function workflowHitlArmUnsupportedMessage(type, id2, container) {
1128
1245
  const legal = WORKFLOW_HITL_ARM_CONTAINERS.map((c) => `\`${c}\``).join(" / ");
1129
1246
  return `the engine does not run \`${type}\` inside a \`${container}\` yet (node "${id2}") \u2014 place it at the top level, as a ${legal} arm, or inside a child \`workflow\``;
1130
1247
  }
1131
1248
  __name(workflowHitlArmUnsupportedMessage, "workflowHitlArmUnsupportedMessage");
1132
- __name2(workflowHitlArmUnsupportedMessage, "workflowHitlArmUnsupportedMessage");
1249
+ __name3(workflowHitlArmUnsupportedMessage, "workflowHitlArmUnsupportedMessage");
1133
1250
  function workflowHitlArmShapeMessage(type, id2, shape) {
1134
1251
  return shape === "mapped-arm" ? `\`${type}\` arm "${id2}" takes the previous output as its payload \u2014 it cannot head a [mapping, step] chain; map before the container instead` : `a chunked foreach hands each child a slice of items, not one \u2014 \`${type}\` body "${id2}" takes one item; drop \`chunk\``;
1135
1252
  }
1136
1253
  __name(workflowHitlArmShapeMessage, "workflowHitlArmShapeMessage");
1137
- __name2(workflowHitlArmShapeMessage, "workflowHitlArmShapeMessage");
1254
+ __name3(workflowHitlArmShapeMessage, "workflowHitlArmShapeMessage");
1138
1255
  var WORKFLOW_GRAPH_ENTRY_STEP_KINDS = Object.freeze({
1139
1256
  agent: "agent",
1140
1257
  tool: "tool",
@@ -1167,13 +1284,13 @@ function isModelIdSentinel(input) {
1167
1284
  return lower === "auto" || lower.startsWith("auto/");
1168
1285
  }
1169
1286
  __name(isModelIdSentinel, "isModelIdSentinel");
1170
- __name2(isModelIdSentinel, "isModelIdSentinel");
1287
+ __name3(isModelIdSentinel, "isModelIdSentinel");
1171
1288
  var MODEL_CLASS_REF_PREFIX = "class/";
1172
1289
  function isModelClassRef(input) {
1173
1290
  return modelClassOf(input) !== void 0;
1174
1291
  }
1175
1292
  __name(isModelClassRef, "isModelClassRef");
1176
- __name2(isModelClassRef, "isModelClassRef");
1293
+ __name3(isModelClassRef, "isModelClassRef");
1177
1294
  function modelClassOf(input) {
1178
1295
  const lower = (input ?? "").trim().toLowerCase();
1179
1296
  if (!lower.startsWith(MODEL_CLASS_REF_PREFIX)) return void 0;
@@ -1181,12 +1298,12 @@ function modelClassOf(input) {
1181
1298
  return WORKFLOW_MODEL_CLASSES.includes(c) ? c : void 0;
1182
1299
  }
1183
1300
  __name(modelClassOf, "modelClassOf");
1184
- __name2(modelClassOf, "modelClassOf");
1301
+ __name3(modelClassOf, "modelClassOf");
1185
1302
  function modelClassRef(modelClass) {
1186
1303
  return `${MODEL_CLASS_REF_PREFIX}${modelClass}`;
1187
1304
  }
1188
1305
  __name(modelClassRef, "modelClassRef");
1189
- __name2(modelClassRef, "modelClassRef");
1306
+ __name3(modelClassRef, "modelClassRef");
1190
1307
  function normalizeModelId(input, registry) {
1191
1308
  const requested = typeof input === "string" ? input.trim() : "";
1192
1309
  if (!requested) return {
@@ -1260,7 +1377,7 @@ function normalizeModelId(input, registry) {
1260
1377
  };
1261
1378
  }
1262
1379
  __name(normalizeModelId, "normalizeModelId");
1263
- __name2(normalizeModelId, "normalizeModelId");
1380
+ __name3(normalizeModelId, "normalizeModelId");
1264
1381
  function modelUnresolvedMessage(r) {
1265
1382
  if (r.reason === "empty") return "model pin is empty \u2014 pin an approved model (provider/model) or omit `model`";
1266
1383
  if (r.reason === "ambiguous") {
@@ -1269,12 +1386,12 @@ function modelUnresolvedMessage(r) {
1269
1386
  return r.candidates.length ? `model "${r.requested}" does not resolve to an approved model \u2014 accepted forms: ${r.candidates.join(", ")}` : `model "${r.requested}" does not resolve to an approved model \u2014 accepted forms are the registry's provider-prefixed ids (provider/model) or a bare id that names exactly one of them`;
1270
1387
  }
1271
1388
  __name(modelUnresolvedMessage, "modelUnresolvedMessage");
1272
- __name2(modelUnresolvedMessage, "modelUnresolvedMessage");
1389
+ __name3(modelUnresolvedMessage, "modelUnresolvedMessage");
1273
1390
  function modelClassUnresolvedMessage(ref) {
1274
1391
  return `model "${ref.trim()}" is a model-class request that was not resolved before dispatch \u2014 a class is resolved to a concrete approved model by the class map at dispatch, and is never sent to a provider as written; this step refuses rather than run on a substituted model`;
1275
1392
  }
1276
1393
  __name(modelClassUnresolvedMessage, "modelClassUnresolvedMessage");
1277
- __name2(modelClassUnresolvedMessage, "modelClassUnresolvedMessage");
1394
+ __name3(modelClassUnresolvedMessage, "modelClassUnresolvedMessage");
1278
1395
  function providerModelId(code) {
1279
1396
  const requested = typeof code === "string" ? code.trim() : "";
1280
1397
  if (!requested || isModelIdSentinel(requested)) return requested;
@@ -1285,13 +1402,13 @@ function providerModelId(code) {
1285
1402
  return requested.slice(slash + 1);
1286
1403
  }
1287
1404
  __name(providerModelId, "providerModelId");
1288
- __name2(providerModelId, "providerModelId");
1405
+ __name3(providerModelId, "providerModelId");
1289
1406
  var MODEL_SNAPSHOT_SUFFIX = /(?:[-@](?:19|20)\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])|-(?:19|20)\d{2}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01]))$/;
1290
1407
  function providerModelFamily(code) {
1291
1408
  return providerModelId(code).toLowerCase().replace(MODEL_SNAPSHOT_SUFFIX, "");
1292
1409
  }
1293
1410
  __name(providerModelFamily, "providerModelFamily");
1294
- __name2(providerModelFamily, "providerModelFamily");
1411
+ __name3(providerModelFamily, "providerModelFamily");
1295
1412
  var IMPLICIT_MODEL_SELECTION_SOURCES = [
1296
1413
  "workspace-default",
1297
1414
  "platform-default"
@@ -1300,13 +1417,13 @@ function isImplicitModelSelectionSource(source) {
1300
1417
  return source !== void 0 && IMPLICIT_MODEL_SELECTION_SOURCES.includes(source);
1301
1418
  }
1302
1419
  __name(isImplicitModelSelectionSource, "isImplicitModelSelectionSource");
1303
- __name2(isImplicitModelSelectionSource, "isImplicitModelSelectionSource");
1420
+ __name3(isImplicitModelSelectionSource, "isImplicitModelSelectionSource");
1304
1421
  var PLATFORM_FALLBACK_MODEL_SOURCE = "platform-fallback";
1305
1422
  function isPlatformFallbackModelSource(source) {
1306
1423
  return source === PLATFORM_FALLBACK_MODEL_SOURCE;
1307
1424
  }
1308
1425
  __name(isPlatformFallbackModelSource, "isPlatformFallbackModelSource");
1309
- __name2(isPlatformFallbackModelSource, "isPlatformFallbackModelSource");
1426
+ __name3(isPlatformFallbackModelSource, "isPlatformFallbackModelSource");
1310
1427
  function resolveRequireToolApproval(rules) {
1311
1428
  const raw = rules?.requireToolApproval ?? rules?.requireApproval;
1312
1429
  if (raw === void 0 || raw === null) return void 0;
@@ -1316,7 +1433,7 @@ function resolveRequireToolApproval(rules) {
1316
1433
  return list.filter((t) => typeof t === "string");
1317
1434
  }
1318
1435
  __name(resolveRequireToolApproval, "resolveRequireToolApproval");
1319
- __name2(resolveRequireToolApproval, "resolveRequireToolApproval");
1436
+ __name3(resolveRequireToolApproval, "resolveRequireToolApproval");
1320
1437
  var AGENT_NAME_TOKEN = "[Your Agent Name]";
1321
1438
  var DEFAULT_PERSONA_GUIDE = `# ${AGENT_NAME_TOKEN} - Persona
1322
1439
 
@@ -1368,7 +1485,7 @@ function buildDefaultPersona(agentName) {
1368
1485
  return DEFAULT_PERSONA_GUIDE.replace(AGENT_NAME_TOKEN, () => agentName || "My Agent");
1369
1486
  }
1370
1487
  __name(buildDefaultPersona, "buildDefaultPersona");
1371
- __name2(buildDefaultPersona, "buildDefaultPersona");
1488
+ __name3(buildDefaultPersona, "buildDefaultPersona");
1372
1489
  var PERSONAL_SPACE_STARTING_PERSONA = `# ${AGENT_NAME_TOKEN}
1373
1490
 
1374
1491
  You are ${AGENT_NAME_TOKEN}, the assistant for whoever is chatting with you here. Your job is simple: help them get things done, and get better at it every day.
@@ -1405,7 +1522,7 @@ function buildPersonalSpaceStartingPersona(agentName) {
1405
1522
  return PERSONAL_SPACE_STARTING_PERSONA.replace(new RegExp(AGENT_NAME_TOKEN.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g"), () => agentName || "Your assistant");
1406
1523
  }
1407
1524
  __name(buildPersonalSpaceStartingPersona, "buildPersonalSpaceStartingPersona");
1408
- __name2(buildPersonalSpaceStartingPersona, "buildPersonalSpaceStartingPersona");
1525
+ __name3(buildPersonalSpaceStartingPersona, "buildPersonalSpaceStartingPersona");
1409
1526
  var AGENT_LOG_SOURCES = [
1410
1527
  "skill",
1411
1528
  "job",
@@ -1425,7 +1542,8 @@ var AGENT_LOG_SOURCES = [
1425
1542
  "model-resolver",
1426
1543
  "workflow-step",
1427
1544
  "workflow-script",
1428
- "workflow"
1545
+ "workflow",
1546
+ "supervision"
1429
1547
  ];
1430
1548
  var AGENT_LOG_FIELDS_MAX_WIRE_KEYS = LOG_FIELDS_MAX_KEYS + 1;
1431
1549
  function utf8Bytes(value3) {
@@ -1455,14 +1573,14 @@ function utf8Bytes(value3) {
1455
1573
  return bytes;
1456
1574
  }
1457
1575
  __name(utf8Bytes, "utf8Bytes");
1458
- __name2(utf8Bytes, "utf8Bytes");
1576
+ __name3(utf8Bytes, "utf8Bytes");
1459
1577
  function isPlainFieldKey(key) {
1460
1578
  if (!LOG_FIELD_KEY_PATTERN.test(key)) return false;
1461
1579
  if (key === LOG_FIELDS_CLAMPED_KEY) return false;
1462
1580
  return !LOG_FIELD_SECRET_SHAPED_KEY_PATTERNS.some((pattern) => pattern.test(key));
1463
1581
  }
1464
1582
  __name(isPlainFieldKey, "isPlainFieldKey");
1465
- __name2(isPlainFieldKey, "isPlainFieldKey");
1583
+ __name3(isPlainFieldKey, "isPlainFieldKey");
1466
1584
  function describeAgentLogFieldsViolation(value3) {
1467
1585
  if (typeof value3 !== "object" || value3 === null || Array.isArray(value3)) {
1468
1586
  return "fields must be an object";
@@ -1506,12 +1624,12 @@ function describeAgentLogFieldsViolation(value3) {
1506
1624
  return void 0;
1507
1625
  }
1508
1626
  __name(describeAgentLogFieldsViolation, "describeAgentLogFieldsViolation");
1509
- __name2(describeAgentLogFieldsViolation, "describeAgentLogFieldsViolation");
1627
+ __name3(describeAgentLogFieldsViolation, "describeAgentLogFieldsViolation");
1510
1628
  function isAgentLogFields(value3) {
1511
1629
  return describeAgentLogFieldsViolation(value3) === void 0;
1512
1630
  }
1513
1631
  __name(isAgentLogFields, "isAgentLogFields");
1514
- __name2(isAgentLogFields, "isAgentLogFields");
1632
+ __name3(isAgentLogFields, "isAgentLogFields");
1515
1633
  var LOG_DRAIN_TYPES_PHASE1 = [
1516
1634
  "http",
1517
1635
  "otlp",
@@ -1553,7 +1671,7 @@ function maxDrainsForTier(tier) {
1553
1671
  return tier === "enterprise" ? LOG_DRAIN_MAX_PER_ORG_ENTERPRISE : LOG_DRAIN_MAX_PER_ORG;
1554
1672
  }
1555
1673
  __name(maxDrainsForTier, "maxDrainsForTier");
1556
- __name2(maxDrainsForTier, "maxDrainsForTier");
1674
+ __name3(maxDrainsForTier, "maxDrainsForTier");
1557
1675
  var LOG_DRAIN_DATADOG_SITES = [
1558
1676
  "datadoghq.com",
1559
1677
  "datadoghq.eu",
@@ -1581,7 +1699,7 @@ function resolvePresetEndpoint(type, site) {
1581
1699
  return template3.replace("{site}", site);
1582
1700
  }
1583
1701
  __name(resolvePresetEndpoint, "resolvePresetEndpoint");
1584
- __name2(resolvePresetEndpoint, "resolvePresetEndpoint");
1702
+ __name3(resolvePresetEndpoint, "resolvePresetEndpoint");
1585
1703
  var LOG_DRAIN_BUCKET_NAME_PATTERN = /^[a-z0-9][a-z0-9-]{1,61}[a-z0-9]$/;
1586
1704
  var LOG_DRAIN_BUCKET_HOST_PATTERNS = Object.freeze({
1587
1705
  aws: [
@@ -1603,7 +1721,7 @@ function isLogDrainBucketHostAllowed(provider, host) {
1603
1721
  return (LOG_DRAIN_BUCKET_HOST_PATTERNS[provider] ?? []).some((pattern) => pattern.test(normalized));
1604
1722
  }
1605
1723
  __name(isLogDrainBucketHostAllowed, "isLogDrainBucketHostAllowed");
1606
- __name2(isLogDrainBucketHostAllowed, "isLogDrainBucketHostAllowed");
1724
+ __name3(isLogDrainBucketHostAllowed, "isLogDrainBucketHostAllowed");
1607
1725
  function resolveDrainBucketEndpoint(bucket) {
1608
1726
  if (!LOG_DRAIN_BUCKET_NAME_PATTERN.test(bucket.bucket)) {
1609
1727
  throw new Error("log drain bucket name is not a valid S3 bucket label");
@@ -1624,12 +1742,12 @@ function resolveDrainBucketEndpoint(bucket) {
1624
1742
  return `https://${url.host}/${bucket.bucket}`;
1625
1743
  }
1626
1744
  __name(resolveDrainBucketEndpoint, "resolveDrainBucketEndpoint");
1627
- __name2(resolveDrainBucketEndpoint, "resolveDrainBucketEndpoint");
1745
+ __name3(resolveDrainBucketEndpoint, "resolveDrainBucketEndpoint");
1628
1746
  function drainBucketUsesPathStyle(provider) {
1629
1747
  return provider !== "aws";
1630
1748
  }
1631
1749
  __name(drainBucketUsesPathStyle, "drainBucketUsesPathStyle");
1632
- __name2(drainBucketUsesPathStyle, "drainBucketUsesPathStyle");
1750
+ __name3(drainBucketUsesPathStyle, "drainBucketUsesPathStyle");
1633
1751
  function presetIntakeHosts(type) {
1634
1752
  const template3 = LOG_DRAIN_ENDPOINT_TEMPLATES[type];
1635
1753
  const sites = LOG_DRAIN_PRESET_SITES[type];
@@ -1644,7 +1762,7 @@ function presetIntakeHosts(type) {
1644
1762
  return hosts;
1645
1763
  }
1646
1764
  __name(presetIntakeHosts, "presetIntakeHosts");
1647
- __name2(presetIntakeHosts, "presetIntakeHosts");
1765
+ __name3(presetIntakeHosts, "presetIntakeHosts");
1648
1766
  var LOG_DRAIN_PRESET_HOST_SUFFIXES = {
1649
1767
  axiom: [
1650
1768
  ".axiom.co"
@@ -1660,7 +1778,7 @@ function presetHostAllowlist(type) {
1660
1778
  ];
1661
1779
  }
1662
1780
  __name(presetHostAllowlist, "presetHostAllowlist");
1663
- __name2(presetHostAllowlist, "presetHostAllowlist");
1781
+ __name3(presetHostAllowlist, "presetHostAllowlist");
1664
1782
  function drainHostAllowlistAllows(allowlist, host) {
1665
1783
  const needle = host.toLowerCase();
1666
1784
  return allowlist.some((raw) => {
@@ -1670,25 +1788,25 @@ function drainHostAllowlistAllows(allowlist, host) {
1670
1788
  });
1671
1789
  }
1672
1790
  __name(drainHostAllowlistAllows, "drainHostAllowlistAllows");
1673
- __name2(drainHostAllowlistAllows, "drainHostAllowlistAllows");
1791
+ __name3(drainHostAllowlistAllows, "drainHostAllowlistAllows");
1674
1792
  function drainDestinationIsVendorPinned(type) {
1675
1793
  if (LOG_DRAIN_ENDPOINT_TEMPLATES[type]) return true;
1676
1794
  return presetHostAllowlist(type).length > 0;
1677
1795
  }
1678
1796
  __name(drainDestinationIsVendorPinned, "drainDestinationIsVendorPinned");
1679
- __name2(drainDestinationIsVendorPinned, "drainDestinationIsVendorPinned");
1797
+ __name3(drainDestinationIsVendorPinned, "drainDestinationIsVendorPinned");
1680
1798
  function drainVerificationOwnership(input) {
1681
1799
  if (input.proved === true) return "verified";
1682
1800
  if (input.mode === "test-post" && drainDestinationIsVendorPinned(input.type)) return "verified";
1683
1801
  return "reachability-only";
1684
1802
  }
1685
1803
  __name(drainVerificationOwnership, "drainVerificationOwnership");
1686
- __name2(drainVerificationOwnership, "drainVerificationOwnership");
1804
+ __name3(drainVerificationOwnership, "drainVerificationOwnership");
1687
1805
  function drainOwnershipOrDefault(ownership) {
1688
1806
  return ownership === "verified" ? "verified" : "reachability-only";
1689
1807
  }
1690
1808
  __name(drainOwnershipOrDefault, "drainOwnershipOrDefault");
1691
- __name2(drainOwnershipOrDefault, "drainOwnershipOrDefault");
1809
+ __name3(drainOwnershipOrDefault, "drainOwnershipOrDefault");
1692
1810
  var DRAIN_CONTENT_ACK_ERROR_CODE = "DRAIN_CONTENT_ACK_REQUIRED";
1693
1811
  var DRAIN_CONTENT_ACK_FIELD = "includeContentAck";
1694
1812
  var DrainContentAckRequiredError = class extends Error {
@@ -1696,7 +1814,7 @@ var DrainContentAckRequiredError = class extends Error {
1696
1814
  __name(this, "DrainContentAckRequiredError");
1697
1815
  }
1698
1816
  static {
1699
- __name2(this, "DrainContentAckRequiredError");
1817
+ __name3(this, "DrainContentAckRequiredError");
1700
1818
  }
1701
1819
  code = DRAIN_CONTENT_ACK_ERROR_CODE;
1702
1820
  field = DRAIN_CONTENT_ACK_FIELD;
@@ -1719,7 +1837,7 @@ function assertDrainContentAck(input) {
1719
1837
  };
1720
1838
  }
1721
1839
  __name(assertDrainContentAck, "assertDrainContentAck");
1722
- __name2(assertDrainContentAck, "assertDrainContentAck");
1840
+ __name3(assertDrainContentAck, "assertDrainContentAck");
1723
1841
  var LOG_DRAIN_PRESET_PATHS = {
1724
1842
  // https://docs.splunk.com/Documentation/Splunk/latest/Data/HECExamples
1725
1843
  splunk: {
@@ -1802,13 +1920,13 @@ function composePresetEndpoint(type, endpoint) {
1802
1920
  };
1803
1921
  }
1804
1922
  __name(composePresetEndpoint, "composePresetEndpoint");
1805
- __name2(composePresetEndpoint, "composePresetEndpoint");
1923
+ __name3(composePresetEndpoint, "composePresetEndpoint");
1806
1924
  function joinPresetEndpointToken(endpoint, token) {
1807
1925
  if (typeof token !== "string" || !PRESET_SEGMENT_RE.test(token)) return endpoint;
1808
1926
  return endpoint.endsWith("/") ? `${endpoint}${token}` : `${endpoint}/${token}`;
1809
1927
  }
1810
1928
  __name(joinPresetEndpointToken, "joinPresetEndpointToken");
1811
- __name2(joinPresetEndpointToken, "joinPresetEndpointToken");
1929
+ __name3(joinPresetEndpointToken, "joinPresetEndpointToken");
1812
1930
  var LOG_DRAIN_QUOTAS = {
1813
1931
  team: {
1814
1932
  eventsPerDay: 1e6,
@@ -1831,18 +1949,18 @@ function nextLogDrainQuotaResetAt(now) {
1831
1949
  return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() + 1)).toISOString();
1832
1950
  }
1833
1951
  __name(nextLogDrainQuotaResetAt, "nextLogDrainQuotaResetAt");
1834
- __name2(nextLogDrainQuotaResetAt, "nextLogDrainQuotaResetAt");
1952
+ __name3(nextLogDrainQuotaResetAt, "nextLogDrainQuotaResetAt");
1835
1953
  function logDrainQuotaWindowExpired(usage, now) {
1836
1954
  const resetsAt = Date.parse(usage?.resetsAt ?? "");
1837
1955
  if (!Number.isFinite(resetsAt)) return true;
1838
1956
  return now.getTime() >= resetsAt;
1839
1957
  }
1840
1958
  __name(logDrainQuotaWindowExpired, "logDrainQuotaWindowExpired");
1841
- __name2(logDrainQuotaWindowExpired, "logDrainQuotaWindowExpired");
1959
+ __name3(logDrainQuotaWindowExpired, "logDrainQuotaWindowExpired");
1842
1960
  function logDrainQuotaRatio(usage, now) {
1843
1961
  if (!usage) return 0;
1844
1962
  if (now && logDrainQuotaWindowExpired(usage, now)) return 0;
1845
- const dimension = /* @__PURE__ */ __name2((used, limit) => {
1963
+ const dimension = /* @__PURE__ */ __name3((used, limit) => {
1846
1964
  if (!Number.isFinite(limit) || limit <= 0) return 0;
1847
1965
  if (!Number.isFinite(used) || used <= 0) return 0;
1848
1966
  return used / limit;
@@ -1850,7 +1968,7 @@ function logDrainQuotaRatio(usage, now) {
1850
1968
  return Math.max(dimension(usage.usedEvents, usage.eventsPerDay), dimension(usage.usedBytes, usage.bytesPerDay));
1851
1969
  }
1852
1970
  __name(logDrainQuotaRatio, "logDrainQuotaRatio");
1853
- __name2(logDrainQuotaRatio, "logDrainQuotaRatio");
1971
+ __name3(logDrainQuotaRatio, "logDrainQuotaRatio");
1854
1972
  function logDrainQuotaDegradationForRatio(ratio) {
1855
1973
  if (!Number.isFinite(ratio)) return "none";
1856
1974
  if (ratio >= LOG_DRAIN_QUOTA_PAUSE_RATIO) return "paused";
@@ -1859,17 +1977,17 @@ function logDrainQuotaDegradationForRatio(ratio) {
1859
1977
  return "none";
1860
1978
  }
1861
1979
  __name(logDrainQuotaDegradationForRatio, "logDrainQuotaDegradationForRatio");
1862
- __name2(logDrainQuotaDegradationForRatio, "logDrainQuotaDegradationForRatio");
1980
+ __name3(logDrainQuotaDegradationForRatio, "logDrainQuotaDegradationForRatio");
1863
1981
  function logDrainQuotaDegradation(usage, now) {
1864
1982
  return logDrainQuotaDegradationForRatio(logDrainQuotaRatio(usage, now));
1865
1983
  }
1866
1984
  __name(logDrainQuotaDegradation, "logDrainQuotaDegradation");
1867
- __name2(logDrainQuotaDegradation, "logDrainQuotaDegradation");
1985
+ __name3(logDrainQuotaDegradation, "logDrainQuotaDegradation");
1868
1986
  function logDrainQuotaWarned(usage, now) {
1869
1987
  return logDrainQuotaRatio(usage, now) >= LOG_DRAIN_QUOTA_WARN_RATIO;
1870
1988
  }
1871
1989
  __name(logDrainQuotaWarned, "logDrainQuotaWarned");
1872
- __name2(logDrainQuotaWarned, "logDrainQuotaWarned");
1990
+ __name3(logDrainQuotaWarned, "logDrainQuotaWarned");
1873
1991
  function logDrainQuotaDroppedSeverities(degradation) {
1874
1992
  switch (degradation) {
1875
1993
  case "debug_dropped":
@@ -1886,7 +2004,7 @@ function logDrainQuotaDroppedSeverities(degradation) {
1886
2004
  }
1887
2005
  }
1888
2006
  __name(logDrainQuotaDroppedSeverities, "logDrainQuotaDroppedSeverities");
1889
- __name2(logDrainQuotaDroppedSeverities, "logDrainQuotaDroppedSeverities");
2007
+ __name3(logDrainQuotaDroppedSeverities, "logDrainQuotaDroppedSeverities");
1890
2008
  var LOG_EXPORT_SOURCES = [
1891
2009
  ...AGENT_LOG_SOURCES,
1892
2010
  "execution"
@@ -1901,7 +2019,7 @@ function isLogExportSource(source) {
1901
2019
  return LOG_EXPORT_SOURCES.includes(source);
1902
2020
  }
1903
2021
  __name(isLogExportSource, "isLogExportSource");
1904
- __name2(isLogExportSource, "isLogExportSource");
2022
+ __name3(isLogExportSource, "isLogExportSource");
1905
2023
  var LOG_DRAIN_NOTICE_RATE_LIMIT_MS = 60 * 6e4;
1906
2024
  var LOG_DRAIN_VERIFICATION_STALE_MS = 24 * 60 * 6e4;
1907
2025
  var LOG_DRAIN_DIGEST_INTERVAL_MS = 24 * 60 * 6e4;
@@ -1914,17 +2032,17 @@ function clamp(value3, max) {
1914
2032
  return trimmed.length <= max ? trimmed : `${trimmed.slice(0, max - 1)}\u2026`;
1915
2033
  }
1916
2034
  __name(clamp, "clamp");
1917
- __name2(clamp, "clamp");
2035
+ __name3(clamp, "clamp");
1918
2036
  function numberOr(value3, fallback) {
1919
2037
  return typeof value3 === "number" && Number.isFinite(value3) ? value3 : fallback;
1920
2038
  }
1921
2039
  __name(numberOr, "numberOr");
1922
- __name2(numberOr, "numberOr");
2040
+ __name3(numberOr, "numberOr");
1923
2041
  function isoOr(value3) {
1924
2042
  return typeof value3 === "string" && value3.length > 0 ? value3 : void 0;
1925
2043
  }
1926
2044
  __name(isoOr, "isoOr");
1927
- __name2(isoOr, "isoOr");
2045
+ __name3(isoOr, "isoOr");
1928
2046
  function logDrainNoticeView(drain, now) {
1929
2047
  const health = drain.health ?? {};
1930
2048
  const quota = drain.quota;
@@ -1952,18 +2070,18 @@ function logDrainNoticeView(drain, now) {
1952
2070
  return view;
1953
2071
  }
1954
2072
  __name(logDrainNoticeView, "logDrainNoticeView");
1955
- __name2(logDrainNoticeView, "logDrainNoticeView");
2073
+ __name3(logDrainNoticeView, "logDrainNoticeView");
1956
2074
  function logDrainHealthCardPath(orgId, drainId) {
1957
2075
  return `/orgs/${encodeURIComponent(orgId)}/log-drains/${encodeURIComponent(drainId)}`;
1958
2076
  }
1959
2077
  __name(logDrainHealthCardPath, "logDrainHealthCardPath");
1960
- __name2(logDrainHealthCardPath, "logDrainHealthCardPath");
2078
+ __name3(logDrainHealthCardPath, "logDrainHealthCardPath");
1961
2079
  function percent(ratio) {
1962
2080
  if (!Number.isFinite(ratio) || ratio <= 0) return "0%";
1963
2081
  return `${Math.round(ratio * 100)}%`;
1964
2082
  }
1965
2083
  __name(percent, "percent");
1966
- __name2(percent, "percent");
2084
+ __name3(percent, "percent");
1967
2085
  function becauseClause(view) {
1968
2086
  const bits = [];
1969
2087
  if (view.lastStatusCode) bits.push(`HTTP ${view.lastStatusCode}`);
@@ -1971,7 +2089,7 @@ function becauseClause(view) {
1971
2089
  return bits.length ? ` Last error: ${bits.join(" \u2014 ")}.` : "";
1972
2090
  }
1973
2091
  __name(becauseClause, "becauseClause");
1974
- __name2(becauseClause, "becauseClause");
2092
+ __name3(becauseClause, "becauseClause");
1975
2093
  function logDrainNoticeCopy(payload) {
1976
2094
  const view = payload.drain;
1977
2095
  const name = view.name || view.id;
@@ -2040,7 +2158,7 @@ function logDrainNoticeCopy(payload) {
2040
2158
  }
2041
2159
  }
2042
2160
  __name(logDrainNoticeCopy, "logDrainNoticeCopy");
2043
- __name2(logDrainNoticeCopy, "logDrainNoticeCopy");
2161
+ __name3(logDrainNoticeCopy, "logDrainNoticeCopy");
2044
2162
  function logDrainNoticeLabel(kind) {
2045
2163
  switch (kind) {
2046
2164
  case "failing":
@@ -2062,7 +2180,7 @@ function logDrainNoticeLabel(kind) {
2062
2180
  }
2063
2181
  }
2064
2182
  __name(logDrainNoticeLabel, "logDrainNoticeLabel");
2065
- __name2(logDrainNoticeLabel, "logDrainNoticeLabel");
2183
+ __name3(logDrainNoticeLabel, "logDrainNoticeLabel");
2066
2184
  function logDrainNoticeDigestCopy(payload) {
2067
2185
  const entries = [
2068
2186
  ...payload.entries ?? []
@@ -2081,7 +2199,7 @@ function logDrainNoticeDigestCopy(payload) {
2081
2199
  };
2082
2200
  }
2083
2201
  __name(logDrainNoticeDigestCopy, "logDrainNoticeDigestCopy");
2084
- __name2(logDrainNoticeDigestCopy, "logDrainNoticeDigestCopy");
2202
+ __name3(logDrainNoticeDigestCopy, "logDrainNoticeDigestCopy");
2085
2203
  var LOG_DRAIN_USAGE_LINE_ITEM = "log_drain_events";
2086
2204
  var LOG_DRAIN_BYTES_PER_GIB = 1024 ** 3;
2087
2205
  var DEFAULT_LOG_DRAIN_PLAN_CONFIG = {
@@ -2127,7 +2245,7 @@ function finiteNonNegative(value3) {
2127
2245
  return typeof value3 === "number" && Number.isFinite(value3) && value3 >= 0 ? value3 : void 0;
2128
2246
  }
2129
2247
  __name(finiteNonNegative, "finiteNonNegative");
2130
- __name2(finiteNonNegative, "finiteNonNegative");
2248
+ __name3(finiteNonNegative, "finiteNonNegative");
2131
2249
  function mergeLimits(base, stored) {
2132
2250
  const patch = stored ?? {};
2133
2251
  return {
@@ -2136,7 +2254,7 @@ function mergeLimits(base, stored) {
2136
2254
  };
2137
2255
  }
2138
2256
  __name(mergeLimits, "mergeLimits");
2139
- __name2(mergeLimits, "mergeLimits");
2257
+ __name3(mergeLimits, "mergeLimits");
2140
2258
  function mergeCard(base, stored) {
2141
2259
  const patch = stored ?? {};
2142
2260
  return {
@@ -2147,7 +2265,7 @@ function mergeCard(base, stored) {
2147
2265
  };
2148
2266
  }
2149
2267
  __name(mergeCard, "mergeCard");
2150
- __name2(mergeCard, "mergeCard");
2268
+ __name3(mergeCard, "mergeCard");
2151
2269
  function resolveStoredLogDrainPlanConfig(stored) {
2152
2270
  const values = stored;
2153
2271
  if (!values || typeof values.version !== "number" || !Number.isFinite(values.version)) {
@@ -2183,12 +2301,12 @@ function resolveStoredLogDrainPlanConfig(stored) {
2183
2301
  };
2184
2302
  }
2185
2303
  __name(resolveStoredLogDrainPlanConfig, "resolveStoredLogDrainPlanConfig");
2186
- __name2(resolveStoredLogDrainPlanConfig, "resolveStoredLogDrainPlanConfig");
2304
+ __name3(resolveStoredLogDrainPlanConfig, "resolveStoredLogDrainPlanConfig");
2187
2305
  function logDrainPlanTierOverride(config, orgId) {
2188
2306
  return orgId ? config.orgs?.[orgId]?.tier : void 0;
2189
2307
  }
2190
2308
  __name(logDrainPlanTierOverride, "logDrainPlanTierOverride");
2191
- __name2(logDrainPlanTierOverride, "logDrainPlanTierOverride");
2309
+ __name3(logDrainPlanTierOverride, "logDrainPlanTierOverride");
2192
2310
  function logDrainQuotaLimitsFor(config, orgId, tier) {
2193
2311
  const base = config.tiers[tier] ?? config.tiers.team ?? LOG_DRAIN_QUOTAS.team;
2194
2312
  const override = orgId ? config.orgs?.[orgId] : void 0;
@@ -2201,7 +2319,7 @@ function logDrainQuotaLimitsFor(config, orgId, tier) {
2201
2319
  };
2202
2320
  }
2203
2321
  __name(logDrainQuotaLimitsFor, "logDrainQuotaLimitsFor");
2204
- __name2(logDrainQuotaLimitsFor, "logDrainQuotaLimitsFor");
2322
+ __name3(logDrainQuotaLimitsFor, "logDrainQuotaLimitsFor");
2205
2323
  function logDrainPriceCardFor(config, orgId, tier) {
2206
2324
  const base = config.pricing[tier] ?? config.pricing.team ?? DEFAULT_LOG_DRAIN_PLAN_CONFIG.pricing.team;
2207
2325
  const override = orgId ? config.orgs?.[orgId]?.pricing : void 0;
@@ -2210,7 +2328,7 @@ function logDrainPriceCardFor(config, orgId, tier) {
2210
2328
  };
2211
2329
  }
2212
2330
  __name(logDrainPriceCardFor, "logDrainPriceCardFor");
2213
- __name2(logDrainPriceCardFor, "logDrainPriceCardFor");
2331
+ __name3(logDrainPriceCardFor, "logDrainPriceCardFor");
2214
2332
  function priceDrainUsage(totals, card, tier) {
2215
2333
  const billableRecords = Math.max(0, Math.floor(finiteNonNegative(totals?.billableRecords) ?? 0));
2216
2334
  const billableBytes = Math.max(0, Math.floor(finiteNonNegative(totals?.billableBytes) ?? 0));
@@ -2221,7 +2339,7 @@ function priceDrainUsage(totals, card, tier) {
2221
2339
  const eventsUsd = overageEvents / 1e6 * card.usdPerMillionEvents;
2222
2340
  const bytesUsd = overageBytes / LOG_DRAIN_BYTES_PER_GIB * card.usdPerGiB;
2223
2341
  const unpriced = card.usdPerMillionEvents === 0 && card.usdPerGiB === 0;
2224
- const round = /* @__PURE__ */ __name2((usd) => Math.round(usd * 100) / 100, "round");
2342
+ const round = /* @__PURE__ */ __name3((usd) => Math.round(usd * 100) / 100, "round");
2225
2343
  return {
2226
2344
  lineItem: LOG_DRAIN_USAGE_LINE_ITEM,
2227
2345
  tier,
@@ -2238,7 +2356,7 @@ function priceDrainUsage(totals, card, tier) {
2238
2356
  };
2239
2357
  }
2240
2358
  __name(priceDrainUsage, "priceDrainUsage");
2241
- __name2(priceDrainUsage, "priceDrainUsage");
2359
+ __name3(priceDrainUsage, "priceDrainUsage");
2242
2360
  var LOG_CURSOR_MAX_LENGTH = 512;
2243
2361
  var LOG_CURSOR_MAX_ID_LENGTH = 128;
2244
2362
  var LOG_RELATIVE_TIME_PATTERN = /^(\d{1,9})([smhd])$/;
@@ -2256,7 +2374,7 @@ function encodeLogCursor(c) {
2256
2374
  }), "utf8").toString("base64url");
2257
2375
  }
2258
2376
  __name(encodeLogCursor, "encodeLogCursor");
2259
- __name2(encodeLogCursor, "encodeLogCursor");
2377
+ __name3(encodeLogCursor, "encodeLogCursor");
2260
2378
  function decodeLogCursor(raw) {
2261
2379
  if (typeof raw !== "string") return null;
2262
2380
  const trimmed = raw.trim();
@@ -2277,7 +2395,7 @@ function decodeLogCursor(raw) {
2277
2395
  };
2278
2396
  }
2279
2397
  __name(decodeLogCursor, "decodeLogCursor");
2280
- __name2(decodeLogCursor, "decodeLogCursor");
2398
+ __name3(decodeLogCursor, "decodeLogCursor");
2281
2399
  function parseLogTimeBound(raw, now = /* @__PURE__ */ new Date()) {
2282
2400
  if (typeof raw !== "string") return null;
2283
2401
  const value3 = raw.trim();
@@ -2295,7 +2413,7 @@ function parseLogTimeBound(raw, now = /* @__PURE__ */ new Date()) {
2295
2413
  return Number.isNaN(at) ? null : new Date(at);
2296
2414
  }
2297
2415
  __name(parseLogTimeBound, "parseLogTimeBound");
2298
- __name2(parseLogTimeBound, "parseLogTimeBound");
2416
+ __name3(parseLogTimeBound, "parseLogTimeBound");
2299
2417
  var CORE_DRAINING_CODE = "CORE_DRAINING";
2300
2418
  var CORE_DRAINING_DEFAULT_RETRY_MS = 1e3;
2301
2419
  var CORE_DRAINING_MAX_RETRY_MS = 5e3;
@@ -2303,13 +2421,13 @@ function isRecord(value3) {
2303
2421
  return typeof value3 === "object" && value3 !== null;
2304
2422
  }
2305
2423
  __name(isRecord, "isRecord");
2306
- __name2(isRecord, "isRecord");
2424
+ __name3(isRecord, "isRecord");
2307
2425
  function isCoreDrainingErrorResponse(value3) {
2308
2426
  if (!isRecord(value3) || !isRecord(value3.error)) return false;
2309
2427
  return value3.error.code === CORE_DRAINING_CODE && typeof value3.error.message === "string" && value3.error.retryable === true;
2310
2428
  }
2311
2429
  __name(isCoreDrainingErrorResponse, "isCoreDrainingErrorResponse");
2312
- __name2(isCoreDrainingErrorResponse, "isCoreDrainingErrorResponse");
2430
+ __name3(isCoreDrainingErrorResponse, "isCoreDrainingErrorResponse");
2313
2431
  function coreDrainingRetryDelayMs(retryAfter, nowMs = Date.now()) {
2314
2432
  if (retryAfter === null) return CORE_DRAINING_DEFAULT_RETRY_MS;
2315
2433
  const seconds = /^\d+$/.test(retryAfter.trim()) ? Number(retryAfter) : Number.NaN;
@@ -2318,7 +2436,7 @@ function coreDrainingRetryDelayMs(retryAfter, nowMs = Date.now()) {
2318
2436
  return Math.min(Math.max(0, delayMs), CORE_DRAINING_MAX_RETRY_MS);
2319
2437
  }
2320
2438
  __name(coreDrainingRetryDelayMs, "coreDrainingRetryDelayMs");
2321
- __name2(coreDrainingRetryDelayMs, "coreDrainingRetryDelayMs");
2439
+ __name3(coreDrainingRetryDelayMs, "coreDrainingRetryDelayMs");
2322
2440
  async function readCoreDrainingRetryDelayMs(response) {
2323
2441
  if (response.status !== 503) return null;
2324
2442
  try {
@@ -2330,7 +2448,7 @@ async function readCoreDrainingRetryDelayMs(response) {
2330
2448
  return coreDrainingRetryDelayMs(response.headers.get("Retry-After"));
2331
2449
  }
2332
2450
  __name(readCoreDrainingRetryDelayMs, "readCoreDrainingRetryDelayMs");
2333
- __name2(readCoreDrainingRetryDelayMs, "readCoreDrainingRetryDelayMs");
2451
+ __name3(readCoreDrainingRetryDelayMs, "readCoreDrainingRetryDelayMs");
2334
2452
  function waitForCoreDrain(delayMs, signal) {
2335
2453
  return new Promise((resolve, reject) => {
2336
2454
  if (signal?.aborted) {
@@ -2346,14 +2464,14 @@ function waitForCoreDrain(delayMs, signal) {
2346
2464
  reject(signal?.reason ?? new DOMException("Aborted", "AbortError"));
2347
2465
  }
2348
2466
  __name(onAbort, "onAbort");
2349
- __name2(onAbort, "onAbort");
2467
+ __name3(onAbort, "onAbort");
2350
2468
  signal?.addEventListener("abort", onAbort, {
2351
2469
  once: true
2352
2470
  });
2353
2471
  });
2354
2472
  }
2355
2473
  __name(waitForCoreDrain, "waitForCoreDrain");
2356
- __name2(waitForCoreDrain, "waitForCoreDrain");
2474
+ __name3(waitForCoreDrain, "waitForCoreDrain");
2357
2475
  async function fetchWithCoreDrainRetry(run, options = {}) {
2358
2476
  const first = await run();
2359
2477
  const delayMs = await readCoreDrainingRetryDelayMs(first);
@@ -2368,7 +2486,7 @@ async function fetchWithCoreDrainRetry(run, options = {}) {
2368
2486
  return run();
2369
2487
  }
2370
2488
  __name(fetchWithCoreDrainRetry, "fetchWithCoreDrainRetry");
2371
- __name2(fetchWithCoreDrainRetry, "fetchWithCoreDrainRetry");
2489
+ __name3(fetchWithCoreDrainRetry, "fetchWithCoreDrainRetry");
2372
2490
  var VoiceNameSchema = z.string().regex(/^[a-zA-Z0-9_-]+$/, "Voice name must contain only alphanumeric characters, underscores, or hyphens").min(1).max(64);
2373
2491
  var PluginProviderSchema = z.enum([
2374
2492
  "deepgram",
@@ -2627,7 +2745,7 @@ function resolveLuaJobTimeoutSeconds(timeout) {
2627
2745
  return resolved;
2628
2746
  }
2629
2747
  __name(resolveLuaJobTimeoutSeconds, "resolveLuaJobTimeoutSeconds");
2630
- __name2(resolveLuaJobTimeoutSeconds, "resolveLuaJobTimeoutSeconds");
2748
+ __name3(resolveLuaJobTimeoutSeconds, "resolveLuaJobTimeoutSeconds");
2631
2749
  function normalizeLuaJobExecutionTimeoutSeconds(timeout) {
2632
2750
  if (typeof timeout !== "number" || !Number.isFinite(timeout)) {
2633
2751
  return LUA_JOB_DEFAULT_TIMEOUT_SECONDS;
@@ -2635,7 +2753,7 @@ function normalizeLuaJobExecutionTimeoutSeconds(timeout) {
2635
2753
  return Math.min(Math.max(timeout, LUA_JOB_MIN_TIMEOUT_SECONDS), LUA_JOB_MAX_TIMEOUT_SECONDS);
2636
2754
  }
2637
2755
  __name(normalizeLuaJobExecutionTimeoutSeconds, "normalizeLuaJobExecutionTimeoutSeconds");
2638
- __name2(normalizeLuaJobExecutionTimeoutSeconds, "normalizeLuaJobExecutionTimeoutSeconds");
2756
+ __name3(normalizeLuaJobExecutionTimeoutSeconds, "normalizeLuaJobExecutionTimeoutSeconds");
2639
2757
  var KEYS = /* @__PURE__ */ new Set([
2640
2758
  "v",
2641
2759
  "kind",
@@ -2651,7 +2769,7 @@ function isId(value3) {
2651
2769
  return typeof value3 === "string" && value3.length > 0 && value3.length <= MAX_ID_LENGTH;
2652
2770
  }
2653
2771
  __name(isId, "isId");
2654
- __name2(isId, "isId");
2772
+ __name3(isId, "isId");
2655
2773
  function parseScheduledJobFire(raw) {
2656
2774
  if (new TextEncoder().encode(raw).byteLength > MAX_BODY_BYTES) {
2657
2775
  throw new Error("Invalid scheduled job fire: body is too large");
@@ -2699,14 +2817,14 @@ function parseScheduledJobFire(raw) {
2699
2817
  };
2700
2818
  }
2701
2819
  __name(parseScheduledJobFire, "parseScheduledJobFire");
2702
- __name2(parseScheduledJobFire, "parseScheduledJobFire");
2820
+ __name3(parseScheduledJobFire, "parseScheduledJobFire");
2703
2821
  var TEMPLATE_TRIGGER_URL_ENV_PREFIX = "LUA_TRIGGER_URL__";
2704
2822
  function triggerUrlEnvKey(triggerKey) {
2705
2823
  const upper = triggerKey.trim().replace(/[^A-Za-z0-9]+/g, "_").replace(/^_+|_+$/g, "").toUpperCase();
2706
2824
  return `${TEMPLATE_TRIGGER_URL_ENV_PREFIX}${upper}`;
2707
2825
  }
2708
2826
  __name(triggerUrlEnvKey, "triggerUrlEnvKey");
2709
- __name2(triggerUrlEnvKey, "triggerUrlEnvKey");
2827
+ __name3(triggerUrlEnvKey, "triggerUrlEnvKey");
2710
2828
  var TEMPLATE_INSTALL_POLICY_PER_WORKSPACE_VALUES = Object.freeze([
2711
2829
  "single",
2712
2830
  "multiple"
@@ -2746,7 +2864,7 @@ function deviceCredentialScopes(operations) {
2746
2864
  ];
2747
2865
  }
2748
2866
  __name(deviceCredentialScopes, "deviceCredentialScopes");
2749
- __name2(deviceCredentialScopes, "deviceCredentialScopes");
2867
+ __name3(deviceCredentialScopes, "deviceCredentialScopes");
2750
2868
  var DeviceBindingSchema = z2.object({
2751
2869
  agentId: z2.string().min(1).max(256),
2752
2870
  deviceName: z2.string().min(1).max(256),
@@ -2863,12 +2981,12 @@ function parsePrincipalContext(value3) {
2863
2981
  return parsed.success ? parsed.data : void 0;
2864
2982
  }
2865
2983
  __name(parsePrincipalContext, "parsePrincipalContext");
2866
- __name2(parsePrincipalContext, "parsePrincipalContext");
2984
+ __name3(parsePrincipalContext, "parsePrincipalContext");
2867
2985
  function isDeviceCredentialPrincipal(context) {
2868
2986
  return context?.credential.type === "deviceCredential";
2869
2987
  }
2870
2988
  __name(isDeviceCredentialPrincipal, "isDeviceCredentialPrincipal");
2871
- __name2(isDeviceCredentialPrincipal, "isDeviceCredentialPrincipal");
2989
+ __name3(isDeviceCredentialPrincipal, "isDeviceCredentialPrincipal");
2872
2990
  var DeviceCredentialClaimSchema = z2.object({
2873
2991
  credential: z2.object({
2874
2992
  type: z2.literal("deviceCredential")
@@ -2878,19 +2996,19 @@ function hasDeviceCredentialType(value3) {
2878
2996
  return DeviceCredentialClaimSchema.safeParse(value3).success;
2879
2997
  }
2880
2998
  __name(hasDeviceCredentialType, "hasDeviceCredentialType");
2881
- __name2(hasDeviceCredentialType, "hasDeviceCredentialType");
2999
+ __name3(hasDeviceCredentialType, "hasDeviceCredentialType");
2882
3000
  function sessionAuthTime(context) {
2883
3001
  if (!context || context.credential.type !== "firstPartySession") return void 0;
2884
3002
  const authTime = context.authTime;
2885
3003
  return typeof authTime === "number" && Number.isInteger(authTime) && authTime >= 0 && authTime <= SESSION_AUTH_TIME_MAX_S ? authTime : void 0;
2886
3004
  }
2887
3005
  __name(sessionAuthTime, "sessionAuthTime");
2888
- __name2(sessionAuthTime, "sessionAuthTime");
3006
+ __name3(sessionAuthTime, "sessionAuthTime");
2889
3007
  function isTypedApiKeyPrincipal(context) {
2890
3008
  return context?.subject.subjectType === "apiKey" && context.credential.type === "apiKey" && !context.compatibility;
2891
3009
  }
2892
3010
  __name(isTypedApiKeyPrincipal, "isTypedApiKeyPrincipal");
2893
- __name2(isTypedApiKeyPrincipal, "isTypedApiKeyPrincipal");
3011
+ __name3(isTypedApiKeyPrincipal, "isTypedApiKeyPrincipal");
2894
3012
  function typedApiKeyPrincipalId(context) {
2895
3013
  if (!context || !isTypedApiKeyPrincipal(context) || !context.subject.subjectId || context.credential.id !== context.subject.subjectId || context.actor?.actorType !== "apiKey" || context.actor.actorId !== context.subject.subjectId || context.owner?.type !== "user" || !context.owner.id) {
2896
3014
  return void 0;
@@ -2898,7 +3016,7 @@ function typedApiKeyPrincipalId(context) {
2898
3016
  return context.subject.subjectId;
2899
3017
  }
2900
3018
  __name(typedApiKeyPrincipalId, "typedApiKeyPrincipalId");
2901
- __name2(typedApiKeyPrincipalId, "typedApiKeyPrincipalId");
3019
+ __name3(typedApiKeyPrincipalId, "typedApiKeyPrincipalId");
2902
3020
  var LUA_CLIENT_APPS = [
2903
3021
  "desktop",
2904
3022
  "web",
@@ -2943,13 +3061,13 @@ function parseLuaClientHeader(value3) {
2943
3061
  return void 0;
2944
3062
  }
2945
3063
  __name(parseLuaClientHeader, "parseLuaClientHeader");
2946
- __name2(parseLuaClientHeader, "parseLuaClientHeader");
3064
+ __name3(parseLuaClientHeader, "parseLuaClientHeader");
2947
3065
  function serializeLuaClientHeader(client) {
2948
3066
  if (!client) return void 0;
2949
3067
  return `${client.app}/${client.version === "unknown" ? "unversioned" : client.version}`;
2950
3068
  }
2951
3069
  __name(serializeLuaClientHeader, "serializeLuaClientHeader");
2952
- __name2(serializeLuaClientHeader, "serializeLuaClientHeader");
3070
+ __name3(serializeLuaClientHeader, "serializeLuaClientHeader");
2953
3071
  function formatLuaClientHeader(app, version) {
2954
3072
  if (typeof version !== "string") return `${app}/unversioned`;
2955
3073
  const normalized = version.trim();
@@ -2958,7 +3076,7 @@ function formatLuaClientHeader(app, version) {
2958
3076
  return `${app}/unversioned`;
2959
3077
  }
2960
3078
  __name(formatLuaClientHeader, "formatLuaClientHeader");
2961
- __name2(formatLuaClientHeader, "formatLuaClientHeader");
3079
+ __name3(formatLuaClientHeader, "formatLuaClientHeader");
2962
3080
  function luaClientMetricLabels(client) {
2963
3081
  const canonical2 = parseLuaClientHeader(serializeLuaClientHeader(client));
2964
3082
  return {
@@ -2967,7 +3085,7 @@ function luaClientMetricLabels(client) {
2967
3085
  };
2968
3086
  }
2969
3087
  __name(luaClientMetricLabels, "luaClientMetricLabels");
2970
- __name2(luaClientMetricLabels, "luaClientMetricLabels");
3088
+ __name3(luaClientMetricLabels, "luaClientMetricLabels");
2971
3089
  var AUTHZ_PROJECTION_VERSION = 1;
2972
3090
  var ProjectedScopeSchema = z3.string().min(1).max(128);
2973
3091
  var DisplayRoleSchema = z3.object({
@@ -3116,29 +3234,29 @@ function parseEffectiveAuthorization(value3) {
3116
3234
  return parsed.success ? parsed.data : void 0;
3117
3235
  }
3118
3236
  __name(parseEffectiveAuthorization, "parseEffectiveAuthorization");
3119
- __name2(parseEffectiveAuthorization, "parseEffectiveAuthorization");
3237
+ __name3(parseEffectiveAuthorization, "parseEffectiveAuthorization");
3120
3238
  function parseResourcePage(value3) {
3121
3239
  const parsed = ResourcePageSchema.safeParse(value3);
3122
3240
  return parsed.success ? parsed.data : void 0;
3123
3241
  }
3124
3242
  __name(parseResourcePage, "parseResourcePage");
3125
- __name2(parseResourcePage, "parseResourcePage");
3243
+ __name3(parseResourcePage, "parseResourcePage");
3126
3244
  function capabilitiesFor(profiles, profileId) {
3127
3245
  if (!profileId) return [];
3128
3246
  return profiles[profileId] ?? [];
3129
3247
  }
3130
3248
  __name(capabilitiesFor, "capabilitiesFor");
3131
- __name2(capabilitiesFor, "capabilitiesFor");
3249
+ __name3(capabilitiesFor, "capabilitiesFor");
3132
3250
  function isKnownProfile(profiles, profileId) {
3133
3251
  return profileId !== void 0 && Object.prototype.hasOwnProperty.call(profiles, profileId);
3134
3252
  }
3135
3253
  __name(isKnownProfile, "isKnownProfile");
3136
- __name2(isKnownProfile, "isKnownProfile");
3254
+ __name3(isKnownProfile, "isKnownProfile");
3137
3255
  function hasCapability(profiles, profileId, required) {
3138
3256
  return capabilitiesFor(profiles, profileId).includes(required);
3139
3257
  }
3140
3258
  __name(hasCapability, "hasCapability");
3141
- __name2(hasCapability, "hasCapability");
3259
+ __name3(hasCapability, "hasCapability");
3142
3260
  function workflowJobId(id2) {
3143
3261
  switch (id2.kind) {
3144
3262
  case "start":
@@ -3194,48 +3312,48 @@ function workflowJobId(id2) {
3194
3312
  }
3195
3313
  }
3196
3314
  __name(workflowJobId, "workflowJobId");
3197
- __name2(workflowJobId, "workflowJobId");
3315
+ __name3(workflowJobId, "workflowJobId");
3198
3316
  function assertNever(id2) {
3199
3317
  throw new Error(`workflowJobId: unknown wake kind ${JSON.stringify(id2)}`);
3200
3318
  }
3201
3319
  __name(assertNever, "assertNever");
3202
- __name2(assertNever, "assertNever");
3320
+ __name3(assertNever, "assertNever");
3203
3321
  function agentStepJobId(msg) {
3204
3322
  return `${msg.runId}_${msg.stepId}_${msg.attempt}_x${msg.executionId}`;
3205
3323
  }
3206
3324
  __name(agentStepJobId, "agentStepJobId");
3207
- __name2(agentStepJobId, "agentStepJobId");
3325
+ __name3(agentStepJobId, "agentStepJobId");
3208
3326
  function heavyStepJobId(msg) {
3209
3327
  return `${msg.runId}_${msg.stepId}_${msg.attempt}_x${msg.executionId}`;
3210
3328
  }
3211
3329
  __name(heavyStepJobId, "heavyStepJobId");
3212
- __name2(heavyStepJobId, "heavyStepJobId");
3330
+ __name3(heavyStepJobId, "heavyStepJobId");
3213
3331
  function jobSpawnJobId(msg) {
3214
3332
  return `${msg.runId}_${msg.stepId}_${msg.attempt}_s${msg.segment}_${msg.executionId}`;
3215
3333
  }
3216
3334
  __name(jobSpawnJobId, "jobSpawnJobId");
3217
- __name2(jobSpawnJobId, "jobSpawnJobId");
3335
+ __name3(jobSpawnJobId, "jobSpawnJobId");
3218
3336
  function exportAutoJobId(exportId, suffix) {
3219
3337
  return suffix ? `${exportId}:${suffix}` : exportId;
3220
3338
  }
3221
3339
  __name(exportAutoJobId, "exportAutoJobId");
3222
- __name2(exportAutoJobId, "exportAutoJobId");
3340
+ __name3(exportAutoJobId, "exportAutoJobId");
3223
3341
  var SYSTEM_USER_PREFIX = "system:";
3224
3342
  function isSystemRun(identity) {
3225
3343
  return identity.userId.startsWith(SYSTEM_USER_PREFIX);
3226
3344
  }
3227
3345
  __name(isSystemRun, "isSystemRun");
3228
- __name2(isSystemRun, "isSystemRun");
3346
+ __name3(isSystemRun, "isSystemRun");
3229
3347
  function creatorUserId(identity) {
3230
3348
  return isSystemRun(identity) ? void 0 : identity.userId;
3231
3349
  }
3232
3350
  __name(creatorUserId, "creatorUserId");
3233
- __name2(creatorUserId, "creatorUserId");
3351
+ __name3(creatorUserId, "creatorUserId");
3234
3352
  function actingUserId(identity) {
3235
3353
  return creatorUserId(identity);
3236
3354
  }
3237
3355
  __name(actingUserId, "actingUserId");
3238
- __name2(actingUserId, "actingUserId");
3356
+ __name3(actingUserId, "actingUserId");
3239
3357
  var WORKFLOW_RUN_IN_FLIGHT = [
3240
3358
  "queued",
3241
3359
  "running",
@@ -3298,27 +3416,27 @@ function isWorkflowSignalEventSite(value3) {
3298
3416
  return typeof value3 === "string" && WORKFLOW_SIGNAL_EVENT_SITES.includes(value3);
3299
3417
  }
3300
3418
  __name(isWorkflowSignalEventSite, "isWorkflowSignalEventSite");
3301
- __name2(isWorkflowSignalEventSite, "isWorkflowSignalEventSite");
3419
+ __name3(isWorkflowSignalEventSite, "isWorkflowSignalEventSite");
3302
3420
  var ARCHIVE_WINDOW_MARGIN_DAYS = 7;
3303
3421
  function shouldSkipArchive(run, manifestSha256, sinkSha256) {
3304
3422
  if (!run.completedAt || !run.exportedAt || run.exportedAt < run.completedAt) return false;
3305
3423
  return !!manifestSha256 && manifestSha256 === sinkSha256;
3306
3424
  }
3307
3425
  __name(shouldSkipArchive, "shouldSkipArchive");
3308
- __name2(shouldSkipArchive, "shouldSkipArchive");
3426
+ __name3(shouldSkipArchive, "shouldSkipArchive");
3309
3427
  function isArchiveWindowTooOld(run, retentionDays, now = Date.now(), marginDays = ARCHIVE_WINDOW_MARGIN_DAYS) {
3310
3428
  if (!run.completedAt) return false;
3311
3429
  const cutoff = now - Math.max(retentionDays - marginDays, 0) * 864e5;
3312
3430
  return run.completedAt < cutoff;
3313
3431
  }
3314
3432
  __name(isArchiveWindowTooOld, "isArchiveWindowTooOld");
3315
- __name2(isArchiveWindowTooOld, "isArchiveWindowTooOld");
3433
+ __name3(isArchiveWindowTooOld, "isArchiveWindowTooOld");
3316
3434
  var WORKFLOW_ORG_PURGING_TTL_S = 7 * 86400;
3317
3435
  function workflowOrgPurgingKey(orgId) {
3318
3436
  return `wf:org:${orgId}:purging`;
3319
3437
  }
3320
3438
  __name(workflowOrgPurgingKey, "workflowOrgPurgingKey");
3321
- __name2(workflowOrgPurgingKey, "workflowOrgPurgingKey");
3439
+ __name3(workflowOrgPurgingKey, "workflowOrgPurgingKey");
3322
3440
  var WORKFLOW_ORG_PURGE_FORCE_AFTER_MS = 10 * 6e4;
3323
3441
  var IDEMPOTENCY_HOLDING_STATUSES = [
3324
3442
  ...WORKFLOW_RUN_IN_FLIGHT,
@@ -3331,22 +3449,22 @@ function isCloudTaskRunId(id2) {
3331
3449
  return id2.startsWith(CLOUD_TASK_RUN_ID_PREFIX);
3332
3450
  }
3333
3451
  __name(isCloudTaskRunId, "isCloudTaskRunId");
3334
- __name2(isCloudTaskRunId, "isCloudTaskRunId");
3452
+ __name3(isCloudTaskRunId, "isCloudTaskRunId");
3335
3453
  function isScheduledWorkflowRunId(id2) {
3336
3454
  return id2.startsWith(WORKFLOW_SCHEDULED_RUN_ID_PREFIX);
3337
3455
  }
3338
3456
  __name(isScheduledWorkflowRunId, "isScheduledWorkflowRunId");
3339
- __name2(isScheduledWorkflowRunId, "isScheduledWorkflowRunId");
3457
+ __name3(isScheduledWorkflowRunId, "isScheduledWorkflowRunId");
3340
3458
  function scheduledWorkflowRunId(jobId, scheduledTime) {
3341
3459
  const key = typeof scheduledTime === "number" ? String(scheduledTime) : scheduledTimeKey(scheduledTime);
3342
3460
  return `${WORKFLOW_SCHEDULED_RUN_ID_PREFIX}${jobId}_${key}`;
3343
3461
  }
3344
3462
  __name(scheduledWorkflowRunId, "scheduledWorkflowRunId");
3345
- __name2(scheduledWorkflowRunId, "scheduledWorkflowRunId");
3463
+ __name3(scheduledWorkflowRunId, "scheduledWorkflowRunId");
3346
3464
  var WORKFLOW_SCHEDULE_KEY_MAX = 128;
3347
3465
  function renderWorkflowScheduleKeyTemplate(template3, ctx) {
3348
3466
  if (!template3) return void 0;
3349
- const read = /* @__PURE__ */ __name2((path) => path.split(".").reduce((o, k) => o && typeof o === "object" ? o[k] : void 0, ctx.input), "read");
3467
+ const read = /* @__PURE__ */ __name3((path) => path.split(".").reduce((o, k) => o && typeof o === "object" ? o[k] : void 0, ctx.input), "read");
3350
3468
  let unresolved = false;
3351
3469
  const out = template3.replace(/\$\{\s*([a-zA-Z0-9_.]+)\s*\}/g, (_m, expr) => {
3352
3470
  let v = "";
@@ -3361,7 +3479,7 @@ function renderWorkflowScheduleKeyTemplate(template3, ctx) {
3361
3479
  return key && /^[A-Za-z0-9:_\-.\/]+$/.test(key) ? key : void 0;
3362
3480
  }
3363
3481
  __name(renderWorkflowScheduleKeyTemplate, "renderWorkflowScheduleKeyTemplate");
3364
- __name2(renderWorkflowScheduleKeyTemplate, "renderWorkflowScheduleKeyTemplate");
3482
+ __name3(renderWorkflowScheduleKeyTemplate, "renderWorkflowScheduleKeyTemplate");
3365
3483
  var WORKFLOW_SCHEDULE_IDEMPOTENCY_KEY_PREFIX = "sched:";
3366
3484
  function scheduledWorkflowIdempotencyKey(jobId, rendered) {
3367
3485
  const head = `${WORKFLOW_SCHEDULE_IDEMPOTENCY_KEY_PREFIX}${jobId}:`;
@@ -3371,7 +3489,7 @@ function scheduledWorkflowIdempotencyKey(jobId, rendered) {
3371
3489
  return `${head}${rendered.slice(0, Math.max(0, room))}~${digest}`;
3372
3490
  }
3373
3491
  __name(scheduledWorkflowIdempotencyKey, "scheduledWorkflowIdempotencyKey");
3374
- __name2(scheduledWorkflowIdempotencyKey, "scheduledWorkflowIdempotencyKey");
3492
+ __name3(scheduledWorkflowIdempotencyKey, "scheduledWorkflowIdempotencyKey");
3375
3493
  function stableKeyDigest(s) {
3376
3494
  let a = 2166136261;
3377
3495
  let b = 84696351;
@@ -3383,23 +3501,23 @@ function stableKeyDigest(s) {
3383
3501
  return (a >>> 0).toString(16).padStart(8, "0") + (b >>> 0).toString(16).padStart(8, "0");
3384
3502
  }
3385
3503
  __name(stableKeyDigest, "stableKeyDigest");
3386
- __name2(stableKeyDigest, "stableKeyDigest");
3504
+ __name3(stableKeyDigest, "stableKeyDigest");
3387
3505
  var WORKFLOW_OPERATION_ID_PREFIX = "wf:";
3388
3506
  function workflowOperationId(runId, stepId, billingEpoch) {
3389
3507
  return `${WORKFLOW_OPERATION_ID_PREFIX}${runId}:${stepId}:${billingEpoch}`;
3390
3508
  }
3391
3509
  __name(workflowOperationId, "workflowOperationId");
3392
- __name2(workflowOperationId, "workflowOperationId");
3510
+ __name3(workflowOperationId, "workflowOperationId");
3393
3511
  function workflowOccurrenceId(lineageId, stepId) {
3394
3512
  return `${lineageId}:${stepId}`;
3395
3513
  }
3396
3514
  __name(workflowOccurrenceId, "workflowOccurrenceId");
3397
- __name2(workflowOccurrenceId, "workflowOccurrenceId");
3515
+ __name3(workflowOccurrenceId, "workflowOccurrenceId");
3398
3516
  function workflowOrgSlotKey(orgId, kind) {
3399
3517
  return `wf:org:${orgId}:${kind}`;
3400
3518
  }
3401
3519
  __name(workflowOrgSlotKey, "workflowOrgSlotKey");
3402
- __name2(workflowOrgSlotKey, "workflowOrgSlotKey");
3520
+ __name3(workflowOrgSlotKey, "workflowOrgSlotKey");
3403
3521
  var WORKFLOW_CONNECTION_KEY_RE = /^[a-z][a-z0-9_-]{0,63}$/;
3404
3522
  var WORKFLOW_JOB_MODEL_SOURCE_LABELS = {
3405
3523
  stamp: "lease stamp",
@@ -3413,17 +3531,17 @@ function workflowJobModelSourceLabel(source) {
3413
3531
  return WORKFLOW_JOB_MODEL_SOURCE_LABELS[source];
3414
3532
  }
3415
3533
  __name(workflowJobModelSourceLabel, "workflowJobModelSourceLabel");
3416
- __name2(workflowJobModelSourceLabel, "workflowJobModelSourceLabel");
3534
+ __name3(workflowJobModelSourceLabel, "workflowJobModelSourceLabel");
3417
3535
  function scheduledTimeKey(scheduledTime) {
3418
3536
  return scheduledTime.replace(/[^0-9TZ]/g, "");
3419
3537
  }
3420
3538
  __name(scheduledTimeKey, "scheduledTimeKey");
3421
- __name2(scheduledTimeKey, "scheduledTimeKey");
3539
+ __name3(scheduledTimeKey, "scheduledTimeKey");
3422
3540
  function scheduledWorkflowRunIdForTime(jobId, scheduledTime) {
3423
3541
  return scheduledWorkflowRunId(jobId, scheduledTime);
3424
3542
  }
3425
3543
  __name(scheduledWorkflowRunIdForTime, "scheduledWorkflowRunIdForTime");
3426
- __name2(scheduledWorkflowRunIdForTime, "scheduledWorkflowRunIdForTime");
3544
+ __name3(scheduledWorkflowRunIdForTime, "scheduledWorkflowRunIdForTime");
3427
3545
  var WORKFLOW_SUSPEND_KINDS = [
3428
3546
  "input",
3429
3547
  "approval",
@@ -3436,18 +3554,227 @@ var WORKFLOW_RUN_NOTIFICATION_SUSPENDED_KINDS = [
3436
3554
  ];
3437
3555
  var WORKFLOW_SIGNAL_PAYLOAD_MAX_BYTES = 64 * 1024;
3438
3556
  var WORKFLOW_RESOLVE_OUTPUT_MAX_BYTES = 256 * 1024;
3557
+ var SCHEDULE_HEALTH_NOTIFY_CHANNELS = [
3558
+ "app",
3559
+ "email",
3560
+ "emailApp"
3561
+ ];
3562
+ var SCHEDULE_HEALTH_DEFAULT_NOTIFY = "emailApp";
3563
+ var SCHEDULE_HEALTH_LIMITS = {
3564
+ maxSilenceMinutes: {
3565
+ min: 5,
3566
+ max: 43200
3567
+ },
3568
+ alertAfterConsecutiveFailures: {
3569
+ min: 1,
3570
+ max: 50
3571
+ },
3572
+ /** The platform's auto-disable trip (PRO-726 / 07 §7.1.6): a streak can never pass it on these kinds. */
3573
+ parkedKindsMaxFailures: 3
3574
+ };
3575
+ var KNOWN_KEYS = /* @__PURE__ */ new Set([
3576
+ "maxSilenceMinutes",
3577
+ "alertAfterConsecutiveFailures",
3578
+ "notify"
3579
+ ]);
3580
+ function isInt(v) {
3581
+ return typeof v === "number" && Number.isInteger(v);
3582
+ }
3583
+ __name(isInt, "isInt");
3584
+ __name3(isInt, "isInt");
3585
+ function validateScheduleHealth(health, opts) {
3586
+ const base = opts.path ?? "health";
3587
+ const issues = [];
3588
+ if (health === null || typeof health !== "object" || Array.isArray(health)) {
3589
+ return [
3590
+ {
3591
+ code: "health-not-object",
3592
+ path: base,
3593
+ message: `${base} must be an object`
3594
+ }
3595
+ ];
3596
+ }
3597
+ const h = health;
3598
+ for (const key of Object.keys(h)) {
3599
+ if (!KNOWN_KEYS.has(key)) {
3600
+ issues.push({
3601
+ code: "health-unknown-field",
3602
+ path: `${base}.${key}`,
3603
+ message: `${base}.${key} is not a health field (maxSilenceMinutes, alertAfterConsecutiveFailures, notify)`
3604
+ });
3605
+ }
3606
+ }
3607
+ const silence = h.maxSilenceMinutes;
3608
+ const failures = h.alertAfterConsecutiveFailures;
3609
+ if (silence === void 0 && failures === void 0) {
3610
+ issues.push({
3611
+ code: "health-empty",
3612
+ path: base,
3613
+ message: `${base} needs maxSilenceMinutes and/or alertAfterConsecutiveFailures`
3614
+ });
3615
+ }
3616
+ const { min: sMin, max: sMax } = SCHEDULE_HEALTH_LIMITS.maxSilenceMinutes;
3617
+ if (silence !== void 0 && (!isInt(silence) || silence < sMin || silence > sMax)) {
3618
+ issues.push({
3619
+ code: "health-silence-invalid",
3620
+ path: `${base}.maxSilenceMinutes`,
3621
+ message: `${base}.maxSilenceMinutes must be an integer in ${sMin}..${sMax}`
3622
+ });
3623
+ }
3624
+ const fMin = SCHEDULE_HEALTH_LIMITS.alertAfterConsecutiveFailures.min;
3625
+ const fMax = opts.target === "workflow" ? SCHEDULE_HEALTH_LIMITS.parkedKindsMaxFailures : SCHEDULE_HEALTH_LIMITS.alertAfterConsecutiveFailures.max;
3626
+ if (failures !== void 0) {
3627
+ if (!isInt(failures) || failures < fMin) {
3628
+ issues.push({
3629
+ code: "health-failures-invalid",
3630
+ path: `${base}.alertAfterConsecutiveFailures`,
3631
+ message: `${base}.alertAfterConsecutiveFailures must be an integer in ${fMin}..${fMax}`
3632
+ });
3633
+ } else if (failures > fMax) {
3634
+ issues.push({
3635
+ code: opts.target === "workflow" ? "health-failures-unreachable" : "health-failures-invalid",
3636
+ path: `${base}.alertAfterConsecutiveFailures`,
3637
+ message: opts.target === "workflow" ? `${base}.alertAfterConsecutiveFailures must be \u2264 ${fMax}: a workflow schedule is turned off after ${fMax} consecutive failures, so a longer streak can never happen (the turn-off itself always alerts)` : `${base}.alertAfterConsecutiveFailures must be an integer in ${fMin}..${fMax}`
3638
+ });
3639
+ }
3640
+ }
3641
+ if (h.notify !== void 0 && !SCHEDULE_HEALTH_NOTIFY_CHANNELS.includes(h.notify)) {
3642
+ issues.push({
3643
+ code: "health-notify-invalid",
3644
+ path: `${base}.notify`,
3645
+ message: `${base}.notify must be one of ${SCHEDULE_HEALTH_NOTIFY_CHANNELS.join(", ")}`
3646
+ });
3647
+ }
3648
+ const triggers = (opts.triggers ?? []).filter((t) => !!t && typeof t === "object");
3649
+ if (opts.triggers !== void 0 && triggers.length === 0) {
3650
+ issues.push({
3651
+ code: "health-requires-schedule",
3652
+ path: base,
3653
+ message: `${base} needs a schedule to watch`
3654
+ });
3655
+ }
3656
+ if (isInt(silence) && triggers.length > 0) {
3657
+ if (triggers.every((t) => t.type === "once")) {
3658
+ issues.push({
3659
+ code: "health-silence-on-once",
3660
+ path: `${base}.maxSilenceMinutes`,
3661
+ message: `${base}.maxSilenceMinutes needs a recurring schedule; a one-time schedule has no cadence to fall silent against`
3662
+ });
3663
+ } else {
3664
+ const intervals = triggers.filter((t) => t.type === "interval" && isInt(t.seconds)).map((t) => t.seconds);
3665
+ const onlyIntervals = intervals.length === triggers.filter((t) => t.type !== "once").length;
3666
+ if (onlyIntervals && intervals.length > 0) {
3667
+ const fastest = Math.min(...intervals);
3668
+ if (silence * 60 <= fastest) {
3669
+ issues.push({
3670
+ code: "health-silence-shorter-than-interval",
3671
+ path: `${base}.maxSilenceMinutes`,
3672
+ message: `${base}.maxSilenceMinutes (${silence} min) must be longer than the schedule's interval (${fastest}s), or every healthy gap alerts`
3673
+ });
3674
+ }
3675
+ }
3676
+ }
3677
+ }
3678
+ return issues;
3679
+ }
3680
+ __name(validateScheduleHealth, "validateScheduleHealth");
3681
+ __name3(validateScheduleHealth, "validateScheduleHealth");
3682
+ function normalizeScheduleHealth(health) {
3683
+ return {
3684
+ ...health.maxSilenceMinutes !== void 0 ? {
3685
+ maxSilenceMinutes: health.maxSilenceMinutes
3686
+ } : {},
3687
+ ...health.alertAfterConsecutiveFailures !== void 0 ? {
3688
+ alertAfterConsecutiveFailures: health.alertAfterConsecutiveFailures
3689
+ } : {},
3690
+ notify: health.notify ?? SCHEDULE_HEALTH_DEFAULT_NOTIFY
3691
+ };
3692
+ }
3693
+ __name(normalizeScheduleHealth, "normalizeScheduleHealth");
3694
+ __name3(normalizeScheduleHealth, "normalizeScheduleHealth");
3695
+ function evaluateScheduleHealth(subject, now) {
3696
+ const parked = subject.status === "failed";
3697
+ if (parked) return {
3698
+ watched: true,
3699
+ condition: "auto_disabled"
3700
+ };
3701
+ if (subject.active === false || subject.status !== "active") return {
3702
+ watched: false,
3703
+ condition: null
3704
+ };
3705
+ const threshold = subject.health.alertAfterConsecutiveFailures;
3706
+ if (threshold !== void 0 && subject.consecutiveFailures >= threshold) {
3707
+ return {
3708
+ watched: true,
3709
+ condition: "failures"
3710
+ };
3711
+ }
3712
+ const window = subject.health.maxSilenceMinutes;
3713
+ if (window !== void 0) {
3714
+ const baseline = Math.max(subject.lastSucceededAt ?? 0, subject.state?.watchFrom ?? now);
3715
+ const silentMs = now - baseline;
3716
+ if (silentMs > window * 6e4) {
3717
+ return {
3718
+ watched: true,
3719
+ condition: "silence",
3720
+ silentForMinutes: Math.floor(silentMs / 6e4)
3721
+ };
3722
+ }
3723
+ }
3724
+ return {
3725
+ watched: true,
3726
+ condition: null
3727
+ };
3728
+ }
3729
+ __name(evaluateScheduleHealth, "evaluateScheduleHealth");
3730
+ __name3(evaluateScheduleHealth, "evaluateScheduleHealth");
3731
+ function scheduleHealthView(health, state3) {
3732
+ if (!health) return void 0;
3733
+ const incident = state3?.incident;
3734
+ return {
3735
+ config: {
3736
+ ...health.maxSilenceMinutes !== void 0 ? {
3737
+ maxSilenceMinutes: health.maxSilenceMinutes
3738
+ } : {},
3739
+ ...health.alertAfterConsecutiveFailures !== void 0 ? {
3740
+ alertAfterConsecutiveFailures: health.alertAfterConsecutiveFailures
3741
+ } : {},
3742
+ ...health.notify ? {
3743
+ notify: health.notify
3744
+ } : {}
3745
+ },
3746
+ state: incident ? "alerting" : state3?.watchFrom !== void 0 ? "ok" : "unwatched",
3747
+ ...incident ? {
3748
+ condition: incident.condition,
3749
+ since: incident.openedAt
3750
+ } : {},
3751
+ ...state3?.lastSucceededAt !== void 0 ? {
3752
+ lastSucceededAt: state3.lastSucceededAt
3753
+ } : {},
3754
+ ...state3?.checkedAt !== void 0 ? {
3755
+ checkedAt: state3.checkedAt
3756
+ } : {}
3757
+ };
3758
+ }
3759
+ __name(scheduleHealthView, "scheduleHealthView");
3760
+ __name3(scheduleHealthView, "scheduleHealthView");
3761
+ function scheduleHealthSourceId(agentId, jobId) {
3762
+ return `schedule-health:${agentId}:${jobId}`;
3763
+ }
3764
+ __name(scheduleHealthSourceId, "scheduleHealthSourceId");
3765
+ __name3(scheduleHealthSourceId, "scheduleHealthSourceId");
3439
3766
  var WORKFLOW_GOAL_JUDGE_SELF = "$self";
3440
3767
  function workflowGoalJudgeKind(judge) {
3441
3768
  return judge && typeof judge === "object" && judge.predicate !== void 0 ? "predicate" : "agent";
3442
3769
  }
3443
3770
  __name(workflowGoalJudgeKind, "workflowGoalJudgeKind");
3444
- __name2(workflowGoalJudgeKind, "workflowGoalJudgeKind");
3771
+ __name3(workflowGoalJudgeKind, "workflowGoalJudgeKind");
3445
3772
  function isWorkflowGoalJudgeComplete(judge) {
3446
3773
  if (workflowGoalJudgeKind(judge) === "predicate") return true;
3447
3774
  return typeof judge.agentId === "string" && judge.agentId.length > 0 && !!judge.schema && typeof judge.schema === "object" && !Array.isArray(judge.schema);
3448
3775
  }
3449
3776
  __name(isWorkflowGoalJudgeComplete, "isWorkflowGoalJudgeComplete");
3450
- __name2(isWorkflowGoalJudgeComplete, "isWorkflowGoalJudgeComplete");
3777
+ __name3(isWorkflowGoalJudgeComplete, "isWorkflowGoalJudgeComplete");
3451
3778
  function normalizeWorkflowGoalJudge(judge) {
3452
3779
  if (workflowGoalJudgeKind(judge) === "agent") return judge;
3453
3780
  return {
@@ -3459,7 +3786,7 @@ function normalizeWorkflowGoalJudge(judge) {
3459
3786
  };
3460
3787
  }
3461
3788
  __name(normalizeWorkflowGoalJudge, "normalizeWorkflowGoalJudge");
3462
- __name2(normalizeWorkflowGoalJudge, "normalizeWorkflowGoalJudge");
3789
+ __name3(normalizeWorkflowGoalJudge, "normalizeWorkflowGoalJudge");
3463
3790
  var REDACTED_PLACEHOLDER = "[REDACTED]";
3464
3791
  var PROVIDER_MESSAGE_MAX_CHARS = 300;
3465
3792
  var ERROR_MESSAGE_MAX_CHARS = 2e3;
@@ -3547,7 +3874,7 @@ function groupCount(re) {
3547
3874
  return n2;
3548
3875
  }
3549
3876
  __name(groupCount, "groupCount");
3550
- __name2(groupCount, "groupCount");
3877
+ __name3(groupCount, "groupCount");
3551
3878
  var WORKFLOW_SECRET_KEY_RE = /(^|[_\-.\s])(secret|token|password|passwd|pwd|passphrase|api[_-]?key|apikey|access[_-]?key|secret[_-]?key|private[_-]?key|client[_-]?secret|authorization|auth[_-]?token|access[_-]?token|id[_-]?token|refresh[_-]?token|session[_-]?key|credential(s)?)([_\-.\s]|$)|^(secret|token|password|passwd|pwd|passphrase|apikey|authorization|credentials?)$/i;
3552
3879
  var WORKFLOW_RESERVED_SECRET_KEYS = Object.freeze([
3553
3880
  "secret",
@@ -3575,7 +3902,7 @@ function isWorkflowSecretKey(key) {
3575
3902
  return WORKFLOW_SECRET_KEY_RE.test(key);
3576
3903
  }
3577
3904
  __name(isWorkflowSecretKey, "isWorkflowSecretKey");
3578
- __name2(isWorkflowSecretKey, "isWorkflowSecretKey");
3905
+ __name3(isWorkflowSecretKey, "isWorkflowSecretKey");
3579
3906
  function applyPatterns(text, patterns) {
3580
3907
  let out = text;
3581
3908
  for (const { re, suffix } of patterns) {
@@ -3595,13 +3922,13 @@ function applyPatterns(text, patterns) {
3595
3922
  return out;
3596
3923
  }
3597
3924
  __name(applyPatterns, "applyPatterns");
3598
- __name2(applyPatterns, "applyPatterns");
3925
+ __name3(applyPatterns, "applyPatterns");
3599
3926
  function scrubSecretText(text) {
3600
3927
  if (typeof text !== "string" || text.length < 4) return text;
3601
3928
  return applyPatterns(applyPatterns(text, SECRET_LITERAL_PATTERNS), SECRET_PAIR_PATTERNS);
3602
3929
  }
3603
3930
  __name(scrubSecretText, "scrubSecretText");
3604
- __name2(scrubSecretText, "scrubSecretText");
3931
+ __name3(scrubSecretText, "scrubSecretText");
3605
3932
  var SCRUB_INPUT_MAX_CHARS = 16 * 1024;
3606
3933
  var SCRUB_CUT_BACKOFF_CHARS = 256;
3607
3934
  function boundScrubInput(text, max = SCRUB_INPUT_MAX_CHARS) {
@@ -3612,12 +3939,12 @@ function boundScrubInput(text, max = SCRUB_INPUT_MAX_CHARS) {
3612
3939
  return `${text.slice(0, cut)}\u2026`;
3613
3940
  }
3614
3941
  __name(boundScrubInput, "boundScrubInput");
3615
- __name2(boundScrubInput, "boundScrubInput");
3942
+ __name3(boundScrubInput, "boundScrubInput");
3616
3943
  function scrubSecretLines(lines) {
3617
3944
  return lines.map((l) => typeof l === "string" ? scrubSecretText(boundScrubInput(l)) : l);
3618
3945
  }
3619
3946
  __name(scrubSecretLines, "scrubSecretLines");
3620
- __name2(scrubSecretLines, "scrubSecretLines");
3947
+ __name3(scrubSecretLines, "scrubSecretLines");
3621
3948
  function messageText(value3) {
3622
3949
  if (typeof value3 === "string") return value3;
3623
3950
  if (value3 instanceof Error) return value3.message;
@@ -3633,7 +3960,7 @@ function messageText(value3) {
3633
3960
  return value3 === void 0 || value3 === null ? "" : String(value3);
3634
3961
  }
3635
3962
  __name(messageText, "messageText");
3636
- __name2(messageText, "messageText");
3963
+ __name3(messageText, "messageText");
3637
3964
  function scrubProviderMessage(raw, max = PROVIDER_MESSAGE_MAX_CHARS) {
3638
3965
  const text = boundScrubInput(messageText(raw)).replace(/\s+/g, " ").trim();
3639
3966
  if (!text) return void 0;
@@ -3641,12 +3968,12 @@ function scrubProviderMessage(raw, max = PROVIDER_MESSAGE_MAX_CHARS) {
3641
3968
  return out.length > max ? `${out.slice(0, max - 1)}\u2026` : out;
3642
3969
  }
3643
3970
  __name(scrubProviderMessage, "scrubProviderMessage");
3644
- __name2(scrubProviderMessage, "scrubProviderMessage");
3971
+ __name3(scrubProviderMessage, "scrubProviderMessage");
3645
3972
  function scrubStepErrorMessage(raw) {
3646
3973
  return scrubProviderMessage(raw, ERROR_MESSAGE_MAX_CHARS);
3647
3974
  }
3648
3975
  __name(scrubStepErrorMessage, "scrubStepErrorMessage");
3649
- __name2(scrubStepErrorMessage, "scrubStepErrorMessage");
3976
+ __name3(scrubStepErrorMessage, "scrubStepErrorMessage");
3650
3977
  var WORKFLOW_AUDIT_EVENTS = [
3651
3978
  // --- definitions / versions / templates (13, 11 §11.11.5) ---
3652
3979
  "workflow.published",
@@ -3759,7 +4086,7 @@ function isWorkflowAuditEvent(action) {
3759
4086
  return typeof action === "string" && WORKFLOW_AUDIT_EVENTS.includes(action);
3760
4087
  }
3761
4088
  __name(isWorkflowAuditEvent, "isWorkflowAuditEvent");
3762
- __name2(isWorkflowAuditEvent, "isWorkflowAuditEvent");
4089
+ __name3(isWorkflowAuditEvent, "isWorkflowAuditEvent");
3763
4090
  function emptyRetentionCounts() {
3764
4091
  return {
3765
4092
  runs: 0,
@@ -3772,7 +4099,7 @@ function emptyRetentionCounts() {
3772
4099
  };
3773
4100
  }
3774
4101
  __name(emptyRetentionCounts, "emptyRetentionCounts");
3775
- __name2(emptyRetentionCounts, "emptyRetentionCounts");
4102
+ __name3(emptyRetentionCounts, "emptyRetentionCounts");
3776
4103
  var INDENT = " ";
3777
4104
  var WRAP_WIDTH = 78;
3778
4105
  var NOUNS = {
@@ -3816,7 +4143,7 @@ function wrap(tokens, indent, width) {
3816
4143
  return lines.join("\n");
3817
4144
  }
3818
4145
  __name(wrap, "wrap");
3819
- __name2(wrap, "wrap");
4146
+ __name3(wrap, "wrap");
3820
4147
  function passthroughPath(target) {
3821
4148
  const { owner, repo, number } = target.address;
3822
4149
  const base = `repos/${owner}/${repo}`;
@@ -3826,7 +4153,7 @@ function passthroughPath(target) {
3826
4153
  return base;
3827
4154
  }
3828
4155
  __name(passthroughPath, "passthroughPath");
3829
- __name2(passthroughPath, "passthroughPath");
4156
+ __name3(passthroughPath, "passthroughPath");
3830
4157
  function headerLine(target, position) {
3831
4158
  const { owner, repo, number, key, container } = target.address;
3832
4159
  const slug = owner && repo ? `${owner}/${repo}` : void 0;
@@ -3846,7 +4173,7 @@ function headerLine(target, position) {
3846
4173
  return `${position}. ${parts.join(" ")}`;
3847
4174
  }
3848
4175
  __name(headerLine, "headerLine");
3849
- __name2(headerLine, "headerLine");
4176
+ __name3(headerLine, "headerLine");
3850
4177
  function reachingIt(target) {
3851
4178
  const { owner, repo, key } = target.address;
3852
4179
  const toolName = GET_TOOL_NAMES[`${target.integrationType}:${target.kind}`];
@@ -3868,7 +4195,7 @@ function reachingIt(target) {
3868
4195
  return wrap(tokens, INDENT, WRAP_WIDTH);
3869
4196
  }
3870
4197
  __name(reachingIt, "reachingIt");
3871
- __name2(reachingIt, "reachingIt");
4198
+ __name3(reachingIt, "reachingIt");
3872
4199
  function renderTargetsBlock(targets) {
3873
4200
  if (!targets.length) return "";
3874
4201
  const items = targets.map((target, i) => [
@@ -3886,7 +4213,7 @@ ${PREAMBLE}
3886
4213
  ${items.join("\n\n")}`;
3887
4214
  }
3888
4215
  __name(renderTargetsBlock, "renderTargetsBlock");
3889
- __name2(renderTargetsBlock, "renderTargetsBlock");
4216
+ __name3(renderTargetsBlock, "renderTargetsBlock");
3890
4217
  var WORKFLOW_APPROVAL_OUTPUT_DECISIONS = [
3891
4218
  "approved",
3892
4219
  "denied",
@@ -3956,7 +4283,7 @@ function workflowApprovalDecisionOf(resumeData) {
3956
4283
  return resumeData.approved === true ? "approved" : "denied";
3957
4284
  }
3958
4285
  __name(workflowApprovalDecisionOf, "workflowApprovalDecisionOf");
3959
- __name2(workflowApprovalDecisionOf, "workflowApprovalDecisionOf");
4286
+ __name3(workflowApprovalDecisionOf, "workflowApprovalDecisionOf");
3960
4287
  function workflowApprovalOutput(resumeData) {
3961
4288
  const decision = typeof resumeData.decision === "string" ? resumeData.decision : workflowApprovalDecisionOf(resumeData);
3962
4289
  const note = typeof resumeData.note === "string" && resumeData.note.trim() !== "" ? resumeData.note : void 0;
@@ -3968,14 +4295,14 @@ function workflowApprovalOutput(resumeData) {
3968
4295
  };
3969
4296
  }
3970
4297
  __name(workflowApprovalOutput, "workflowApprovalOutput");
3971
- __name2(workflowApprovalOutput, "workflowApprovalOutput");
4298
+ __name3(workflowApprovalOutput, "workflowApprovalOutput");
3972
4299
  function isWorkflowApprovalOutput(value3) {
3973
4300
  if (typeof value3 !== "object" || value3 === null || Array.isArray(value3)) return false;
3974
4301
  const v = value3;
3975
4302
  return typeof v.approved === "boolean" && WORKFLOW_APPROVAL_OUTPUT_DECISIONS.includes(v.decision) && typeof v.text === "string";
3976
4303
  }
3977
4304
  __name(isWorkflowApprovalOutput, "isWorkflowApprovalOutput");
3978
- __name2(isWorkflowApprovalOutput, "isWorkflowApprovalOutput");
4305
+ __name3(isWorkflowApprovalOutput, "isWorkflowApprovalOutput");
3979
4306
  var JSON_FENCE_RE = /```(?:json)?[ \t]*\r?\n([\s\S]*?)\r?\n?```/g;
3980
4307
  function extractSingleJsonValue(text) {
3981
4308
  const trimmed = (text ?? "").trim();
@@ -4018,7 +4345,7 @@ function extractSingleJsonValue(text) {
4018
4345
  }
4019
4346
  }
4020
4347
  __name(extractSingleJsonValue, "extractSingleJsonValue");
4021
- __name2(extractSingleJsonValue, "extractSingleJsonValue");
4348
+ __name3(extractSingleJsonValue, "extractSingleJsonValue");
4022
4349
  var DEFAULT_ON_AGENT_FEATURES = [
4023
4350
  "workflows",
4024
4351
  "workflowCompose",
@@ -4028,17 +4355,17 @@ function agentFeatureCatalogDefault(featureName) {
4028
4355
  return DEFAULT_ON_AGENT_FEATURES.includes(featureName);
4029
4356
  }
4030
4357
  __name(agentFeatureCatalogDefault, "agentFeatureCatalogDefault");
4031
- __name2(agentFeatureCatalogDefault, "agentFeatureCatalogDefault");
4358
+ __name3(agentFeatureCatalogDefault, "agentFeatureCatalogDefault");
4032
4359
  function hasExplicitFeatureActive(row) {
4033
4360
  return typeof row?.active === "boolean";
4034
4361
  }
4035
4362
  __name(hasExplicitFeatureActive, "hasExplicitFeatureActive");
4036
- __name2(hasExplicitFeatureActive, "hasExplicitFeatureActive");
4363
+ __name3(hasExplicitFeatureActive, "hasExplicitFeatureActive");
4037
4364
  function effectiveFeatureActive(row, catalogDefault) {
4038
4365
  return hasExplicitFeatureActive(row) ? row.active : catalogDefault;
4039
4366
  }
4040
4367
  __name(effectiveFeatureActive, "effectiveFeatureActive");
4041
- __name2(effectiveFeatureActive, "effectiveFeatureActive");
4368
+ __name3(effectiveFeatureActive, "effectiveFeatureActive");
4042
4369
  function resolveEffectiveFeature(row, catalogDefault) {
4043
4370
  return hasExplicitFeatureActive(row) ? {
4044
4371
  active: row.active,
@@ -4051,7 +4378,7 @@ function resolveEffectiveFeature(row, catalogDefault) {
4051
4378
  };
4052
4379
  }
4053
4380
  __name(resolveEffectiveFeature, "resolveEffectiveFeature");
4054
- __name2(resolveEffectiveFeature, "resolveEffectiveFeature");
4381
+ __name3(resolveEffectiveFeature, "resolveEffectiveFeature");
4055
4382
  function asFeatureRow(value3) {
4056
4383
  if (value3 === false) return {
4057
4384
  active: false
@@ -4059,12 +4386,12 @@ function asFeatureRow(value3) {
4059
4386
  return typeof value3 === "object" && value3 !== null && !Array.isArray(value3) ? value3 : void 0;
4060
4387
  }
4061
4388
  __name(asFeatureRow, "asFeatureRow");
4062
- __name2(asFeatureRow, "asFeatureRow");
4389
+ __name3(asFeatureRow, "asFeatureRow");
4063
4390
  function agentFeatureBagCarries(bag, name) {
4064
4391
  return bag != null && Object.prototype.hasOwnProperty.call(bag, name) && asFeatureRow(bag[name]) !== void 0;
4065
4392
  }
4066
4393
  __name(agentFeatureBagCarries, "agentFeatureBagCarries");
4067
- __name2(agentFeatureBagCarries, "agentFeatureBagCarries");
4394
+ __name3(agentFeatureBagCarries, "agentFeatureBagCarries");
4068
4395
  function effectiveAgentFeatureRows(base, override) {
4069
4396
  const merged = /* @__PURE__ */ new Map();
4070
4397
  for (const [name, value3] of Object.entries(base ?? {})) {
@@ -4097,7 +4424,7 @@ function effectiveAgentFeatureRows(base, override) {
4097
4424
  };
4098
4425
  }
4099
4426
  __name(effectiveAgentFeatureRows, "effectiveAgentFeatureRows");
4100
- __name2(effectiveAgentFeatureRows, "effectiveAgentFeatureRows");
4427
+ __name3(effectiveAgentFeatureRows, "effectiveAgentFeatureRows");
4101
4428
  var SUBAGENT_PER_KEY_FLAG_ENV = "LUA_SUBAGENT_FEATURES_PER_KEY";
4102
4429
  var PER_KEY_FLAG_VALUES = /* @__PURE__ */ new Set([
4103
4430
  "1",
@@ -4110,17 +4437,17 @@ function agentFeatureMergeRuleFromEnv(env) {
4110
4437
  return typeof raw === "string" && PER_KEY_FLAG_VALUES.has(raw.trim().toLowerCase()) ? "per-key" : "wholesale";
4111
4438
  }
4112
4439
  __name(agentFeatureMergeRuleFromEnv, "agentFeatureMergeRuleFromEnv");
4113
- __name2(agentFeatureMergeRuleFromEnv, "agentFeatureMergeRuleFromEnv");
4440
+ __name3(agentFeatureMergeRuleFromEnv, "agentFeatureMergeRuleFromEnv");
4114
4441
  function effectiveAgentFeatures(base, override, rule) {
4115
4442
  if (rule === "wholesale") return override || base || void 0;
4116
4443
  return effectiveAgentFeatureRows(base, override).rows;
4117
4444
  }
4118
4445
  __name(effectiveAgentFeatures, "effectiveAgentFeatures");
4119
- __name2(effectiveAgentFeatures, "effectiveAgentFeatures");
4446
+ __name3(effectiveAgentFeatures, "effectiveAgentFeatures");
4120
4447
  var ONBOARDING_FLOW_KEY = "alpha-choose-meet";
4121
4448
  var ONBOARDING_SCHEMA_VERSION = 1;
4122
4449
  var id = z4.string().min(1).max(80).regex(/^[A-Za-z0-9][A-Za-z0-9_-]*$/);
4123
- var copy = /* @__PURE__ */ __name2((max) => z4.string().max(max), "copy");
4450
+ var copy = /* @__PURE__ */ __name3((max) => z4.string().max(max), "copy");
4124
4451
  var onboardingHeadingSchema = z4.discriminatedUnion("kind", [
4125
4452
  z4.object({
4126
4453
  kind: z4.literal("plain"),
@@ -4347,12 +4674,12 @@ function parseOnboardingFlow(value3) {
4347
4674
  return onboardingFlowSchema.parse(value3);
4348
4675
  }
4349
4676
  __name(parseOnboardingFlow, "parseOnboardingFlow");
4350
- __name2(parseOnboardingFlow, "parseOnboardingFlow");
4677
+ __name3(parseOnboardingFlow, "parseOnboardingFlow");
4351
4678
  function parsePublishedOnboardingResponse(value3) {
4352
4679
  return getPublishedOnboardingResponseSchema.parse(value3);
4353
4680
  }
4354
4681
  __name(parsePublishedOnboardingResponse, "parsePublishedOnboardingResponse");
4355
- __name2(parsePublishedOnboardingResponse, "parsePublishedOnboardingResponse");
4682
+ __name3(parsePublishedOnboardingResponse, "parsePublishedOnboardingResponse");
4356
4683
  var WEB_ROUTE_PROTOCOL_VERSION = 1;
4357
4684
  var WEB_ROUTE_METHODS = [
4358
4685
  "GET",
@@ -4381,14 +4708,14 @@ function isForwardableWebRouteRequestHeader(name) {
4381
4708
  return WEB_ROUTE_REQUEST_HEADER_ALLOWLIST.includes(n2) || n2.startsWith("x-lua-");
4382
4709
  }
4383
4710
  __name(isForwardableWebRouteRequestHeader, "isForwardableWebRouteRequestHeader");
4384
- __name2(isForwardableWebRouteRequestHeader, "isForwardableWebRouteRequestHeader");
4711
+ __name3(isForwardableWebRouteRequestHeader, "isForwardableWebRouteRequestHeader");
4385
4712
  function isForwardableWebRouteResponseHeader(name) {
4386
4713
  const n2 = name.toLowerCase();
4387
4714
  if (n2 === "set-cookie") return false;
4388
4715
  return WEB_ROUTE_RESPONSE_HEADER_ALLOWLIST.includes(n2) || n2.startsWith("x-lua-");
4389
4716
  }
4390
4717
  __name(isForwardableWebRouteResponseHeader, "isForwardableWebRouteResponseHeader");
4391
- __name2(isForwardableWebRouteResponseHeader, "isForwardableWebRouteResponseHeader");
4718
+ __name3(isForwardableWebRouteResponseHeader, "isForwardableWebRouteResponseHeader");
4392
4719
  var WEB_ROUTE_MAX_REQUEST_BODY_BYTES = 1 * 1024 * 1024;
4393
4720
  var WEB_ROUTE_MAX_RESPONSE_BYTES = 4 * 1024 * 1024;
4394
4721
  function isWebRouteBody(value3) {
@@ -4399,7 +4726,19 @@ function isWebRouteBody(value3) {
4399
4726
  return false;
4400
4727
  }
4401
4728
  __name(isWebRouteBody, "isWebRouteBody");
4402
- __name2(isWebRouteBody, "isWebRouteBody");
4729
+ __name3(isWebRouteBody, "isWebRouteBody");
4730
+ function isStringRecord(value3) {
4731
+ if (!value3 || typeof value3 !== "object" || Array.isArray(value3)) return false;
4732
+ return Object.values(value3).every((v) => typeof v === "string");
4733
+ }
4734
+ __name(isStringRecord, "isStringRecord");
4735
+ __name3(isStringRecord, "isStringRecord");
4736
+ function isQueryRecord(value3) {
4737
+ if (!value3 || typeof value3 !== "object" || Array.isArray(value3)) return false;
4738
+ return Object.values(value3).every((v) => typeof v === "string" || Array.isArray(v) && v.every((one) => typeof one === "string"));
4739
+ }
4740
+ __name(isQueryRecord, "isQueryRecord");
4741
+ __name3(isQueryRecord, "isQueryRecord");
4403
4742
  function isWebRouteInput(value3) {
4404
4743
  if (!value3 || typeof value3 !== "object") return false;
4405
4744
  const v = value3;
@@ -4408,9 +4747,9 @@ function isWebRouteInput(value3) {
4408
4747
  if (!r || typeof r !== "object") return false;
4409
4748
  if (!WEB_ROUTE_METHODS.includes(String(r.method))) return false;
4410
4749
  if (typeof r.path !== "string" || !r.path.startsWith("/")) return false;
4411
- if (!r.params || typeof r.params !== "object") return false;
4412
- if (!r.query || typeof r.query !== "object") return false;
4413
- if (!r.headers || typeof r.headers !== "object") return false;
4750
+ if (!isStringRecord(r.params)) return false;
4751
+ if (!isQueryRecord(r.query)) return false;
4752
+ if (!isStringRecord(r.headers)) return false;
4414
4753
  if (r.body !== void 0) {
4415
4754
  if (r.method === "GET") return false;
4416
4755
  if (!isWebRouteBody(r.body)) return false;
@@ -4422,56 +4761,411 @@ function isWebRouteInput(value3) {
4422
4761
  return true;
4423
4762
  }
4424
4763
  __name(isWebRouteInput, "isWebRouteInput");
4425
- __name2(isWebRouteInput, "isWebRouteInput");
4426
-
4427
- // ../workflow-graph/dist/index.mjs
4428
- import { createHash } from "crypto";
4429
- import { z as z5 } from "zod";
4430
- import { z as z22 } from "zod";
4431
-
4432
- // ../shared-types/dist/workflow-job-tools.mjs
4433
- var __defProp3 = Object.defineProperty;
4434
- var __name3 = /* @__PURE__ */ __name((target, value3) => __defProp3(target, "name", { value: value3, configurable: true }), "__name");
4435
- var WORKFLOW_JOB_TOOLS = [
4436
- "shell",
4437
- "read",
4438
- "write",
4439
- "edit",
4440
- "glob",
4441
- "grep",
4442
- "git",
4443
- "gh",
4444
- "fetch",
4445
- "ripwire"
4764
+ __name3(isWebRouteInput, "isWebRouteInput");
4765
+ var EVIDENCE_SESSION_IDLE_MS = 30 * 6e4;
4766
+ var EVIDENCE_MIN_CONVERSATIONS = 20;
4767
+ var EVIDENCE_LOW_CONFIDENCE_N = 5;
4768
+ var EVIDENCE_SNIPPET_MAX_CHARS = 160;
4769
+ var EVIDENCE_EXAMPLES_PER_ITEM = 5;
4770
+ var EVIDENCE_SHOWN_ITEMS = 5;
4771
+ var EVIDENCE_LATENCY_BOUNDS_MS = [
4772
+ 500,
4773
+ 1e3,
4774
+ 2e3,
4775
+ 3e3,
4776
+ 5e3,
4777
+ 8e3,
4778
+ 13e3,
4779
+ 2e4,
4780
+ 3e4,
4781
+ 6e4,
4782
+ 12e4
4446
4783
  ];
4447
- var WORKFLOW_JOB_READ_ONLY_DROPPED = [
4448
- "write",
4449
- "edit",
4450
- "git",
4451
- "shell"
4784
+ var EVIDENCE_WORD_BOUNDS = [
4785
+ 4,
4786
+ 10,
4787
+ 20,
4788
+ 40,
4789
+ 80,
4790
+ 150,
4791
+ 300,
4792
+ 600
4452
4793
  ];
4453
- var WORKFLOW_JOB_DEFAULT_TOOLS = [
4454
- "shell",
4455
- "read",
4456
- "write",
4457
- "edit",
4458
- "glob",
4459
- "grep",
4460
- "git"
4794
+ var BAD_CONVERSATION_REASONS = [
4795
+ "thumbs_down",
4796
+ "unfinished",
4797
+ "asked_for_human"
4461
4798
  ];
4462
- function effectiveJobTools(jobTools, readOnly) {
4463
- const base = jobTools?.length ? jobTools : WORKFLOW_JOB_DEFAULT_TOOLS;
4799
+ var ATTACHMENT_LINES = [
4800
+ // Audio / video / document lines carry a URL; a reply like "Audio: terrible" is the user's words.
4801
+ [
4802
+ /^\[?audio:\s*https?:\/\/\S+\]?$/i,
4803
+ () => "[Voice message]"
4804
+ ],
4805
+ [
4806
+ /^\[?video:\s*https?:\/\/\S+\]?$/i,
4807
+ () => "[Video]"
4808
+ ],
4809
+ [
4810
+ /^\[?document:\s*https?:\/\/\S+\]?$/i,
4811
+ () => "[Document]"
4812
+ ],
4813
+ // Image lines carry a file name with an extension (spaces allowed): "Image: my photo.jpg".
4814
+ [
4815
+ /^\[?image:\s*(?:https?:\/\/\S+|[^\s][^\n]{0,200}\.[a-z0-9]{2,5})\]?$/i,
4816
+ () => "[Image]"
4817
+ ],
4818
+ // "File: name (url)" — bounded classes, no backtracking between the name and the URL.
4819
+ [
4820
+ /^file:\s*([^()]{1,200}?)\s*\(https?:\/\/[^\s)]+\)$/i,
4821
+ (m) => `[File: ${m[1]}]`
4822
+ ]
4823
+ ];
4824
+ function evidenceDisplayText(text) {
4825
+ const raw = typeof text === "string" ? text : "";
4826
+ if (!raw.trim()) return "";
4827
+ const lines = removeHiddenBlocks(raw).split(/\r?\n/).map((line) => {
4828
+ const t = line.trim();
4829
+ for (const [re, label] of ATTACHMENT_LINES) {
4830
+ const m = t.match(re);
4831
+ if (m) return label(m);
4832
+ }
4833
+ return t.replace(/https?:\/\/cdn\.heylua\.ai\/\S+/gi, "[attachment]");
4834
+ }).filter(Boolean);
4835
+ const out = lines.join(" ").replace(/\s+/g, " ").trim();
4836
+ return out || "[Attachment]";
4837
+ }
4838
+ __name(evidenceDisplayText, "evidenceDisplayText");
4839
+ __name3(evidenceDisplayText, "evidenceDisplayText");
4840
+ function evidenceSnippet(text) {
4841
+ const flat = evidenceDisplayText(text);
4842
+ return flat.length <= EVIDENCE_SNIPPET_MAX_CHARS ? flat : `${flat.slice(0, EVIDENCE_SNIPPET_MAX_CHARS - 1)}\u2026`;
4843
+ }
4844
+ __name(evidenceSnippet, "evidenceSnippet");
4845
+ __name3(evidenceSnippet, "evidenceSnippet");
4846
+ function evidenceWordCount(text) {
4847
+ if (typeof text !== "string") return 0;
4848
+ const t = text.trim();
4849
+ return t ? t.split(/\s+/).length : 0;
4850
+ }
4851
+ __name(evidenceWordCount, "evidenceWordCount");
4852
+ __name3(evidenceWordCount, "evidenceWordCount");
4853
+ function evidenceKey(label) {
4854
+ return label.toLowerCase().replace(/[_\-\s]+/g, " ").trim();
4855
+ }
4856
+ __name(evidenceKey, "evidenceKey");
4857
+ __name3(evidenceKey, "evidenceKey");
4858
+ function evidenceOpaqueKey(text) {
4859
+ let h = 0xcbf29ce484222325n;
4860
+ const prime = 0x100000001b3n;
4861
+ for (const ch of evidenceKey(text)) {
4862
+ h ^= BigInt(ch.codePointAt(0) ?? 0);
4863
+ h = h * prime & 0xffffffffffffffffn;
4864
+ }
4865
+ return `q_${h.toString(16).padStart(16, "0")}`;
4866
+ }
4867
+ __name(evidenceOpaqueKey, "evidenceOpaqueKey");
4868
+ __name3(evidenceOpaqueKey, "evidenceOpaqueKey");
4869
+ function evidenceToolKey(name) {
4870
+ const i = name.indexOf("__");
4871
+ return (i >= 0 ? name.slice(i + 2) : name).toLowerCase();
4872
+ }
4873
+ __name(evidenceToolKey, "evidenceToolKey");
4874
+ __name3(evidenceToolKey, "evidenceToolKey");
4875
+ function evidenceToolSlug(name) {
4876
+ const i = name.indexOf("__");
4877
+ return i >= 0 ? name.slice(0, i).toLowerCase() : "";
4878
+ }
4879
+ __name(evidenceToolSlug, "evidenceToolSlug");
4880
+ __name3(evidenceToolSlug, "evidenceToolSlug");
4881
+ function skillSlugBase(skill) {
4882
+ return skill.toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, "");
4883
+ }
4884
+ __name(skillSlugBase, "skillSlugBase");
4885
+ __name3(skillSlugBase, "skillSlugBase");
4886
+ function matchDefinedTool(calledName, defined2) {
4887
+ const key = evidenceToolKey(calledName);
4888
+ const candidates = [];
4889
+ defined2.forEach((d, i) => {
4890
+ if (d.name.toLowerCase() === key) candidates.push(i);
4891
+ });
4892
+ if (candidates.length <= 1) return candidates[0] ?? -1;
4893
+ const slug = evidenceToolSlug(calledName);
4894
+ const bySkill = candidates.find((i) => {
4895
+ const base = skillSlugBase(defined2[i].skill);
4896
+ return base !== "" && (slug === base || slug.startsWith(`${base}_`) || base.startsWith(slug));
4897
+ });
4898
+ return bySkill ?? candidates[0];
4899
+ }
4900
+ __name(matchDefinedTool, "matchDefinedTool");
4901
+ __name3(matchDefinedTool, "matchDefinedTool");
4902
+ function isMisunderstoodReason(reason) {
4903
+ return typeof reason === "string" && /misunderst/i.test(reason);
4904
+ }
4905
+ __name(isMisunderstoodReason, "isMisunderstoodReason");
4906
+ __name3(isMisunderstoodReason, "isMisunderstoodReason");
4907
+ function emptyHistogram(bounds) {
4908
+ return {
4909
+ count: 0,
4910
+ sum: 0,
4911
+ buckets: new Array(bounds.length + 1).fill(0)
4912
+ };
4913
+ }
4914
+ __name(emptyHistogram, "emptyHistogram");
4915
+ __name3(emptyHistogram, "emptyHistogram");
4916
+ function addToHistogram(h, bounds, value3) {
4917
+ if (!Number.isFinite(value3) || value3 < 0) return;
4918
+ let i = bounds.findIndex((b) => value3 <= b);
4919
+ if (i < 0) i = bounds.length;
4920
+ h.buckets[i] += 1;
4921
+ h.count += 1;
4922
+ h.sum += value3;
4923
+ }
4924
+ __name(addToHistogram, "addToHistogram");
4925
+ __name3(addToHistogram, "addToHistogram");
4926
+ function mergeHistograms(hs, bounds) {
4927
+ if (hs.length === 0) return null;
4928
+ const out = emptyHistogram(bounds);
4929
+ for (const h of hs) {
4930
+ out.count += h.count;
4931
+ out.sum += h.sum;
4932
+ for (let i = 0; i < out.buckets.length; i++) out.buckets[i] += h.buckets[i] ?? 0;
4933
+ }
4934
+ return out.count > 0 ? out : null;
4935
+ }
4936
+ __name(mergeHistograms, "mergeHistograms");
4937
+ __name3(mergeHistograms, "mergeHistograms");
4938
+ function histogramQuantile(h, bounds, q) {
4939
+ if (h.count === 0) return 0;
4940
+ const target = q * h.count;
4941
+ let seen = 0;
4942
+ for (let i = 0; i < h.buckets.length; i++) {
4943
+ const n2 = h.buckets[i];
4944
+ if (n2 > 0 && seen + n2 >= target) {
4945
+ const lo = i === 0 ? 0 : bounds[i - 1];
4946
+ if (i >= bounds.length) return lo;
4947
+ const hi = bounds[i];
4948
+ return lo + (target - seen) / n2 * (hi - lo);
4949
+ }
4950
+ seen += n2;
4951
+ }
4952
+ return bounds[bounds.length - 1];
4953
+ }
4954
+ __name(histogramQuantile, "histogramQuantile");
4955
+ __name3(histogramQuantile, "histogramQuantile");
4956
+ function mergeCounted(lists) {
4957
+ const byKey = /* @__PURE__ */ new Map();
4958
+ for (const list of [
4959
+ ...lists
4960
+ ].reverse()) {
4961
+ for (const item of list) {
4962
+ const cur = byKey.get(item.key);
4963
+ if (!cur) {
4964
+ byKey.set(item.key, {
4965
+ ...item,
4966
+ examples: item.examples.slice(0, EVIDENCE_EXAMPLES_PER_ITEM)
4967
+ });
4968
+ } else {
4969
+ cur.count += item.count;
4970
+ if (cur.examples.length < EVIDENCE_EXAMPLES_PER_ITEM) {
4971
+ cur.examples.push(...item.examples.slice(0, EVIDENCE_EXAMPLES_PER_ITEM - cur.examples.length));
4972
+ }
4973
+ }
4974
+ }
4975
+ }
4976
+ return [
4977
+ ...byKey.values()
4978
+ ].sort((a, b) => b.count - a.count || a.key.localeCompare(b.key));
4979
+ }
4980
+ __name(mergeCounted, "mergeCounted");
4981
+ __name3(mergeCounted, "mergeCounted");
4982
+ function recentRefs(lists) {
4983
+ return lists.flat().sort((a, b) => b.createdAt - a.createdAt).slice(0, EVIDENCE_EXAMPLES_PER_ITEM);
4984
+ }
4985
+ __name(recentRefs, "recentRefs");
4986
+ __name3(recentRefs, "recentRefs");
4987
+ function confidenceOf(n2) {
4988
+ return n2 < EVIDENCE_LOW_CONFIDENCE_N ? "low" : "ok";
4989
+ }
4990
+ __name(confidenceOf, "confidenceOf");
4991
+ __name3(confidenceOf, "confidenceOf");
4992
+ function rateOf(count, conversations) {
4993
+ return {
4994
+ count,
4995
+ rate: conversations > 0 ? count / conversations : null,
4996
+ confidence: confidenceOf(count)
4997
+ };
4998
+ }
4999
+ __name(rateOf, "rateOf");
5000
+ __name3(rateOf, "rateOf");
5001
+ function evidenceDays(from, to) {
4464
5002
  const out = [];
4465
- for (const id2 of base) {
4466
- if (readOnly && WORKFLOW_JOB_READ_ONLY_DROPPED.includes(id2)) continue;
4467
- if (!out.includes(id2)) out.push(id2);
5003
+ const end = Date.parse(`${to}T00:00:00Z`);
5004
+ for (let t = Date.parse(`${from}T00:00:00Z`); t <= end; t += 864e5) {
5005
+ out.push(new Date(t).toISOString().slice(0, 10));
4468
5006
  }
4469
5007
  return out;
4470
5008
  }
4471
- __name(effectiveJobTools, "effectiveJobTools");
4472
- __name3(effectiveJobTools, "effectiveJobTools");
5009
+ __name(evidenceDays, "evidenceDays");
5010
+ __name3(evidenceDays, "evidenceDays");
5011
+ function summarizeEvidence(input) {
5012
+ const { agentId, from, to } = input;
5013
+ const windowDays = evidenceDays(from, to);
5014
+ const readable = /* @__PURE__ */ __name3((s) => s === "ok" || s === "empty", "readable");
5015
+ const covered = /* @__PURE__ */ __name3((d) => readable(d.sources?.messages) && readable(d.sources?.analyses), "covered");
5016
+ const inWindow = input.days.filter((d) => d.date >= from && d.date <= to && covered(d)).sort((a, b) => a.date.localeCompare(b.date));
5017
+ const trackedSince = [
5018
+ ...input.days,
5019
+ ...input.previous ?? []
5020
+ ].filter(covered).map((d) => d.date).sort()[0] ?? null;
5021
+ const sum = /* @__PURE__ */ __name3((f) => inWindow.reduce((acc, d) => acc + (f(d) || 0), 0), "sum");
5022
+ const conversations = sum((d) => d.conversations);
5023
+ const byReason = Object.fromEntries(BAD_CONVERSATION_REASONS.map((r) => [
5024
+ r,
5025
+ sum((d) => d.bad.byReason[r])
5026
+ ]));
5027
+ const badTotal = sum((d) => d.bad.total);
5028
+ const prevDays = (input.previous ?? []).filter(covered);
5029
+ const comparable = prevDays.length > 0;
5030
+ const prevReasons = mergeCounted(prevDays.map((d) => d.themes.failureReasons));
5031
+ const prevTopics = mergeCounted(prevDays.map((d) => d.themes.topics));
5032
+ const toThemes = /* @__PURE__ */ __name3((lists, prev) => mergeCounted(lists).slice(0, EVIDENCE_SHOWN_ITEMS).map((t) => ({
5033
+ ...t,
5034
+ share: badTotal > 0 ? t.count / badTotal : 0,
5035
+ previousCount: comparable ? prev.find((p) => p.key === t.key)?.count ?? 0 : null,
5036
+ confidence: confidenceOf(t.count)
5037
+ })), "toThemes");
5038
+ const usage = /* @__PURE__ */ new Map();
5039
+ for (const d of inWindow) {
5040
+ for (const t of d.tools) {
5041
+ const cur = usage.get(t.name) ?? {
5042
+ name: t.name,
5043
+ calls: 0,
5044
+ conversations: 0,
5045
+ errors: 0
5046
+ };
5047
+ cur.calls += t.calls;
5048
+ cur.conversations += t.conversations;
5049
+ cur.errors += t.errors;
5050
+ usage.set(t.name, cur);
5051
+ }
5052
+ }
5053
+ const latestDefined = [
5054
+ ...inWindow
5055
+ ].reverse().find((d) => d.definedTools)?.definedTools ?? null;
5056
+ const defined2 = input.definedTools !== void 0 ? input.definedTools : latestDefined;
5057
+ const definedKnown = Array.isArray(defined2);
5058
+ const enoughData = conversations >= EVIDENCE_MIN_CONVERSATIONS;
5059
+ const definedList = defined2 ?? [];
5060
+ const definedRows = definedList.map((dt) => ({
5061
+ name: dt.name,
5062
+ skill: dt.skill,
5063
+ calls: 0,
5064
+ conversations: 0,
5065
+ errors: 0
5066
+ }));
5067
+ const matched = /* @__PURE__ */ new Set();
5068
+ for (const u of usage.values()) {
5069
+ const i = matchDefinedTool(u.name, definedList);
5070
+ if (i < 0) continue;
5071
+ matched.add(u.name);
5072
+ definedRows[i].calls += u.calls;
5073
+ definedRows[i].conversations += u.conversations;
5074
+ definedRows[i].errors += u.errors;
5075
+ }
5076
+ definedRows.sort((a, b) => b.calls - a.calls || a.name.localeCompare(b.name));
5077
+ const other = [
5078
+ ...usage.values()
5079
+ ].filter((u) => !matched.has(u.name)).sort((a, b) => b.calls - a.calls);
5080
+ const rt = mergeHistograms(inWindow.map((d) => d.responseTimeMs).filter((h) => !!h), EVIDENCE_LATENCY_BOUNDS_MS);
5081
+ const wordRows = inWindow.map((d) => d.responseWords).filter((h) => !!h);
5082
+ const rw = mergeHistograms(wordRows, EVIDENCE_WORD_BOUNDS);
5083
+ const short = wordRows.reduce((a, h) => a + h.short, 0);
5084
+ const long = wordRows.reduce((a, h) => a + h.long, 0);
5085
+ return {
5086
+ agentId,
5087
+ window: {
5088
+ from,
5089
+ to,
5090
+ days: windowDays.length
5091
+ },
5092
+ coverage: {
5093
+ daysWithData: inWindow.length,
5094
+ trackedSince,
5095
+ complete: inWindow.length === windowDays.length
5096
+ },
5097
+ conversations,
5098
+ exchanges: sum((d) => d.exchanges),
5099
+ bad: {
5100
+ ...rateOf(badTotal, conversations),
5101
+ byReason,
5102
+ examples: recentRefs(inWindow.map((d) => d.examples.bad))
5103
+ },
5104
+ misunderstood: {
5105
+ ...rateOf(sum((d) => d.misunderstood), conversations),
5106
+ examples: recentRefs(inWindow.map((d) => d.examples.misunderstood))
5107
+ },
5108
+ unmetIntent: {
5109
+ ...rateOf(sum((d) => d.unmetIntent), conversations),
5110
+ questions: mergeCounted(inWindow.map((d) => d.unmetQuestions)).slice(0, EVIDENCE_SHOWN_ITEMS)
5111
+ },
5112
+ loops: {
5113
+ ...rateOf(sum((d) => d.loops), conversations),
5114
+ examples: recentRefs(inWindow.map((d) => d.examples.loops))
5115
+ },
5116
+ themes: {
5117
+ failureReasons: toThemes(inWindow.map((d) => d.themes.failureReasons), prevReasons),
5118
+ topics: toThemes(inWindow.map((d) => d.themes.topics), prevTopics),
5119
+ comparable
5120
+ },
5121
+ tools: {
5122
+ enoughData,
5123
+ definedKnown,
5124
+ definedCount: definedRows.length,
5125
+ usedDefinedCount: definedRows.filter((r) => r.calls > 0).length,
5126
+ calledCount: definedRows.filter((r) => r.calls > 0).length + other.filter((u) => u.calls > 0).length,
5127
+ defined: definedRows,
5128
+ unused: enoughData && definedKnown ? definedRows.filter((r) => r.calls === 0).map(({ name, skill }) => ({
5129
+ name,
5130
+ skill
5131
+ })) : [],
5132
+ other
5133
+ },
5134
+ responseTime: rt ? {
5135
+ count: rt.count,
5136
+ avgMs: Math.round(rt.sum / rt.count),
5137
+ medianMs: Math.round(histogramQuantile(rt, EVIDENCE_LATENCY_BOUNDS_MS, 0.5)),
5138
+ p90Ms: Math.round(histogramQuantile(rt, EVIDENCE_LATENCY_BOUNDS_MS, 0.9))
5139
+ } : null,
5140
+ responseLength: rw ? {
5141
+ count: rw.count,
5142
+ avgWords: Math.round(rw.sum / rw.count),
5143
+ medianWords: Math.round(histogramQuantile(rw, EVIDENCE_WORD_BOUNDS, 0.5)),
5144
+ shortRate: short / rw.count,
5145
+ longRate: long / rw.count
5146
+ } : null
5147
+ };
5148
+ }
5149
+ __name(summarizeEvidence, "summarizeEvidence");
5150
+ __name3(summarizeEvidence, "summarizeEvidence");
5151
+ var REVIEW_VERDICT_REASON_ORDER = [
5152
+ "overall_below",
5153
+ "dimension_below",
5154
+ "critical_issues",
5155
+ "issue_count"
5156
+ ];
5157
+ function sortVerdictReasons(reasons) {
5158
+ return [
5159
+ ...reasons
5160
+ ].sort((a, b) => REVIEW_VERDICT_REASON_ORDER.indexOf(a.kind) - REVIEW_VERDICT_REASON_ORDER.indexOf(b.kind));
5161
+ }
5162
+ __name(sortVerdictReasons, "sortVerdictReasons");
5163
+ __name3(sortVerdictReasons, "sortVerdictReasons");
4473
5164
 
4474
5165
  // ../workflow-graph/dist/index.mjs
5166
+ import { createHash } from "crypto";
5167
+ import { z as z5 } from "zod";
5168
+ import { z as z22 } from "zod";
4475
5169
  import { createHash as createHash2 } from "crypto";
4476
5170
  var __defProp4 = Object.defineProperty;
4477
5171
  var __name4 = /* @__PURE__ */ __name((target, value22) => __defProp4(target, "name", { value: value22, configurable: true }), "__name");
@@ -5699,6 +6393,26 @@ function validateLuaExtensions(g, caps = WORKFLOW_CAPS_DEFAULT, opts = {
5699
6393
  warn("gh-on-coding-turn", `"${id2}" grants the gh tool on a coding turn \u2014 the pod can open/merge PRs on the workspace repo (purpose:'gh' token, pull_requests:write + contents:write)`, `${path}.jobTools`, id2);
5700
6394
  }
5701
6395
  }
6396
+ const plugins = node.plugins;
6397
+ const target = node.target;
6398
+ if (target !== void 0) {
6399
+ const problem = workflowJobTargetProblem(target, plugins);
6400
+ if (problem) err("target-invalid", problem, `${path}.target`, id2);
6401
+ }
6402
+ if (plugins !== void 0) {
6403
+ const problem = workflowJobPluginsProblem(plugins);
6404
+ if (problem) err("plugins-invalid", problem, `${path}.plugins`, id2);
6405
+ if (node.type !== "agent") err("plugins-invalid", "`plugins` is legal on agent steps only", `${path}.plugins`, id2);
6406
+ else {
6407
+ if (!isJobTier(node)) err("plugins-invalid", "`plugins` needs tier:'job'", `${path}.plugins`, id2);
6408
+ const provider = classifyModelProvider(jobClassifiablePin(node.model));
6409
+ if (node.harness === "generic" || provider !== null && provider !== "anthropic") err("plugins-invalid", "`plugins` run on the claude-code harness only (an Anthropic model, no `harness:'generic'`)", `${path}.plugins`, id2);
6410
+ const w = workspaceOf(node);
6411
+ const ro = w !== void 0 && w !== "inherit" && w.mount === "ro";
6412
+ const declared = Array.isArray(tools) ? tools : void 0;
6413
+ if (!effectiveJobTools(declared, ro).includes("shell")) err("plugins-invalid", "`plugins` need the `shell` job tool (the plugin drives lua-cli) \u2014 keep it in jobTools and mount rw", `${path}.plugins`, id2);
6414
+ }
6415
+ }
5702
6416
  if (node.type === "agent" && ws && ws !== "inherit" && ws.mount === "ro" && Array.isArray(tools) && effectiveJobTools(tools, true).length === 0) {
5703
6417
  warn("ro-step-has-no-tools", `"${id2}" mounts the workspace read-only and every jobTool it declares (${JSON.stringify(tools)}) is one the ro mount drops [${WORKFLOW_JOB_READ_ONLY_DROPPED.join(", ")}] \u2014 the coding turn would run with no tools at all; keep a read-only tool (read/glob/grep, gh) or mount rw`, `${path}.jobTools`, id2);
5704
6418
  }
@@ -9349,6 +10063,15 @@ var WorkflowBuilderImpl = class WorkflowBuilderImpl2 {
9349
10063
  throw new LuaWorkflowBuildError("max-turns-invalid", `"${id2}": ${m} must be an integer ${min}..${max}`);
9350
10064
  }
9351
10065
  }
10066
+ if (opts.plugins !== void 0) {
10067
+ if (tier !== "job") throw new LuaWorkflowBuildError("plugins-invalid", `"${id2}": plugins are only legal on a tier:'job' agent step`);
10068
+ const problem = workflowJobPluginsProblem(opts.plugins);
10069
+ if (problem) throw new LuaWorkflowBuildError("plugins-invalid", `"${id2}": ${problem}`);
10070
+ }
10071
+ if (opts.target !== void 0) {
10072
+ const problem = workflowJobTargetProblem(opts.target, opts.plugins);
10073
+ if (problem) throw new LuaWorkflowBuildError("plugins-invalid", `"${id2}": ${problem}`);
10074
+ }
9352
10075
  assertTimeout({
9353
10076
  id: id2,
9354
10077
  timeoutSeconds: opts.timeoutSeconds,
@@ -9381,7 +10104,9 @@ var WorkflowBuilderImpl = class WorkflowBuilderImpl2 {
9381
10104
  harness: opts.harness,
9382
10105
  maxTurns: opts.maxTurns,
9383
10106
  maxMessages: opts.maxMessages,
9384
- maxInputTokens: opts.maxInputTokens
10107
+ maxInputTokens: opts.maxInputTokens,
10108
+ plugins: opts.plugins,
10109
+ target: opts.target
9385
10110
  });
9386
10111
  return this.push({
9387
10112
  kind: "declare",
@@ -9648,6 +10373,15 @@ function createWorkflow(cfg) {
9648
10373
  const n2 = cfg.backfillOnEnable.maxOccurrences;
9649
10374
  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)");
9650
10375
  }
10376
+ if (cfg.health !== void 0) {
10377
+ const issues = validateScheduleHealth(cfg.health, {
10378
+ target: "workflow",
10379
+ triggers: cfg.schedule && typeof cfg.schedule === "object" ? [
10380
+ cfg.schedule
10381
+ ] : []
10382
+ });
10383
+ if (issues.length > 0) throw new LuaWorkflowBuildError("invalid-envelope", issues.map((i) => `${i.message} (${i.code})`).join("; "));
10384
+ }
9651
10385
  const keys = /* @__PURE__ */ new Set();
9652
10386
  envRefKeys(cfg.schedule, keys);
9653
10387
  envRefKeys(cfg.workspace, keys);