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.
- package/CHANGELOG.md +57 -10
- package/README.md +28 -4
- package/SECURITY.md +5 -2
- package/docs/ADAPTERS.md +28 -1
- package/docs/API.md +16 -3
- package/docs/ARCHITECTURE.md +43 -8
- package/docs/CLI.md +1 -0
- package/docs/EXPORTS.md +1 -1
- package/docs/GETTING-STARTED.md +36 -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 +20 -18
- 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 +409 -141
- package/packages/core/dist/index.cjs.map +1 -1
- package/packages/core/dist/index.d.cts +130 -76
- package/packages/core/dist/index.d.ts +130 -76
- package/packages/core/dist/index.mjs +401 -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;
|
|
@@ -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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|