agent-inspect 4.1.0 → 4.2.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 +12 -0
- package/docs/CLI.md +17 -6
- package/package.json +1 -1
- package/packages/cli/dist/{chunk-MT5G7JFO.mjs → chunk-5VSPJEZ7.mjs} +264 -11
- package/packages/cli/dist/chunk-5VSPJEZ7.mjs.map +1 -0
- package/packages/cli/dist/index.cjs +700 -188
- package/packages/cli/dist/index.cjs.map +1 -1
- package/packages/cli/dist/index.mjs +392 -151
- package/packages/cli/dist/index.mjs.map +1 -1
- package/packages/cli/dist/{src-DUGEOAZ7.mjs → src-VQT7QLGV.mjs} +3 -3
- package/packages/cli/dist/{src-DUGEOAZ7.mjs.map → src-VQT7QLGV.mjs.map} +1 -1
- package/packages/core/dist/advanced.cjs +265 -8
- package/packages/core/dist/advanced.cjs.map +1 -1
- package/packages/core/dist/advanced.d.cts +79 -1
- package/packages/core/dist/advanced.d.ts +79 -1
- package/packages/core/dist/advanced.mjs +262 -9
- package/packages/core/dist/advanced.mjs.map +1 -1
- package/packages/cli/dist/chunk-MT5G7JFO.mjs.map +0 -1
|
@@ -4078,6 +4078,252 @@ function sessionKeyForRun(meta, options) {
|
|
|
4078
4078
|
return void 0;
|
|
4079
4079
|
}
|
|
4080
4080
|
|
|
4081
|
+
// packages/core/src/sessions/status.ts
|
|
4082
|
+
var DEFAULT_STALE_THRESHOLD_MS = 864e5;
|
|
4083
|
+
var EXPLICIT_STATUS_PRIORITY = {
|
|
4084
|
+
error: 5,
|
|
4085
|
+
waiting_input: 4,
|
|
4086
|
+
idle: 3,
|
|
4087
|
+
stale: 2,
|
|
4088
|
+
completed: 1
|
|
4089
|
+
};
|
|
4090
|
+
var EXPLICIT_SESSION_STATUSES = /* @__PURE__ */ new Set([
|
|
4091
|
+
"running",
|
|
4092
|
+
"waiting_input",
|
|
4093
|
+
"idle",
|
|
4094
|
+
"completed",
|
|
4095
|
+
"error",
|
|
4096
|
+
"stale",
|
|
4097
|
+
"unknown"
|
|
4098
|
+
]);
|
|
4099
|
+
function isExplicitSessionStatus(value) {
|
|
4100
|
+
return typeof value === "string" && EXPLICIT_SESSION_STATUSES.has(value);
|
|
4101
|
+
}
|
|
4102
|
+
function activityMs(run) {
|
|
4103
|
+
return run.endedAt ?? run.startedAt ?? 0;
|
|
4104
|
+
}
|
|
4105
|
+
function latestActivityMs(runs) {
|
|
4106
|
+
let latest = 0;
|
|
4107
|
+
for (const run of runs) {
|
|
4108
|
+
const ms = activityMs(run);
|
|
4109
|
+
if (ms > latest) latest = ms;
|
|
4110
|
+
}
|
|
4111
|
+
return latest;
|
|
4112
|
+
}
|
|
4113
|
+
function earliestStart(runs) {
|
|
4114
|
+
let earliest;
|
|
4115
|
+
for (const run of runs) {
|
|
4116
|
+
if (run.startedAt === void 0) continue;
|
|
4117
|
+
if (earliest === void 0 || run.startedAt < earliest) {
|
|
4118
|
+
earliest = run.startedAt;
|
|
4119
|
+
}
|
|
4120
|
+
}
|
|
4121
|
+
return earliest;
|
|
4122
|
+
}
|
|
4123
|
+
function latestEndWhenAllEnded(runs) {
|
|
4124
|
+
if (runs.length === 0) return void 0;
|
|
4125
|
+
let latest;
|
|
4126
|
+
for (const run of runs) {
|
|
4127
|
+
if (run.endedAt === void 0) return void 0;
|
|
4128
|
+
if (latest === void 0 || run.endedAt > latest) latest = run.endedAt;
|
|
4129
|
+
}
|
|
4130
|
+
return latest;
|
|
4131
|
+
}
|
|
4132
|
+
function pickExplicitStatus(runs) {
|
|
4133
|
+
let best;
|
|
4134
|
+
let bestPriority = 0;
|
|
4135
|
+
for (const run of runs) {
|
|
4136
|
+
const raw = run.metadata?.sessionStatus;
|
|
4137
|
+
if (!isExplicitSessionStatus(raw)) continue;
|
|
4138
|
+
const priority = EXPLICIT_STATUS_PRIORITY[raw] ?? 0;
|
|
4139
|
+
if (priority > bestPriority) {
|
|
4140
|
+
bestPriority = priority;
|
|
4141
|
+
best = raw;
|
|
4142
|
+
}
|
|
4143
|
+
}
|
|
4144
|
+
return best;
|
|
4145
|
+
}
|
|
4146
|
+
function deriveLastError(runs) {
|
|
4147
|
+
const errorRuns = runs.filter((run) => run.status === "error").sort((a, b) => activityMs(b) - activityMs(a));
|
|
4148
|
+
const latest = errorRuns[0];
|
|
4149
|
+
if (!latest) return void 0;
|
|
4150
|
+
const meta = latest.metadata ?? {};
|
|
4151
|
+
const message = typeof meta.errorMessage === "string" && meta.errorMessage.trim() !== "" ? meta.errorMessage.trim() : latest.name ?? latest.runId;
|
|
4152
|
+
const code = typeof meta.errorCode === "string" && meta.errorCode.trim() !== "" ? meta.errorCode.trim() : void 0;
|
|
4153
|
+
return { runId: latest.runId, message, code };
|
|
4154
|
+
}
|
|
4155
|
+
function deriveCheckSummary(runs) {
|
|
4156
|
+
let pass = 0;
|
|
4157
|
+
let fail = 0;
|
|
4158
|
+
let warn2 = 0;
|
|
4159
|
+
let found = false;
|
|
4160
|
+
for (const run of runs) {
|
|
4161
|
+
const summary = run.metadata?.checkSummary;
|
|
4162
|
+
if (!summary || typeof summary !== "object") continue;
|
|
4163
|
+
const record = summary;
|
|
4164
|
+
if (typeof record.pass === "number") {
|
|
4165
|
+
pass += record.pass;
|
|
4166
|
+
found = true;
|
|
4167
|
+
}
|
|
4168
|
+
if (typeof record.fail === "number") {
|
|
4169
|
+
fail += record.fail;
|
|
4170
|
+
found = true;
|
|
4171
|
+
}
|
|
4172
|
+
if (typeof record.warn === "number") {
|
|
4173
|
+
warn2 += record.warn;
|
|
4174
|
+
found = true;
|
|
4175
|
+
}
|
|
4176
|
+
}
|
|
4177
|
+
return found ? { pass, fail, warn: warn2 } : void 0;
|
|
4178
|
+
}
|
|
4179
|
+
function deriveObservationSummary(runs) {
|
|
4180
|
+
for (const run of [...runs].sort((a, b) => activityMs(b) - activityMs(a))) {
|
|
4181
|
+
const value = run.metadata?.observationSummary;
|
|
4182
|
+
if (typeof value === "string" && value.trim() !== "") {
|
|
4183
|
+
return value.trim();
|
|
4184
|
+
}
|
|
4185
|
+
}
|
|
4186
|
+
return void 0;
|
|
4187
|
+
}
|
|
4188
|
+
function deriveSessionStatus(runs, options = {}) {
|
|
4189
|
+
if (runs.length === 0) return "unknown";
|
|
4190
|
+
if (runs.some((run) => run.status === "running")) return "running";
|
|
4191
|
+
const explicit = pickExplicitStatus(runs);
|
|
4192
|
+
if (explicit && explicit !== "running") return explicit;
|
|
4193
|
+
if (runs.some((run) => run.status === "error")) return "error";
|
|
4194
|
+
if (runs.every((run) => run.status === "success")) return "completed";
|
|
4195
|
+
const nowMs = options.nowMs ?? Date.now();
|
|
4196
|
+
const staleThresholdMs = options.staleThresholdMs ?? DEFAULT_STALE_THRESHOLD_MS;
|
|
4197
|
+
const lastMs = latestActivityMs(runs);
|
|
4198
|
+
if (lastMs > 0 && nowMs - lastMs > staleThresholdMs) return "stale";
|
|
4199
|
+
return "unknown";
|
|
4200
|
+
}
|
|
4201
|
+
function enrichSessionSummary(summary, runs, options = {}) {
|
|
4202
|
+
const sessionRuns = runs.filter((run) => summary.runIds.includes(run.runId)).sort((a, b) => a.runId.localeCompare(b.runId));
|
|
4203
|
+
const startedAt = earliestStart(sessionRuns);
|
|
4204
|
+
const endedAt = latestEndWhenAllEnded(sessionRuns);
|
|
4205
|
+
const durationMs2 = startedAt !== void 0 && endedAt !== void 0 ? endedAt - startedAt : void 0;
|
|
4206
|
+
let correlationId;
|
|
4207
|
+
let jobId;
|
|
4208
|
+
let workflowId;
|
|
4209
|
+
for (const run of sessionRuns) {
|
|
4210
|
+
const meta = extractSessionWorkflowMetadata(run.metadata);
|
|
4211
|
+
if (!correlationId && meta?.correlationId) correlationId = meta.correlationId;
|
|
4212
|
+
if (!jobId && meta?.jobId) jobId = meta.jobId;
|
|
4213
|
+
if (!workflowId && meta?.workflowName) workflowId = meta.workflowName;
|
|
4214
|
+
else if (!workflowId && meta?.workflowStep) workflowId = meta.workflowStep;
|
|
4215
|
+
}
|
|
4216
|
+
const lastMs = latestActivityMs(sessionRuns);
|
|
4217
|
+
const lastActivity = lastMs > 0 ? new Date(lastMs).toISOString() : (/* @__PURE__ */ new Date(0)).toISOString();
|
|
4218
|
+
const retryCount = summary.retries.filter(
|
|
4219
|
+
(retry) => retry.retryOf !== void 0 || (retry.attempt ?? 0) > 1
|
|
4220
|
+
).length;
|
|
4221
|
+
return {
|
|
4222
|
+
...summary,
|
|
4223
|
+
status: deriveSessionStatus(sessionRuns, options),
|
|
4224
|
+
startedAt,
|
|
4225
|
+
endedAt,
|
|
4226
|
+
durationMs: durationMs2,
|
|
4227
|
+
correlationId,
|
|
4228
|
+
jobId,
|
|
4229
|
+
workflowId,
|
|
4230
|
+
lastError: deriveLastError(sessionRuns),
|
|
4231
|
+
lastActivity,
|
|
4232
|
+
retryCount,
|
|
4233
|
+
observationSummary: deriveObservationSummary(sessionRuns),
|
|
4234
|
+
checkSummary: deriveCheckSummary(sessionRuns)
|
|
4235
|
+
};
|
|
4236
|
+
}
|
|
4237
|
+
|
|
4238
|
+
// packages/core/src/sessions/activity.ts
|
|
4239
|
+
function statusLine(session) {
|
|
4240
|
+
const name = session.workflowId ?? session.correlationId ?? session.sessionId;
|
|
4241
|
+
const status = session.status;
|
|
4242
|
+
if (session.lastError) {
|
|
4243
|
+
return `${name} session ${session.sessionId} failed at ${session.lastError.message}`;
|
|
4244
|
+
}
|
|
4245
|
+
if (session.observationSummary) {
|
|
4246
|
+
return `${name} session ${session.sessionId} ${status} with observation warning`;
|
|
4247
|
+
}
|
|
4248
|
+
return `${name} session ${session.sessionId} ${status}`;
|
|
4249
|
+
}
|
|
4250
|
+
function parseSinceMs(since, nowMs) {
|
|
4251
|
+
if (!since || since.trim() === "") return nowMs - 7 * 864e5;
|
|
4252
|
+
const trimmed = since.trim().toLowerCase();
|
|
4253
|
+
const match = /^(\d+)([smhd])$/.exec(trimmed);
|
|
4254
|
+
if (!match) return nowMs - 7 * 864e5;
|
|
4255
|
+
const amount = Number.parseInt(match[1], 10);
|
|
4256
|
+
const unit = match[2];
|
|
4257
|
+
const mult = unit === "s" ? 1e3 : unit === "m" ? 6e4 : unit === "h" ? 36e5 : 864e5;
|
|
4258
|
+
return nowMs - amount * mult;
|
|
4259
|
+
}
|
|
4260
|
+
function isFailed(status) {
|
|
4261
|
+
return status === "error";
|
|
4262
|
+
}
|
|
4263
|
+
function isStale(status) {
|
|
4264
|
+
return status === "stale";
|
|
4265
|
+
}
|
|
4266
|
+
function guardrailWarnings(session) {
|
|
4267
|
+
const summary = session.checkSummary;
|
|
4268
|
+
if (!summary) return 0;
|
|
4269
|
+
return summary.warn;
|
|
4270
|
+
}
|
|
4271
|
+
function buildActivitySummary(index, options = {}) {
|
|
4272
|
+
const nowMs = options.nowMs ?? Date.now();
|
|
4273
|
+
const sinceMs = parseSinceMs(options.since, nowMs);
|
|
4274
|
+
const sinceIso = new Date(sinceMs).toISOString();
|
|
4275
|
+
const limit = Number.isInteger(options.limit) && options.limit > 0 ? options.limit : 20;
|
|
4276
|
+
const inWindow = index.sessions.filter((session) => {
|
|
4277
|
+
const activityMs2 = Date.parse(session.lastActivity);
|
|
4278
|
+
return Number.isFinite(activityMs2) && activityMs2 >= sinceMs;
|
|
4279
|
+
});
|
|
4280
|
+
const entries = [...inWindow].sort((a, b) => Date.parse(b.lastActivity) - Date.parse(a.lastActivity)).slice(0, limit).map((session) => ({
|
|
4281
|
+
sessionId: session.sessionId,
|
|
4282
|
+
status: session.status,
|
|
4283
|
+
summary: statusLine(session),
|
|
4284
|
+
lastActivity: session.lastActivity,
|
|
4285
|
+
runCount: session.runIds.length
|
|
4286
|
+
}));
|
|
4287
|
+
let failed = 0;
|
|
4288
|
+
let stale = 0;
|
|
4289
|
+
let guardrailWarningTotal = 0;
|
|
4290
|
+
for (const session of inWindow) {
|
|
4291
|
+
if (isFailed(session.status)) failed += 1;
|
|
4292
|
+
if (isStale(session.status)) stale += 1;
|
|
4293
|
+
guardrailWarningTotal += guardrailWarnings(session);
|
|
4294
|
+
}
|
|
4295
|
+
return {
|
|
4296
|
+
since: sinceIso,
|
|
4297
|
+
sessions: inWindow.length,
|
|
4298
|
+
failed,
|
|
4299
|
+
stale,
|
|
4300
|
+
guardrailWarnings: guardrailWarningTotal,
|
|
4301
|
+
entries
|
|
4302
|
+
};
|
|
4303
|
+
}
|
|
4304
|
+
function renderActivitySummaryHuman(summary) {
|
|
4305
|
+
const lines = [];
|
|
4306
|
+
const todayStart = /* @__PURE__ */ new Date();
|
|
4307
|
+
todayStart.setHours(0, 0, 0, 0);
|
|
4308
|
+
const todayMs = todayStart.getTime();
|
|
4309
|
+
const today = summary.entries.filter(
|
|
4310
|
+
(entry) => Date.parse(entry.lastActivity) >= todayMs
|
|
4311
|
+
);
|
|
4312
|
+
if (today.length > 0) {
|
|
4313
|
+
lines.push("Today");
|
|
4314
|
+
for (const entry of today) {
|
|
4315
|
+
lines.push(` ${entry.summary}`);
|
|
4316
|
+
}
|
|
4317
|
+
lines.push("");
|
|
4318
|
+
}
|
|
4319
|
+
lines.push(`Since ${summary.since}`);
|
|
4320
|
+
lines.push(` ${summary.sessions} sessions`);
|
|
4321
|
+
lines.push(` ${summary.failed} failed`);
|
|
4322
|
+
lines.push(` ${summary.stale} stale`);
|
|
4323
|
+
lines.push(` ${summary.guardrailWarnings} guardrail warnings`);
|
|
4324
|
+
return lines.join("\n");
|
|
4325
|
+
}
|
|
4326
|
+
|
|
4081
4327
|
// packages/core/src/sessions/types.ts
|
|
4082
4328
|
var SESSION_WORKFLOW_KEYS = [
|
|
4083
4329
|
"sessionId",
|
|
@@ -4560,14 +4806,21 @@ function buildSessionIndex(inputRuns, options = {}) {
|
|
|
4560
4806
|
sessionId
|
|
4561
4807
|
});
|
|
4562
4808
|
}
|
|
4563
|
-
return
|
|
4564
|
-
|
|
4565
|
-
|
|
4566
|
-
|
|
4567
|
-
|
|
4568
|
-
|
|
4569
|
-
|
|
4570
|
-
|
|
4809
|
+
return enrichSessionSummary(
|
|
4810
|
+
{
|
|
4811
|
+
sessionId,
|
|
4812
|
+
runIds,
|
|
4813
|
+
groups,
|
|
4814
|
+
handoffs,
|
|
4815
|
+
retries,
|
|
4816
|
+
criticalPath
|
|
4817
|
+
},
|
|
4818
|
+
runs,
|
|
4819
|
+
{
|
|
4820
|
+
nowMs: options.nowMs,
|
|
4821
|
+
staleThresholdMs: options.staleThresholdMs
|
|
4822
|
+
}
|
|
4823
|
+
);
|
|
4571
4824
|
});
|
|
4572
4825
|
if (sessions.length === 0 && runs.length > 0) {
|
|
4573
4826
|
warnings.push({
|
|
@@ -4774,6 +5027,7 @@ exports.SESSION_WORKFLOW_KEYS = SESSION_WORKFLOW_KEYS;
|
|
|
4774
5027
|
exports.TERMINAL_INDENT = TERMINAL_INDENT;
|
|
4775
5028
|
exports.TraceDirectory = TraceDirectory;
|
|
4776
5029
|
exports.aggregateSessionCheckResults = aggregateSessionCheckResults;
|
|
5030
|
+
exports.buildActivitySummary = buildActivitySummary;
|
|
4777
5031
|
exports.buildLocalExplanation = buildLocalExplanation;
|
|
4778
5032
|
exports.buildRunSummary = buildRunSummary;
|
|
4779
5033
|
exports.buildRunTimeline = buildRunTimeline;
|
|
@@ -4784,7 +5038,9 @@ exports.createInspector = createInspector;
|
|
|
4784
5038
|
exports.createInspectorRuntime = createInspectorRuntime;
|
|
4785
5039
|
exports.createRunId = createRunId;
|
|
4786
5040
|
exports.createStepId = createStepId;
|
|
5041
|
+
exports.deriveSessionStatus = deriveSessionStatus;
|
|
4787
5042
|
exports.enrichSessionRunRecord = enrichSessionRunRecord;
|
|
5043
|
+
exports.enrichSessionSummary = enrichSessionSummary;
|
|
4788
5044
|
exports.ensureTraceDir = ensureTraceDir;
|
|
4789
5045
|
exports.extractMetadata = extractMetadata;
|
|
4790
5046
|
exports.extractSessionWorkflowMetadata = extractSessionWorkflowMetadata;
|
|
@@ -4833,6 +5089,7 @@ exports.printStepComplete = printStepComplete;
|
|
|
4833
5089
|
exports.printStepStart = printStepStart;
|
|
4834
5090
|
exports.readTraceEvents = readTraceEvents;
|
|
4835
5091
|
exports.readTraceFile = readTraceFile;
|
|
5092
|
+
exports.renderActivitySummaryHuman = renderActivitySummaryHuman;
|
|
4836
5093
|
exports.renderErrorLine = renderErrorLine;
|
|
4837
5094
|
exports.renderRunSummary = renderRunSummary;
|
|
4838
5095
|
exports.renderRunWhat = renderRunWhat;
|