agent-inspect 1.0.3 → 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.
- package/CHANGELOG.md +49 -10
- package/README.md +13 -3
- package/SECURITY.md +5 -2
- package/docs/ADAPTERS.md +28 -1
- package/docs/API.md +12 -1
- package/docs/ARCHITECTURE.md +43 -8
- package/docs/EXPORTS.md +1 -1
- package/docs/GETTING-STARTED.md +14 -10
- package/docs/LIMITATIONS.md +7 -1
- package/docs/LOG-TO-TREE-QUICKSTART.md +2 -0
- package/docs/LOGS.md +3 -2
- package/docs/SCHEMA.md +8 -2
- package/package.json +12 -15
- package/packages/cli/dist/index.cjs +310 -90
- package/packages/cli/dist/index.cjs.map +1 -1
- package/packages/cli/dist/index.mjs +310 -90
- package/packages/cli/dist/index.mjs.map +1 -1
- package/packages/core/dist/index.cjs +385 -141
- package/packages/core/dist/index.cjs.map +1 -1
- package/packages/core/dist/index.d.cts +111 -75
- package/packages/core/dist/index.d.ts +111 -75
- package/packages/core/dist/index.mjs +379 -142
- package/packages/core/dist/index.mjs.map +1 -1
|
@@ -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
|
-
|
|
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(
|
|
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
|
|
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 (!
|
|
2011
|
+
if (!isRecord8(parsed)) continue;
|
|
1789
2012
|
checked += 1;
|
|
1790
2013
|
if (isTraceEvent(parsed)) return true;
|
|
1791
2014
|
const ev = parsed.event;
|
|
@@ -2543,6 +2766,7 @@ async function inspectRun(name, fn, options) {
|
|
|
2543
2766
|
const runName = normalizeRunName(name);
|
|
2544
2767
|
const runId = createRunId();
|
|
2545
2768
|
const traceDir = resolveTraceDir({ dir: options?.traceDir });
|
|
2769
|
+
const traceSafety = resolveTraceSafetyOptions(options);
|
|
2546
2770
|
const context = {
|
|
2547
2771
|
runId,
|
|
2548
2772
|
runName,
|
|
@@ -2566,7 +2790,10 @@ async function inspectRun(name, fn, options) {
|
|
|
2566
2790
|
startTime,
|
|
2567
2791
|
...options?.metadata !== void 0 ? { metadata: options.metadata } : {}
|
|
2568
2792
|
};
|
|
2569
|
-
await writeTraceEvent(
|
|
2793
|
+
await writeTraceEvent(
|
|
2794
|
+
prepareTraceEventForDisk(started, traceSafety),
|
|
2795
|
+
traceDir
|
|
2796
|
+
);
|
|
2570
2797
|
});
|
|
2571
2798
|
await safeInstrumentation("printRunStart", () => {
|
|
2572
2799
|
printRunStart(runId, runName);
|
|
@@ -2590,7 +2817,10 @@ async function inspectRun(name, fn, options) {
|
|
|
2590
2817
|
durationMs: durationMs2,
|
|
2591
2818
|
error: formatted
|
|
2592
2819
|
};
|
|
2593
|
-
await writeTraceEvent(
|
|
2820
|
+
await writeTraceEvent(
|
|
2821
|
+
prepareTraceEventForDisk(completed, traceSafety),
|
|
2822
|
+
traceDir
|
|
2823
|
+
);
|
|
2594
2824
|
});
|
|
2595
2825
|
await safeInstrumentation("printRunComplete(error)", () => {
|
|
2596
2826
|
printRunComplete(runName, runId, durationMs2, "error", printPath2);
|
|
@@ -2610,13 +2840,16 @@ async function inspectRun(name, fn, options) {
|
|
|
2610
2840
|
endTime,
|
|
2611
2841
|
durationMs
|
|
2612
2842
|
};
|
|
2613
|
-
await writeTraceEvent(
|
|
2843
|
+
await writeTraceEvent(
|
|
2844
|
+
prepareTraceEventForDisk(completed, traceSafety),
|
|
2845
|
+
traceDir
|
|
2846
|
+
);
|
|
2614
2847
|
});
|
|
2615
2848
|
await safeInstrumentation("printRunComplete(success)", () => {
|
|
2616
2849
|
printRunComplete(runName, runId, durationMs, "success", printPath);
|
|
2617
2850
|
});
|
|
2618
2851
|
return result;
|
|
2619
|
-
});
|
|
2852
|
+
}, traceSafety);
|
|
2620
2853
|
}
|
|
2621
2854
|
|
|
2622
2855
|
// packages/core/src/maybe-inspect-run.ts
|
|
@@ -2667,6 +2900,7 @@ async function stepImpl(name, fn, options) {
|
|
|
2667
2900
|
const parentId = getParentStepId();
|
|
2668
2901
|
const stepType = options?.type ?? "logic";
|
|
2669
2902
|
const metadata = options?.metadata;
|
|
2903
|
+
const traceSafety = getTraceSafetyFromContext();
|
|
2670
2904
|
const startTime = Date.now();
|
|
2671
2905
|
await safeInstrumentation2("writeTraceEvent(step_started)", async () => {
|
|
2672
2906
|
const started = {
|
|
@@ -2681,7 +2915,8 @@ async function stepImpl(name, fn, options) {
|
|
|
2681
2915
|
startTime,
|
|
2682
2916
|
...metadata !== void 0 ? { metadata } : {}
|
|
2683
2917
|
};
|
|
2684
|
-
|
|
2918
|
+
const safe = traceSafety !== void 0 ? prepareTraceEventForDisk(started, traceSafety) : started;
|
|
2919
|
+
await writeTraceEvent(safe, context.traceDir);
|
|
2685
2920
|
});
|
|
2686
2921
|
await safeInstrumentation2("printStepStart", () => {
|
|
2687
2922
|
printStepStart(stepName, renderDepth);
|
|
@@ -2707,7 +2942,8 @@ async function stepImpl(name, fn, options) {
|
|
|
2707
2942
|
durationMs: durationMs2,
|
|
2708
2943
|
error: formatted
|
|
2709
2944
|
};
|
|
2710
|
-
|
|
2945
|
+
const safe = traceSafety !== void 0 ? prepareTraceEventForDisk(completed, traceSafety) : completed;
|
|
2946
|
+
await writeTraceEvent(safe, context.traceDir);
|
|
2711
2947
|
});
|
|
2712
2948
|
await safeInstrumentation2("printStepComplete(error)", () => {
|
|
2713
2949
|
printStepComplete(stepName, durationMs2, "error", renderDepth);
|
|
@@ -2733,7 +2969,8 @@ async function stepImpl(name, fn, options) {
|
|
|
2733
2969
|
endTime,
|
|
2734
2970
|
durationMs
|
|
2735
2971
|
};
|
|
2736
|
-
|
|
2972
|
+
const safe = traceSafety !== void 0 ? prepareTraceEventForDisk(completed, traceSafety) : completed;
|
|
2973
|
+
await writeTraceEvent(safe, context.traceDir);
|
|
2737
2974
|
});
|
|
2738
2975
|
await safeInstrumentation2("printStepComplete(success)", () => {
|
|
2739
2976
|
printStepComplete(stepName, durationMs, "success", renderDepth);
|
|
@@ -3603,6 +3840,9 @@ function validateExport(result) {
|
|
|
3603
3840
|
}
|
|
3604
3841
|
|
|
3605
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;
|
|
3606
3846
|
exports.DEFAULT_REDACT_KEYS = DEFAULT_REDACT_KEYS;
|
|
3607
3847
|
exports.DEFAULT_TRACE_DIR_NAME = DEFAULT_TRACE_DIR_NAME;
|
|
3608
3848
|
exports.EXPORT_PAYLOAD_VERSION = EXPORT_PAYLOAD_VERSION;
|
|
@@ -3651,6 +3891,7 @@ exports.getParentStepId = getParentStepId;
|
|
|
3651
3891
|
exports.getRunIdFromTraceFileName = getRunIdFromTraceFileName;
|
|
3652
3892
|
exports.getTraceDirFromContext = getTraceDirFromContext;
|
|
3653
3893
|
exports.getTraceFilePath = getTraceFilePath;
|
|
3894
|
+
exports.getTraceSafetyFromContext = getTraceSafetyFromContext;
|
|
3654
3895
|
exports.hasActiveContext = hasActiveContext;
|
|
3655
3896
|
exports.initializeTraceFile = initializeTraceFile;
|
|
3656
3897
|
exports.inspectRun = inspectRun;
|
|
@@ -3672,6 +3913,8 @@ exports.observe = observe;
|
|
|
3672
3913
|
exports.parseDuration = parseDuration;
|
|
3673
3914
|
exports.parseLogLine = parseLogLine;
|
|
3674
3915
|
exports.parseLogsToTrees = parseLogsToTrees;
|
|
3916
|
+
exports.prepareMetadataForDisk = prepareMetadataForDisk;
|
|
3917
|
+
exports.prepareTraceEventForDisk = prepareTraceEventForDisk;
|
|
3675
3918
|
exports.printError = printError;
|
|
3676
3919
|
exports.printFailedAt = printFailedAt;
|
|
3677
3920
|
exports.printRunComplete = printRunComplete;
|
|
@@ -3687,6 +3930,7 @@ exports.renderRunTree = renderRunTree;
|
|
|
3687
3930
|
exports.renderRunTrees = renderRunTrees;
|
|
3688
3931
|
exports.renderStepLine = renderStepLine;
|
|
3689
3932
|
exports.resolveTraceDir = resolveTraceDir;
|
|
3933
|
+
exports.resolveTraceSafetyOptions = resolveTraceSafetyOptions;
|
|
3690
3934
|
exports.runWithContext = runWithContext;
|
|
3691
3935
|
exports.runWithStepContext = runWithStepContext;
|
|
3692
3936
|
exports.safeString = safeString2;
|