@runcofactor/cli 0.23.0 → 0.25.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.
- package/README.md +15 -0
- package/dist/{account-HWN3W3DJ.js → account-LF73VDLD.js} +3 -3
- package/dist/{alert-2XQKWLXV.js → alert-YDCWKNLG.js} +4 -4
- package/dist/{api-catalog-3DNTXLUR.js → api-catalog-SUJ4DUAW.js} +3 -3
- package/dist/{attachment-EKI6FME3.js → attachment-ZOWURGCW.js} +3 -3
- package/dist/{augmentor-WVDFIJVN.js → augmentor-7JFSE344.js} +3 -3
- package/dist/{chunk-5XJARJVW.js → chunk-4O7KUIYE.js} +2 -2
- package/dist/{chunk-UAF5JTY6.js → chunk-EPMDUCEA.js} +2 -2
- package/dist/{chunk-C6GFGMMI.js → chunk-IC3HQSRW.js} +2 -2
- package/dist/{chunk-5H5LE7ZJ.js → chunk-LNX22N2L.js} +2 -2
- package/dist/{chunk-XFESXI7N.js → chunk-LQ5IBELB.js} +2 -2
- package/dist/{chunk-JWPQUDTG.js → chunk-OCT6HQZK.js} +2 -2
- package/dist/{chunk-JNBZKVZE.js → chunk-QX7RZ5CZ.js} +1 -1
- package/dist/chunk-QX7RZ5CZ.js.map +1 -0
- package/dist/{chunk-FZKJERAJ.js → chunk-SL5GDAWL.js} +2 -2
- package/dist/{chunk-AHVGWPO3.js → chunk-SZOPRIBA.js} +18 -2
- package/dist/chunk-SZOPRIBA.js.map +1 -0
- package/dist/{chunk-HXM3JXCX.js → chunk-TVM3VEAP.js} +2 -2
- package/dist/{chunk-2RGTNVYR.js → chunk-YI4LFJFK.js} +36 -11
- package/dist/{chunk-2RGTNVYR.js.map → chunk-YI4LFJFK.js.map} +1 -1
- package/dist/{credential-YCLLYSXW.js → credential-DAK26ZN5.js} +3 -3
- package/dist/{credential-template-ILUYGLUZ.js → credential-template-2S4IKKWH.js} +3 -3
- package/dist/{dist-FC2BFYMX.js → dist-MQMO6WA3.js} +3 -3
- package/dist/{docs-UGJPGZOR.js → docs-SX5RFWWF.js} +3 -3
- package/dist/{environment-TENLRRC3.js → environment-2OAJCTFK.js} +3 -3
- package/dist/{feature-flag-5EBZJD43.js → feature-flag-2HRNJ6Z6.js} +3 -3
- package/dist/index.js +47 -37
- package/dist/index.js.map +1 -1
- package/dist/{init-YCS4OZFP.js → init-U2Z4ZJCC.js} +3 -3
- package/dist/{install-AVD4R5KA.js → install-VYXTJJVC.js} +3 -3
- package/dist/{issues-TRD5CQ4R.js → issues-QTX3YE5G.js} +3 -3
- package/dist/{knobs-DKAVOTMC.js → knobs-HMONFFHZ.js} +3 -3
- package/dist/{list-W3ONQTUH.js → list-46W2OU5D.js} +3 -3
- package/dist/{local-LLQFYBF3.js → local-4Y75MUYQ.js} +5 -5
- package/dist/{login-X72OFYMF.js → login-GCEIQ5FN.js} +3 -3
- package/dist/{mcp-KGMDCJJO.js → mcp-SLYY6DQL.js} +4 -4
- package/dist/{metrics-IRO7NK4L.js → metrics-3S4ZEA3B.js} +3 -3
- package/dist/{product-FAEOC2BC.js → product-2NW74HNE.js} +3 -3
- package/dist/prompts-NKJEQ62J.js +186 -0
- package/dist/prompts-NKJEQ62J.js.map +1 -0
- package/dist/{property-X6NPV2VK.js → property-E675NNFW.js} +3 -3
- package/dist/{record-CJIEUF2Z.js → record-HELPASIE.js} +4 -4
- package/dist/{release-PGLSKZCM.js → release-ZZIANCH7.js} +3 -3
- package/dist/{sandbox-PBRWVF4Y.js → sandbox-TTFAKM63.js} +82 -7
- package/dist/sandbox-TTFAKM63.js.map +1 -0
- package/dist/{scenarios-5TJ76A5P.js → scenarios-FWFSTCTV.js} +3 -3
- package/dist/{schedule-FRAVS3RH.js → schedule-QIXBH2HF.js} +4 -4
- package/dist/{session-E4PFQPBF.js → session-4RB4TRRU.js} +5 -5
- package/dist/skills/debug-run/SKILL.md +1 -1
- package/dist/{spec-ZNOLW4JR.js → spec-7LGJ4H5W.js} +3 -3
- package/dist/{src-OLQ7ZFHS.js → src-F4UX4PMP.js} +140 -8
- package/dist/src-F4UX4PMP.js.map +1 -0
- package/dist/{src-GEMLVCW4.js → src-FW7TIXEQ.js} +3 -3
- package/dist/{start-EV7J2TEF.js → start-IEUE53KY.js} +3 -3
- package/dist/{tag-UXKWRACA.js → tag-J5SX224K.js} +4 -4
- package/dist/{task-VDLJQKUB.js → task-ONZVZQAQ.js} +3 -3
- package/dist/{test-suite-SOM2MTNH.js → test-suite-STGE6IAV.js} +5 -5
- package/dist/{trace-DZCJO27U.js → trace-O5BVV7ZU.js} +4 -4
- package/dist/{triage-UQAB5HGG.js → triage-VS3S7GXN.js} +4 -4
- package/dist/{utilities-D7EYIATI.js → utilities-ARHQATQ6.js} +3 -3
- package/dist/{workflow-X7QNGJJ2.js → workflow-5FJ4D62D.js} +29 -32
- package/dist/workflow-5FJ4D62D.js.map +1 -0
- package/dist/{workflow-cache-ZMYUGEPB.js → workflow-cache-PDLY7XLW.js} +6 -6
- package/dist/{workflow-debug-LQKP27VI.js → workflow-debug-6IJQ5C3X.js} +6 -6
- package/dist/{workflow-proposals-NEXXWL3O.js → workflow-proposals-MTHYBJGV.js} +3 -3
- package/package.json +1 -1
- package/dist/chunk-AHVGWPO3.js.map +0 -1
- package/dist/chunk-JNBZKVZE.js.map +0 -1
- package/dist/sandbox-PBRWVF4Y.js.map +0 -1
- package/dist/src-OLQ7ZFHS.js.map +0 -1
- package/dist/workflow-X7QNGJJ2.js.map +0 -1
- /package/dist/{account-HWN3W3DJ.js.map → account-LF73VDLD.js.map} +0 -0
- /package/dist/{alert-2XQKWLXV.js.map → alert-YDCWKNLG.js.map} +0 -0
- /package/dist/{api-catalog-3DNTXLUR.js.map → api-catalog-SUJ4DUAW.js.map} +0 -0
- /package/dist/{attachment-EKI6FME3.js.map → attachment-ZOWURGCW.js.map} +0 -0
- /package/dist/{augmentor-WVDFIJVN.js.map → augmentor-7JFSE344.js.map} +0 -0
- /package/dist/{chunk-5XJARJVW.js.map → chunk-4O7KUIYE.js.map} +0 -0
- /package/dist/{chunk-UAF5JTY6.js.map → chunk-EPMDUCEA.js.map} +0 -0
- /package/dist/{chunk-C6GFGMMI.js.map → chunk-IC3HQSRW.js.map} +0 -0
- /package/dist/{chunk-5H5LE7ZJ.js.map → chunk-LNX22N2L.js.map} +0 -0
- /package/dist/{chunk-XFESXI7N.js.map → chunk-LQ5IBELB.js.map} +0 -0
- /package/dist/{chunk-JWPQUDTG.js.map → chunk-OCT6HQZK.js.map} +0 -0
- /package/dist/{chunk-FZKJERAJ.js.map → chunk-SL5GDAWL.js.map} +0 -0
- /package/dist/{chunk-HXM3JXCX.js.map → chunk-TVM3VEAP.js.map} +0 -0
- /package/dist/{credential-YCLLYSXW.js.map → credential-DAK26ZN5.js.map} +0 -0
- /package/dist/{credential-template-ILUYGLUZ.js.map → credential-template-2S4IKKWH.js.map} +0 -0
- /package/dist/{dist-FC2BFYMX.js.map → dist-MQMO6WA3.js.map} +0 -0
- /package/dist/{docs-UGJPGZOR.js.map → docs-SX5RFWWF.js.map} +0 -0
- /package/dist/{environment-TENLRRC3.js.map → environment-2OAJCTFK.js.map} +0 -0
- /package/dist/{feature-flag-5EBZJD43.js.map → feature-flag-2HRNJ6Z6.js.map} +0 -0
- /package/dist/{init-YCS4OZFP.js.map → init-U2Z4ZJCC.js.map} +0 -0
- /package/dist/{install-AVD4R5KA.js.map → install-VYXTJJVC.js.map} +0 -0
- /package/dist/{issues-TRD5CQ4R.js.map → issues-QTX3YE5G.js.map} +0 -0
- /package/dist/{knobs-DKAVOTMC.js.map → knobs-HMONFFHZ.js.map} +0 -0
- /package/dist/{list-W3ONQTUH.js.map → list-46W2OU5D.js.map} +0 -0
- /package/dist/{local-LLQFYBF3.js.map → local-4Y75MUYQ.js.map} +0 -0
- /package/dist/{login-X72OFYMF.js.map → login-GCEIQ5FN.js.map} +0 -0
- /package/dist/{mcp-KGMDCJJO.js.map → mcp-SLYY6DQL.js.map} +0 -0
- /package/dist/{metrics-IRO7NK4L.js.map → metrics-3S4ZEA3B.js.map} +0 -0
- /package/dist/{product-FAEOC2BC.js.map → product-2NW74HNE.js.map} +0 -0
- /package/dist/{property-X6NPV2VK.js.map → property-E675NNFW.js.map} +0 -0
- /package/dist/{record-CJIEUF2Z.js.map → record-HELPASIE.js.map} +0 -0
- /package/dist/{release-PGLSKZCM.js.map → release-ZZIANCH7.js.map} +0 -0
- /package/dist/{scenarios-5TJ76A5P.js.map → scenarios-FWFSTCTV.js.map} +0 -0
- /package/dist/{schedule-FRAVS3RH.js.map → schedule-QIXBH2HF.js.map} +0 -0
- /package/dist/{session-E4PFQPBF.js.map → session-4RB4TRRU.js.map} +0 -0
- /package/dist/{spec-ZNOLW4JR.js.map → spec-7LGJ4H5W.js.map} +0 -0
- /package/dist/{src-GEMLVCW4.js.map → src-FW7TIXEQ.js.map} +0 -0
- /package/dist/{start-EV7J2TEF.js.map → start-IEUE53KY.js.map} +0 -0
- /package/dist/{tag-UXKWRACA.js.map → tag-J5SX224K.js.map} +0 -0
- /package/dist/{task-VDLJQKUB.js.map → task-ONZVZQAQ.js.map} +0 -0
- /package/dist/{test-suite-SOM2MTNH.js.map → test-suite-STGE6IAV.js.map} +0 -0
- /package/dist/{trace-DZCJO27U.js.map → trace-O5BVV7ZU.js.map} +0 -0
- /package/dist/{triage-UQAB5HGG.js.map → triage-VS3S7GXN.js.map} +0 -0
- /package/dist/{utilities-D7EYIATI.js.map → utilities-ARHQATQ6.js.map} +0 -0
- /package/dist/{workflow-cache-ZMYUGEPB.js.map → workflow-cache-PDLY7XLW.js.map} +0 -0
- /package/dist/{workflow-debug-LQKP27VI.js.map → workflow-debug-6IJQ5C3X.js.map} +0 -0
- /package/dist/{workflow-proposals-NEXXWL3O.js.map → workflow-proposals-MTHYBJGV.js.map} +0 -0
|
@@ -1387,6 +1387,11 @@ var capScreencastFrames = (frames, cap) => {
|
|
|
1387
1387
|
import * as fs10 from "fs/promises";
|
|
1388
1388
|
var MAX_NOTABLE_EVENTS = 5;
|
|
1389
1389
|
var MAX_HISTORY_LOOKBACK = 10;
|
|
1390
|
+
var MAX_DIVERGENCE_CANDIDATES = 5;
|
|
1391
|
+
var MAX_INTENDED_INPUTS = 4;
|
|
1392
|
+
var CHURN_MIN_THOUGHTS = 8;
|
|
1393
|
+
var CHURN_MEDIAN_MULTIPLE = 1.5;
|
|
1394
|
+
var CHURN_MIN_DOM_PROBES = 2;
|
|
1390
1395
|
var isCleanPassStatus = (s) => s === "passed" || s === "success";
|
|
1391
1396
|
var isFlakyPassStatus = (s) => s === "flaky_success";
|
|
1392
1397
|
var isPassStatus = (s) => isCleanPassStatus(s) || isFlakyPassStatus(s);
|
|
@@ -1435,6 +1440,7 @@ var writeSummary = async (input) => {
|
|
|
1435
1440
|
lines.push("**Hypothesis. Verify before trusting \u2014 root cause may be upstream.**");
|
|
1436
1441
|
lines.push("");
|
|
1437
1442
|
}
|
|
1443
|
+
for (const l of buildDivergenceSection(input)) lines.push(l);
|
|
1438
1444
|
const seedRuns = input.seedRuns ?? [];
|
|
1439
1445
|
if (seedRuns.length > 0) {
|
|
1440
1446
|
lines.push("## Seed flows");
|
|
@@ -1623,6 +1629,70 @@ var buildHistoryHint = (runs, currentRunId, lastGreenComparison, greenRunAccess)
|
|
|
1623
1629
|
return out;
|
|
1624
1630
|
};
|
|
1625
1631
|
var formatRelativePrefix = (timestampMs, baselineMs) => baselineMs !== null ? `[${formatRelative(timestampMs - baselineMs)}]` : "[T+?]";
|
|
1632
|
+
var computeCandidateUpstreamDivergences = (input) => {
|
|
1633
|
+
if (isCleanPassStatus(input.runStatus)) return [];
|
|
1634
|
+
const steps = input.steps;
|
|
1635
|
+
if (steps.length === 0) return [];
|
|
1636
|
+
const anchor = input.reportedFailure.failedStepOrderIndex;
|
|
1637
|
+
const referencedVars = new Set(input.failedStepReferencedVars ?? []);
|
|
1638
|
+
const allCounts = steps.map((s) => s.thoughtCount ?? 0).sort((a, b) => a - b);
|
|
1639
|
+
const median = allCounts.length === 0 ? 0 : allCounts[Math.floor((allCounts.length - 1) / 2)];
|
|
1640
|
+
const churnThreshold = Math.max(CHURN_MIN_THOUGHTS, median * CHURN_MEDIAN_MULTIPLE);
|
|
1641
|
+
const maxThoughts = allCounts.length > 0 ? allCounts[allCounts.length - 1] : 0;
|
|
1642
|
+
const candidates = [];
|
|
1643
|
+
for (const s of steps) {
|
|
1644
|
+
if (s.status === "failed") continue;
|
|
1645
|
+
if (anchor !== null && s.orderIndex >= anchor) continue;
|
|
1646
|
+
const reasons = [];
|
|
1647
|
+
let highSignal = false;
|
|
1648
|
+
if (s.cacheOutcome === "fallback") {
|
|
1649
|
+
const why = s.cacheFailureCategory ?? s.cacheOutcomeReason;
|
|
1650
|
+
reasons.push(`ejected cache\u2192live${why ? ` (${why})` : ""}; post-state never cache-verified`);
|
|
1651
|
+
}
|
|
1652
|
+
const thoughts = s.thoughtCount ?? 0;
|
|
1653
|
+
const probes = s.domProbeCount ?? 0;
|
|
1654
|
+
if (thoughts >= churnThreshold && probes >= CHURN_MIN_DOM_PROBES) {
|
|
1655
|
+
const lead = thoughts === maxThoughts ? "highest churn in run" : "high agent churn";
|
|
1656
|
+
reasons.push(`${lead} (${thoughts} thoughts, ${probes} DOM probes) yet marked ${s.status}`);
|
|
1657
|
+
highSignal = true;
|
|
1658
|
+
}
|
|
1659
|
+
for (const v of s.variablesSet ?? []) {
|
|
1660
|
+
if (v.extracted && referencedVars.has(v.key)) {
|
|
1661
|
+
reasons.push(
|
|
1662
|
+
`produced $var.${v.key} (extracted), which the failing step depends on \u2014 confirm that value is valid before treating the current page state as external behavior`
|
|
1663
|
+
);
|
|
1664
|
+
highSignal = true;
|
|
1665
|
+
}
|
|
1666
|
+
}
|
|
1667
|
+
if (reasons.length === 0) continue;
|
|
1668
|
+
const intendedInputs = (s.variablesSet ?? []).filter((v) => v.source === "inputValue" && v.value !== null).slice(0, MAX_INTENDED_INPUTS);
|
|
1669
|
+
candidates.push({ step: s, reasons, intendedInputs, highSignal });
|
|
1670
|
+
}
|
|
1671
|
+
candidates.sort(
|
|
1672
|
+
(a, b) => a.highSignal !== b.highSignal ? a.highSignal ? -1 : 1 : a.step.orderIndex - b.step.orderIndex
|
|
1673
|
+
);
|
|
1674
|
+
const selected = candidates.slice(0, MAX_DIVERGENCE_CANDIDATES);
|
|
1675
|
+
selected.sort((a, b) => a.step.orderIndex - b.step.orderIndex);
|
|
1676
|
+
return selected;
|
|
1677
|
+
};
|
|
1678
|
+
var buildDivergenceSection = (input) => {
|
|
1679
|
+
const candidates = computeCandidateUpstreamDivergences(input);
|
|
1680
|
+
if (candidates.length === 0) return [];
|
|
1681
|
+
const out = [];
|
|
1682
|
+
out.push("## \u26A0 Candidate upstream divergences");
|
|
1683
|
+
out.push(
|
|
1684
|
+
"Heuristic candidates only \u2014 each is a place to START, not a root cause. Confirm or rule out every one by walking backwards and verifying the step's EFFECT (the value selected, the field populated, the record created) from its screenshot/DOM \u2014 not its success flag. This list is NOT exhaustive; an upstream cause can exist with no hint here."
|
|
1685
|
+
);
|
|
1686
|
+
for (const c of candidates) {
|
|
1687
|
+
const name = c.step.name ?? "(unnamed)";
|
|
1688
|
+
const reasons = c.reasons.join("; ");
|
|
1689
|
+
const inputs = c.intendedInputs.length > 0 ? ` [configured inputs: ${c.intendedInputs.map((v) => `${v.key}=${truncate(oneLine(String(v.value)), 40)}`).join(", ")}]` : "";
|
|
1690
|
+
const ref = ` \`${stepRollupRelativePath(c.step.orderIndex, c.step.id)}\``;
|
|
1691
|
+
out.push(`- Step ${c.step.orderIndex} "${name}": ${reasons}.${inputs}${ref}`);
|
|
1692
|
+
}
|
|
1693
|
+
out.push("");
|
|
1694
|
+
return out;
|
|
1695
|
+
};
|
|
1626
1696
|
|
|
1627
1697
|
// ../diagnostic-workspace/src/assemble-workspace.ts
|
|
1628
1698
|
var assembleWorkspace = async (input) => {
|
|
@@ -1736,8 +1806,18 @@ var assembleWorkspace = async (input) => {
|
|
|
1736
1806
|
durationMs: s.durationMs,
|
|
1737
1807
|
cacheOutcome: s.cacheOutcome,
|
|
1738
1808
|
cacheHitSource: s.cacheHitSource,
|
|
1809
|
+
cacheOutcomeReason: s.cacheOutcomeReason,
|
|
1810
|
+
cacheFailureCategory: s.cacheFailureCategory,
|
|
1811
|
+
variablesSet: s.variablesSet,
|
|
1812
|
+
thoughtCount: s.thoughtCount,
|
|
1813
|
+
domProbeCount: s.domProbeCount,
|
|
1739
1814
|
errorMessage: s.errorMessage
|
|
1740
1815
|
})),
|
|
1816
|
+
// Variable keys the failing step's node config references (`$var.X`) — drives the
|
|
1817
|
+
// upstream-divergence lineage heuristic. Empty when no failed node / no references.
|
|
1818
|
+
failedStepReferencedVars: runData.failedNodeId ? extractReferencedVarKeys(
|
|
1819
|
+
runData.nodes.find((n) => n.id === runData.failedNodeId)?.configJson
|
|
1820
|
+
) : [],
|
|
1741
1821
|
network: eventProjection.network,
|
|
1742
1822
|
consoleLogs: eventProjection.consoleLogs,
|
|
1743
1823
|
navigation: eventProjection.navigation,
|
|
@@ -1778,6 +1858,26 @@ var assembleWorkspace = async (input) => {
|
|
|
1778
1858
|
};
|
|
1779
1859
|
};
|
|
1780
1860
|
var isPlainObject = (v) => v !== null && typeof v === "object" && !Array.isArray(v);
|
|
1861
|
+
var VAR_REFERENCE_RE = /\$var\.(\w+(?:\.\w+)*)/g;
|
|
1862
|
+
var extractReferencedVarKeys = (configJson) => {
|
|
1863
|
+
if (configJson === null || configJson === void 0) return [];
|
|
1864
|
+
let serialized;
|
|
1865
|
+
try {
|
|
1866
|
+
serialized = typeof configJson === "string" ? configJson : JSON.stringify(configJson);
|
|
1867
|
+
} catch {
|
|
1868
|
+
return [];
|
|
1869
|
+
}
|
|
1870
|
+
if (!serialized) return [];
|
|
1871
|
+
const keys = /* @__PURE__ */ new Set();
|
|
1872
|
+
for (const m of serialized.matchAll(VAR_REFERENCE_RE)) {
|
|
1873
|
+
const path2 = m[1];
|
|
1874
|
+
if (!path2) continue;
|
|
1875
|
+
for (const segment of path2.split(".")) {
|
|
1876
|
+
if (segment) keys.add(segment);
|
|
1877
|
+
}
|
|
1878
|
+
}
|
|
1879
|
+
return [...keys];
|
|
1880
|
+
};
|
|
1781
1881
|
var stringField = (v) => typeof v === "string" && v.length > 0 ? v : null;
|
|
1782
1882
|
var normalizeTs = (ts) => {
|
|
1783
1883
|
if (ts === null || ts === void 0) return null;
|
|
@@ -1785,12 +1885,45 @@ var normalizeTs = (ts) => {
|
|
|
1785
1885
|
const parsed = Date.parse(ts);
|
|
1786
1886
|
return Number.isFinite(parsed) ? parsed : null;
|
|
1787
1887
|
};
|
|
1888
|
+
var DOM_PROBE_TOOL_NAMES = /* @__PURE__ */ new Set(["browser_run_code", "browser_evaluate"]);
|
|
1889
|
+
var projectVariablesSet = (meta) => {
|
|
1890
|
+
const raw = Array.isArray(meta.variablesSet) ? meta.variablesSet : [];
|
|
1891
|
+
const out = [];
|
|
1892
|
+
for (const c of raw) {
|
|
1893
|
+
if (!isPlainObject(c)) continue;
|
|
1894
|
+
const key = stringField(c.key) ?? stringField(c.name);
|
|
1895
|
+
if (!key) continue;
|
|
1896
|
+
const source = stringField(c.source);
|
|
1897
|
+
out.push({
|
|
1898
|
+
key,
|
|
1899
|
+
value: typeof c.value === "string" ? c.value : null,
|
|
1900
|
+
source,
|
|
1901
|
+
extracted: source === "extracted" || typeof c.extractorExpression === "string"
|
|
1902
|
+
});
|
|
1903
|
+
}
|
|
1904
|
+
return out;
|
|
1905
|
+
};
|
|
1788
1906
|
var projectEvents = (runData) => {
|
|
1789
1907
|
const baselineMs = runData.timeline.startTimestamp ? Date.parse(runData.timeline.startTimestamp) : null;
|
|
1908
|
+
const thoughts = runData.thoughts.map((t) => ({
|
|
1909
|
+
stepId: t.stepId,
|
|
1910
|
+
timestampMs: Date.parse(t.createdAt),
|
|
1911
|
+
toolName: t.toolName,
|
|
1912
|
+
content: t.content
|
|
1913
|
+
}));
|
|
1914
|
+
const thoughtStatsByStep = /* @__PURE__ */ new Map();
|
|
1915
|
+
for (const t of thoughts) {
|
|
1916
|
+
if (!t.stepId) continue;
|
|
1917
|
+
const cur = thoughtStatsByStep.get(t.stepId) ?? { thoughtCount: 0, domProbeCount: 0 };
|
|
1918
|
+
cur.thoughtCount += 1;
|
|
1919
|
+
if (t.toolName && DOM_PROBE_TOOL_NAMES.has(t.toolName)) cur.domProbeCount += 1;
|
|
1920
|
+
thoughtStatsByStep.set(t.stepId, cur);
|
|
1921
|
+
}
|
|
1790
1922
|
const steps = runData.steps.map((s) => {
|
|
1791
1923
|
const meta = isPlainObject(s.metadataJson) ? s.metadataJson : {};
|
|
1792
1924
|
const startedAtMs = s.startedAt ? Date.parse(s.startedAt) : null;
|
|
1793
1925
|
const finishedAtMs = s.finishedAt ? Date.parse(s.finishedAt) : null;
|
|
1926
|
+
const churn = thoughtStatsByStep.get(s.id) ?? { thoughtCount: 0, domProbeCount: 0 };
|
|
1794
1927
|
return {
|
|
1795
1928
|
id: s.id,
|
|
1796
1929
|
nodeId: s.nodeId,
|
|
@@ -1803,15 +1936,14 @@ var projectEvents = (runData) => {
|
|
|
1803
1936
|
durationMs: startedAtMs !== null && finishedAtMs !== null ? finishedAtMs - startedAtMs : null,
|
|
1804
1937
|
errorMessage: s.errorMessage,
|
|
1805
1938
|
cacheOutcome: stringField(meta.cacheOutcome),
|
|
1806
|
-
cacheHitSource: stringField(meta.cacheHitSource)
|
|
1939
|
+
cacheHitSource: stringField(meta.cacheHitSource),
|
|
1940
|
+
cacheOutcomeReason: stringField(meta.cacheOutcomeReason),
|
|
1941
|
+
cacheFailureCategory: stringField(meta.cacheFailureCategory),
|
|
1942
|
+
variablesSet: projectVariablesSet(meta),
|
|
1943
|
+
thoughtCount: churn.thoughtCount,
|
|
1944
|
+
domProbeCount: churn.domProbeCount
|
|
1807
1945
|
};
|
|
1808
1946
|
});
|
|
1809
|
-
const thoughts = runData.thoughts.map((t) => ({
|
|
1810
|
-
stepId: t.stepId,
|
|
1811
|
-
timestampMs: Date.parse(t.createdAt),
|
|
1812
|
-
toolName: t.toolName,
|
|
1813
|
-
content: t.content
|
|
1814
|
-
}));
|
|
1815
1947
|
const actions = runData.timeline.entries.map((e) => ({
|
|
1816
1948
|
action: e.action,
|
|
1817
1949
|
target: e.target ?? null,
|
|
@@ -1887,4 +2019,4 @@ export {
|
|
|
1887
2019
|
writeStepRollups,
|
|
1888
2020
|
writeSummary
|
|
1889
2021
|
};
|
|
1890
|
-
//# sourceMappingURL=src-
|
|
2022
|
+
//# sourceMappingURL=src-F4UX4PMP.js.map
|