@ggui-ai/ui-gen 0.22.0 → 0.24.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.
Files changed (90) hide show
  1. package/dist/adapter-Du7P_5Fx.d.ts +201 -0
  2. package/dist/adapters/generation-dispatch.d.ts +33 -12
  3. package/dist/adapters/generation-dispatch.js +549 -129
  4. package/dist/adapters/generation-dispatch.js.map +1 -1
  5. package/dist/adapters/index.js +1 -1
  6. package/dist/adapters/index.js.map +1 -1
  7. package/dist/advanced/index.d.ts +5 -3
  8. package/dist/advanced/index.js +601 -144
  9. package/dist/advanced/index.js.map +1 -1
  10. package/dist/blueprint-validator.js +178 -54
  11. package/dist/blueprint-validator.js.map +1 -1
  12. package/dist/boilerplate.js +1 -0
  13. package/dist/boilerplate.js.map +1 -1
  14. package/dist/check/index.d.ts +2 -1
  15. package/dist/check/index.js +47 -1
  16. package/dist/check/index.js.map +1 -1
  17. package/dist/{create-ui-generator-BEkzEtNz.d.ts → create-ui-generator-GIhzx08x.d.ts} +34 -10
  18. package/dist/{dispatch-DJNpQ7DI.d.ts → dispatch-BnAH56p4.d.ts} +1 -1
  19. package/dist/evaluation/axis-checks/index.d.ts +4 -3
  20. package/dist/evaluation/axis-checks/index.js +19 -4
  21. package/dist/evaluation/axis-checks/index.js.map +1 -1
  22. package/dist/evaluation/axis-checks/registry.d.ts +2 -1
  23. package/dist/evaluation/axis-checks/registry.js +19 -4
  24. package/dist/evaluation/axis-checks/registry.js.map +1 -1
  25. package/dist/evaluation/index.d.ts +4 -3
  26. package/dist/evaluation/index.js +21 -6
  27. package/dist/evaluation/index.js.map +1 -1
  28. package/dist/harness/check/runtime-render/index.d.ts +27 -8
  29. package/dist/harness/check/runtime-render/index.js +217 -54
  30. package/dist/harness/check/runtime-render/index.js.map +1 -1
  31. package/dist/harness/check/runtime-render/render-check-worker.d.ts +8 -1
  32. package/dist/harness/check/runtime-render/render-check-worker.js +72 -32
  33. package/dist/harness/check/runtime-render/render-check-worker.js.map +1 -1
  34. package/dist/harness/index.d.ts +2 -1
  35. package/dist/harness/index.js +3 -2
  36. package/dist/harness/index.js.map +1 -1
  37. package/dist/harness/prompts.js.map +1 -1
  38. package/dist/harness/result-types.d.ts +2 -1
  39. package/dist/harness/runtime.d.ts +2 -1
  40. package/dist/harness/runtime.js +2 -1
  41. package/dist/harness/runtime.js.map +1 -1
  42. package/dist/harness/types-public.d.ts +18 -5
  43. package/dist/harness/types-public.js +1 -0
  44. package/dist/harness/types-public.js.map +1 -1
  45. package/dist/harness/validator-trace-sink.d.ts +2 -1
  46. package/dist/index.d.ts +38 -3
  47. package/dist/index.js +592 -144
  48. package/dist/index.js.map +1 -1
  49. package/dist/patch.d.ts +2 -1
  50. package/dist/policy.d.ts +7 -4
  51. package/dist/policy.js.map +1 -1
  52. package/dist/tools/get-primitives-ts.d.ts +1 -1
  53. package/dist/tools/get-primitives-ts.js +1 -1
  54. package/dist/tools/get-primitives-ts.js.map +1 -1
  55. package/dist/tools/render-check-worker.d.ts +7 -1
  56. package/dist/tools/render-check-worker.js +55 -23
  57. package/dist/tools/render-check-worker.js.map +1 -1
  58. package/dist/{types-public-mM_-1Yk3.d.ts → types-public-Bk6d1WLN.d.ts} +98 -9
  59. package/dist/validation/index.d.ts +1 -1
  60. package/dist/validation/index.js +1 -1
  61. package/dist/validation/index.js.map +1 -1
  62. package/dist/workflows.d.ts +2 -1
  63. package/package.json +12 -12
  64. package/src/adapters/generation-dispatch.ts +137 -96
  65. package/src/advanced/generator.ts +16 -1
  66. package/src/blueprint-validator.ts +21 -6
  67. package/src/boilerplate/hard-sections.ts +1 -0
  68. package/src/check/run-tier0.ts +80 -1
  69. package/src/coding-agent/tools.ts +6 -1
  70. package/src/create-ui-generator.ts +185 -95
  71. package/src/evaluation/axis-checks/checks/state-payload.ts +29 -4
  72. package/src/evaluation/types-public.ts +94 -8
  73. package/src/harness/check/runtime-render/adapter.ts +223 -58
  74. package/src/harness/check/runtime-render/index.ts +75 -2
  75. package/src/harness/check/runtime-render/render-check-host.ts +111 -26
  76. package/src/harness/check/runtime-render/render-check-worker.ts +83 -29
  77. package/src/harness/check/runtime-render/render-check.ts +173 -117
  78. package/src/harness/coding/generate-task-runner.ts +57 -4
  79. package/src/harness/coding/init-session.ts +13 -0
  80. package/src/harness/coding/run-eval-round.ts +238 -13
  81. package/src/harness/llm-router.ts +3 -3
  82. package/src/harness/policy.ts +11 -0
  83. package/src/harness/primitive-slice.ts +104 -0
  84. package/src/harness/types-public.ts +17 -5
  85. package/src/index.ts +4 -0
  86. package/src/policy.ts +7 -4
  87. package/src/tools/get-primitives-ts.ts +1 -1
  88. package/src/tools/render-check-worker.ts +74 -23
  89. package/src/validation/primitives.ts +1 -1
  90. package/dist/render-check-C0CqVceF.d.ts +0 -87
