agent-inspect 1.0.2 → 1.1.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.
@@ -1182,136 +1182,6 @@ function warn(message, error) {
1182
1182
  }
1183
1183
  console.warn(`${base}: ${formatError(error).message}`);
1184
1184
  }
1185
- var storage = new async_hooks.AsyncLocalStorage();
1186
- function toPublicContext(ctx) {
1187
- return {
1188
- runId: ctx.runId,
1189
- runName: ctx.runName,
1190
- traceDir: ctx.traceDir,
1191
- silent: ctx.silent,
1192
- metadata: ctx.metadata
1193
- };
1194
- }
1195
- function invoke(fn) {
1196
- return new Promise((resolve, reject) => {
1197
- try {
1198
- Promise.resolve(fn()).then(resolve, reject);
1199
- } catch (e) {
1200
- reject(e);
1201
- }
1202
- });
1203
- }
1204
- function getCurrentContext() {
1205
- try {
1206
- const s = storage.getStore();
1207
- if (!s) return void 0;
1208
- return toPublicContext(s);
1209
- } catch {
1210
- return void 0;
1211
- }
1212
- }
1213
- function getCurrentRunId() {
1214
- try {
1215
- return storage.getStore()?.runId;
1216
- } catch {
1217
- return void 0;
1218
- }
1219
- }
1220
- function getCurrentRunName() {
1221
- try {
1222
- return storage.getStore()?.runName;
1223
- } catch {
1224
- return void 0;
1225
- }
1226
- }
1227
- function getCurrentStepId() {
1228
- try {
1229
- return storage.getStore()?.currentStepId;
1230
- } catch {
1231
- return void 0;
1232
- }
1233
- }
1234
- function getParentStepId() {
1235
- return getCurrentStepId();
1236
- }
1237
- function getCurrentDepth() {
1238
- try {
1239
- const d = storage.getStore()?.currentDepth;
1240
- return typeof d === "number" && Number.isFinite(d) ? d : 0;
1241
- } catch {
1242
- return 0;
1243
- }
1244
- }
1245
- function hasActiveContext() {
1246
- try {
1247
- return storage.getStore() !== void 0;
1248
- } catch {
1249
- return false;
1250
- }
1251
- }
1252
- function getTraceDirFromContext() {
1253
- try {
1254
- return storage.getStore()?.traceDir;
1255
- } catch {
1256
- return void 0;
1257
- }
1258
- }
1259
- function isSilentContext() {
1260
- try {
1261
- const s = storage.getStore();
1262
- return s ? s.silent : false;
1263
- } catch {
1264
- return false;
1265
- }
1266
- }
1267
- function runWithContext(context, fn) {
1268
- const runtime = {
1269
- runId: context.runId,
1270
- runName: context.runName,
1271
- traceDir: context.traceDir,
1272
- silent: context.silent,
1273
- metadata: context.metadata,
1274
- currentDepth: 0
1275
- };
1276
- return new Promise((resolve, reject) => {
1277
- storage.run(runtime, () => {
1278
- try {
1279
- Promise.resolve(fn()).then(resolve, reject);
1280
- } catch (e) {
1281
- reject(e);
1282
- }
1283
- });
1284
- });
1285
- }
1286
- function runWithStepContext(stepId, fn) {
1287
- let parent;
1288
- try {
1289
- parent = storage.getStore();
1290
- } catch {
1291
- parent = void 0;
1292
- }
1293
- if (!parent) {
1294
- return invoke(fn);
1295
- }
1296
- const derived = {
1297
- runId: parent.runId,
1298
- runName: parent.runName,
1299
- traceDir: parent.traceDir,
1300
- silent: parent.silent,
1301
- metadata: parent.metadata,
1302
- currentStepId: stepId,
1303
- currentDepth: parent.currentDepth + 1
1304
- };
1305
- return new Promise((resolve, reject) => {
1306
- storage.run(derived, () => {
1307
- try {
1308
- Promise.resolve(fn()).then(resolve, reject);
1309
- } catch (e) {
1310
- reject(e);
1311
- }
1312
- });
1313
- });
1314
- }
1315
1185
  function isRecord6(value) {
1316
1186
  return typeof value === "object" && value !== null && !Array.isArray(value);
1317
1187
  }
@@ -1393,12 +1263,20 @@ async function initializeTraceFile(runId, traceDir) {
1393
1263
  return void 0;
1394
1264
  }
