@resolveio/server-lib 22.3.196 → 22.3.198

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.
@@ -63,6 +63,10 @@ export interface AIRunCostPanel {
63
63
  manualEstimatedUsd?: number;
64
64
  untrackedEstimatedUsd?: number;
65
65
  untrackedWarnings?: string[];
66
+ observabilityStatus?: string;
67
+ missingLedger?: boolean;
68
+ externalCodexMonitorUsed?: boolean;
69
+ nextAction?: string;
66
70
  }
67
71
  export interface AIRunOperatorView {
68
72
  runId?: string;
@@ -79,6 +83,6 @@ export interface AIRunOperatorView {
79
83
  }
80
84
  export declare function buildAIRunTimeline(run: AIRun): AIRunTimelineItem[];
81
85
  export declare function buildAIRunQaHealth(run: AIRun): AIRunQaHealth;
82
- export declare function buildAIRunCostPanel(cost?: AIRunCost): AIRunCostPanel;
86
+ export declare function buildAIRunCostPanel(cost?: AIRunCost, run?: AIRun): AIRunCostPanel;
83
87
  export declare function buildAIRunFalsePassWarnings(run: AIRun): string[];
84
88
  export declare function buildAIRunOperatorView(run: AIRun): AIRunOperatorView;
@@ -255,7 +255,8 @@ function buildAIRunQaHealth(run) {
255
255
  }
256
256
  };
257
257
  }