@@ -1,5 +1,6 @@
1
1
  import { existsSync } from 'fs';
2
2
  import { createRequire } from 'module';
3
+ import { loadavg, availableParallelism } from 'os';
3
4
  import { fileURLToPath, pathToFileURL } from 'url';
4
5
  import { runSandboxed } from '@ggui-ai/sandbox';
5
6
  import { listContractGadgets, HOOK_NAME_RE } from '@ggui-ai/protocol';
@@ -19,9 +20,25 @@ var __export = (target, all) => {
19
20
  // src/harness/check/runtime-render/render-check-host.ts
20
21
  var render_check_host_exports = {};
21
22
  __export(render_check_host_exports, {
23
+ DEFAULT_RENDER_CHECK_HOST_BOUNDS: () => DEFAULT_RENDER_CHECK_HOST_BOUNDS,
22
24
  mapSandboxResultToCheckResult: () => mapSandboxResultToCheckResult,
25
+ resolveRenderCheckHostBounds: () => resolveRenderCheckHostBounds,
26
+ resolveWorkerSpawn: () => resolveWorkerSpawn,
23
27
  runRenderCheckViaWorker: () => runRenderCheckViaWorker
24
28
  });
29
+ function resolveRenderCheckHostBounds(bounds = {}) {
30
+ const timeoutMs = bounds.timeoutMs ?? DEFAULT_RENDER_CHECK_HOST_BOUNDS.timeoutMs;
31
+ const heapMb = bounds.heapMb ?? DEFAULT_RENDER_CHECK_HOST_BOUNDS.heapMb;
32
+ if (!Number.isInteger(timeoutMs) || timeoutMs < 2) {
33
+ throw new RangeError(`render-check: timeoutMs must be an integer \u2265 2, got ${timeoutMs}`);
34
+ }
35
+ if (!Number.isInteger(heapMb) || heapMb < 1) {
36
+ throw new RangeError(`render-check: heapMb must be a positive integer, got ${heapMb}`);
37
+ }
38
+ const requestedGrace = bounds.gracePeriodMs ?? DEFAULT_RENDER_CHECK_HOST_BOUNDS.gracePeriodMs;
39
+ const gracePeriodMs = Math.max(1, Math.min(requestedGrace, Math.floor(timeoutMs / 2)));
40
+ return { timeoutMs, heapMb, gracePeriodMs };
41
+ }
25
42
  function resolveWorkerSpawn() {
26
43
  const jsCandidates = [
27
44
  // Sibling — when import.meta.url is already .../harness/check/runtime-render/.
@@ -70,12 +87,14 @@ function unverified(reason, t0) {
70
87
  stats: { actionsChecked: 0, streamsChecked: 0, renderMs: Date.now() - t0 }
71
88
  };
72
89
  }
73
- function mapSandboxResultToCheckResult(result, t0) {
90
+ function mapSandboxResultToCheckResult(result, t0, boundMs = DEFAULT_RENDER_CHECK_HOST_BOUNDS.timeoutMs) {
74
91
  if (result.outcome === "timeout") {
75
- return failed(
76
- `render check timed out after ${CHECK_TIMEOUT_MS}ms in the isolated worker (likely infinite loop or runaway effect in the component).`,
77
- t0
78
- );
92
+ return {
93
+ ok: false,
94
+ issues: [],
95
+ incomplete: { kind: "timeout", elapsedMs: result.durationMs, boundMs },
96
+ stats: { actionsChecked: 0, streamsChecked: 0, renderMs: Date.now() - t0 }
97
+ };
79
98
  }
80
99
  if (result.outcome === "overflow-stdout" || result.outcome === "overflow-stderr") {
81
100
  return failed(
@@ -118,34 +137,46 @@ function mapSandboxResultToCheckResult(result, t0) {
118
137
  );
119
138
  }
120
139
  }
121
- async function runRenderCheckViaWorker(input) {
140
+ async function runRenderCheckViaWorker(input, options = {}) {
122
141
  const t0 = Date.now();
142
+ const bounds = resolveRenderCheckHostBounds(options.bounds);
123
143
  let spawn;
124
144
  try {
125
145
  spawn = resolveWorkerSpawn();
126
146
  } catch (err) {
127
147
  return unverified(err instanceof Error ? err.message : String(err), t0);
128
148
  }
149
+ const loadAtStart = loadavg()[0] ?? 0;
129
150
  const result = await runSandboxed({
130
151
  command: spawn.command,
131
152
  args: spawn.args,
132
- timeoutMs: CHECK_TIMEOUT_MS,
153
+ timeoutMs: bounds.timeoutMs,
154
+ gracePeriodMs: bounds.gracePeriodMs,
133
155
  maxStdoutBytes: CHECK_STDOUT_CAP,
134
- nodeHeapMb: CHECK_NODE_HEAP_MB,
156
+ nodeHeapMb: bounds.heapMb,
135
157
  stdin: JSON.stringify(input),
136
158
  // NODE_ENV steers React's production vs development build — keep
137
159
  // parity with the caller; everything else stays on the sandbox's
138
160
  // default allowlist.
139
161
  env: { NODE_ENV: process.env.NODE_ENV ?? "production" }
140
162
  });
141
- return mapSandboxResultToCheckResult(result, t0);
163
+ const hostLoad = {
164
+ start: loadAtStart,
165
+ end: loadavg()[0] ?? 0,
166
+ cores: availableParallelism()
167
+ };
168
+ const mapped = mapSandboxResultToCheckResult(result, t0, bounds.timeoutMs);
169
+ return { ...mapped, stats: { ...mapped.stats, hostLoad } };
142
170
  }
143
- var CHECK_TIMEOUT_MS, CHECK_STDOUT_CAP, CHECK_NODE_HEAP_MB, WORKER_BASENAME;
171
+ var DEFAULT_RENDER_CHECK_HOST_BOUNDS, CHECK_STDOUT_CAP, WORKER_BASENAME;
144
172
  var init_render_check_host = __esm({
145
173
  "src/harness/check/runtime-render/render-check-host.ts"() {
146
- CHECK_TIMEOUT_MS = 3e4;
174
+ DEFAULT_RENDER_CHECK_HOST_BOUNDS = {
175
+ timeoutMs: 3e4,
176
+ heapMb: 512,
177
+ gracePeriodMs: 2e3
178
+ };
147
179
  CHECK_STDOUT_CAP = 2 * 1024 * 1024;
148
- CHECK_NODE_HEAP_MB = 512;
149
180
  WORKER_BASENAME = "render-check-worker";
150
181
  }
151
182
  });
@@ -667,13 +698,13 @@ function editableSurface(el) {
667
698
  function parentLink(node) {
668
699
  return node;
669
700
  }
670
- async function runRenderCheck(input) {
701
+ async function runRenderCheck(input, options = {}) {
671
702
  const g = hostGlobals();
672
703
  if ("window" in g && "document" in g) {
673
704
  return runRenderCheckInProcess(input);
674
705
  }
675
706
  const { runRenderCheckViaWorker: runRenderCheckViaWorker2 } = await Promise.resolve().then(() => (init_render_check_host(), render_check_host_exports));
676
- return runRenderCheckViaWorker2(input);
707
+ return runRenderCheckViaWorker2(input, options);
677
708
  }
678
709
  async function runRenderCheckInProcess(input) {
679
710
  const t0 = Date.now();
@@ -687,7 +718,7 @@ async function runRenderCheckInProcess(input) {
687
718
  const Wire = await import('@ggui-ai/wire');
688
719
  const { GguiWireProvider } = Wire;
689
720
  const moduleResolutions = {
690
- "react": React,
721
+ react: React,
691
722
  "react/jsx-runtime": ReactJsxRuntime,
692
723
  "@ggui-ai/wire": Wire
693
724
  };
@@ -803,14 +834,23 @@ async function runRenderCheckInProcess(input) {
803
834
  )
804
835
  );
805
836
  const timeoutPromise = new Promise((_, reject) => {
806
- setTimeout(() => reject(new Error(`[runtime-render] render exceeded ${RENDER_TIMEOUT_MS}ms \u2014 classified as runtime-hang`)), RENDER_TIMEOUT_MS).unref?.();
837
+ setTimeout(
838
+ () => reject(
839
+ new Error(
840
+ `[runtime-render] render exceeded ${RENDER_TIMEOUT_MS}ms \u2014 classified as runtime-hang`
841
+ )
842
+ ),
843
+ RENDER_TIMEOUT_MS
844
+ ).unref?.();
807
845
  });
808
846
  renderResult = await Promise.race([renderPromise, timeoutPromise]);
809
847
  } catch (e) {
810
848
  const msg = e instanceof Error ? e.message : String(e);
811
849
  const errStack = e instanceof Error ? e.stack ?? "" : "";
812
850
  const baseReason = loopSignature ? `Infinite render loop (${loopSignature}) \u2014 likely setState/dispatch inside useEffect with missing or unstable dependency` : /runtime-hang/.test(msg) ? `Render wall-clock exceeded ${RENDER_TIMEOUT_MS}ms \u2014 likely async effect loop or unresolved promise` : `Render threw: ${msg}`;
813
- const userFrames = errStack.split("\n").map((l) => l.trim()).filter((l) => l.startsWith("at ")).filter((l) => !/(node_modules|happy-dom|@testing-library|react-dom|node:internal|node:async)/.test(l)).slice(0, 5);
851
+ const userFrames = errStack.split("\n").map((l) => l.trim()).filter((l) => l.startsWith("at ")).filter(
852
+ (l) => !/(node_modules|happy-dom|@testing-library|react-dom|node:internal|node:async)/.test(l)
853
+ ).slice(0, 5);
814
854
  const stackSource = boundaryRef.stack ?? capturedComponentStack ?? "";
815
855
  const componentFrames = stackSource.split("\n").map((l) => l.trim()).filter((l) => l.startsWith("at ")).slice(0, 4);
816
856
  const stackBlock = userFrames.length ? `
@@ -1275,9 +1315,7 @@ function idLikeRequiredStringField(schema) {
1275
1315
  const required = schema["required"];
1276
1316
  if (properties === null || typeof properties !== "object") return null;
1277
1317
  if (!Array.isArray(required)) return null;
1278
- for (const [propName, propSchema] of Object.entries(
1279
- properties
1280
- )) {
1318
+ for (const [propName, propSchema] of Object.entries(properties)) {
1281
1319
  if (!/id$/i.test(propName)) continue;
1282
1320
  if (!required.includes(propName)) continue;
1283
1321
  const t = propSchema !== null && typeof propSchema === "object" ? propSchema["type"] : void 0;
@@ -1308,9 +1346,7 @@ async function checkSelectionIdentity(input) {
1308
1346
  return void 0;
1309
1347
  }
1310
1348
  await flushPromises();
1311
- const events = probe.getFireLog().slice(before).filter(
1312
- (e) => e.kind === "action.fired" && e.name === actionName
1313
- );
1349
+ const events = probe.getFireLog().slice(before).filter((e) => e.kind === "action.fired" && e.name === actionName);
1314
1350
  return events.length > 0 ? events[events.length - 1].payload : void 0;
1315
1351
  };
1316
1352
  const first = await payloadFor(group[0]);
@@ -1371,7 +1407,10 @@ async function dispatchTrigger(el, kind, user) {
1371
1407
  case "submit": {
1372
1408
  const form = closestForm(el);
1373
1409
  if (!form) return;
1374
- const ev = new globalThis.Event("submit", { bubbles: true, cancelable: true });
1410
+ const ev = new globalThis.Event("submit", {
1411
+ bubbles: true,
1412
+ cancelable: true
1413
+ });
1375
1414
  toEventDispatcher(form).dispatchEvent(ev);
1376
1415
  return;
1377
1416
  }
@@ -1708,37 +1747,112 @@ function synthesizeFromSchema(schema, hint, warnings, depth, ordinal) {
1708
1747
  }
1709
1748
 
1710
1749
  // src/harness/check/runtime-render/adapter.ts
1711
- var DEFAULT_RUNTIME_RENDER_CHECK = {
1712
- id: "runtime-render",
1713
- run: async (input) => {
1714
- const { sourceCode, compiledCode, contract, fixtureProps } = input;
1715
- if (compiledCode === null) {
1716
- return { status: "not-applicable", issues: [], reason: "no compiled code" };
1717
- }
1718
- if (!contract) {
1719
- return { status: "not-applicable", issues: [], reason: "no contract surface" };
1720
- }
1721
- const mockup = prepareMockupProps({ contract, fixtureProps });
1722
- let result;
1723
- try {
1724
- result = await runRenderCheck({
1725
- sourceCode,
1726
- mockupProps: mockup.props,
1727
- contract
1750
+ init_render_check_host();
1751
+ function createSlotLimiter(maxConcurrent) {
1752
+ if (maxConcurrent === void 0) return (task) => task(0);
1753
+ if (!Number.isInteger(maxConcurrent) || maxConcurrent < 1) {
1754
+ throw new RangeError(
1755
+ `createRuntimeRenderCheck: maxConcurrent must be a positive integer, got ${maxConcurrent}`
1756
+ );
1757
+ }
1758
+ let active = 0;
1759
+ const waiting = [];
1760
+ const acquire = () => {
1761
+ if (active < maxConcurrent) {
1762
+ active += 1;
1763
+ return Promise.resolve(0);
1764
+ }
1765
+ const enqueuedAt = Date.now();
1766
+ return new Promise((resolve) => {
1767
+ waiting.push(() => {
1768
+ active += 1;
1769
+ resolve(Date.now() - enqueuedAt);
1728
1770
  });
1729
- } catch (e) {
1730
- const message = e instanceof Error ? e.message : String(e);
1731
- console.warn(
1732
- `[runtime-render] probe skipped \u2014 infra failure: ${message}`
1733
- );
1734
- return { status: "infra-skipped", issues: [], reason: message };
1771
+ });
1772
+ };
1773
+ const release = () => {
1774
+ active -= 1;
1775
+ const next = waiting.shift();
1776
+ if (next !== void 0) next();
1777
+ };
1778
+ return async (task) => {
1779
+ const waitedMs = await acquire();
1780
+ try {
1781
+ return await task(waitedMs);
1782
+ } finally {
1783
+ release();
1735
1784
  }
1736
- return {
1737
- status: "ran",
1738
- issues: result.issues.map(toEvalIssue).filter((x) => x !== null)
1739
- };
1740
- }
1741
- };
1785
+ };
1786
+ }
1787
+ function queuedField(queuedMs) {
1788
+ return queuedMs > 0 ? { queuedMs } : {};
1789
+ }
1790
+ function toRenderCheckOptions(config) {
1791
+ if (config.timeoutMs === void 0 && config.heapMb === void 0) return void 0;
1792
+ return {
1793
+ bounds: {
1794
+ ...config.timeoutMs !== void 0 ? { timeoutMs: config.timeoutMs } : {},
1795
+ ...config.heapMb !== void 0 ? { heapMb: config.heapMb } : {}
1796
+ }
1797
+ };
1798
+ }
1799
+ function createRuntimeRenderCheck(config = {}) {
1800
+ const limit = createSlotLimiter(config.maxConcurrent);
1801
+ const options = toRenderCheckOptions(config);
1802
+ if (options !== void 0) resolveRenderCheckHostBounds(options.bounds);
1803
+ return {
1804
+ id: "runtime-render",
1805
+ run: async (input) => {
1806
+ const { sourceCode, compiledCode, contract, fixtureProps } = input;
1807
+ if (compiledCode === null) {
1808
+ return { status: "not-applicable", issues: [], reason: "no compiled code" };
1809
+ }
1810
+ if (!contract) {
1811
+ return { status: "not-applicable", issues: [], reason: "no contract surface" };
1812
+ }
1813
+ const mockup = prepareMockupProps({ contract, fixtureProps });
1814
+ let queuedMs = 0;
1815
+ let t0 = Date.now();
1816
+ let result;
1817
+ try {
1818
+ result = await limit((waitedMs) => {
1819
+ queuedMs = waitedMs;
1820
+ t0 = Date.now();
1821
+ return runRenderCheck(
1822
+ {
1823
+ sourceCode,
1824
+ mockupProps: mockup.props,
1825
+ contract
1826
+ },
1827
+ options
1828
+ );
1829
+ });
1830
+ } catch (e) {
1831
+ const message = e instanceof Error ? e.message : String(e);
1832
+ console.warn(`[runtime-render] probe skipped \u2014 infra failure: ${message}`);
1833
+ return { status: "infra-skipped", issues: [], reason: message, elapsedMs: Date.now() - t0, ...queuedField(queuedMs) };
1834
+ }
1835
+ const hostLoad = result.stats.hostLoad;
1836
+ const load = hostLoad !== void 0 ? { hostLoad } : {};
1837
+ if (result.incomplete !== void 0) {
1838
+ const { elapsedMs, boundMs } = result.incomplete;
1839
+ const loadNote = hostLoad !== void 0 ? `; host load ${hostLoad.start.toFixed(1)} \u2192 ${hostLoad.end.toFixed(1)} on ${hostLoad.cores} CPUs` : "";
1840
+ const reason = `render check did not finish within ${boundMs} ms (stopped at ${elapsedMs} ms)${loadNote}`;
1841
+ console.warn(`[runtime-render] probe timed out \u2014 ${reason}`);
1842
+ return { status: "timed-out", issues: [], reason, elapsedMs: Date.now() - t0, ...queuedField(queuedMs), ...load };
1843
+ }
1844
+ return {
1845
+ status: "ran",
1846
+ issues: result.issues.map(toEvalIssue).filter((x) => x !== null),
1847
+ elapsedMs: Date.now() - t0,
1848
+ ...queuedField(queuedMs),
1849
+ renderMs: result.stats.renderMs,
1850
+ ...load
1851
+ };
1852
+ }
1853
+ };
1854
+ }
1855
+ var DEFAULT_RUNTIME_RENDER_CHECK = createRuntimeRenderCheck();
1742
1856
  function classifyRenderCrashFix(reason) {
1743
1857
  const r = reason.toLowerCase();
1744
1858
  if (r.includes("too many re-renders") || r.includes("maximum update depth") || r.includes("infinite render loop")) {
@@ -1863,6 +1977,16 @@ function toEvalIssue(issue) {
1863
1977
  }
1864
1978
 
1865
1979
  // src/blueprint-validator.ts
1980
+ function probeDidNotRunCode(status) {
1981
+ switch (status) {
1982
+ case "infra-skipped":
1983
+ return "runtime:probe-infra-failure";
1984
+ case "not-applicable":
1985
+ return "runtime:probe-not-applicable";
1986
+ case "timed-out":
1987
+ return "runtime:probe-timeout";
1988
+ }
1989
+ }
1866
1990
  function asContract(x) {
1867
1991
  if (typeof x !== "object" || x === null) return void 0;
1868
1992
  return x;
@@ -1972,7 +2096,7 @@ async function runtimeTier(input) {
1972
2096
  warnings.push({
1973
2097
  _kind: "warning",
1974
2098
  tier: "runtime",
1975
- code: outcome.status === "infra-skipped" ? "runtime:probe-infra-failure" : "runtime:probe-not-applicable",
2099
+ code: probeDidNotRunCode(outcome.status),
1976
2100
  message: `Runtime probe did not run (${outcome.status}): ${outcome.reason ?? "no reason recorded"}`
1977
2101
  });
1978
2102
  return { errors, warnings };