1395
1265
  }
1266
+ function ensureEventWithinBounds(event) {
1267
+ const line = serializeEvent(event);
1268
+ if (line === "") return event;
1269
+ const bytes = Buffer.byteLength(line, "utf8");
1270
+ if (bytes <= DEFAULT_MAX_EVENT_BYTES) return event;
1271
+ return prepareTraceEventForDisk(event, resolveTraceSafetyOptions());
1272
+ }
1396
1273
  async function writeTraceEvent(event, traceDir) {
1397
- if (!validateEvent(event)) {
1274
+ const bounded = ensureEventWithinBounds(event);
1275
+ if (!validateEvent(bounded)) {
1398
1276
  warn("Skipped invalid trace event (validation failed)");
1399
1277
  return;
1400
1278
  }
1401
- const line = serializeEvent(event);
1279
+ const line = serializeEvent(bounded);
1402
1280
  if (line === "") {
1403
1281
  warn("Skipped trace event (serialization failed)");
1404
1282
  return;
@@ -1499,6 +1377,351 @@ function getRunIdFromTraceFileName(fileName) {
1499
1377
  return void 0;
1500
1378
  }
1501
1379
  }
1380
+
1381
+ // packages/core/src/trace-event-safety.ts
1382
+ var DEFAULT_MAX_METADATA_VALUE_LENGTH = 2e3;
1383
+ var DEFAULT_MAX_PREVIEW_LENGTH = 500;
1384
+ var DEFAULT_MAX_EVENT_BYTES = 65536;
1385
+ function isRecord7(value) {
1386
+ return typeof value === "object" && value !== null && !Array.isArray(value);
1387
+ }
1388
+ function isPreviewKey(key) {
1389
+ return key.toLowerCase().includes("preview");
1390
+ }
1391
+ function truncateString(value, maxLen) {
1392
+ if (maxLen <= 0) return "\u2026";
1393
+ if (value.length <= maxLen) return value;
1394
+ return `${value.slice(0, maxLen)}\u2026`;
1395
+ }
1396
+ function byteLength(text) {
1397
+ return Buffer.byteLength(text, "utf8");
1398
+ }
1399
+ function resolveTraceSafetyOptions(options) {
1400
+ const redact = options?.redact;
1401
+ let redactEnabled = true;
1402
+ let redactionRules;
1403
+ if (redact === false) {
1404
+ redactEnabled = false;
1405
+ } else if (redact === true || redact === void 0) {
1406
+ redactEnabled = true;
1407
+ } else if (isRecord7(redact)) {
1408
+ redactEnabled = true;
1409
+ redactionRules = redact.rules;
1410
+ }
1411
+ return {
1412
+ redactEnabled,
1413
+ redactionRules,
1414
+ maxMetadataValueLength: typeof options?.maxMetadataValueLength === "number" && Number.isFinite(options.maxMetadataValueLength) && options.maxMetadataValueLength >= 0 ? Math.floor(options.maxMetadataValueLength) : DEFAULT_MAX_METADATA_VALUE_LENGTH,
1415
+ maxPreviewLength: typeof options?.maxPreviewLength === "number" && Number.isFinite(options.maxPreviewLength) && options.maxPreviewLength >= 0 ? Math.floor(options.maxPreviewLength) : DEFAULT_MAX_PREVIEW_LENGTH,
1416
+ maxEventBytes: typeof options?.maxEventBytes === "number" && Number.isFinite(options.maxEventBytes) && options.maxEventBytes > 0 ? Math.floor(options.maxEventBytes) : DEFAULT_MAX_EVENT_BYTES
1417
+ };
1418
+ }
1419
+ function boundMetadataValue(key, value, opts, seen, depth) {
1420
+ if (depth > 32) return "[MaxDepth]";
1421
+ if (value === null || typeof value !== "object") {
1422
+ if (typeof value === "string") {
1423
+ const max = isPreviewKey(key) ? opts.maxPreviewLength : opts.maxMetadataValueLength;
1424
+ return truncateString(value, max);
1425
+ }
1426
+ return value;
1427
+ }
1428
+ if (seen.has(value)) return "[Circular]";
1429
+ seen.add(value);
1430
+ if (Array.isArray(value)) {
1431
+ const maxItems = 50;
1432
+ const out2 = value.slice(0, maxItems).map(
1433
+ (item, index) => boundMetadataValue(String(index), item, opts, seen, depth + 1)
1434
+ );
1435
+ if (value.length > maxItems) {
1436
+ out2.push(`\u2026(+${value.length - maxItems} more)`);
1437
+ }
1438
+ return out2;
1439
+ }
1440
+ const record = value;
1441
+ const out = {};
1442
+ for (const [k, v] of Object.entries(record)) {
1443
+ out[k] = boundMetadataValue(k, v, opts, seen, depth + 1);
1444
+ }
1445
+ return out;
1446
+ }
1447
+ function redactMetadata(metadata, opts) {
1448
+ if (!opts.redactEnabled) return { ...metadata };
1449
+ const redactor = new Redactor({ rules: opts.redactionRules });
1450
+ return redactor.redactRecord(metadata);
1451
+ }
1452
+ function prepareMetadataForDisk(metadata, opts) {
1453
+ try {
1454
+ const redacted = redactMetadata(metadata, opts);
1455
+ const seen = /* @__PURE__ */ new WeakSet();
1456
+ const bounded = boundMetadataValue(
1457
+ "metadata",
1458
+ redacted,
1459
+ opts,
1460
+ seen,
1461
+ 0
1462
+ );
1463
+ return isRecord7(bounded) ? bounded : {};
1464
+ } catch {
1465
+ return { truncated: true, reason: "metadataPreparationFailed" };
1466
+ }
1467
+ }
1468
+ function truncateErrorStack(event, maxLen) {
1469
+ if (event.event !== "run_completed" && event.event !== "step_completed") {
1470
+ return event;
1471
+ }
1472
+ if (!event.error?.stack || typeof event.error.stack !== "string") {
1473
+ return event;
1474
+ }
1475
+ return {
1476
+ ...event,
1477
+ error: {
1478
+ ...event.error,
1479
+ stack: truncateString(event.error.stack, maxLen)
1480
+ }
1481
+ };
1482
+ }
1483
+ function replaceMetadataWithTruncationMarker(event, originalApproxBytes) {
1484
+ const marker = {
1485
+ truncated: true,
1486
+ reason: "maxEventBytes",
1487
+ originalApproxBytes
1488
+ };
1489
+ if (event.event === "run_started") {
1490
+ return { ...event, metadata: marker };
1491
+ }
1492
+ if (event.event === "step_started") {
1493
+ return { ...event, metadata: marker };
1494
+ }
1495
+ return event;
1496
+ }
1497
+ function shrinkMetadataLimits(opts, factor) {
1498
+ return {
1499
+ ...opts,
1500
+ maxMetadataValueLength: Math.max(32, Math.floor(opts.maxMetadataValueLength * factor)),
1501
+ maxPreviewLength: Math.max(16, Math.floor(opts.maxPreviewLength * factor))
1502
+ };
1503
+ }
1504
+ function applyMetadataToEvent(event, metadata) {
1505
+ if (event.event === "run_started") {
1506
+ return { ...event, metadata };
1507
+ }
1508
+ if (event.event === "step_started") {
1509
+ return { ...event, metadata };
1510
+ }
1511
+ return event;
1512
+ }
1513
+ function eventHasMetadata(event) {
1514
+ return (event.event === "run_started" || event.event === "step_started") && event.metadata !== void 0;
1515
+ }
1516
+ function getEventMetadata(event) {
1517
+ if (event.event === "run_started" || event.event === "step_started") {
1518
+ return event.metadata;
1519
+ }
1520
+ return void 0;
1521
+ }
1522
+ function prepareTraceEventForDisk(event, opts) {
1523
+ try {
1524
+ let working = { ...event };
1525
+ const rawMetadata = getEventMetadata(working);
1526
+ if (rawMetadata !== void 0) {
1527
+ const safe = prepareMetadataForDisk(rawMetadata, opts);
1528
+ working = applyMetadataToEvent(working, safe);
1529
+ }
1530
+ let serialized = serializeEvent(working);
1531
+ if (serialized === "") {
1532
+ return working;
1533
+ }
1534
+ let bytes = byteLength(serialized);
1535
+ if (bytes <= opts.maxEventBytes) {
1536
+ return working;
1537
+ }
1538
+ if (rawMetadata !== void 0) {
1539
+ for (const factor of [0.5, 0.25, 0.1]) {
1540
+ const tighter = shrinkMetadataLimits(opts, factor);
1541
+ const shrunk = prepareMetadataForDisk(rawMetadata, tighter);
1542
+ working = applyMetadataToEvent(working, shrunk);
1543
+ serialized = serializeEvent(working);
1544
+ if (serialized !== "" && byteLength(serialized) <= opts.maxEventBytes) {
1545
+ return working;
1546
+ }
1547
+ }
1548
+ working = replaceMetadataWithTruncationMarker(working, bytes);
1549
+ serialized = serializeEvent(working);
1550
+ if (serialized !== "" && byteLength(serialized) <= opts.maxEventBytes) {
1551
+ return working;
1552
+ }
1553
+ }
1554
+ working = truncateErrorStack(working, Math.min(opts.maxMetadataValueLength, 500));
1555
+ serialized = serializeEvent(working);
1556
+ if (serialized !== "" && byteLength(serialized) <= opts.maxEventBytes) {
1557
+ return working;
1558
+ }
1559
+ if (eventHasMetadata(working)) {
1560
+ working = replaceMetadataWithTruncationMarker(working, bytes);
1561
+ serialized = serializeEvent(working);
1562
+ if (serialized !== "" && byteLength(serialized) <= opts.maxEventBytes) {
1563
+ return working;
1564
+ }
1565
+ if (working.event === "run_started") {
1566
+ const { metadata: _meta, ...rest } = working;
1567
+ working = rest;
1568
+ } else if (working.event === "step_started") {
1569
+ const { metadata: _meta, ...rest } = working;
1570
+ working = rest;
1571
+ }
1572
+ }
1573
+ return working;
1574
+ } catch {
1575
+ if (event.event === "run_started" || event.event === "step_started") {
1576
+ return applyMetadataToEvent(event, {
1577
+ truncated: true,
1578
+ reason: "prepareTraceEventFailed"
1579
+ });
1580
+ }
1581
+ return event;
1582
+ }
1583
+ }
1584
+
1585
+ // packages/core/src/context.ts
1586
+ var storage = new async_hooks.AsyncLocalStorage();
1587
+ function toPublicContext(ctx) {
1588
+ return {
1589
+ runId: ctx.runId,
1590
+ runName: ctx.runName,
1591
+ traceDir: ctx.traceDir,
1592
+ silent: ctx.silent,
1593
+ metadata: ctx.metadata
1594
+ };
1595
+ }
1596
+ function invoke(fn) {
1597
+ return new Promise((resolve, reject) => {
1598
+ try {
1599
+ Promise.resolve(fn()).then(resolve, reject);
1600
+ } catch (e) {
1601
+ reject(e);
1602
+ }
1603
+ });
1604
+ }
1605
+ function getCurrentContext() {
1606
+ try {
1607
+ const s = storage.getStore();
1608
+ if (!s) return void 0;
1609
+ return toPublicContext(s);
1610
+ } catch {
1611
+ return void 0;
1612
+ }
1613
+ }
1614
+ function getCurrentRunId() {
1615
+ try {
1616
+ return storage.getStore()?.runId;
1617
+ } catch {
1618
+ return void 0;
1619
+ }
1620
+ }
1621
+ function getCurrentRunName() {
1622
+ try {
1623
+ return storage.getStore()?.runName;
1624
+ } catch {
1625
+ return void 0;
1626
+ }
1627
+ }
1628
+ function getCurrentStepId() {
1629
+ try {
1630
+ return storage.getStore()?.currentStepId;
1631
+ } catch {
1632
+ return void 0;
1633
+ }
1634
+ }
1635
+ function getParentStepId() {
1636
+ return getCurrentStepId();
1637
+ }
1638
+ function getCurrentDepth() {
1639
+ try {
1640
+ const d = storage.getStore()?.currentDepth;
1641
+ return typeof d === "number" && Number.isFinite(d) ? d : 0;
1642
+ } catch {
1643
+ return 0;
1644
+ }
1645
+ }
1646
+ function hasActiveContext() {
1647
+ try {
1648
+ return storage.getStore() !== void 0;
1649
+ } catch {
1650
+ return false;
1651
+ }
1652
+ }
1653
+ function getTraceDirFromContext() {
1654
+ try {
1655
+ return storage.getStore()?.traceDir;
1656
+ } catch {
1657
+ return void 0;
1658
+ }
1659
+ }
1660
+ function isSilentContext() {
1661
+ try {
1662
+ const s = storage.getStore();
1663
+ return s ? s.silent : false;
1664
+ } catch {
1665
+ return false;
1666
+ }
1667
+ }
1668
+ function getTraceSafetyFromContext() {
1669
+ try {
1670
+ return storage.getStore()?.traceSafety;
1671
+ } catch {
1672
+ return void 0;
1673
+ }
1674
+ }
1675
+ function runWithContext(context, fn, traceSafety = resolveTraceSafetyOptions()) {
1676
+ const runtime = {
1677
+ runId: context.runId,
1678
+ runName: context.runName,
1679
+ traceDir: context.traceDir,
1680
+ silent: context.silent,
1681
+ metadata: context.metadata,
1682
+ traceSafety,
1683
+ currentDepth: 0
1684
+ };
1685
+ return new Promise((resolve, reject) => {
1686
+ storage.run(runtime, () => {
1687
+ try {
1688
+ Promise.resolve(fn()).then(resolve, reject);
1689
+ } catch (e) {
1690
+ reject(e);
1691
+ }
1692
+ });
1693
+ });
1694
+ }
1695
+ function runWithStepContext(stepId, fn) {
1696
+ let parent;
1697
+ try {
1698
+ parent = storage.getStore();
1699
+ } catch {
1700
+ parent = void 0;
1701
+ }
1702
+ if (!parent) {
1703
+ return invoke(fn);
1704
+ }
1705
+ const derived = {
1706
+ runId: parent.runId,
1707
+ runName: parent.runName,
1708
+ traceDir: parent.traceDir,
1709
+ silent: parent.silent,
1710
+ metadata: parent.metadata,
1711
+ traceSafety: parent.traceSafety,
1712
+ currentStepId: stepId,
1713
+ currentDepth: parent.currentDepth + 1
1714
+ };
1715
+ return new Promise((resolve, reject) => {
1716
+ storage.run(derived, () => {
1717
+ try {
1718
+ Promise.resolve(fn()).then(resolve, reject);
1719
+ } catch (e) {
1720
+ reject(e);
1721
+ }
1722
+ });
1723
+ });
1724
+ }
1502
1725
  function resolveTraceDir(options = {}) {
1503
1726
  if (typeof options.dir === "string" && options.dir.trim() !== "") {
1504
1727
  return options.dir.trim();
@@ -1763,7 +1986,7 @@ var KNOWN_EVENTS = /* @__PURE__ */ new Set([
1763
1986
  "step_started",
1764
1987
  "step_completed"
1765
1988
  ]);
1766
- function isRecord7(value) {
1989
+ function isRecord8(value) {
1767
1990
  return typeof value === "object" && value !== null && !Array.isArray(value);
1768
1991
  }
1769
1992
  function safeParse(line) {
@@ -1785,7 +2008,7 @@ async function isAgentInspectTrace(filePath) {
1785
2008
  if (trimmed === "") continue;
1786
2009
  const parsed = safeParse(trimmed);
1787
2010
  if (!parsed) continue;
1788
- if (!isRecord7(parsed)) continue;
2011
+ if (!isRecord8(parsed)) continue;
1789
2012
  checked += 1;
1790
2013
  if (isTraceEvent(parsed)) return true;
1791
2014
  const ev = parsed.event;
@@ -2537,9 +2760,13 @@ async function inspectRun(name, fn, options) {
2537
2760
  if (typeof fn !== "function") {
2538
2761
  throw new TypeError("inspectRun requires `fn` to be a function");
2539
2762
  }
2763
+ if (options?.enabled === false) {
2764
+ return Promise.resolve(fn());
2765
+ }
2540
2766
  const runName = normalizeRunName(name);
2541
2767
  const runId = createRunId();
2542
2768
  const traceDir = resolveTraceDir({ dir: options?.traceDir });
2769
+ const traceSafety = resolveTraceSafetyOptions(options);
2543
2770
  const context = {
2544
2771
  runId,
2545
2772
  runName,
@@ -2563,7 +2790,10 @@ async function inspectRun(name, fn, options) {
2563
2790
  startTime,
2564
2791
  ...options?.metadata !== void 0 ? { metadata: options.metadata } : {}
2565
2792
  };
2566
- await writeTraceEvent(started, traceDir);
2793
+ await writeTraceEvent(
2794
+ prepareTraceEventForDisk(started, traceSafety),
2795
+ traceDir
2796
+ );
2567
2797
  });
2568
2798
  await safeInstrumentation("printRunStart", () => {
2569
2799
  printRunStart(runId, runName);
@@ -2587,7 +2817,10 @@ async function inspectRun(name, fn, options) {
2587
2817
  durationMs: durationMs2,
2588
2818
  error: formatted
2589
2819
  };
2590
- await writeTraceEvent(completed, traceDir);
2820
+ await writeTraceEvent(
2821
+ prepareTraceEventForDisk(completed, traceSafety),
2822
+ traceDir
2823
+ );
2591
2824
  });
2592
2825
  await safeInstrumentation("printRunComplete(error)", () => {
2593
2826
  printRunComplete(runName, runId, durationMs2, "error", printPath2);
@@ -2607,13 +2840,35 @@ async function inspectRun(name, fn, options) {
2607
2840
  endTime,
2608
2841
  durationMs
2609
2842
  };
2610
- await writeTraceEvent(completed, traceDir);
2843
+ await writeTraceEvent(
2844
+ prepareTraceEventForDisk(completed, traceSafety),
2845
+ traceDir
2846
+ );
2611
2847
  });
2612
2848
  await safeInstrumentation("printRunComplete(success)", () => {
2613
2849
  printRunComplete(runName, runId, durationMs, "success", printPath);
2614
2850
  });
2615
2851
  return result;
2616
- });
2852
+ }, traceSafety);
2853
+ }
2854
+
2855
+ // packages/core/src/maybe-inspect-run.ts
2856
+ var ENABLED_ENV_VALUES = /* @__PURE__ */ new Set(["1", "true", "yes", "on", "enabled"]);
2857
+ function isAgentInspectEnabled(value) {
2858
+ if (value === void 0) return false;
2859
+ const normalized = value.trim().toLowerCase();
2860
+ if (normalized === "") return false;
2861
+ return ENABLED_ENV_VALUES.has(normalized);
2862
+ }
2863
+ async function maybeInspectRun(name, fn, options) {
2864
+ if (typeof fn !== "function") {
2865
+ throw new TypeError("maybeInspectRun requires `fn` to be a function");
2866
+ }
2867
+ const enabled = options?.enabled !== void 0 ? options.enabled : isAgentInspectEnabled(process.env.AGENT_INSPECT);
2868
+ if (!enabled) {
2869
+ return Promise.resolve(fn());
2870
+ }
2871
+ return inspectRun(name, fn, options);
2617
2872
  }
2618
2873
 
2619
2874
  // packages/core/src/step.ts
@@ -2645,6 +2900,7 @@ async function stepImpl(name, fn, options) {
2645
2900
  const parentId = getParentStepId();
2646
2901
  const stepType = options?.type ?? "logic";
2647
2902
  const metadata = options?.metadata;
2903
+ const traceSafety = getTraceSafetyFromContext();
2648
2904
  const startTime = Date.now();
2649
2905
  await safeInstrumentation2("writeTraceEvent(step_started)", async () => {
2650
2906
  const started = {
@@ -2659,7 +2915,8 @@ async function stepImpl(name, fn, options) {
2659
2915
  startTime,
2660
2916
  ...metadata !== void 0 ? { metadata } : {}
2661
2917
  };
2662
- await writeTraceEvent(started, context.traceDir);
2918
+ const safe = traceSafety !== void 0 ? prepareTraceEventForDisk(started, traceSafety) : started;
2919
+ await writeTraceEvent(safe, context.traceDir);
2663
2920
  });
2664
2921
  await safeInstrumentation2("printStepStart", () => {
2665
2922
  printStepStart(stepName, renderDepth);
@@ -2685,7 +2942,8 @@ async function stepImpl(name, fn, options) {
2685
2942
  durationMs: durationMs2,
2686
2943
  error: formatted
2687
2944
  };
2688
- await writeTraceEvent(completed, context.traceDir);
2945
+ const safe = traceSafety !== void 0 ? prepareTraceEventForDisk(completed, traceSafety) : completed;
2946
+ await writeTraceEvent(safe, context.traceDir);
2689
2947
  });
2690
2948
  await safeInstrumentation2("printStepComplete(error)", () => {
2691
2949
  printStepComplete(stepName, durationMs2, "error", renderDepth);
@@ -2711,7 +2969,8 @@ async function stepImpl(name, fn, options) {
2711
2969
  endTime,
2712
2970
  durationMs
2713
2971
  };
2714
- await writeTraceEvent(completed, context.traceDir);
2972
+ const safe = traceSafety !== void 0 ? prepareTraceEventForDisk(completed, traceSafety) : completed;
2973
+ await writeTraceEvent(safe, context.traceDir);
2715
2974
  });
2716
2975
  await safeInstrumentation2("printStepComplete(success)", () => {
2717
2976
  printStepComplete(stepName, durationMs, "success", renderDepth);
@@ -3581,6 +3840,9 @@ function validateExport(result) {
3581
3840
  }
3582
3841
 
3583
3842
  exports.DEFAULT_LOG_INGEST_CONFIG = DEFAULT_LOG_INGEST_CONFIG;
3843
+ exports.DEFAULT_MAX_EVENT_BYTES = DEFAULT_MAX_EVENT_BYTES;
3844
+ exports.DEFAULT_MAX_METADATA_VALUE_LENGTH = DEFAULT_MAX_METADATA_VALUE_LENGTH;
3845
+ exports.DEFAULT_MAX_PREVIEW_LENGTH = DEFAULT_MAX_PREVIEW_LENGTH;
3584
3846
  exports.DEFAULT_REDACT_KEYS = DEFAULT_REDACT_KEYS;
3585
3847
  exports.DEFAULT_TRACE_DIR_NAME = DEFAULT_TRACE_DIR_NAME;
3586
3848
  exports.EXPORT_PAYLOAD_VERSION = EXPORT_PAYLOAD_VERSION;
@@ -3629,9 +3891,11 @@ exports.getParentStepId = getParentStepId;
3629
3891
  exports.getRunIdFromTraceFileName = getRunIdFromTraceFileName;
3630
3892
  exports.getTraceDirFromContext = getTraceDirFromContext;
3631
3893
  exports.getTraceFilePath = getTraceFilePath;
3894
+ exports.getTraceSafetyFromContext = getTraceSafetyFromContext;
3632
3895
  exports.hasActiveContext = hasActiveContext;
3633
3896
  exports.initializeTraceFile = initializeTraceFile;
3634
3897
  exports.inspectRun = inspectRun;
3898
+ exports.isAgentInspectEnabled = isAgentInspectEnabled;
3635
3899
  exports.isAgentInspectTrace = isAgentInspectTrace;
3636
3900
  exports.isSilentContext = isSilentContext;
3637
3901
  exports.isStepStatus = isStepStatus;
@@ -3642,12 +3906,15 @@ exports.loadLogIngestConfig = loadLogIngestConfig;
3642
3906
  exports.manualTraceEventsToComparableRun = manualTraceEventsToComparableRun;
3643
3907
  exports.manualTraceEventsToRunTree = manualTraceEventsToRunTree;
3644
3908
  exports.matchMapping = matchMapping;
3909
+ exports.maybeInspectRun = maybeInspectRun;
3645
3910
  exports.mergeExportDefaults = mergeExportDefaults;
3646
3911
  exports.mergeLogIngestConfig = mergeLogIngestConfig;
3647
3912
  exports.observe = observe;
3648
3913
  exports.parseDuration = parseDuration;
3649
3914
  exports.parseLogLine = parseLogLine;
3650
3915
  exports.parseLogsToTrees = parseLogsToTrees;
3916
+ exports.prepareMetadataForDisk = prepareMetadataForDisk;
3917
+ exports.prepareTraceEventForDisk = prepareTraceEventForDisk;
3651
3918
  exports.printError = printError;
3652
3919
  exports.printFailedAt = printFailedAt;
3653
3920
  exports.printRunComplete = printRunComplete;
@@ -3663,6 +3930,7 @@ exports.renderRunTree = renderRunTree;
3663
3930
  exports.renderRunTrees = renderRunTrees;
3664
3931
  exports.renderStepLine = renderStepLine;
3665
3932
  exports.resolveTraceDir = resolveTraceDir;
3933
+ exports.resolveTraceSafetyOptions = resolveTraceSafetyOptions;
3666
3934
  exports.runWithContext = runWithContext;
3667
3935
  exports.runWithStepContext = runWithStepContext;
3668
3936
  exports.safeString = safeString2;