258
- function buildAIRunCostPanel(cost) {
258
+ function buildAIRunCostPanel(cost, run) {
259
+ var _a, _b, _c, _d;
259
260
  var categories = Object.keys((cost === null || cost === void 0 ? void 0 : cost.categories) || {}).sort().map(function (category) {
260
261
  var _a;
261
262
  var entry = (_a = cost === null || cost === void 0 ? void 0 : cost.categories) === null || _a === void 0 ? void 0 : _a[category];
@@ -288,6 +289,8 @@ function buildAIRunCostPanel(cost) {
288
289
  count: Number((entry === null || entry === void 0 ? void 0 : entry.count) || 0)
289
290
  };
290
291
  });
292
+ var costGate = (_a = run === null || run === void 0 ? void 0 : run.gates) === null || _a === void 0 ? void 0 : _a.find(function (gate) { return gate.key === 'cost_observability'; });
293
+ var observability = ((_b = run === null || run === void 0 ? void 0 : run.metadata) === null || _b === void 0 ? void 0 : _b.costObservability) || (costGate === null || costGate === void 0 ? void 0 : costGate.metadata) || {};
291
294
  return {
292
295
  totalTokens: Number((cost === null || cost === void 0 ? void 0 : cost.totalTokens) || 0),
293
296
  estimatedUsd: Number((cost === null || cost === void 0 ? void 0 : cost.estimatedUsd) || 0),
@@ -297,7 +300,11 @@ function buildAIRunCostPanel(cost) {
297
300
  surfaces: surfaces,
298
301
  manualEstimatedUsd: Number((cost === null || cost === void 0 ? void 0 : cost.manualEstimatedUsd) || 0),
299
302
  untrackedEstimatedUsd: Number((cost === null || cost === void 0 ? void 0 : cost.untrackedEstimatedUsd) || 0),
300
- untrackedWarnings: Array.isArray(cost === null || cost === void 0 ? void 0 : cost.untrackedWarnings) ? cost.untrackedWarnings : []
303
+ untrackedWarnings: Array.isArray(cost === null || cost === void 0 ? void 0 : cost.untrackedWarnings) ? cost.untrackedWarnings : [],
304
+ observabilityStatus: cleanText(observability.status || (costGate === null || costGate === void 0 ? void 0 : costGate.status), 80),
305
+ missingLedger: observability.missingLedger === true || ((_c = costGate === null || costGate === void 0 ? void 0 : costGate.metadata) === null || _c === void 0 ? void 0 : _c.missingLedger) === true,
306
+ externalCodexMonitorUsed: observability.externalCodexMonitorUsed === true || ((_d = costGate === null || costGate === void 0 ? void 0 : costGate.metadata) === null || _d === void 0 ? void 0 : _d.externalCodexMonitorUsed) === true,
307
+ nextAction: cleanText(observability.nextAction, 500)
301
308
  };
302
309
  }
303
310
  function buildAIRunFalsePassWarnings(run) {
@@ -328,7 +335,7 @@ function buildAIRunOperatorView(run) {
328
335
  warnings: buildAIRunFalsePassWarnings(run),
329
336
  timeline: buildAIRunTimeline(run),
330
337
  qaHealth: buildAIRunQaHealth(run),
331
- costPanel: buildAIRunCostPanel(run.cost),
338
+ costPanel: buildAIRunCostPanel(run.cost, run),
332
339
  trainingExample: (0, ai_run_evidence_eval_1.buildAIRunTrainingExampleFromRun)(run)
333
340
  };
334
341
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/util/ai-run-evidence-dashboard.ts"],"names":[],"mappings":"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","file":"ai-run-evidence-dashboard.js","sourcesContent":["import { AIRun, AIRunCost } from './ai-run-evidence';\nimport { buildAIRunTrainingExampleFromRun, classifyAIRunFailureClass } from './ai-run-evidence-eval';\n\nexport interface AIRunTimelineItem {\n\ttime?: string;\n\ttype: string;\n\tlabel: string;\n\tstatus?: string;\n\tmessage?: string;\n\tevidenceRefs: string[];\n\tmetadata?: Record<string, any>;\n}\n\nexport interface AIRunQaHealth {\n\toutcome?: string;\n\tinfra: {\n\t\tpass: number;\n\t\tfail: number;\n\t\tblocked: number;\n\t\twarn: number;\n\t\tunknown: number;\n\t};\n\tcompile?: {\n\t\tstatus?: string;\n\t\tstale?: boolean;\n\t\tartifactPath?: string;\n\t\tmessage?: string;\n\t};\n\troute: {\n\t\tpass: number;\n\t\tfail: number;\n\t\tshellOnly: number;\n\t};\n\tbusiness: {\n\t\tpass: number;\n\t\tfail: number;\n\t\tblocked: number;\n\t\tmissing: boolean;\n\t};\n}\n\nexport interface AIRunCostPanel {\n\ttotalTokens: number;\n\testimatedUsd: number;\n\tmodels: string[];\n\tcategories: Array<{\n\t\tcategory: string;\n\t\ttotalTokens: number;\n\t\testimatedUsd: number;\n\t\tcount: number;\n\t}>;\n\tsources?: Array<{\n\t\tsource: string;\n\t\ttotalTokens: number;\n\t\testimatedUsd: number;\n\t\tcount: number;\n\t\tmanualCount: number;\n\t\tuntrackedCount: number;\n\t}>;\n\tsurfaces?: Array<{\n\t\tsurface: string;\n\t\ttotalTokens: number;\n\t\testimatedUsd: number;\n\t\tcount: number;\n\t}>;\n\tmanualEstimatedUsd?: number;\n\tuntrackedEstimatedUsd?: number;\n\tuntrackedWarnings?: string[];\n}\n\nexport interface AIRunOperatorView {\n\trunId?: string;\n\tsource: string;\n\ttitle?: string;\n\toutcome: string;\n\tfailureClass: string;\n\tnextAction?: string;\n\twarnings: string[];\n\ttimeline: AIRunTimelineItem[];\n\tqaHealth: AIRunQaHealth;\n\tcostPanel: AIRunCostPanel;\n\ttrainingExample: ReturnType<typeof buildAIRunTrainingExampleFromRun>;\n}\n\nfunction cleanText(value: any, max = 1000): string {\n\treturn String(value || '').replace(/\\s+/g, ' ').trim().slice(0, max);\n}\n\nfunction toIso(value: any): string | undefined {\n\tif (value instanceof Date && Number.isFinite(value.getTime())) {\n\t\treturn value.toISOString();\n\t}\n\tif (value) {\n\t\tconst parsed = new Date(value);\n\t\tif (Number.isFinite(parsed.getTime())) {\n\t\t\treturn parsed.toISOString();\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction countStatuses(values: Array<{ status?: string }>): Record<string, number> {\n\tconst result: Record<string, number> = {\n\t\tpass: 0,\n\t\tfail: 0,\n\t\tblocked: 0,\n\t\twarn: 0,\n\t\tunknown: 0\n\t};\n\tfor (const value of values) {\n\t\tconst status = cleanText(value.status, 40).toLowerCase();\n\t\tif (status === 'pass' || status === 'fail' || status === 'blocked' || status === 'warn') {\n\t\t\tresult[status] += 1;\n\t\t}\n\t\telse {\n\t\t\tresult.unknown += 1;\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction sortTimeline(items: AIRunTimelineItem[]): AIRunTimelineItem[] {\n\treturn [...items].sort((left, right) => {\n\t\tconst leftTime = left.time ? new Date(left.time).getTime() : 0;\n\t\tconst rightTime = right.time ? new Date(right.time).getTime() : 0;\n\t\treturn leftTime - rightTime;\n\t});\n}\n\nexport function buildAIRunTimeline(run: AIRun): AIRunTimelineItem[] {\n\tconst items: AIRunTimelineItem[] = [];\n\tfor (const event of run.events || []) {\n\t\titems.push({\n\t\t\ttime: toIso(event.recordedAt),\n\t\t\ttype: event.type,\n\t\t\tlabel: event.category || event.type,\n\t\t\tmessage: cleanText(event.message, 2000),\n\t\t\tevidenceRefs: Array.isArray(event.artifactPaths) ? event.artifactPaths : [],\n\t\t\tmetadata: event.metadata\n\t\t});\n\t}\n\tfor (const gate of run.gates || []) {\n\t\titems.push({\n\t\t\ttime: toIso(gate.recordedAt),\n\t\t\ttype: 'gate',\n\t\t\tlabel: gate.label || gate.key,\n\t\t\tstatus: gate.status,\n\t\t\tmessage: gate.reason,\n\t\t\tevidenceRefs: gate.evidenceRefs || [],\n\t\t\tmetadata: gate.metadata\n\t\t});\n\t}\n\tfor (const check of run.qa?.infraChecks || []) {\n\t\titems.push({\n\t\t\ttime: toIso(check.checkedAt),\n\t\t\ttype: 'qa_infra',\n\t\t\tlabel: check.name,\n\t\t\tstatus: check.status,\n\t\t\tmessage: check.message,\n\t\t\tevidenceRefs: check.path ? [check.path] : [],\n\t\t\tmetadata: check.metadata\n\t\t});\n\t}\n\tif (run.qa?.compile) {\n\t\titems.push({\n\t\t\ttime: toIso(run.qa.compile.recordedAt),\n\t\t\ttype: 'qa_compile',\n\t\t\tlabel: run.qa.compile.command || 'Compile/build',\n\t\t\tstatus: run.qa.compile.status,\n\t\t\tmessage: run.qa.compile.message,\n\t\t\tevidenceRefs: run.qa.compile.artifactPath ? [run.qa.compile.artifactPath] : [],\n\t\t\tmetadata: run.qa.compile.metadata\n\t\t});\n\t}\n\tfor (const probe of run.qa?.routeProbes || []) {\n\t\titems.push({\n\t\t\ttime: toIso(probe.recordedAt),\n\t\t\ttype: 'qa_route_probe',\n\t\t\tlabel: probe.route,\n\t\t\tstatus: probe.status,\n\t\t\tmessage: probe.message || probe.caption,\n\t\t\tevidenceRefs: probe.screenshot ? [probe.screenshot] : [],\n\t\t\tmetadata: probe.metadata\n\t\t});\n\t}\n\tfor (const assertion of run.qa?.businessAssertions || []) {\n\t\titems.push({\n\t\t\ttime: toIso(assertion.recordedAt),\n\t\t\ttype: 'qa_business_assertion',\n\t\t\tlabel: assertion.assertion,\n\t\t\tstatus: assertion.status,\n\t\t\tmessage: assertion.observed || assertion.dataProof || assertion.message,\n\t\t\tevidenceRefs: assertion.artifactPaths || [],\n\t\t\tmetadata: assertion.metadata\n\t\t});\n\t}\n\treturn sortTimeline(items);\n}\n\nexport function buildAIRunQaHealth(run: AIRun): AIRunQaHealth {\n\tconst infraCounts = countStatuses(run.qa?.infraChecks || []);\n\tconst routeProbes = run.qa?.routeProbes || [];\n\tconst routePass = routeProbes.filter((probe) => probe.status === 'pass' && probe.shellOnly !== true).length;\n\tconst routeFail = routeProbes.filter((probe) => probe.status === 'fail' || probe.status === 'blocked').length;\n\tconst shellOnly = routeProbes.filter((probe) => probe.shellOnly === true).length;\n\tconst assertions = run.qa?.businessAssertions || [];\n\tconst businessPass = assertions.filter((assertion) => assertion.status === 'pass').length;\n\tconst businessFail = assertions.filter((assertion) => assertion.status === 'fail').length;\n\tconst businessBlocked = assertions.filter((assertion) => assertion.status === 'blocked').length;\n\treturn {\n\t\toutcome: run.qa?.outcome,\n\t\tinfra: {\n\t\t\tpass: infraCounts.pass,\n\t\t\tfail: infraCounts.fail,\n\t\t\tblocked: infraCounts.blocked,\n\t\t\twarn: infraCounts.warn,\n\t\t\tunknown: infraCounts.unknown\n\t\t},\n\t\tcompile: run.qa?.compile ? {\n\t\t\tstatus: run.qa.compile.status,\n\t\t\tstale: run.qa.compile.staleEvidence === true || run.qa.compile.status === 'stale',\n\t\t\tartifactPath: run.qa.compile.artifactPath,\n\t\t\tmessage: run.qa.compile.message\n\t\t} : undefined,\n\t\troute: {\n\t\t\tpass: routePass,\n\t\t\tfail: routeFail,\n\t\t\tshellOnly\n\t\t},\n\t\tbusiness: {\n\t\t\tpass: businessPass,\n\t\t\tfail: businessFail,\n\t\t\tblocked: businessBlocked,\n\t\t\tmissing: assertions.length === 0\n\t\t}\n\t};\n}\n\nexport function buildAIRunCostPanel(cost?: AIRunCost): AIRunCostPanel {\n\tconst categories = Object.keys(cost?.categories || {}).sort().map((category) => {\n\t\tconst entry = cost?.categories?.[category];\n\t\treturn {\n\t\t\tcategory,\n\t\t\ttotalTokens: Number(entry?.totalTokens || 0),\n\t\t\testimatedUsd: Number(entry?.estimatedUsd || 0),\n\t\t\tcount: Number(entry?.count || 0)\n\t\t};\n\t});\n\tconst sources = Object.keys(cost?.sources || {}).sort().map((source) => {\n\t\tconst entry = cost?.sources?.[source];\n\t\treturn {\n\t\t\tsource,\n\t\t\ttotalTokens: Number(entry?.totalTokens || 0),\n\t\t\testimatedUsd: Number(entry?.estimatedUsd || 0),\n\t\t\tcount: Number(entry?.count || 0),\n\t\t\tmanualCount: Number(entry?.manualCount || 0),\n\t\t\tuntrackedCount: Number(entry?.untrackedCount || 0)\n\t\t};\n\t});\n\tconst surfaces = Object.keys(cost?.surfaces || {}).sort().map((surface) => {\n\t\tconst entry = cost?.surfaces?.[surface];\n\t\treturn {\n\t\t\tsurface,\n\t\t\ttotalTokens: Number(entry?.totalTokens || 0),\n\t\t\testimatedUsd: Number(entry?.estimatedUsd || 0),\n\t\t\tcount: Number(entry?.count || 0)\n\t\t};\n\t});\n\treturn {\n\t\ttotalTokens: Number(cost?.totalTokens || 0),\n\t\testimatedUsd: Number(cost?.estimatedUsd || 0),\n\t\tmodels: Array.isArray(cost?.models) ? cost.models : [],\n\t\tcategories,\n\t\tsources,\n\t\tsurfaces,\n\t\tmanualEstimatedUsd: Number(cost?.manualEstimatedUsd || 0),\n\t\tuntrackedEstimatedUsd: Number(cost?.untrackedEstimatedUsd || 0),\n\t\tuntrackedWarnings: Array.isArray(cost?.untrackedWarnings) ? cost.untrackedWarnings : []\n\t};\n}\n\nexport function buildAIRunFalsePassWarnings(run: AIRun): string[] {\n\tconst warnings = Array.isArray(run.warnings) ? [...run.warnings] : [];\n\tif (run.outcome === 'false_pass' && !warnings.includes('false_pass_outcome')) {\n\t\twarnings.push('false_pass_outcome');\n\t}\n\tif ((run.qa?.outcome === 'route_only_pass' || run.qa?.outcome === 'incomplete') && !warnings.includes('missing_business_assertion')) {\n\t\twarnings.push('missing_business_assertion');\n\t}\n\tif (run.qa?.routeProbes?.some((probe) => probe.shellOnly === true) && !warnings.includes('shell_only_route')) {\n\t\twarnings.push('shell_only_route');\n\t}\n\tif (run.outcome === 'release_blocked' && !warnings.includes('release_blocked_after_scorecard')) {\n\t\twarnings.push('release_blocked_after_scorecard');\n\t}\n\treturn warnings;\n}\n\nexport function buildAIRunOperatorView(run: AIRun): AIRunOperatorView {\n\treturn {\n\t\trunId: run.id || (run as any)._id,\n\t\tsource: run.source,\n\t\ttitle: run.title,\n\t\toutcome: run.outcome,\n\t\tfailureClass: classifyAIRunFailureClass(run),\n\t\tnextAction: run.nextAction,\n\t\twarnings: buildAIRunFalsePassWarnings(run),\n\t\ttimeline: buildAIRunTimeline(run),\n\t\tqaHealth: buildAIRunQaHealth(run),\n\t\tcostPanel: buildAIRunCostPanel(run.cost),\n\t\ttrainingExample: buildAIRunTrainingExampleFromRun(run)\n\t};\n}\n"]}
1
+ {"version":3,"sources":["../../src/util/ai-run-evidence-dashboard.ts"],"names":[],"mappings":"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","file":"ai-run-evidence-dashboard.js","sourcesContent":["import { AIRun, AIRunCost } from './ai-run-evidence';\nimport { buildAIRunTrainingExampleFromRun, classifyAIRunFailureClass } from './ai-run-evidence-eval';\n\nexport interface AIRunTimelineItem {\n\ttime?: string;\n\ttype: string;\n\tlabel: string;\n\tstatus?: string;\n\tmessage?: string;\n\tevidenceRefs: string[];\n\tmetadata?: Record<string, any>;\n}\n\nexport interface AIRunQaHealth {\n\toutcome?: string;\n\tinfra: {\n\t\tpass: number;\n\t\tfail: number;\n\t\tblocked: number;\n\t\twarn: number;\n\t\tunknown: number;\n\t};\n\tcompile?: {\n\t\tstatus?: string;\n\t\tstale?: boolean;\n\t\tartifactPath?: string;\n\t\tmessage?: string;\n\t};\n\troute: {\n\t\tpass: number;\n\t\tfail: number;\n\t\tshellOnly: number;\n\t};\n\tbusiness: {\n\t\tpass: number;\n\t\tfail: number;\n\t\tblocked: number;\n\t\tmissing: boolean;\n\t};\n}\n\nexport interface AIRunCostPanel {\n\ttotalTokens: number;\n\testimatedUsd: number;\n\tmodels: string[];\n\tcategories: Array<{\n\t\tcategory: string;\n\t\ttotalTokens: number;\n\t\testimatedUsd: number;\n\t\tcount: number;\n\t}>;\n\tsources?: Array<{\n\t\tsource: string;\n\t\ttotalTokens: number;\n\t\testimatedUsd: number;\n\t\tcount: number;\n\t\tmanualCount: number;\n\t\tuntrackedCount: number;\n\t}>;\n\tsurfaces?: Array<{\n\t\tsurface: string;\n\t\ttotalTokens: number;\n\t\testimatedUsd: number;\n\t\tcount: number;\n\t}>;\n\tmanualEstimatedUsd?: number;\n\tuntrackedEstimatedUsd?: number;\n\tuntrackedWarnings?: string[];\n\tobservabilityStatus?: string;\n\tmissingLedger?: boolean;\n\texternalCodexMonitorUsed?: boolean;\n\tnextAction?: string;\n}\n\nexport interface AIRunOperatorView {\n\trunId?: string;\n\tsource: string;\n\ttitle?: string;\n\toutcome: string;\n\tfailureClass: string;\n\tnextAction?: string;\n\twarnings: string[];\n\ttimeline: AIRunTimelineItem[];\n\tqaHealth: AIRunQaHealth;\n\tcostPanel: AIRunCostPanel;\n\ttrainingExample: ReturnType<typeof buildAIRunTrainingExampleFromRun>;\n}\n\nfunction cleanText(value: any, max = 1000): string {\n\treturn String(value || '').replace(/\\s+/g, ' ').trim().slice(0, max);\n}\n\nfunction toIso(value: any): string | undefined {\n\tif (value instanceof Date && Number.isFinite(value.getTime())) {\n\t\treturn value.toISOString();\n\t}\n\tif (value) {\n\t\tconst parsed = new Date(value);\n\t\tif (Number.isFinite(parsed.getTime())) {\n\t\t\treturn parsed.toISOString();\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction countStatuses(values: Array<{ status?: string }>): Record<string, number> {\n\tconst result: Record<string, number> = {\n\t\tpass: 0,\n\t\tfail: 0,\n\t\tblocked: 0,\n\t\twarn: 0,\n\t\tunknown: 0\n\t};\n\tfor (const value of values) {\n\t\tconst status = cleanText(value.status, 40).toLowerCase();\n\t\tif (status === 'pass' || status === 'fail' || status === 'blocked' || status === 'warn') {\n\t\t\tresult[status] += 1;\n\t\t}\n\t\telse {\n\t\t\tresult.unknown += 1;\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction sortTimeline(items: AIRunTimelineItem[]): AIRunTimelineItem[] {\n\treturn [...items].sort((left, right) => {\n\t\tconst leftTime = left.time ? new Date(left.time).getTime() : 0;\n\t\tconst rightTime = right.time ? new Date(right.time).getTime() : 0;\n\t\treturn leftTime - rightTime;\n\t});\n}\n\nexport function buildAIRunTimeline(run: AIRun): AIRunTimelineItem[] {\n\tconst items: AIRunTimelineItem[] = [];\n\tfor (const event of run.events || []) {\n\t\titems.push({\n\t\t\ttime: toIso(event.recordedAt),\n\t\t\ttype: event.type,\n\t\t\tlabel: event.category || event.type,\n\t\t\tmessage: cleanText(event.message, 2000),\n\t\t\tevidenceRefs: Array.isArray(event.artifactPaths) ? event.artifactPaths : [],\n\t\t\tmetadata: event.metadata\n\t\t});\n\t}\n\tfor (const gate of run.gates || []) {\n\t\titems.push({\n\t\t\ttime: toIso(gate.recordedAt),\n\t\t\ttype: 'gate',\n\t\t\tlabel: gate.label || gate.key,\n\t\t\tstatus: gate.status,\n\t\t\tmessage: gate.reason,\n\t\t\tevidenceRefs: gate.evidenceRefs || [],\n\t\t\tmetadata: gate.metadata\n\t\t});\n\t}\n\tfor (const check of run.qa?.infraChecks || []) {\n\t\titems.push({\n\t\t\ttime: toIso(check.checkedAt),\n\t\t\ttype: 'qa_infra',\n\t\t\tlabel: check.name,\n\t\t\tstatus: check.status,\n\t\t\tmessage: check.message,\n\t\t\tevidenceRefs: check.path ? [check.path] : [],\n\t\t\tmetadata: check.metadata\n\t\t});\n\t}\n\tif (run.qa?.compile) {\n\t\titems.push({\n\t\t\ttime: toIso(run.qa.compile.recordedAt),\n\t\t\ttype: 'qa_compile',\n\t\t\tlabel: run.qa.compile.command || 'Compile/build',\n\t\t\tstatus: run.qa.compile.status,\n\t\t\tmessage: run.qa.compile.message,\n\t\t\tevidenceRefs: run.qa.compile.artifactPath ? [run.qa.compile.artifactPath] : [],\n\t\t\tmetadata: run.qa.compile.metadata\n\t\t});\n\t}\n\tfor (const probe of run.qa?.routeProbes || []) {\n\t\titems.push({\n\t\t\ttime: toIso(probe.recordedAt),\n\t\t\ttype: 'qa_route_probe',\n\t\t\tlabel: probe.route,\n\t\t\tstatus: probe.status,\n\t\t\tmessage: probe.message || probe.caption,\n\t\t\tevidenceRefs: probe.screenshot ? [probe.screenshot] : [],\n\t\t\tmetadata: probe.metadata\n\t\t});\n\t}\n\tfor (const assertion of run.qa?.businessAssertions || []) {\n\t\titems.push({\n\t\t\ttime: toIso(assertion.recordedAt),\n\t\t\ttype: 'qa_business_assertion',\n\t\t\tlabel: assertion.assertion,\n\t\t\tstatus: assertion.status,\n\t\t\tmessage: assertion.observed || assertion.dataProof || assertion.message,\n\t\t\tevidenceRefs: assertion.artifactPaths || [],\n\t\t\tmetadata: assertion.metadata\n\t\t});\n\t}\n\treturn sortTimeline(items);\n}\n\nexport function buildAIRunQaHealth(run: AIRun): AIRunQaHealth {\n\tconst infraCounts = countStatuses(run.qa?.infraChecks || []);\n\tconst routeProbes = run.qa?.routeProbes || [];\n\tconst routePass = routeProbes.filter((probe) => probe.status === 'pass' && probe.shellOnly !== true).length;\n\tconst routeFail = routeProbes.filter((probe) => probe.status === 'fail' || probe.status === 'blocked').length;\n\tconst shellOnly = routeProbes.filter((probe) => probe.shellOnly === true).length;\n\tconst assertions = run.qa?.businessAssertions || [];\n\tconst businessPass = assertions.filter((assertion) => assertion.status === 'pass').length;\n\tconst businessFail = assertions.filter((assertion) => assertion.status === 'fail').length;\n\tconst businessBlocked = assertions.filter((assertion) => assertion.status === 'blocked').length;\n\treturn {\n\t\toutcome: run.qa?.outcome,\n\t\tinfra: {\n\t\t\tpass: infraCounts.pass,\n\t\t\tfail: infraCounts.fail,\n\t\t\tblocked: infraCounts.blocked,\n\t\t\twarn: infraCounts.warn,\n\t\t\tunknown: infraCounts.unknown\n\t\t},\n\t\tcompile: run.qa?.compile ? {\n\t\t\tstatus: run.qa.compile.status,\n\t\t\tstale: run.qa.compile.staleEvidence === true || run.qa.compile.status === 'stale',\n\t\t\tartifactPath: run.qa.compile.artifactPath,\n\t\t\tmessage: run.qa.compile.message\n\t\t} : undefined,\n\t\troute: {\n\t\t\tpass: routePass,\n\t\t\tfail: routeFail,\n\t\t\tshellOnly\n\t\t},\n\t\tbusiness: {\n\t\t\tpass: businessPass,\n\t\t\tfail: businessFail,\n\t\t\tblocked: businessBlocked,\n\t\t\tmissing: assertions.length === 0\n\t\t}\n\t};\n}\n\nexport function buildAIRunCostPanel(cost?: AIRunCost, run?: AIRun): AIRunCostPanel {\n\tconst categories = Object.keys(cost?.categories || {}).sort().map((category) => {\n\t\tconst entry = cost?.categories?.[category];\n\t\treturn {\n\t\t\tcategory,\n\t\t\ttotalTokens: Number(entry?.totalTokens || 0),\n\t\t\testimatedUsd: Number(entry?.estimatedUsd || 0),\n\t\t\tcount: Number(entry?.count || 0)\n\t\t};\n\t});\n\tconst sources = Object.keys(cost?.sources || {}).sort().map((source) => {\n\t\tconst entry = cost?.sources?.[source];\n\t\treturn {\n\t\t\tsource,\n\t\t\ttotalTokens: Number(entry?.totalTokens || 0),\n\t\t\testimatedUsd: Number(entry?.estimatedUsd || 0),\n\t\t\tcount: Number(entry?.count || 0),\n\t\t\tmanualCount: Number(entry?.manualCount || 0),\n\t\t\tuntrackedCount: Number(entry?.untrackedCount || 0)\n\t\t};\n\t});\n\tconst surfaces = Object.keys(cost?.surfaces || {}).sort().map((surface) => {\n\t\tconst entry = cost?.surfaces?.[surface];\n\t\treturn {\n\t\t\tsurface,\n\t\t\ttotalTokens: Number(entry?.totalTokens || 0),\n\t\t\testimatedUsd: Number(entry?.estimatedUsd || 0),\n\t\t\tcount: Number(entry?.count || 0)\n\t\t};\n\t});\n\tconst costGate = run?.gates?.find((gate) => gate.key === 'cost_observability');\n\tconst observability = (run?.metadata as any)?.costObservability || costGate?.metadata || {};\n\treturn {\n\t\ttotalTokens: Number(cost?.totalTokens || 0),\n\t\testimatedUsd: Number(cost?.estimatedUsd || 0),\n\t\tmodels: Array.isArray(cost?.models) ? cost.models : [],\n\t\tcategories,\n\t\tsources,\n\t\tsurfaces,\n\t\tmanualEstimatedUsd: Number(cost?.manualEstimatedUsd || 0),\n\t\tuntrackedEstimatedUsd: Number(cost?.untrackedEstimatedUsd || 0),\n\t\tuntrackedWarnings: Array.isArray(cost?.untrackedWarnings) ? cost.untrackedWarnings : [],\n\t\tobservabilityStatus: cleanText(observability.status || costGate?.status, 80),\n\t\tmissingLedger: observability.missingLedger === true || costGate?.metadata?.missingLedger === true,\n\t\texternalCodexMonitorUsed: observability.externalCodexMonitorUsed === true || costGate?.metadata?.externalCodexMonitorUsed === true,\n\t\tnextAction: cleanText(observability.nextAction, 500)\n\t};\n}\n\nexport function buildAIRunFalsePassWarnings(run: AIRun): string[] {\n\tconst warnings = Array.isArray(run.warnings) ? [...run.warnings] : [];\n\tif (run.outcome === 'false_pass' && !warnings.includes('false_pass_outcome')) {\n\t\twarnings.push('false_pass_outcome');\n\t}\n\tif ((run.qa?.outcome === 'route_only_pass' || run.qa?.outcome === 'incomplete') && !warnings.includes('missing_business_assertion')) {\n\t\twarnings.push('missing_business_assertion');\n\t}\n\tif (run.qa?.routeProbes?.some((probe) => probe.shellOnly === true) && !warnings.includes('shell_only_route')) {\n\t\twarnings.push('shell_only_route');\n\t}\n\tif (run.outcome === 'release_blocked' && !warnings.includes('release_blocked_after_scorecard')) {\n\t\twarnings.push('release_blocked_after_scorecard');\n\t}\n\treturn warnings;\n}\n\nexport function buildAIRunOperatorView(run: AIRun): AIRunOperatorView {\n\treturn {\n\t\trunId: run.id || (run as any)._id,\n\t\tsource: run.source,\n\t\ttitle: run.title,\n\t\toutcome: run.outcome,\n\t\tfailureClass: classifyAIRunFailureClass(run),\n\t\tnextAction: run.nextAction,\n\t\twarnings: buildAIRunFalsePassWarnings(run),\n\t\ttimeline: buildAIRunTimeline(run),\n\t\tqaHealth: buildAIRunQaHealth(run),\n\t\tcostPanel: buildAIRunCostPanel(run.cost, run),\n\t\ttrainingExample: buildAIRunTrainingExampleFromRun(run)\n\t};\n}\n"]}
@@ -776,7 +776,7 @@ export interface ResolveIOSupportNextActionContract {
776
776
  action: ResolveIOSupportV5AutonomousNextAction;
777
777
  label: string;
778
778
  primaryCommand: string;
779
- lane: ResolveIOSupportV5Lane | 'release' | 'customer';
779
+ lane: ResolveIOSupportV5Lane | 'release' | 'customer' | 'supervisor';
780
780
  stepType: ResolveIOSupportV5StepType | 'release_gate' | 'customer_reply';
781
781
  safeToAutoRun: boolean;
782
782
  requiresHumanApproval: boolean;
@@ -814,6 +814,40 @@ export interface ResolveIOSupportNextActionContract {
814
814
  nextCommands: string[];
815
815
  createdAt: string;
816
816
  }
817
+ export type ResolveIOSupportNextActionContractValidationStatus = 'ready' | 'manual_required' | 'blocked';
818
+ export interface ResolveIOSupportNextActionContractValidation {
819
+ valid: boolean;
820
+ status: ResolveIOSupportNextActionContractValidationStatus;
821
+ blockers: string[];
822
+ warnings: string[];
823
+ normalized?: ResolveIOSupportNextActionContract;
824
+ }
825
+ export type ResolveIOSupportManagerExecutionPacketStatus = 'auto_ready' | 'manual_required' | 'blocked';
826
+ export type ResolveIOSupportManagerExecutionRetryScope = 'none' | 'diagnosis_only' | 'infra_only' | 'owner_files_only' | 'business_proof_only' | 'release_hotfix_only' | 'customer_draft_only' | 'evidence_only';
827
+ export interface ResolveIOSupportManagerExecutionPacket {
828
+ packetId: string;
829
+ status: ResolveIOSupportManagerExecutionPacketStatus;
830
+ action: ResolveIOSupportV5AutonomousNextAction;
831
+ label: string;
832
+ primaryCommand: string;
833
+ lane: ResolveIOSupportV5Lane | 'release' | 'customer' | 'supervisor';
834
+ stepType: ResolveIOSupportV5StepType | 'release_gate' | 'customer_reply';
835
+ executeNow: boolean;
836
+ canRunWithoutCodexMonitor: boolean;
837
+ codexFallbackRequired: boolean;
838
+ retryScope: ResolveIOSupportManagerExecutionRetryScope;
839
+ maxAttemptsBeforeFreshEvidence: number;
840
+ costRisk: ResolveIOSupportNextActionCostRisk;
841
+ proofRequiredBeforeContinuation: string[];
842
+ expectedStateTransition: string;
843
+ stopConditions: string[];
844
+ forbiddenActions: string[];
845
+ ownerFiles: string[];
846
+ nextCommands: string[];
847
+ blockers: string[];
848
+ validation: ResolveIOSupportNextActionContractValidation;
849
+ createdAt: string;
850
+ }
817
851
  export interface ResolveIOSupportV5AutonomousDecisionInput {
818
852
  bundle: ResolveIOSupportV5StateBundle;
819
853
  changedFiles?: any;
@@ -851,7 +885,7 @@ export interface ResolveIOSupportV5AutonomousDecision {
851
885
  liveHotfixBlockedUntilCommit: boolean;
852
886
  canDraftCustomerReply: boolean;
853
887
  canSendCustomerReply: boolean;
854
- lane: ResolveIOSupportV5Lane | 'release' | 'customer';
888
+ lane: ResolveIOSupportV5Lane | 'release' | 'customer' | 'supervisor';
855
889
  stepType: ResolveIOSupportV5StepType | 'release_gate' | 'customer_reply';
856
890
  microtaskId?: string;
857
891
  primaryCommand: string;
@@ -877,6 +911,7 @@ export interface ResolveIOSupportV5AutonomousDecision {
877
911
  rootCauseReadiness: ResolveIOSupportRootCauseReadiness;
878
912
  continuationProofCheckpoint: ResolveIOSupportContinuationProofCheckpoint;
879
913
  nextActionContract: ResolveIOSupportNextActionContract;
914
+ managerExecutionPacket: ResolveIOSupportManagerExecutionPacket;
880
915
  humanReviewPacket: ResolveIOSupportHumanReviewPacket;
881
916
  humanDecisionRequest?: ResolveIOSupportHumanDecisionRequest;
882
917
  hotfixContinuation?: ResolveIOAIManagerHotfixContinuationDecision;
@@ -912,6 +947,8 @@ export declare function buildResolveIOSupportIssueClassProbes(value: any): Resol
912
947
  export declare function validateResolveIOSupportIssueClassProbePlan(value: any, diagnosisGate?: any, now?: Date | string): ResolveIOSupportIssueClassProbePlanValidation;
913
948
  export declare function buildResolveIOSupportIssueClassProbePlan(diagnosisGate: any, now?: Date | string): ResolveIOSupportIssueClassProbePlan;
914
949
  export declare function hashResolveIOSupportV5Evidence(value: any): string;
950
+ export declare function validateResolveIOSupportNextActionContract(value: any): ResolveIOSupportNextActionContractValidation;
951
+ export declare function buildResolveIOSupportManagerExecutionPacket(contract: ResolveIOSupportNextActionContract, now?: Date | string): ResolveIOSupportManagerExecutionPacket;
915
952
  export declare function decideResolveIOSupportV5RepeatedFailureStop(input: ResolveIOSupportV5RepeatStopInput): ResolveIOSupportV5RepeatStopDecision;
916
953
  export declare function evaluateResolveIOSupportEvidenceFreshness(input: {
917
954
  history?: ResolveIOSupportV5StepRecord[];
@@ -64,6 +64,8 @@ exports.buildResolveIOSupportIssueClassProbes = buildResolveIOSupportIssueClassP
64
64
  exports.validateResolveIOSupportIssueClassProbePlan = validateResolveIOSupportIssueClassProbePlan;
65
65
  exports.buildResolveIOSupportIssueClassProbePlan = buildResolveIOSupportIssueClassProbePlan;
66
66
  exports.hashResolveIOSupportV5Evidence = hashResolveIOSupportV5Evidence;
67
+ exports.validateResolveIOSupportNextActionContract = validateResolveIOSupportNextActionContract;
68
+ exports.buildResolveIOSupportManagerExecutionPacket = buildResolveIOSupportManagerExecutionPacket;
67
69
  exports.decideResolveIOSupportV5RepeatedFailureStop = decideResolveIOSupportV5RepeatedFailureStop;
68
70
  exports.evaluateResolveIOSupportEvidenceFreshness = evaluateResolveIOSupportEvidenceFreshness;
69
71
  exports.buildResolveIOSupportContinuationProofCheckpoint = buildResolveIOSupportContinuationProofCheckpoint;
@@ -2533,6 +2535,193 @@ function hashResolveIOSupportV5Evidence(value) {
2533
2535
  }
2534
2536
  return "ev-".concat(Math.abs(hash).toString(36) || '0');
2535
2537
  }
2538
+ function supportManagerRetryScopeForAction(action) {
2539
+ if (action === 'run_diagnosis_gate' || action === 'revise_diagnosis_scope') {
2540
+ return 'diagnosis_only';
2541
+ }
2542
+ if (action === 'repair_infra_only') {
2543
+ return 'infra_only';
2544
+ }
2545
+ if (action === 'run_owner_scoped_repair') {
2546
+ return 'owner_files_only';
2547
+ }
2548
+ if (action === 'run_business_proof_qa') {
2549
+ return 'business_proof_only';
2550
+ }
2551
+ if (action === 'repair_release_hotfix_first') {
2552
+ return 'release_hotfix_only';
2553
+ }
2554
+ if (action === 'draft_customer_reply' || action === 'ask_customer_clarification') {
2555
+ return 'customer_draft_only';
2556
+ }
2557
+ if (action === 'collect_new_evidence') {
2558
+ return 'evidence_only';
2559
+ }
2560
+ return 'none';
2561
+ }
2562
+ function supportManagerMaxAttemptsForContract(contract) {
2563
+ if (contract.action === 'run_owner_scoped_repair' || contract.action === 'repair_release_hotfix_first') {
2564
+ return 1;
2565
+ }
2566
+ if (contract.action === 'repair_infra_only') {
2567
+ return 2;
2568
+ }
2569
+ if (contract.action === 'run_business_proof_qa' || contract.action === 'collect_new_evidence') {
2570
+ return 1;
2571
+ }
2572
+ return contract.costRisk === 'expensive_model' ? 1 : 2;
2573
+ }
2574
+ function validateResolveIOSupportNextActionContract(value) {
2575
+ var e_9, _a;
2576
+ var _b, _c, _d;
2577
+ var contract = cleanObject(value);
2578
+ var blockers = [];
2579
+ var warnings = [];
2580
+ var action = cleanText(contract.action, 120);
2581
+ var primaryCommand = cleanText(contract.primaryCommand, 240);
2582
+ var requiredStringFields = [
2583
+ ['action', action],
2584
+ ['label', contract.label],
2585
+ ['primaryCommand', primaryCommand],
2586
+ ['expectedStateTransition', contract.expectedStateTransition],
2587
+ ['contractId', contract.contractId]
2588
+ ];
2589
+ try {
2590
+ for (var requiredStringFields_1 = __values(requiredStringFields), requiredStringFields_1_1 = requiredStringFields_1.next(); !requiredStringFields_1_1.done; requiredStringFields_1_1 = requiredStringFields_1.next()) {
2591
+ var _e = __read(requiredStringFields_1_1.value, 2), field = _e[0], fieldValue = _e[1];
2592
+ if (!cleanText(fieldValue, 500)) {
2593
+ blockers.push("NextActionContract.".concat(field, " is required."));
2594
+ }
2595
+ }
2596
+ }
2597
+ catch (e_9_1) { e_9 = { error: e_9_1 }; }
2598
+ finally {
2599
+ try {
2600
+ if (requiredStringFields_1_1 && !requiredStringFields_1_1.done && (_a = requiredStringFields_1.return)) _a.call(requiredStringFields_1);
2601
+ }
2602
+ finally { if (e_9) throw e_9.error; }
2603
+ }
2604
+ if (!Array.isArray(contract.nextCommands) || !contract.nextCommands.length) {
2605
+ blockers.push('NextActionContract.nextCommands must include at least the primary command.');
2606
+ }
2607
+ if (primaryCommand && Array.isArray(contract.nextCommands) && !contract.nextCommands.includes(primaryCommand)) {
2608
+ blockers.push('NextActionContract.nextCommands must include primaryCommand.');
2609
+ }
2610
+ if (!Array.isArray(contract.stopConditions) || !contract.stopConditions.length) {
2611
+ blockers.push('NextActionContract.stopConditions are required so the manager can stop without Codex sidecar monitoring.');
2612
+ }
2613
+ if (!Array.isArray(contract.forbiddenActions) || contract.forbiddenActions.length < 2) {
2614
+ blockers.push('NextActionContract.forbiddenActions must make unsafe follow-up work explicit.');
2615
+ }
2616
+ if (!Array.isArray(contract.successEvidence) || !contract.successEvidence.length) {
2617
+ blockers.push('NextActionContract.successEvidence is required before continuation.');
2618
+ }
2619
+ if (contract.safeToAutoRun === true && contract.requiresHumanApproval === true) {
2620
+ blockers.push('NextActionContract cannot be both safeToAutoRun and requiresHumanApproval.');
2621
+ }
2622
+ if (contract.canRunWithoutCodexMonitor === true) {
2623
+ if (contract.safeToAutoRun !== true) {
2624
+ blockers.push('canRunWithoutCodexMonitor requires safeToAutoRun=true.');
2625
+ }
2626
+ if (contract.codexFallbackRequired === true) {
2627
+ blockers.push('canRunWithoutCodexMonitor cannot require Codex fallback.');
2628
+ }
2629
+ if (!contract.stopConditions.some(function (entry) { return /same failure|evidence hash|blocker fingerprint|stop/i.test(entry); })) {
2630
+ blockers.push('canRunWithoutCodexMonitor requires a deterministic same-failure or evidence-change stop condition.');
2631
+ }
2632
+ }
2633
+ if (action === 'run_owner_scoped_repair') {
2634
+ if (contract.rootCauseFirstSatisfied !== true) {
2635
+ blockers.push('Owner-scoped repair requires rootCauseFirstSatisfied=true.');
2636
+ }
2637
+ if (!Array.isArray(contract.ownerFiles) || !contract.ownerFiles.length) {
2638
+ blockers.push('Owner-scoped repair requires a non-empty ownerFiles set.');
2639
+ }
2640
+ if (!contract.forbiddenActions.some(function (entry) { return /owner_files|outside/i.test(entry); })) {
2641
+ blockers.push('Owner-scoped repair must forbid edits outside owner_files.');
2642
+ }
2643
+ }
2644
+ if (action === 'run_business_proof_qa') {
2645
+ if (((_b = contract.decisionBasis) === null || _b === void 0 ? void 0 : _b.issueClassProbePlanReady) !== true) {
2646
+ blockers.push('Business proof QA requires issueClassProbePlanReady=true.');
2647
+ }
2648
+ if (!contract.successEvidence.some(function (entry) { return /AIQaBusinessAssertion|business proof|before\/action\/after/i.test(entry); })) {
2649
+ blockers.push('Business proof QA must require AIQaBusinessAssertion or before/action/after proof.');
2650
+ }
2651
+ }
2652
+ if (action === 'repair_release_hotfix_first') {
2653
+ if (((_c = contract.decisionBasis) === null || _c === void 0 ? void 0 : _c.hotfixCommitRequired) === true
2654
+ && !__spreadArray(__spreadArray(__spreadArray([], __read(contract.successEvidence), false), __read(contract.stopConditions), false), __read(contract.forbiddenActions), false).some(function (entry) { return /sourceCommitSha|githubCommitUrl|gitCommitStatus|gitPushStatus|GitHub commit/i.test(entry); })) {
2655
+ blockers.push('Hotfix release action requires GitHub commit and push proof before continuation.');
2656
+ }
2657
+ if (((_d = contract.decisionBasis) === null || _d === void 0 ? void 0 : _d.liveHotfixBlockedUntilCommit) === true && contract.safeToAutoRun === true && primaryCommand !== 'record_hotfix_evidence') {
2658
+ warnings.push('Live hotfix is blocked until commit proof; manager should record evidence before any live apply.');
2659
+ }
2660
+ }
2661
+ if (action === 'draft_customer_reply') {
2662
+ if (!contract.forbiddenActions.some(function (entry) { return /do not send|send/i.test(entry); })) {
2663
+ blockers.push('Customer reply draft action must forbid sending without human approval.');
2664
+ }
2665
+ }
2666
+ var status = blockers.length
2667
+ ? 'blocked'
2668
+ : contract.requiresHumanApproval === true || contract.safeToAutoRun !== true
2669
+ ? 'manual_required'
2670
+ : 'ready';
2671
+ return {
2672
+ valid: blockers.length === 0,
2673
+ status: status,
2674
+ blockers: blockers,
2675
+ warnings: warnings,
2676
+ normalized: contract.contractId ? contract : undefined
2677
+ };
2678
+ }
2679
+ function buildResolveIOSupportManagerExecutionPacket(contract, now) {
2680
+ var validation = validateResolveIOSupportNextActionContract(contract);
2681
+ var createdAt = isoNow(now || (contract === null || contract === void 0 ? void 0 : contract.createdAt));
2682
+ var executeNow = validation.valid === true
2683
+ && validation.status === 'ready'
2684
+ && contract.canRunWithoutCodexMonitor === true
2685
+ && contract.codexFallbackRequired !== true;
2686
+ var status = executeNow
2687
+ ? 'auto_ready'
2688
+ : validation.status === 'manual_required'
2689
+ ? 'manual_required'
2690
+ : 'blocked';
2691
+ var proofRequiredBeforeContinuation = Array.from(new Set(__spreadArray(__spreadArray([], __read(cleanList(contract === null || contract === void 0 ? void 0 : contract.successEvidence, 24, 500)), false), [
2692
+ cleanText(contract === null || contract === void 0 ? void 0 : contract.expectedStateTransition, 500)
2693
+ ], false).filter(Boolean))).slice(0, 24);
2694
+ return {
2695
+ packetId: "support-manager-exec-".concat(hashResolveIOSupportV5Evidence({
2696
+ contractId: contract === null || contract === void 0 ? void 0 : contract.contractId,
2697
+ action: contract === null || contract === void 0 ? void 0 : contract.action,
2698
+ primaryCommand: contract === null || contract === void 0 ? void 0 : contract.primaryCommand,
2699
+ status: status,
2700
+ createdAt: createdAt.slice(0, 16)
2701
+ }).slice(0, 16)),
2702
+ status: status,
2703
+ action: contract === null || contract === void 0 ? void 0 : contract.action,
2704
+ label: cleanText(contract === null || contract === void 0 ? void 0 : contract.label, 160),
2705
+ primaryCommand: cleanText(contract === null || contract === void 0 ? void 0 : contract.primaryCommand, 240),
2706
+ lane: (contract === null || contract === void 0 ? void 0 : contract.lane) || 'supervisor',
2707
+ stepType: (contract === null || contract === void 0 ? void 0 : contract.stepType) || 'cleanup',
2708
+ executeNow: executeNow,
2709
+ canRunWithoutCodexMonitor: (contract === null || contract === void 0 ? void 0 : contract.canRunWithoutCodexMonitor) === true,
2710
+ codexFallbackRequired: (contract === null || contract === void 0 ? void 0 : contract.codexFallbackRequired) === true,
2711
+ retryScope: supportManagerRetryScopeForAction(contract === null || contract === void 0 ? void 0 : contract.action),
2712
+ maxAttemptsBeforeFreshEvidence: supportManagerMaxAttemptsForContract(contract),
2713
+ costRisk: (contract === null || contract === void 0 ? void 0 : contract.costRisk) || 'manual_blocked',
2714
+ proofRequiredBeforeContinuation: proofRequiredBeforeContinuation,
2715
+ expectedStateTransition: cleanText(contract === null || contract === void 0 ? void 0 : contract.expectedStateTransition, 1000),
2716
+ stopConditions: cleanList(contract === null || contract === void 0 ? void 0 : contract.stopConditions, 24, 500),
2717
+ forbiddenActions: cleanList(contract === null || contract === void 0 ? void 0 : contract.forbiddenActions, 24, 500),
2718
+ ownerFiles: cleanList(contract === null || contract === void 0 ? void 0 : contract.ownerFiles, 24, 500),
2719
+ nextCommands: cleanList(contract === null || contract === void 0 ? void 0 : contract.nextCommands, 24, 240),
2720
+ blockers: Array.from(new Set(__spreadArray(__spreadArray([], __read(cleanList(contract === null || contract === void 0 ? void 0 : contract.blockers, 24, 500)), false), __read(validation.blockers), false))).slice(0, 24),
2721
+ validation: validation,
2722
+ createdAt: createdAt
2723
+ };
2724
+ }
2536
2725
  function decideResolveIOSupportV5RepeatedFailureStop(input) {
2537
2726
  var failureClass = cleanText(input.failureClass || 'unknown', 80).toLowerCase();
2538
2727
  var blockerFingerprint = fingerprintResolveIOSupportV5Blocker(input.blocker || '');
@@ -3083,7 +3272,7 @@ function buildResolveIOSupportV5ScopeDigest(input) {
3083
3272
  return raw.slice(0, maxChars);
3084
3273
  }
3085
3274
  function buildResolveIOSupportV5MicrotaskLedger(input) {
3086
- var e_9, _a;
3275
+ var e_10, _a;
3087
3276
  var existing = Array.isArray(input.existing) ? input.existing : [];
3088
3277
  var completedByObjective = new Map();
3089
3278
  try {
@@ -3094,12 +3283,12 @@ function buildResolveIOSupportV5MicrotaskLedger(input) {
3094
3283
  }
3095
3284
  }
3096
3285
  }
3097
- catch (e_9_1) { e_9 = { error: e_9_1 }; }
3286
+ catch (e_10_1) { e_10 = { error: e_10_1 }; }
3098
3287
  finally {
3099
3288
  try {
3100
3289
  if (existing_1_1 && !existing_1_1.done && (_a = existing_1.return)) _a.call(existing_1);
3101
3290
  }
3102
- finally { if (e_9) throw e_9.error; }
3291
+ finally { if (e_10) throw e_10.error; }
3103
3292
  }
3104
3293
  var now = isoNow(input.now);
3105
3294
  var requirements = cleanList(input.requirements, 30, 240);
@@ -3908,7 +4097,9 @@ function decideResolveIOSupportV5AutonomousNextAction(input) {
3908
4097
  var makeDecision = function (action, label, reason, fields) {
3909
4098
  var _a;
3910
4099
  var primaryCommand = fields.primaryCommand || action;
3911
- var nextCommands = fields.nextCommands || [primaryCommand];
4100
+ var nextCommands = Array.from(new Set(__spreadArray([
4101
+ primaryCommand
4102
+ ], __read((fields.nextCommands || [])), false).filter(Boolean)));
3912
4103
  var requiredEvidence = fields.requiredEvidence || [];
3913
4104
  var blockers = fields.blockers || [];
3914
4105
  var rootCauseReadiness = buildRootCauseReadiness(action, reason, fields, primaryCommand, nextCommands, blockers);
@@ -3926,6 +4117,7 @@ function decideResolveIOSupportV5AutonomousNextAction(input) {
3926
4117
  blocksProductRepair: evidenceFreshness.mustCollectNewEvidence === true
3927
4118
  });
3928
4119
  var nextActionContract = buildNextActionContract(action, label, reason, fields, rootCauseReadiness, continuationProofCheckpoint, primaryCommand, nextCommands, requiredEvidence, forbiddenActions, blockers);
4120
+ var managerExecutionPacket = buildResolveIOSupportManagerExecutionPacket(nextActionContract, input.now);
3929
4121
  var humanReviewPacket = fields.humanReviewPacket
3930
4122
  || (action === 'draft_customer_reply' && customerReplyPolicy.humanReviewPacket ? customerReplyPolicy.humanReviewPacket : undefined)
3931
4123
  || buildResolveIOSupportHumanReviewPacket({
@@ -3996,6 +4188,7 @@ function decideResolveIOSupportV5AutonomousNextAction(input) {
3996
4188
  rootCauseReadiness: rootCauseReadiness,
3997
4189
  continuationProofCheckpoint: continuationProofCheckpoint,
3998
4190
  nextActionContract: nextActionContract,
4191
+ managerExecutionPacket: managerExecutionPacket,
3999
4192
  humanReviewPacket: humanReviewPacket,
4000
4193
  humanDecisionRequest: humanDecisionRequest,
4001
4194
  hotfixContinuation: fields.hotfixContinuation,
@@ -4551,7 +4744,7 @@ function buildResolveIOSupportV5MicrotaskPrompt(input) {
4551
4744
  };
4552
4745
  }
4553
4746
  function summarizeResolveIOSupportV5MicrotaskUsage(bundle) {
4554
- var e_10, _a, e_11, _b;
4747
+ var e_11, _a, e_12, _b;
4555
4748
  var byMicrotask = new Map();
4556
4749
  var bySection = new Map();
4557
4750
  var totalPromptTokenEstimate = 0;
@@ -4566,17 +4759,17 @@ function summarizeResolveIOSupportV5MicrotaskUsage(bundle) {
4566
4759
  existing.calls += 1;
4567
4760
  byMicrotask.set(usage.microtaskId, existing);
4568
4761
  try {
4569
- for (var _e = (e_11 = void 0, __values(usage.promptSections || [])), _f = _e.next(); !_f.done; _f = _e.next()) {
4762
+ for (var _e = (e_12 = void 0, __values(usage.promptSections || [])), _f = _e.next(); !_f.done; _f = _e.next()) {
4570
4763
  var section = _f.value;
4571
4764
  bySection.set(section.name, (bySection.get(section.name) || 0) + section.tokenEstimate);
4572
4765
  }
4573
4766
  }
4574
- catch (e_11_1) { e_11 = { error: e_11_1 }; }
4767
+ catch (e_12_1) { e_12 = { error: e_12_1 }; }
4575
4768
  finally {
4576
4769
  try {
4577
4770
  if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
4578
4771
  }
4579
- finally { if (e_11) throw e_11.error; }
4772
+ finally { if (e_12) throw e_12.error; }
4580
4773
  }
4581
4774
  var hardCap = usage.lane === 'qa' ? promptBudget.qaMicrotaskHardCap : promptBudget.buildMicrotaskHardCap;
4582
4775
  if ((usage.promptTokenEstimate || 0) > hardCap) {
@@ -4584,12 +4777,12 @@ function summarizeResolveIOSupportV5MicrotaskUsage(bundle) {
4584
4777
  }
4585
4778
  }
4586
4779
  }
4587
- catch (e_10_1) { e_10 = { error: e_10_1 }; }
4780
+ catch (e_11_1) { e_11 = { error: e_11_1 }; }
4588
4781
  finally {
4589
4782
  try {
4590
4783
  if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
4591
4784
  }
4592
- finally { if (e_10) throw e_10.error; }
4785
+ finally { if (e_11) throw e_11.error; }
4593
4786
  }
4594
4787
  return {
4595
4788
  totalPromptTokenEstimate: totalPromptTokenEstimate,