@evalops/maestro 0.10.42 → 0.10.43
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/dist/cli/commands/operating-plane.d.ts.map +1 -1
- package/dist/cli/commands/operating-plane.js +3 -2
- package/dist/cli/commands/operating-plane.js.map +1 -1
- package/dist/cli/help.js +8 -6
- package/dist/cli/help.js.map +1 -1
- package/dist/cli.js +201 -96
- package/dist/codex/subagent-dispatch-table.d.ts +1 -1
- package/dist/codex/subagent-dispatch-table.js +1 -1
- package/dist/codex/subagent-dispatch-table.js.map +1 -1
- package/dist/node_modules/@evalops/contracts/package.json +1 -1
- package/dist/node_modules/@evalops/tui/package.json +1 -1
- package/dist/platform/a2a-completion-audit.d.ts +12 -6
- package/dist/platform/a2a-completion-audit.d.ts.map +1 -1
- package/dist/platform/a2a-completion-audit.js +28 -20
- package/dist/platform/a2a-completion-audit.js.map +1 -1
- package/dist/platform/a2a-maestro-peer.js +8 -7
- package/dist/platform/a2a-maestro-peer.js.map +1 -1
- package/dist/platform/a2a-telemetry-inspect.d.ts +2 -2
- package/dist/platform/a2a-telemetry-inspect.d.ts.map +1 -1
- package/dist/platform/a2a-telemetry-inspect.js +3 -3
- package/dist/platform/a2a-telemetry-inspect.js.map +1 -1
- package/dist/platform/operating-plane-client.d.ts +2 -2
- package/dist/platform/operating-plane-client.d.ts.map +1 -1
- package/dist/platform/operating-plane-client.js.map +1 -1
- package/dist/platform/operating-plane-summary.d.ts +4 -4
- package/dist/platform/operating-plane-summary.d.ts.map +1 -1
- package/dist/platform/operating-plane-summary.js +39 -27
- package/dist/platform/operating-plane-summary.js.map +1 -1
- package/dist/server/session-timeline.d.ts.map +1 -1
- package/dist/server/session-timeline.js +112 -2
- package/dist/server/session-timeline.js.map +1 -1
- package/dist/tools/background/resource-monitor.d.ts.map +1 -1
- package/dist/tools/background/resource-monitor.js +8 -6
- package/dist/tools/background/resource-monitor.js.map +1 -1
- package/dist/tools/parallel-ripgrep.d.ts.map +1 -1
- package/dist/tools/parallel-ripgrep.js +2 -2
- package/dist/tools/parallel-ripgrep.js.map +1 -1
- package/dist/tools/ripgrep-utils.d.ts +1 -0
- package/dist/tools/ripgrep-utils.d.ts.map +1 -1
- package/dist/tools/ripgrep-utils.js +4 -0
- package/dist/tools/ripgrep-utils.js.map +1 -1
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +2 -2
- package/dist/tools/search.js.map +1 -1
- package/dist/version.json +2 -2
- package/package.json +2 -2
|
@@ -30,6 +30,91 @@ function finiteNumber(value) {
|
|
|
30
30
|
function booleanValue(value) {
|
|
31
31
|
return typeof value === "boolean" ? value : undefined;
|
|
32
32
|
}
|
|
33
|
+
function stringValue(value) {
|
|
34
|
+
return typeof value === "string" && value.trim().length > 0
|
|
35
|
+
? value
|
|
36
|
+
: undefined;
|
|
37
|
+
}
|
|
38
|
+
function isPendingRequestKind(value) {
|
|
39
|
+
return (value === "approval" ||
|
|
40
|
+
value === "client_tool" ||
|
|
41
|
+
value === "mcp_elicitation" ||
|
|
42
|
+
value === "user_input" ||
|
|
43
|
+
value === "tool_retry");
|
|
44
|
+
}
|
|
45
|
+
function isPendingRequestSource(value) {
|
|
46
|
+
return value === "local" || value === "platform";
|
|
47
|
+
}
|
|
48
|
+
function isPendingRequestPlatformSource(value) {
|
|
49
|
+
return value === "approvals_service" || value === "tool_execution";
|
|
50
|
+
}
|
|
51
|
+
function pendingRequestFromCustomEntry(entry, sessionId, timestamp) {
|
|
52
|
+
if (entry.type !== "custom" || entry.customType !== "pending_request") {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
const data = detailsRecord(entry.data);
|
|
56
|
+
const request = detailsRecord(data?.request) ?? data;
|
|
57
|
+
if (!request) {
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
const id = stringValue(request.id);
|
|
61
|
+
const kind = request.kind;
|
|
62
|
+
const toolCallId = stringValue(request.toolCallId);
|
|
63
|
+
const toolName = stringValue(request.toolName);
|
|
64
|
+
const reason = stringValue(request.reason);
|
|
65
|
+
if (!id ||
|
|
66
|
+
!isPendingRequestKind(kind) ||
|
|
67
|
+
!toolCallId ||
|
|
68
|
+
!toolName ||
|
|
69
|
+
!reason) {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
const platformRecord = detailsRecord(request.platform);
|
|
73
|
+
const platformSource = platformRecord
|
|
74
|
+
? isPendingRequestPlatformSource(platformRecord.source)
|
|
75
|
+
? platformRecord.source
|
|
76
|
+
: undefined
|
|
77
|
+
: undefined;
|
|
78
|
+
const platform = platformSource
|
|
79
|
+
? {
|
|
80
|
+
source: platformSource,
|
|
81
|
+
...(stringValue(platformRecord?.toolExecutionId)
|
|
82
|
+
? { toolExecutionId: stringValue(platformRecord?.toolExecutionId) }
|
|
83
|
+
: {}),
|
|
84
|
+
...(stringValue(platformRecord?.approvalRequestId)
|
|
85
|
+
? {
|
|
86
|
+
approvalRequestId: stringValue(platformRecord?.approvalRequestId),
|
|
87
|
+
}
|
|
88
|
+
: {}),
|
|
89
|
+
}
|
|
90
|
+
: undefined;
|
|
91
|
+
return {
|
|
92
|
+
id,
|
|
93
|
+
kind,
|
|
94
|
+
status: "pending",
|
|
95
|
+
visibility: "user",
|
|
96
|
+
sessionId: stringValue(request.sessionId) ?? sessionId,
|
|
97
|
+
toolCallId,
|
|
98
|
+
toolName,
|
|
99
|
+
...(stringValue(request.displayName)
|
|
100
|
+
? { displayName: stringValue(request.displayName) }
|
|
101
|
+
: {}),
|
|
102
|
+
...(stringValue(request.summaryLabel)
|
|
103
|
+
? { summaryLabel: stringValue(request.summaryLabel) }
|
|
104
|
+
: {}),
|
|
105
|
+
...(stringValue(request.actionDescription)
|
|
106
|
+
? { actionDescription: stringValue(request.actionDescription) }
|
|
107
|
+
: {}),
|
|
108
|
+
args: request.args ?? {},
|
|
109
|
+
reason,
|
|
110
|
+
createdAt: normalizeTimestamp(request.createdAt, timestamp),
|
|
111
|
+
...(stringValue(request.expiresAt)
|
|
112
|
+
? { expiresAt: normalizeTimestamp(request.expiresAt, timestamp) }
|
|
113
|
+
: {}),
|
|
114
|
+
source: isPendingRequestSource(request.source) ? request.source : "local",
|
|
115
|
+
...(platform ? { platform } : {}),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
33
118
|
function textFromContent(content) {
|
|
34
119
|
if (typeof content === "string")
|
|
35
120
|
return content;
|
|
@@ -367,6 +452,9 @@ function pendingRequestTitle(request) {
|
|
|
367
452
|
}
|
|
368
453
|
function addPendingRequestItems(items, sessionId, pendingRequests, generatedAt) {
|
|
369
454
|
for (const request of pendingRequests) {
|
|
455
|
+
if (items.some((item) => item.type === "wait.pending" && item.pendingRequestId === request.id)) {
|
|
456
|
+
continue;
|
|
457
|
+
}
|
|
370
458
|
const summary = compactTimelineSummary(request.actionDescription || request.summaryLabel || request.reason);
|
|
371
459
|
const platformOperation = platformOperationForPending(request);
|
|
372
460
|
appendItem(items, {
|
|
@@ -522,6 +610,11 @@ function addEntryItems(items, sessionId, entries, generatedAt, context) {
|
|
|
522
610
|
break;
|
|
523
611
|
}
|
|
524
612
|
case "custom": {
|
|
613
|
+
const pendingRequest = pendingRequestFromCustomEntry(entry, sessionId, timestamp);
|
|
614
|
+
if (pendingRequest) {
|
|
615
|
+
addPendingRequestItems(items, sessionId, [pendingRequest], generatedAt);
|
|
616
|
+
break;
|
|
617
|
+
}
|
|
525
618
|
appendItem(items, {
|
|
526
619
|
id: `custom:${entry.id}`,
|
|
527
620
|
sessionId,
|
|
@@ -546,6 +639,22 @@ function sortItems(items) {
|
|
|
546
639
|
return a.id.localeCompare(b.id);
|
|
547
640
|
});
|
|
548
641
|
}
|
|
642
|
+
function pendingRequestCountForItems(items) {
|
|
643
|
+
const pendingRequestIds = new Set();
|
|
644
|
+
let pendingWithoutId = 0;
|
|
645
|
+
for (const item of items) {
|
|
646
|
+
if (item.type !== "wait.pending") {
|
|
647
|
+
continue;
|
|
648
|
+
}
|
|
649
|
+
if (item.pendingRequestId) {
|
|
650
|
+
pendingRequestIds.add(item.pendingRequestId);
|
|
651
|
+
}
|
|
652
|
+
else {
|
|
653
|
+
pendingWithoutId += 1;
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
return pendingRequestIds.size + pendingWithoutId;
|
|
657
|
+
}
|
|
549
658
|
export function buildComposerRunTimeline(options) {
|
|
550
659
|
const generatedAt = options.generatedAt ?? new Date().toISOString();
|
|
551
660
|
const items = [];
|
|
@@ -567,13 +676,14 @@ export function buildComposerRunTimeline(options) {
|
|
|
567
676
|
}
|
|
568
677
|
}
|
|
569
678
|
addPendingRequestItems(items, options.sessionId, pendingRequests, generatedAt);
|
|
679
|
+
const sortedItems = sortItems(items);
|
|
570
680
|
return {
|
|
571
681
|
sessionId: options.sessionId,
|
|
572
682
|
source: "local",
|
|
573
683
|
generatedAt,
|
|
574
684
|
platformBacked: false,
|
|
575
|
-
pendingRequestCount:
|
|
576
|
-
items:
|
|
685
|
+
pendingRequestCount: pendingRequestCountForItems(sortedItems),
|
|
686
|
+
items: sortedItems,
|
|
577
687
|
};
|
|
578
688
|
}
|
|
579
689
|
//# sourceMappingURL=session-timeline.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-timeline.js","sourceRoot":"","sources":["../../src/server/session-timeline.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tComposerPendingRequest,\n\tComposerPendingRequestPlatformOperation,\n\tComposerRunTimelineItem,\n\tComposerRunTimelineResponse,\n\tComposerRunTimelineStatus,\n} from \"@evalops/contracts\";\nimport type {\n\tAppMessage,\n\tAssistantMessage,\n\tToolResultMessage,\n\tUserMessage,\n} from \"../agent/types.js\";\nimport { getDiagnosticDeltaFromToolResult } from \"../lsp/diagnostic-repair.js\";\nimport type { SessionEntry } from \"../session/types.js\";\nimport { getSkillArtifactMetadataFromDetails } from \"../skills/artifact-metadata.js\";\nimport {\n\tcompactTimelineMetadata,\n\tcompactTimelineSummary,\n\tredactTimelineSecrets,\n} from \"../timeline/redaction.js\";\n\ninterface BuildComposerRunTimelineOptions {\n\tsessionId: string;\n\tentries?: SessionEntry[];\n\tmessages?: AppMessage[];\n\tpendingRequests?: ComposerPendingRequest[];\n\tgeneratedAt?: string;\n}\n\ninterface TimelineToolRequest {\n\tname: string;\n\targs: Record<string, unknown>;\n}\n\ninterface TimelineBuildContext {\n\ttoolRequests: Map<string, TimelineToolRequest>;\n}\n\nfunction normalizeTimestamp(value: unknown, fallback: string): string {\n\tif (typeof value === \"string\" || typeof value === \"number\") {\n\t\tconst date = new Date(value);\n\t\tif (!Number.isNaN(date.getTime())) {\n\t\t\treturn date.toISOString();\n\t\t}\n\t}\n\treturn fallback;\n}\n\nfunction detailsRecord(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) {\n\t\treturn undefined;\n\t}\n\treturn value as Record<string, unknown>;\n}\n\nfunction redactedString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst trimmed = value.trim();\n\treturn trimmed ? redactTimelineSecrets(trimmed) : undefined;\n}\n\nfunction finiteNumber(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isFinite(value)\n\t\t? value\n\t\t: undefined;\n}\n\nfunction booleanValue(value: unknown): boolean | undefined {\n\treturn typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction textFromContent(content: unknown): string | undefined {\n\tif (typeof content === \"string\") return content;\n\tif (!Array.isArray(content)) return undefined;\n\tconst text = content\n\t\t.map((block) => {\n\t\t\tif (!block || typeof block !== \"object\") return \"\";\n\t\t\tconst typed = block as { type?: unknown; text?: unknown };\n\t\t\tif (typed.type === \"text\" && typeof typed.text === \"string\") {\n\t\t\t\treturn typed.text;\n\t\t\t}\n\t\t\treturn \"\";\n\t\t})\n\t\t.filter(Boolean)\n\t\t.join(\" \");\n\treturn text || undefined;\n}\n\nfunction getToolPath(\n\trequest: TimelineToolRequest | undefined,\n): string | undefined {\n\tconst args = request?.args;\n\treturn redactedString(args?.path) ?? redactedString(args?.file_path);\n}\n\nfunction fileArtifactIdForToolResult(\n\ttoolResult: ToolResultMessage,\n\trequest: TimelineToolRequest | undefined,\n): string | undefined {\n\tif (toolResult.isError) return undefined;\n\tconst normalizedToolName = toolResult.toolName.toLowerCase();\n\tif (normalizedToolName !== \"write\" && normalizedToolName !== \"edit\") {\n\t\treturn undefined;\n\t}\n\treturn `file:${getToolPath(request) ?? toolResult.toolCallId}`;\n}\n\nfunction governedToolMetadata(details: unknown): {\n\terrorCode?: string;\n\tapprovalRequestId?: string;\n\tgovernedOutcome?: string;\n} {\n\tconst record = detailsRecord(details);\n\tconst outcome = detailsRecord(record?.governedOutcome);\n\tif (!outcome) return {};\n\tconst classification = redactedString(outcome.classification);\n\treturn {\n\t\terrorCode: redactedString(outcome.code) ?? classification,\n\t\tapprovalRequestId: redactedString(outcome.approvalRequestId),\n\t\tgovernedOutcome: classification,\n\t};\n}\n\nfunction timelineStatusForGovernedOutcome(\n\toutcome: string | undefined,\n): ComposerRunTimelineStatus {\n\tswitch (outcome) {\n\t\tcase \"denied\":\n\t\t\treturn \"denied\";\n\t\tcase \"approval_required\":\n\t\tcase \"approval_pending\":\n\t\tcase \"authentication_required\":\n\t\tcase \"rate_limited\":\n\t\t\treturn \"pending\";\n\t\tdefault:\n\t\t\treturn \"info\";\n\t}\n}\n\nfunction addDerivedToolResultItems(\n\titems: ComposerRunTimelineItem[],\n\tsessionId: string,\n\ttoolResult: ToolResultMessage,\n\toptions: {\n\t\tbaseId: string;\n\t\ttimestamp: string;\n\t\tsource: \"local\" | \"platform\";\n\t\trequest?: TimelineToolRequest;\n\t},\n): void {\n\tconst details = detailsRecord(toolResult.details);\n\tconst normalizedToolName = toolResult.toolName.toLowerCase();\n\n\tif (\n\t\t!toolResult.isError &&\n\t\t(normalizedToolName === \"write\" || normalizedToolName === \"edit\")\n\t) {\n\t\tconst displayPath = getToolPath(options.request);\n\t\tconst artifactId = fileArtifactIdForToolResult(toolResult, options.request);\n\t\tconst previousExists = booleanValue(details?.previousExists);\n\t\tconst editsApplied = finiteNumber(details?.editsApplied);\n\t\tconst bytesWritten = finiteNumber(details?.bytesWritten);\n\t\tconst action =\n\t\t\tnormalizedToolName === \"write\"\n\t\t\t\t? previousExists === false\n\t\t\t\t\t? \"created\"\n\t\t\t\t\t: \"wrote\"\n\t\t\t\t: \"edited\";\n\t\tconst summary = compactTimelineSummary(\n\t\t\t[\n\t\t\t\tdisplayPath,\n\t\t\t\tbytesWritten !== undefined ? `${bytesWritten} bytes` : undefined,\n\t\t\t\teditsApplied !== undefined ? `${editsApplied} edits` : undefined,\n\t\t\t]\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join(\" | \"),\n\t\t);\n\t\tconst hasDiff =\n\t\t\ttypeof details?.diff === \"string\" && details.diff.length > 0;\n\t\tconst metadata = compactTimelineMetadata({\n\t\t\tpath: displayPath,\n\t\t\taction,\n\t\t\tpreviousExists,\n\t\t\tbytesWritten,\n\t\t\teditsApplied,\n\t\t\thasDiff,\n\t\t});\n\n\t\tappendItem(items, {\n\t\t\tid: `file-change:${options.baseId}:${toolResult.toolCallId}`,\n\t\t\tsessionId,\n\t\t\ttimestamp: options.timestamp,\n\t\t\ttype: \"file.changed\",\n\t\t\ttitle: `File ${action}`,\n\t\t\tvisibility: \"user\",\n\t\t\tsource: options.source,\n\t\t\tstatus: \"completed\",\n\t\t\ttoolCallId: toolResult.toolCallId,\n\t\t\ttoolName: toolResult.toolName,\n\t\t\t...(artifactId ? { artifactId } : {}),\n\t\t\t...(summary ? { summary } : {}),\n\t\t\t...(metadata ? { metadata } : {}),\n\t\t});\n\t}\n\n\tconst diagnosticDelta = getDiagnosticDeltaFromToolResult(toolResult);\n\tif (diagnosticDelta) {\n\t\tconst summary = compactTimelineSummary(\n\t\t\t`Diagnostic delta: ${diagnosticDelta.introducedCount} introduced, ${diagnosticDelta.repairedCount} repaired, ${diagnosticDelta.remainingCount} remaining.`,\n\t\t);\n\t\tappendItem(items, {\n\t\t\tid: `diagnostic-delta:${options.baseId}:${toolResult.toolCallId}`,\n\t\t\tsessionId,\n\t\t\ttimestamp: options.timestamp,\n\t\t\ttype: \"diagnostic.delta\",\n\t\t\ttitle: `Diagnostics for ${diagnosticDelta.displayPath}`,\n\t\t\tvisibility: \"user\",\n\t\t\tsource: options.source,\n\t\t\tstatus: diagnosticDelta.introducedCount > 0 ? \"failed\" : \"completed\",\n\t\t\ttoolCallId: toolResult.toolCallId,\n\t\t\ttoolName: toolResult.toolName,\n\t\t\t...(summary ? { summary } : {}),\n\t\t\tmetadata: {\n\t\t\t\tdisplayPath: diagnosticDelta.displayPath,\n\t\t\t\tusedDelta: diagnosticDelta.usedDelta,\n\t\t\t\tintroducedCount: diagnosticDelta.introducedCount,\n\t\t\t\trepairedCount: diagnosticDelta.repairedCount,\n\t\t\t\tremainingCount: diagnosticDelta.remainingCount,\n\t\t\t\tfingerprint: diagnosticDelta.fingerprint,\n\t\t\t\tshouldFollowUp: diagnosticDelta.repair.shouldFollowUp,\n\t\t\t\tmaxAttempts: diagnosticDelta.repair.maxAttempts,\n\t\t\t},\n\t\t});\n\t}\n\n\tconst skillMetadata = getSkillArtifactMetadataFromDetails(toolResult.details);\n\tif (skillMetadata) {\n\t\tconst summary = compactTimelineSummary(\n\t\t\t[\n\t\t\t\tskillMetadata.name,\n\t\t\t\tskillMetadata.version ? `v${skillMetadata.version}` : undefined,\n\t\t\t\tskillMetadata.source,\n\t\t\t\tskillMetadata.scope,\n\t\t\t]\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join(\" | \"),\n\t\t);\n\t\tconst metadata = compactTimelineMetadata({\n\t\t\tname: skillMetadata.name,\n\t\t\tversion: skillMetadata.version,\n\t\t\tsource: skillMetadata.source,\n\t\t\tscope: skillMetadata.scope,\n\t\t\tworkspaceId: skillMetadata.workspaceId,\n\t\t\townerId: skillMetadata.ownerId,\n\t\t\thash: skillMetadata.hash,\n\t\t});\n\t\tappendItem(items, {\n\t\t\tid: `artifact-linked:${options.baseId}:${toolResult.toolCallId}`,\n\t\t\tsessionId,\n\t\t\ttimestamp: options.timestamp,\n\t\t\ttype: \"artifact.linked\",\n\t\t\ttitle: `Skill artifact loaded: ${skillMetadata.name}`,\n\t\t\tvisibility: \"admin\",\n\t\t\tsource: options.source,\n\t\t\tstatus: \"completed\",\n\t\t\ttoolCallId: toolResult.toolCallId,\n\t\t\ttoolName: toolResult.toolName,\n\t\t\t...(skillMetadata.artifactId\n\t\t\t\t? { artifactId: skillMetadata.artifactId }\n\t\t\t\t: {}),\n\t\t\t...(summary ? { summary } : {}),\n\t\t\t...(metadata ? { metadata } : {}),\n\t\t});\n\t}\n\n\tconst governed = governedToolMetadata(toolResult.details);\n\tif (governed.governedOutcome || governed.errorCode) {\n\t\tconst summary = compactTimelineSummary(\n\t\t\t[\n\t\t\t\tgoverned.governedOutcome\n\t\t\t\t\t? `Outcome: ${governed.governedOutcome}`\n\t\t\t\t\t: undefined,\n\t\t\t\tgoverned.errorCode ? `Code: ${governed.errorCode}` : undefined,\n\t\t\t]\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join(\" | \"),\n\t\t);\n\t\tconst metadata = compactTimelineMetadata({\n\t\t\tgovernedOutcome: governed.governedOutcome,\n\t\t\terrorCode: governed.errorCode,\n\t\t});\n\t\tappendItem(items, {\n\t\t\tid: `policy-decision:${options.baseId}:${toolResult.toolCallId}`,\n\t\t\tsessionId,\n\t\t\ttimestamp: options.timestamp,\n\t\t\ttype: \"policy.decision\",\n\t\t\ttitle: `Policy decision for ${toolResult.toolName}`,\n\t\t\tvisibility: governed.governedOutcome === \"denied\" ? \"user\" : \"admin\",\n\t\t\tsource: options.source,\n\t\t\tstatus: timelineStatusForGovernedOutcome(governed.governedOutcome),\n\t\t\ttoolCallId: toolResult.toolCallId,\n\t\t\ttoolName: toolResult.toolName,\n\t\t\t...(governed.approvalRequestId\n\t\t\t\t? { approvalRequestId: governed.approvalRequestId }\n\t\t\t\t: {}),\n\t\t\t...(summary ? { summary } : {}),\n\t\t\t...(metadata ? { metadata } : {}),\n\t\t});\n\t}\n}\n\nfunction appendItem(\n\titems: ComposerRunTimelineItem[],\n\titem: ComposerRunTimelineItem,\n): void {\n\titems.push(item);\n}\n\nfunction addMessageItems(\n\titems: ComposerRunTimelineItem[],\n\tsessionId: string,\n\tmessage: AppMessage,\n\toptions: {\n\t\tbaseId: string;\n\t\ttimestamp: string;\n\t\tsource: \"local\" | \"platform\";\n\t\tcontext?: TimelineBuildContext;\n\t},\n): void {\n\tif (message.role === \"user\") {\n\t\tconst userMessage = message as UserMessage;\n\t\tconst summary = compactTimelineSummary(\n\t\t\ttextFromContent(userMessage.content),\n\t\t);\n\t\tappendItem(items, {\n\t\t\tid: `message:${options.baseId}`,\n\t\t\tsessionId,\n\t\t\ttimestamp: options.timestamp,\n\t\t\ttype: \"message.user\",\n\t\t\ttitle: \"User message\",\n\t\t\tvisibility: \"user\",\n\t\t\tsource: options.source,\n\t\t\trole: \"user\",\n\t\t\tstatus: \"completed\",\n\t\t\t...(summary ? { summary } : {}),\n\t\t});\n\t\treturn;\n\t}\n\n\tif (message.role === \"assistant\") {\n\t\tconst assistantMessage = message as AssistantMessage;\n\t\tconst summary = compactTimelineSummary(\n\t\t\ttextFromContent(assistantMessage.content),\n\t\t);\n\t\tappendItem(items, {\n\t\t\tid: `message:${options.baseId}`,\n\t\t\tsessionId,\n\t\t\ttimestamp: options.timestamp,\n\t\t\ttype: \"message.assistant\",\n\t\t\ttitle: \"Assistant response\",\n\t\t\tvisibility: \"user\",\n\t\t\tsource: options.source,\n\t\t\trole: \"assistant\",\n\t\t\tstatus: assistantMessage.stopReason === \"error\" ? \"failed\" : \"completed\",\n\t\t\t...(summary ? { summary } : {}),\n\t\t\t...(assistantMessage.model\n\t\t\t\t? { metadata: { model: assistantMessage.model } }\n\t\t\t\t: {}),\n\t\t});\n\n\t\tfor (const block of assistantMessage.content) {\n\t\t\tif (block.type !== \"toolCall\") continue;\n\t\t\toptions.context?.toolRequests.set(block.id, {\n\t\t\t\tname: block.name,\n\t\t\t\targs: block.arguments,\n\t\t\t});\n\t\t\tappendItem(items, {\n\t\t\t\tid: `tool-requested:${options.baseId}:${block.id}`,\n\t\t\t\tsessionId,\n\t\t\t\ttimestamp: options.timestamp,\n\t\t\t\ttype: \"tool.requested\",\n\t\t\t\ttitle: `Requested ${block.name}`,\n\t\t\t\tvisibility: \"user\",\n\t\t\t\tsource: options.source,\n\t\t\t\tstatus: \"running\",\n\t\t\t\ttoolCallId: block.id,\n\t\t\t\ttoolName: block.name,\n\t\t\t});\n\t\t}\n\t\treturn;\n\t}\n\n\tif (message.role === \"toolResult\") {\n\t\tconst toolResult = message as ToolResultMessage;\n\t\tconst details = detailsRecord(toolResult.details);\n\t\tconst governed = governedToolMetadata(toolResult.details);\n\t\tconst request = options.context?.toolRequests.get(toolResult.toolCallId);\n\t\tconst approvalRequestId =\n\t\t\tgoverned.approvalRequestId ?? redactedString(details?.approvalRequestId);\n\t\tconst toolExecutionId = redactedString(details?.toolExecutionId);\n\t\tconst artifactId = fileArtifactIdForToolResult(toolResult, request);\n\t\tconst metadata = compactTimelineMetadata({\n\t\t\tgovernedOutcome: governed.governedOutcome,\n\t\t\terrorCode: governed.errorCode,\n\t\t});\n\t\tappendItem(items, {\n\t\t\tid: `tool-result:${options.baseId}:${toolResult.toolCallId}`,\n\t\t\tsessionId,\n\t\t\ttimestamp: options.timestamp,\n\t\t\ttype: toolResult.isError ? \"tool.failed\" : \"tool.completed\",\n\t\t\ttitle: `${toolResult.toolName} ${\n\t\t\t\ttoolResult.isError ? \"failed\" : \"completed\"\n\t\t\t}`,\n\t\t\tvisibility: \"user\",\n\t\t\tsource: options.source,\n\t\t\trole: \"tool\",\n\t\t\tstatus: toolResult.isError ? \"failed\" : \"completed\",\n\t\t\ttoolCallId: toolResult.toolCallId,\n\t\t\ttoolName: toolResult.toolName,\n\t\t\t...(approvalRequestId ? { approvalRequestId } : {}),\n\t\t\t...(toolExecutionId ? { toolExecutionId } : {}),\n\t\t\t...(artifactId ? { artifactId } : {}),\n\t\t\t...(metadata ? { metadata } : {}),\n\t\t});\n\t\taddDerivedToolResultItems(items, sessionId, toolResult, {\n\t\t\tbaseId: options.baseId,\n\t\t\ttimestamp: options.timestamp,\n\t\t\tsource: options.source,\n\t\t\trequest,\n\t\t});\n\t}\n}\n\nfunction statusForPendingRequest(\n\trequest: ComposerPendingRequest,\n): ComposerRunTimelineStatus {\n\treturn request.status === \"pending\" ? \"pending\" : \"info\";\n}\n\nfunction platformOperationForPending(\n\trequest: ComposerPendingRequest,\n): ComposerPendingRequestPlatformOperation | undefined {\n\tif (!request.platform) return undefined;\n\tif (request.kind === \"approval\") {\n\t\treturn request.platform.source === \"tool_execution\"\n\t\t\t? \"ResumeToolExecution\"\n\t\t\t: \"ResolveApproval\";\n\t}\n\tif (\n\t\trequest.kind === \"client_tool\" ||\n\t\trequest.kind === \"mcp_elicitation\" ||\n\t\trequest.kind === \"user_input\"\n\t) {\n\t\treturn \"ResumeRun\";\n\t}\n\treturn undefined;\n}\n\nfunction pendingRequestTitle(request: ComposerPendingRequest): string {\n\tconst label =\n\t\trequest.displayName ||\n\t\trequest.summaryLabel ||\n\t\trequest.toolName ||\n\t\t\"request\";\n\tswitch (request.kind) {\n\t\tcase \"approval\":\n\t\t\treturn `Waiting for approval: ${label}`;\n\t\tcase \"tool_retry\":\n\t\t\treturn `Waiting for retry decision: ${label}`;\n\t\tcase \"client_tool\":\n\t\t\treturn `Waiting for client tool: ${label}`;\n\t\tcase \"mcp_elicitation\":\n\t\t\treturn \"Waiting for MCP input\";\n\t\tcase \"user_input\":\n\t\t\treturn \"Waiting for user input\";\n\t}\n}\n\nfunction addPendingRequestItems(\n\titems: ComposerRunTimelineItem[],\n\tsessionId: string,\n\tpendingRequests: ComposerPendingRequest[],\n\tgeneratedAt: string,\n): void {\n\tfor (const request of pendingRequests) {\n\t\tconst summary = compactTimelineSummary(\n\t\t\trequest.actionDescription || request.summaryLabel || request.reason,\n\t\t);\n\t\tconst platformOperation = platformOperationForPending(request);\n\t\tappendItem(items, {\n\t\t\tid: `pending:${request.id}`,\n\t\t\tsessionId,\n\t\t\ttimestamp: normalizeTimestamp(request.createdAt, generatedAt),\n\t\t\ttype: \"wait.pending\",\n\t\t\ttitle: pendingRequestTitle(request),\n\t\t\tvisibility: \"user\",\n\t\t\tsource: request.source,\n\t\t\tstatus: statusForPendingRequest(request),\n\t\t\ttoolCallId: request.toolCallId,\n\t\t\ttoolName: request.toolName,\n\t\t\tpendingRequestId: request.id,\n\t\t\tpendingRequestKind: request.kind,\n\t\t\t...(summary ? { summary } : {}),\n\t\t\t...(request.platform?.approvalRequestId\n\t\t\t\t? { approvalRequestId: request.platform.approvalRequestId }\n\t\t\t\t: {}),\n\t\t\t...(request.platform?.toolExecutionId\n\t\t\t\t? { toolExecutionId: request.platform.toolExecutionId }\n\t\t\t\t: {}),\n\t\t\t...(request.platform ? { platform: request.platform } : {}),\n\t\t\t...(platformOperation ? { platformOperation } : {}),\n\t\t});\n\t}\n}\n\nfunction addEntryItems(\n\titems: ComposerRunTimelineItem[],\n\tsessionId: string,\n\tentries: SessionEntry[],\n\tgeneratedAt: string,\n\tcontext: TimelineBuildContext,\n): number {\n\tlet messageEntryCount = 0;\n\n\tfor (const [index, entry] of entries.entries()) {\n\t\tconst timestamp = normalizeTimestamp(\n\t\t\t(entry as { timestamp?: unknown }).timestamp,\n\t\t\tgeneratedAt,\n\t\t);\n\n\t\tswitch (entry.type) {\n\t\t\tcase \"session\": {\n\t\t\t\tappendItem(items, {\n\t\t\t\t\tid: `session-started:${entry.id}`,\n\t\t\t\t\tsessionId,\n\t\t\t\t\ttimestamp,\n\t\t\t\t\ttype: \"session.started\",\n\t\t\t\t\ttitle: \"Session started\",\n\t\t\t\t\tvisibility: \"user\",\n\t\t\t\t\tsource: \"local\",\n\t\t\t\t\tstatus: \"info\",\n\t\t\t\t\t...(entry.cwd ? { metadata: { cwd: entry.cwd } } : {}),\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"session_meta\": {\n\t\t\t\tconst summary = compactTimelineSummary(\n\t\t\t\t\tentry.title || entry.resumeSummary || entry.summary,\n\t\t\t\t);\n\t\t\t\tappendItem(items, {\n\t\t\t\t\tid: `session-updated:${index}`,\n\t\t\t\t\tsessionId,\n\t\t\t\t\ttimestamp,\n\t\t\t\t\ttype: \"session.updated\",\n\t\t\t\t\ttitle: \"Session metadata updated\",\n\t\t\t\t\tvisibility: \"admin\",\n\t\t\t\t\tsource: \"local\",\n\t\t\t\t\tstatus: \"info\",\n\t\t\t\t\t...(summary ? { summary } : {}),\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"message\": {\n\t\t\t\tmessageEntryCount += 1;\n\t\t\t\taddMessageItems(items, sessionId, entry.message, {\n\t\t\t\t\tbaseId: entry.id,\n\t\t\t\t\ttimestamp,\n\t\t\t\t\tsource: \"local\",\n\t\t\t\t\tcontext,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"compaction\": {\n\t\t\t\tconst summary = compactTimelineSummary(entry.summary);\n\t\t\t\tappendItem(items, {\n\t\t\t\t\tid: `compaction:${entry.id}`,\n\t\t\t\t\tsessionId,\n\t\t\t\t\ttimestamp,\n\t\t\t\t\ttype: \"compaction.created\",\n\t\t\t\t\ttitle: \"Context compacted\",\n\t\t\t\t\tvisibility: \"admin\",\n\t\t\t\t\tsource: \"local\",\n\t\t\t\t\tstatus: \"info\",\n\t\t\t\t\t...(summary ? { summary } : {}),\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\ttokensBefore: entry.tokensBefore,\n\t\t\t\t\t\tauto: entry.auto === true,\n\t\t\t\t\t\tfromHook: entry.fromHook === true,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"branch_summary\": {\n\t\t\t\tconst summary = compactTimelineSummary(entry.summary);\n\t\t\t\tappendItem(items, {\n\t\t\t\t\tid: `branch:${entry.id}`,\n\t\t\t\t\tsessionId,\n\t\t\t\t\ttimestamp,\n\t\t\t\t\ttype: \"branch.created\",\n\t\t\t\t\ttitle: \"Branch summary created\",\n\t\t\t\t\tvisibility: \"admin\",\n\t\t\t\t\tsource: \"local\",\n\t\t\t\t\tstatus: \"info\",\n\t\t\t\t\t...(summary ? { summary } : {}),\n\t\t\t\t\tmetadata: { fromId: entry.fromId },\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"model_change\": {\n\t\t\t\tconst summary = compactTimelineSummary(entry.model);\n\t\t\t\tappendItem(items, {\n\t\t\t\t\tid: `model-change:${entry.id}`,\n\t\t\t\t\tsessionId,\n\t\t\t\t\ttimestamp,\n\t\t\t\t\ttype: \"model.changed\",\n\t\t\t\t\ttitle: \"Model changed\",\n\t\t\t\t\tvisibility: \"admin\",\n\t\t\t\t\tsource: \"local\",\n\t\t\t\t\tstatus: \"info\",\n\t\t\t\t\t...(summary ? { summary } : {}),\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"thinking_level_change\": {\n\t\t\t\tconst summary = compactTimelineSummary(entry.thinkingLevel);\n\t\t\t\tappendItem(items, {\n\t\t\t\t\tid: `thinking-change:${entry.id}`,\n\t\t\t\t\tsessionId,\n\t\t\t\t\ttimestamp,\n\t\t\t\t\ttype: \"thinking.changed\",\n\t\t\t\t\ttitle: \"Thinking level changed\",\n\t\t\t\t\tvisibility: \"admin\",\n\t\t\t\t\tsource: \"local\",\n\t\t\t\t\tstatus: \"info\",\n\t\t\t\t\t...(summary ? { summary } : {}),\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"custom_message\": {\n\t\t\t\tif (!entry.display) break;\n\t\t\t\tconst summary = compactTimelineSummary(textFromContent(entry.content));\n\t\t\t\tappendItem(items, {\n\t\t\t\t\tid: `custom-message:${entry.id}`,\n\t\t\t\t\tsessionId,\n\t\t\t\t\ttimestamp,\n\t\t\t\t\ttype: \"custom.event\",\n\t\t\t\t\ttitle: entry.customType,\n\t\t\t\t\tvisibility: \"admin\",\n\t\t\t\t\tsource: \"local\",\n\t\t\t\t\tstatus: \"info\",\n\t\t\t\t\t...(summary ? { summary } : {}),\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"custom\": {\n\t\t\t\tappendItem(items, {\n\t\t\t\t\tid: `custom:${entry.id}`,\n\t\t\t\t\tsessionId,\n\t\t\t\t\ttimestamp,\n\t\t\t\t\ttype: \"custom.event\",\n\t\t\t\t\ttitle: entry.customType,\n\t\t\t\t\tvisibility: \"audit\",\n\t\t\t\t\tsource: \"local\",\n\t\t\t\t\tstatus: \"info\",\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn messageEntryCount;\n}\n\nfunction sortItems(\n\titems: ComposerRunTimelineItem[],\n): ComposerRunTimelineItem[] {\n\treturn [...items].sort((a, b) => {\n\t\tconst timestampDelta =\n\t\t\tnew Date(a.timestamp).getTime() - new Date(b.timestamp).getTime();\n\t\tif (timestampDelta !== 0) return timestampDelta;\n\t\treturn a.id.localeCompare(b.id);\n\t});\n}\n\nexport function buildComposerRunTimeline(\n\toptions: BuildComposerRunTimelineOptions,\n): ComposerRunTimelineResponse {\n\tconst generatedAt = options.generatedAt ?? new Date().toISOString();\n\tconst items: ComposerRunTimelineItem[] = [];\n\tconst entries = options.entries ?? [];\n\tconst messages = options.messages ?? [];\n\tconst pendingRequests = options.pendingRequests ?? [];\n\tconst context: TimelineBuildContext = {\n\t\ttoolRequests: new Map<string, TimelineToolRequest>(),\n\t};\n\n\tconst messageEntryCount = addEntryItems(\n\t\titems,\n\t\toptions.sessionId,\n\t\tentries,\n\t\tgeneratedAt,\n\t\tcontext,\n\t);\n\n\tif (messageEntryCount === 0) {\n\t\tfor (const [index, message] of messages.entries()) {\n\t\t\taddMessageItems(items, options.sessionId, message, {\n\t\t\t\tbaseId: `fallback-${index}`,\n\t\t\t\ttimestamp: normalizeTimestamp(\n\t\t\t\t\t(message as { timestamp?: unknown }).timestamp,\n\t\t\t\t\tgeneratedAt,\n\t\t\t\t),\n\t\t\t\tsource: \"local\",\n\t\t\t\tcontext,\n\t\t\t});\n\t\t}\n\t}\n\n\taddPendingRequestItems(\n\t\titems,\n\t\toptions.sessionId,\n\t\tpendingRequests,\n\t\tgeneratedAt,\n\t);\n\n\treturn {\n\t\tsessionId: options.sessionId,\n\t\tsource: \"local\",\n\t\tgeneratedAt,\n\t\tplatformBacked: false,\n\t\tpendingRequestCount: pendingRequests.length,\n\t\titems: sortItems(items),\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"session-timeline.js","sourceRoot":"","sources":["../../src/server/session-timeline.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tComposerPendingRequest,\n\tComposerPendingRequestPlatformOperation,\n\tComposerRunTimelineItem,\n\tComposerRunTimelineResponse,\n\tComposerRunTimelineStatus,\n} from \"@evalops/contracts\";\nimport type {\n\tAppMessage,\n\tAssistantMessage,\n\tToolResultMessage,\n\tUserMessage,\n} from \"../agent/types.js\";\nimport { getDiagnosticDeltaFromToolResult } from \"../lsp/diagnostic-repair.js\";\nimport type { SessionEntry } from \"../session/types.js\";\nimport { getSkillArtifactMetadataFromDetails } from \"../skills/artifact-metadata.js\";\nimport {\n\tcompactTimelineMetadata,\n\tcompactTimelineSummary,\n\tredactTimelineSecrets,\n} from \"../timeline/redaction.js\";\n\ninterface BuildComposerRunTimelineOptions {\n\tsessionId: string;\n\tentries?: SessionEntry[];\n\tmessages?: AppMessage[];\n\tpendingRequests?: ComposerPendingRequest[];\n\tgeneratedAt?: string;\n}\n\ninterface TimelineToolRequest {\n\tname: string;\n\targs: Record<string, unknown>;\n}\n\ninterface TimelineBuildContext {\n\ttoolRequests: Map<string, TimelineToolRequest>;\n}\n\nfunction normalizeTimestamp(value: unknown, fallback: string): string {\n\tif (typeof value === \"string\" || typeof value === \"number\") {\n\t\tconst date = new Date(value);\n\t\tif (!Number.isNaN(date.getTime())) {\n\t\t\treturn date.toISOString();\n\t\t}\n\t}\n\treturn fallback;\n}\n\nfunction detailsRecord(value: unknown): Record<string, unknown> | undefined {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) {\n\t\treturn undefined;\n\t}\n\treturn value as Record<string, unknown>;\n}\n\nfunction redactedString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst trimmed = value.trim();\n\treturn trimmed ? redactTimelineSecrets(trimmed) : undefined;\n}\n\nfunction finiteNumber(value: unknown): number | undefined {\n\treturn typeof value === \"number\" && Number.isFinite(value)\n\t\t? value\n\t\t: undefined;\n}\n\nfunction booleanValue(value: unknown): boolean | undefined {\n\treturn typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n\treturn typeof value === \"string\" && value.trim().length > 0\n\t\t? value\n\t\t: undefined;\n}\n\nfunction isPendingRequestKind(\n\tvalue: unknown,\n): value is ComposerPendingRequest[\"kind\"] {\n\treturn (\n\t\tvalue === \"approval\" ||\n\t\tvalue === \"client_tool\" ||\n\t\tvalue === \"mcp_elicitation\" ||\n\t\tvalue === \"user_input\" ||\n\t\tvalue === \"tool_retry\"\n\t);\n}\n\nfunction isPendingRequestSource(\n\tvalue: unknown,\n): value is ComposerPendingRequest[\"source\"] {\n\treturn value === \"local\" || value === \"platform\";\n}\n\nfunction isPendingRequestPlatformSource(\n\tvalue: unknown,\n): value is NonNullable<ComposerPendingRequest[\"platform\"]>[\"source\"] {\n\treturn value === \"approvals_service\" || value === \"tool_execution\";\n}\n\nfunction pendingRequestFromCustomEntry(\n\tentry: SessionEntry,\n\tsessionId: string,\n\ttimestamp: string,\n): ComposerPendingRequest | undefined {\n\tif (entry.type !== \"custom\" || entry.customType !== \"pending_request\") {\n\t\treturn undefined;\n\t}\n\tconst data = detailsRecord(entry.data);\n\tconst request = detailsRecord(data?.request) ?? data;\n\tif (!request) {\n\t\treturn undefined;\n\t}\n\tconst id = stringValue(request.id);\n\tconst kind = request.kind;\n\tconst toolCallId = stringValue(request.toolCallId);\n\tconst toolName = stringValue(request.toolName);\n\tconst reason = stringValue(request.reason);\n\tif (\n\t\t!id ||\n\t\t!isPendingRequestKind(kind) ||\n\t\t!toolCallId ||\n\t\t!toolName ||\n\t\t!reason\n\t) {\n\t\treturn undefined;\n\t}\n\n\tconst platformRecord = detailsRecord(request.platform);\n\tconst platformSource = platformRecord\n\t\t? isPendingRequestPlatformSource(platformRecord.source)\n\t\t\t? platformRecord.source\n\t\t\t: undefined\n\t\t: undefined;\n\tconst platform = platformSource\n\t\t? {\n\t\t\t\tsource: platformSource,\n\t\t\t\t...(stringValue(platformRecord?.toolExecutionId)\n\t\t\t\t\t? { toolExecutionId: stringValue(platformRecord?.toolExecutionId) }\n\t\t\t\t\t: {}),\n\t\t\t\t...(stringValue(platformRecord?.approvalRequestId)\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tapprovalRequestId: stringValue(platformRecord?.approvalRequestId),\n\t\t\t\t\t\t}\n\t\t\t\t\t: {}),\n\t\t\t}\n\t\t: undefined;\n\n\treturn {\n\t\tid,\n\t\tkind,\n\t\tstatus: \"pending\",\n\t\tvisibility: \"user\",\n\t\tsessionId: stringValue(request.sessionId) ?? sessionId,\n\t\ttoolCallId,\n\t\ttoolName,\n\t\t...(stringValue(request.displayName)\n\t\t\t? { displayName: stringValue(request.displayName) }\n\t\t\t: {}),\n\t\t...(stringValue(request.summaryLabel)\n\t\t\t? { summaryLabel: stringValue(request.summaryLabel) }\n\t\t\t: {}),\n\t\t...(stringValue(request.actionDescription)\n\t\t\t? { actionDescription: stringValue(request.actionDescription) }\n\t\t\t: {}),\n\t\targs: request.args ?? {},\n\t\treason,\n\t\tcreatedAt: normalizeTimestamp(request.createdAt, timestamp),\n\t\t...(stringValue(request.expiresAt)\n\t\t\t? { expiresAt: normalizeTimestamp(request.expiresAt, timestamp) }\n\t\t\t: {}),\n\t\tsource: isPendingRequestSource(request.source) ? request.source : \"local\",\n\t\t...(platform ? { platform } : {}),\n\t};\n}\n\nfunction textFromContent(content: unknown): string | undefined {\n\tif (typeof content === \"string\") return content;\n\tif (!Array.isArray(content)) return undefined;\n\tconst text = content\n\t\t.map((block) => {\n\t\t\tif (!block || typeof block !== \"object\") return \"\";\n\t\t\tconst typed = block as { type?: unknown; text?: unknown };\n\t\t\tif (typed.type === \"text\" && typeof typed.text === \"string\") {\n\t\t\t\treturn typed.text;\n\t\t\t}\n\t\t\treturn \"\";\n\t\t})\n\t\t.filter(Boolean)\n\t\t.join(\" \");\n\treturn text || undefined;\n}\n\nfunction getToolPath(\n\trequest: TimelineToolRequest | undefined,\n): string | undefined {\n\tconst args = request?.args;\n\treturn redactedString(args?.path) ?? redactedString(args?.file_path);\n}\n\nfunction fileArtifactIdForToolResult(\n\ttoolResult: ToolResultMessage,\n\trequest: TimelineToolRequest | undefined,\n): string | undefined {\n\tif (toolResult.isError) return undefined;\n\tconst normalizedToolName = toolResult.toolName.toLowerCase();\n\tif (normalizedToolName !== \"write\" && normalizedToolName !== \"edit\") {\n\t\treturn undefined;\n\t}\n\treturn `file:${getToolPath(request) ?? toolResult.toolCallId}`;\n}\n\nfunction governedToolMetadata(details: unknown): {\n\terrorCode?: string;\n\tapprovalRequestId?: string;\n\tgovernedOutcome?: string;\n} {\n\tconst record = detailsRecord(details);\n\tconst outcome = detailsRecord(record?.governedOutcome);\n\tif (!outcome) return {};\n\tconst classification = redactedString(outcome.classification);\n\treturn {\n\t\terrorCode: redactedString(outcome.code) ?? classification,\n\t\tapprovalRequestId: redactedString(outcome.approvalRequestId),\n\t\tgovernedOutcome: classification,\n\t};\n}\n\nfunction timelineStatusForGovernedOutcome(\n\toutcome: string | undefined,\n): ComposerRunTimelineStatus {\n\tswitch (outcome) {\n\t\tcase \"denied\":\n\t\t\treturn \"denied\";\n\t\tcase \"approval_required\":\n\t\tcase \"approval_pending\":\n\t\tcase \"authentication_required\":\n\t\tcase \"rate_limited\":\n\t\t\treturn \"pending\";\n\t\tdefault:\n\t\t\treturn \"info\";\n\t}\n}\n\nfunction addDerivedToolResultItems(\n\titems: ComposerRunTimelineItem[],\n\tsessionId: string,\n\ttoolResult: ToolResultMessage,\n\toptions: {\n\t\tbaseId: string;\n\t\ttimestamp: string;\n\t\tsource: \"local\" | \"platform\";\n\t\trequest?: TimelineToolRequest;\n\t},\n): void {\n\tconst details = detailsRecord(toolResult.details);\n\tconst normalizedToolName = toolResult.toolName.toLowerCase();\n\n\tif (\n\t\t!toolResult.isError &&\n\t\t(normalizedToolName === \"write\" || normalizedToolName === \"edit\")\n\t) {\n\t\tconst displayPath = getToolPath(options.request);\n\t\tconst artifactId = fileArtifactIdForToolResult(toolResult, options.request);\n\t\tconst previousExists = booleanValue(details?.previousExists);\n\t\tconst editsApplied = finiteNumber(details?.editsApplied);\n\t\tconst bytesWritten = finiteNumber(details?.bytesWritten);\n\t\tconst action =\n\t\t\tnormalizedToolName === \"write\"\n\t\t\t\t? previousExists === false\n\t\t\t\t\t? \"created\"\n\t\t\t\t\t: \"wrote\"\n\t\t\t\t: \"edited\";\n\t\tconst summary = compactTimelineSummary(\n\t\t\t[\n\t\t\t\tdisplayPath,\n\t\t\t\tbytesWritten !== undefined ? `${bytesWritten} bytes` : undefined,\n\t\t\t\teditsApplied !== undefined ? `${editsApplied} edits` : undefined,\n\t\t\t]\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join(\" | \"),\n\t\t);\n\t\tconst hasDiff =\n\t\t\ttypeof details?.diff === \"string\" && details.diff.length > 0;\n\t\tconst metadata = compactTimelineMetadata({\n\t\t\tpath: displayPath,\n\t\t\taction,\n\t\t\tpreviousExists,\n\t\t\tbytesWritten,\n\t\t\teditsApplied,\n\t\t\thasDiff,\n\t\t});\n\n\t\tappendItem(items, {\n\t\t\tid: `file-change:${options.baseId}:${toolResult.toolCallId}`,\n\t\t\tsessionId,\n\t\t\ttimestamp: options.timestamp,\n\t\t\ttype: \"file.changed\",\n\t\t\ttitle: `File ${action}`,\n\t\t\tvisibility: \"user\",\n\t\t\tsource: options.source,\n\t\t\tstatus: \"completed\",\n\t\t\ttoolCallId: toolResult.toolCallId,\n\t\t\ttoolName: toolResult.toolName,\n\t\t\t...(artifactId ? { artifactId } : {}),\n\t\t\t...(summary ? { summary } : {}),\n\t\t\t...(metadata ? { metadata } : {}),\n\t\t});\n\t}\n\n\tconst diagnosticDelta = getDiagnosticDeltaFromToolResult(toolResult);\n\tif (diagnosticDelta) {\n\t\tconst summary = compactTimelineSummary(\n\t\t\t`Diagnostic delta: ${diagnosticDelta.introducedCount} introduced, ${diagnosticDelta.repairedCount} repaired, ${diagnosticDelta.remainingCount} remaining.`,\n\t\t);\n\t\tappendItem(items, {\n\t\t\tid: `diagnostic-delta:${options.baseId}:${toolResult.toolCallId}`,\n\t\t\tsessionId,\n\t\t\ttimestamp: options.timestamp,\n\t\t\ttype: \"diagnostic.delta\",\n\t\t\ttitle: `Diagnostics for ${diagnosticDelta.displayPath}`,\n\t\t\tvisibility: \"user\",\n\t\t\tsource: options.source,\n\t\t\tstatus: diagnosticDelta.introducedCount > 0 ? \"failed\" : \"completed\",\n\t\t\ttoolCallId: toolResult.toolCallId,\n\t\t\ttoolName: toolResult.toolName,\n\t\t\t...(summary ? { summary } : {}),\n\t\t\tmetadata: {\n\t\t\t\tdisplayPath: diagnosticDelta.displayPath,\n\t\t\t\tusedDelta: diagnosticDelta.usedDelta,\n\t\t\t\tintroducedCount: diagnosticDelta.introducedCount,\n\t\t\t\trepairedCount: diagnosticDelta.repairedCount,\n\t\t\t\tremainingCount: diagnosticDelta.remainingCount,\n\t\t\t\tfingerprint: diagnosticDelta.fingerprint,\n\t\t\t\tshouldFollowUp: diagnosticDelta.repair.shouldFollowUp,\n\t\t\t\tmaxAttempts: diagnosticDelta.repair.maxAttempts,\n\t\t\t},\n\t\t});\n\t}\n\n\tconst skillMetadata = getSkillArtifactMetadataFromDetails(toolResult.details);\n\tif (skillMetadata) {\n\t\tconst summary = compactTimelineSummary(\n\t\t\t[\n\t\t\t\tskillMetadata.name,\n\t\t\t\tskillMetadata.version ? `v${skillMetadata.version}` : undefined,\n\t\t\t\tskillMetadata.source,\n\t\t\t\tskillMetadata.scope,\n\t\t\t]\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join(\" | \"),\n\t\t);\n\t\tconst metadata = compactTimelineMetadata({\n\t\t\tname: skillMetadata.name,\n\t\t\tversion: skillMetadata.version,\n\t\t\tsource: skillMetadata.source,\n\t\t\tscope: skillMetadata.scope,\n\t\t\tworkspaceId: skillMetadata.workspaceId,\n\t\t\townerId: skillMetadata.ownerId,\n\t\t\thash: skillMetadata.hash,\n\t\t});\n\t\tappendItem(items, {\n\t\t\tid: `artifact-linked:${options.baseId}:${toolResult.toolCallId}`,\n\t\t\tsessionId,\n\t\t\ttimestamp: options.timestamp,\n\t\t\ttype: \"artifact.linked\",\n\t\t\ttitle: `Skill artifact loaded: ${skillMetadata.name}`,\n\t\t\tvisibility: \"admin\",\n\t\t\tsource: options.source,\n\t\t\tstatus: \"completed\",\n\t\t\ttoolCallId: toolResult.toolCallId,\n\t\t\ttoolName: toolResult.toolName,\n\t\t\t...(skillMetadata.artifactId\n\t\t\t\t? { artifactId: skillMetadata.artifactId }\n\t\t\t\t: {}),\n\t\t\t...(summary ? { summary } : {}),\n\t\t\t...(metadata ? { metadata } : {}),\n\t\t});\n\t}\n\n\tconst governed = governedToolMetadata(toolResult.details);\n\tif (governed.governedOutcome || governed.errorCode) {\n\t\tconst summary = compactTimelineSummary(\n\t\t\t[\n\t\t\t\tgoverned.governedOutcome\n\t\t\t\t\t? `Outcome: ${governed.governedOutcome}`\n\t\t\t\t\t: undefined,\n\t\t\t\tgoverned.errorCode ? `Code: ${governed.errorCode}` : undefined,\n\t\t\t]\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join(\" | \"),\n\t\t);\n\t\tconst metadata = compactTimelineMetadata({\n\t\t\tgovernedOutcome: governed.governedOutcome,\n\t\t\terrorCode: governed.errorCode,\n\t\t});\n\t\tappendItem(items, {\n\t\t\tid: `policy-decision:${options.baseId}:${toolResult.toolCallId}`,\n\t\t\tsessionId,\n\t\t\ttimestamp: options.timestamp,\n\t\t\ttype: \"policy.decision\",\n\t\t\ttitle: `Policy decision for ${toolResult.toolName}`,\n\t\t\tvisibility: governed.governedOutcome === \"denied\" ? \"user\" : \"admin\",\n\t\t\tsource: options.source,\n\t\t\tstatus: timelineStatusForGovernedOutcome(governed.governedOutcome),\n\t\t\ttoolCallId: toolResult.toolCallId,\n\t\t\ttoolName: toolResult.toolName,\n\t\t\t...(governed.approvalRequestId\n\t\t\t\t? { approvalRequestId: governed.approvalRequestId }\n\t\t\t\t: {}),\n\t\t\t...(summary ? { summary } : {}),\n\t\t\t...(metadata ? { metadata } : {}),\n\t\t});\n\t}\n}\n\nfunction appendItem(\n\titems: ComposerRunTimelineItem[],\n\titem: ComposerRunTimelineItem,\n): void {\n\titems.push(item);\n}\n\nfunction addMessageItems(\n\titems: ComposerRunTimelineItem[],\n\tsessionId: string,\n\tmessage: AppMessage,\n\toptions: {\n\t\tbaseId: string;\n\t\ttimestamp: string;\n\t\tsource: \"local\" | \"platform\";\n\t\tcontext?: TimelineBuildContext;\n\t},\n): void {\n\tif (message.role === \"user\") {\n\t\tconst userMessage = message as UserMessage;\n\t\tconst summary = compactTimelineSummary(\n\t\t\ttextFromContent(userMessage.content),\n\t\t);\n\t\tappendItem(items, {\n\t\t\tid: `message:${options.baseId}`,\n\t\t\tsessionId,\n\t\t\ttimestamp: options.timestamp,\n\t\t\ttype: \"message.user\",\n\t\t\ttitle: \"User message\",\n\t\t\tvisibility: \"user\",\n\t\t\tsource: options.source,\n\t\t\trole: \"user\",\n\t\t\tstatus: \"completed\",\n\t\t\t...(summary ? { summary } : {}),\n\t\t});\n\t\treturn;\n\t}\n\n\tif (message.role === \"assistant\") {\n\t\tconst assistantMessage = message as AssistantMessage;\n\t\tconst summary = compactTimelineSummary(\n\t\t\ttextFromContent(assistantMessage.content),\n\t\t);\n\t\tappendItem(items, {\n\t\t\tid: `message:${options.baseId}`,\n\t\t\tsessionId,\n\t\t\ttimestamp: options.timestamp,\n\t\t\ttype: \"message.assistant\",\n\t\t\ttitle: \"Assistant response\",\n\t\t\tvisibility: \"user\",\n\t\t\tsource: options.source,\n\t\t\trole: \"assistant\",\n\t\t\tstatus: assistantMessage.stopReason === \"error\" ? \"failed\" : \"completed\",\n\t\t\t...(summary ? { summary } : {}),\n\t\t\t...(assistantMessage.model\n\t\t\t\t? { metadata: { model: assistantMessage.model } }\n\t\t\t\t: {}),\n\t\t});\n\n\t\tfor (const block of assistantMessage.content) {\n\t\t\tif (block.type !== \"toolCall\") continue;\n\t\t\toptions.context?.toolRequests.set(block.id, {\n\t\t\t\tname: block.name,\n\t\t\t\targs: block.arguments,\n\t\t\t});\n\t\t\tappendItem(items, {\n\t\t\t\tid: `tool-requested:${options.baseId}:${block.id}`,\n\t\t\t\tsessionId,\n\t\t\t\ttimestamp: options.timestamp,\n\t\t\t\ttype: \"tool.requested\",\n\t\t\t\ttitle: `Requested ${block.name}`,\n\t\t\t\tvisibility: \"user\",\n\t\t\t\tsource: options.source,\n\t\t\t\tstatus: \"running\",\n\t\t\t\ttoolCallId: block.id,\n\t\t\t\ttoolName: block.name,\n\t\t\t});\n\t\t}\n\t\treturn;\n\t}\n\n\tif (message.role === \"toolResult\") {\n\t\tconst toolResult = message as ToolResultMessage;\n\t\tconst details = detailsRecord(toolResult.details);\n\t\tconst governed = governedToolMetadata(toolResult.details);\n\t\tconst request = options.context?.toolRequests.get(toolResult.toolCallId);\n\t\tconst approvalRequestId =\n\t\t\tgoverned.approvalRequestId ?? redactedString(details?.approvalRequestId);\n\t\tconst toolExecutionId = redactedString(details?.toolExecutionId);\n\t\tconst artifactId = fileArtifactIdForToolResult(toolResult, request);\n\t\tconst metadata = compactTimelineMetadata({\n\t\t\tgovernedOutcome: governed.governedOutcome,\n\t\t\terrorCode: governed.errorCode,\n\t\t});\n\t\tappendItem(items, {\n\t\t\tid: `tool-result:${options.baseId}:${toolResult.toolCallId}`,\n\t\t\tsessionId,\n\t\t\ttimestamp: options.timestamp,\n\t\t\ttype: toolResult.isError ? \"tool.failed\" : \"tool.completed\",\n\t\t\ttitle: `${toolResult.toolName} ${\n\t\t\t\ttoolResult.isError ? \"failed\" : \"completed\"\n\t\t\t}`,\n\t\t\tvisibility: \"user\",\n\t\t\tsource: options.source,\n\t\t\trole: \"tool\",\n\t\t\tstatus: toolResult.isError ? \"failed\" : \"completed\",\n\t\t\ttoolCallId: toolResult.toolCallId,\n\t\t\ttoolName: toolResult.toolName,\n\t\t\t...(approvalRequestId ? { approvalRequestId } : {}),\n\t\t\t...(toolExecutionId ? { toolExecutionId } : {}),\n\t\t\t...(artifactId ? { artifactId } : {}),\n\t\t\t...(metadata ? { metadata } : {}),\n\t\t});\n\t\taddDerivedToolResultItems(items, sessionId, toolResult, {\n\t\t\tbaseId: options.baseId,\n\t\t\ttimestamp: options.timestamp,\n\t\t\tsource: options.source,\n\t\t\trequest,\n\t\t});\n\t}\n}\n\nfunction statusForPendingRequest(\n\trequest: ComposerPendingRequest,\n): ComposerRunTimelineStatus {\n\treturn request.status === \"pending\" ? \"pending\" : \"info\";\n}\n\nfunction platformOperationForPending(\n\trequest: ComposerPendingRequest,\n): ComposerPendingRequestPlatformOperation | undefined {\n\tif (!request.platform) return undefined;\n\tif (request.kind === \"approval\") {\n\t\treturn request.platform.source === \"tool_execution\"\n\t\t\t? \"ResumeToolExecution\"\n\t\t\t: \"ResolveApproval\";\n\t}\n\tif (\n\t\trequest.kind === \"client_tool\" ||\n\t\trequest.kind === \"mcp_elicitation\" ||\n\t\trequest.kind === \"user_input\"\n\t) {\n\t\treturn \"ResumeRun\";\n\t}\n\treturn undefined;\n}\n\nfunction pendingRequestTitle(request: ComposerPendingRequest): string {\n\tconst label =\n\t\trequest.displayName ||\n\t\trequest.summaryLabel ||\n\t\trequest.toolName ||\n\t\t\"request\";\n\tswitch (request.kind) {\n\t\tcase \"approval\":\n\t\t\treturn `Waiting for approval: ${label}`;\n\t\tcase \"tool_retry\":\n\t\t\treturn `Waiting for retry decision: ${label}`;\n\t\tcase \"client_tool\":\n\t\t\treturn `Waiting for client tool: ${label}`;\n\t\tcase \"mcp_elicitation\":\n\t\t\treturn \"Waiting for MCP input\";\n\t\tcase \"user_input\":\n\t\t\treturn \"Waiting for user input\";\n\t}\n}\n\nfunction addPendingRequestItems(\n\titems: ComposerRunTimelineItem[],\n\tsessionId: string,\n\tpendingRequests: ComposerPendingRequest[],\n\tgeneratedAt: string,\n): void {\n\tfor (const request of pendingRequests) {\n\t\tif (\n\t\t\titems.some(\n\t\t\t\t(item) =>\n\t\t\t\t\titem.type === \"wait.pending\" && item.pendingRequestId === request.id,\n\t\t\t)\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst summary = compactTimelineSummary(\n\t\t\trequest.actionDescription || request.summaryLabel || request.reason,\n\t\t);\n\t\tconst platformOperation = platformOperationForPending(request);\n\t\tappendItem(items, {\n\t\t\tid: `pending:${request.id}`,\n\t\t\tsessionId,\n\t\t\ttimestamp: normalizeTimestamp(request.createdAt, generatedAt),\n\t\t\ttype: \"wait.pending\",\n\t\t\ttitle: pendingRequestTitle(request),\n\t\t\tvisibility: \"user\",\n\t\t\tsource: request.source,\n\t\t\tstatus: statusForPendingRequest(request),\n\t\t\ttoolCallId: request.toolCallId,\n\t\t\ttoolName: request.toolName,\n\t\t\tpendingRequestId: request.id,\n\t\t\tpendingRequestKind: request.kind,\n\t\t\t...(summary ? { summary } : {}),\n\t\t\t...(request.platform?.approvalRequestId\n\t\t\t\t? { approvalRequestId: request.platform.approvalRequestId }\n\t\t\t\t: {}),\n\t\t\t...(request.platform?.toolExecutionId\n\t\t\t\t? { toolExecutionId: request.platform.toolExecutionId }\n\t\t\t\t: {}),\n\t\t\t...(request.platform ? { platform: request.platform } : {}),\n\t\t\t...(platformOperation ? { platformOperation } : {}),\n\t\t});\n\t}\n}\n\nfunction addEntryItems(\n\titems: ComposerRunTimelineItem[],\n\tsessionId: string,\n\tentries: SessionEntry[],\n\tgeneratedAt: string,\n\tcontext: TimelineBuildContext,\n): number {\n\tlet messageEntryCount = 0;\n\n\tfor (const [index, entry] of entries.entries()) {\n\t\tconst timestamp = normalizeTimestamp(\n\t\t\t(entry as { timestamp?: unknown }).timestamp,\n\t\t\tgeneratedAt,\n\t\t);\n\n\t\tswitch (entry.type) {\n\t\t\tcase \"session\": {\n\t\t\t\tappendItem(items, {\n\t\t\t\t\tid: `session-started:${entry.id}`,\n\t\t\t\t\tsessionId,\n\t\t\t\t\ttimestamp,\n\t\t\t\t\ttype: \"session.started\",\n\t\t\t\t\ttitle: \"Session started\",\n\t\t\t\t\tvisibility: \"user\",\n\t\t\t\t\tsource: \"local\",\n\t\t\t\t\tstatus: \"info\",\n\t\t\t\t\t...(entry.cwd ? { metadata: { cwd: entry.cwd } } : {}),\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"session_meta\": {\n\t\t\t\tconst summary = compactTimelineSummary(\n\t\t\t\t\tentry.title || entry.resumeSummary || entry.summary,\n\t\t\t\t);\n\t\t\t\tappendItem(items, {\n\t\t\t\t\tid: `session-updated:${index}`,\n\t\t\t\t\tsessionId,\n\t\t\t\t\ttimestamp,\n\t\t\t\t\ttype: \"session.updated\",\n\t\t\t\t\ttitle: \"Session metadata updated\",\n\t\t\t\t\tvisibility: \"admin\",\n\t\t\t\t\tsource: \"local\",\n\t\t\t\t\tstatus: \"info\",\n\t\t\t\t\t...(summary ? { summary } : {}),\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"message\": {\n\t\t\t\tmessageEntryCount += 1;\n\t\t\t\taddMessageItems(items, sessionId, entry.message, {\n\t\t\t\t\tbaseId: entry.id,\n\t\t\t\t\ttimestamp,\n\t\t\t\t\tsource: \"local\",\n\t\t\t\t\tcontext,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"compaction\": {\n\t\t\t\tconst summary = compactTimelineSummary(entry.summary);\n\t\t\t\tappendItem(items, {\n\t\t\t\t\tid: `compaction:${entry.id}`,\n\t\t\t\t\tsessionId,\n\t\t\t\t\ttimestamp,\n\t\t\t\t\ttype: \"compaction.created\",\n\t\t\t\t\ttitle: \"Context compacted\",\n\t\t\t\t\tvisibility: \"admin\",\n\t\t\t\t\tsource: \"local\",\n\t\t\t\t\tstatus: \"info\",\n\t\t\t\t\t...(summary ? { summary } : {}),\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\ttokensBefore: entry.tokensBefore,\n\t\t\t\t\t\tauto: entry.auto === true,\n\t\t\t\t\t\tfromHook: entry.fromHook === true,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"branch_summary\": {\n\t\t\t\tconst summary = compactTimelineSummary(entry.summary);\n\t\t\t\tappendItem(items, {\n\t\t\t\t\tid: `branch:${entry.id}`,\n\t\t\t\t\tsessionId,\n\t\t\t\t\ttimestamp,\n\t\t\t\t\ttype: \"branch.created\",\n\t\t\t\t\ttitle: \"Branch summary created\",\n\t\t\t\t\tvisibility: \"admin\",\n\t\t\t\t\tsource: \"local\",\n\t\t\t\t\tstatus: \"info\",\n\t\t\t\t\t...(summary ? { summary } : {}),\n\t\t\t\t\tmetadata: { fromId: entry.fromId },\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"model_change\": {\n\t\t\t\tconst summary = compactTimelineSummary(entry.model);\n\t\t\t\tappendItem(items, {\n\t\t\t\t\tid: `model-change:${entry.id}`,\n\t\t\t\t\tsessionId,\n\t\t\t\t\ttimestamp,\n\t\t\t\t\ttype: \"model.changed\",\n\t\t\t\t\ttitle: \"Model changed\",\n\t\t\t\t\tvisibility: \"admin\",\n\t\t\t\t\tsource: \"local\",\n\t\t\t\t\tstatus: \"info\",\n\t\t\t\t\t...(summary ? { summary } : {}),\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"thinking_level_change\": {\n\t\t\t\tconst summary = compactTimelineSummary(entry.thinkingLevel);\n\t\t\t\tappendItem(items, {\n\t\t\t\t\tid: `thinking-change:${entry.id}`,\n\t\t\t\t\tsessionId,\n\t\t\t\t\ttimestamp,\n\t\t\t\t\ttype: \"thinking.changed\",\n\t\t\t\t\ttitle: \"Thinking level changed\",\n\t\t\t\t\tvisibility: \"admin\",\n\t\t\t\t\tsource: \"local\",\n\t\t\t\t\tstatus: \"info\",\n\t\t\t\t\t...(summary ? { summary } : {}),\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"custom_message\": {\n\t\t\t\tif (!entry.display) break;\n\t\t\t\tconst summary = compactTimelineSummary(textFromContent(entry.content));\n\t\t\t\tappendItem(items, {\n\t\t\t\t\tid: `custom-message:${entry.id}`,\n\t\t\t\t\tsessionId,\n\t\t\t\t\ttimestamp,\n\t\t\t\t\ttype: \"custom.event\",\n\t\t\t\t\ttitle: entry.customType,\n\t\t\t\t\tvisibility: \"admin\",\n\t\t\t\t\tsource: \"local\",\n\t\t\t\t\tstatus: \"info\",\n\t\t\t\t\t...(summary ? { summary } : {}),\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"custom\": {\n\t\t\t\tconst pendingRequest = pendingRequestFromCustomEntry(\n\t\t\t\t\tentry,\n\t\t\t\t\tsessionId,\n\t\t\t\t\ttimestamp,\n\t\t\t\t);\n\t\t\t\tif (pendingRequest) {\n\t\t\t\t\taddPendingRequestItems(\n\t\t\t\t\t\titems,\n\t\t\t\t\t\tsessionId,\n\t\t\t\t\t\t[pendingRequest],\n\t\t\t\t\t\tgeneratedAt,\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tappendItem(items, {\n\t\t\t\t\tid: `custom:${entry.id}`,\n\t\t\t\t\tsessionId,\n\t\t\t\t\ttimestamp,\n\t\t\t\t\ttype: \"custom.event\",\n\t\t\t\t\ttitle: entry.customType,\n\t\t\t\t\tvisibility: \"audit\",\n\t\t\t\t\tsource: \"local\",\n\t\t\t\t\tstatus: \"info\",\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn messageEntryCount;\n}\n\nfunction sortItems(\n\titems: ComposerRunTimelineItem[],\n): ComposerRunTimelineItem[] {\n\treturn [...items].sort((a, b) => {\n\t\tconst timestampDelta =\n\t\t\tnew Date(a.timestamp).getTime() - new Date(b.timestamp).getTime();\n\t\tif (timestampDelta !== 0) return timestampDelta;\n\t\treturn a.id.localeCompare(b.id);\n\t});\n}\n\nfunction pendingRequestCountForItems(items: ComposerRunTimelineItem[]): number {\n\tconst pendingRequestIds = new Set<string>();\n\tlet pendingWithoutId = 0;\n\tfor (const item of items) {\n\t\tif (item.type !== \"wait.pending\") {\n\t\t\tcontinue;\n\t\t}\n\t\tif (item.pendingRequestId) {\n\t\t\tpendingRequestIds.add(item.pendingRequestId);\n\t\t} else {\n\t\t\tpendingWithoutId += 1;\n\t\t}\n\t}\n\treturn pendingRequestIds.size + pendingWithoutId;\n}\n\nexport function buildComposerRunTimeline(\n\toptions: BuildComposerRunTimelineOptions,\n): ComposerRunTimelineResponse {\n\tconst generatedAt = options.generatedAt ?? new Date().toISOString();\n\tconst items: ComposerRunTimelineItem[] = [];\n\tconst entries = options.entries ?? [];\n\tconst messages = options.messages ?? [];\n\tconst pendingRequests = options.pendingRequests ?? [];\n\tconst context: TimelineBuildContext = {\n\t\ttoolRequests: new Map<string, TimelineToolRequest>(),\n\t};\n\n\tconst messageEntryCount = addEntryItems(\n\t\titems,\n\t\toptions.sessionId,\n\t\tentries,\n\t\tgeneratedAt,\n\t\tcontext,\n\t);\n\n\tif (messageEntryCount === 0) {\n\t\tfor (const [index, message] of messages.entries()) {\n\t\t\taddMessageItems(items, options.sessionId, message, {\n\t\t\t\tbaseId: `fallback-${index}`,\n\t\t\t\ttimestamp: normalizeTimestamp(\n\t\t\t\t\t(message as { timestamp?: unknown }).timestamp,\n\t\t\t\t\tgeneratedAt,\n\t\t\t\t),\n\t\t\t\tsource: \"local\",\n\t\t\t\tcontext,\n\t\t\t});\n\t\t}\n\t}\n\n\taddPendingRequestItems(\n\t\titems,\n\t\toptions.sessionId,\n\t\tpendingRequests,\n\t\tgeneratedAt,\n\t);\n\tconst sortedItems = sortItems(items);\n\n\treturn {\n\t\tsessionId: options.sessionId,\n\t\tsource: \"local\",\n\t\tgeneratedAt,\n\t\tplatformBacked: false,\n\t\tpendingRequestCount: pendingRequestCountForItems(sortedItems),\n\t\titems: sortedItems,\n\t};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-monitor.d.ts","sourceRoot":"","sources":["../../../src/tools/background/resource-monitor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAQD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAetE;AAED;;;;;;GAMG;AACH,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6B;;IAM5D;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAM5B;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAW/C;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,OAAO,IAAI,MAAM,GAAG,IAAI,GAAG,UAAU;IAIrC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAwCzB;;OAEG;IACH,OAAO,CAAC,eAAe;
|
|
1
|
+
{"version":3,"file":"resource-monitor.d.ts","sourceRoot":"","sources":["../../../src/tools/background/resource-monitor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAQD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAetE;AAED;;;;;;GAMG;AACH,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6B;;IAM5D;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAM5B;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAW/C;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,OAAO,IAAI,MAAM,GAAG,IAAI,GAAG,UAAU;IAIrC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAwCzB;;OAEG;IACH,OAAO,CAAC,eAAe;IAsCvB;;;OAGG;IACH,OAAO,CAAC,eAAe;CA6BvB"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Platform-specific resource usage monitoring for child processes.
|
|
5
5
|
* Supports Linux (/proc filesystem) and macOS (ps command).
|
|
6
6
|
*/
|
|
7
|
-
import {
|
|
7
|
+
import { spawnSync } from "node:child_process";
|
|
8
8
|
import { readFileSync } from "node:fs";
|
|
9
9
|
/**
|
|
10
10
|
* Clock ticks per second on Linux systems.
|
|
@@ -144,12 +144,14 @@ export class ResourceMonitor {
|
|
|
144
144
|
*/
|
|
145
145
|
readUsageFromPs(pid) {
|
|
146
146
|
try {
|
|
147
|
-
const
|
|
147
|
+
const result = spawnSync("ps", ["-o", "rss=", "-o", "time=", "-p", String(pid)], {
|
|
148
148
|
encoding: "utf-8",
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
149
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
150
|
+
});
|
|
151
|
+
if (result.error || result.status !== 0) {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
const output = result.stdout.trim().split(/\s+/).filter(Boolean);
|
|
153
155
|
if (output.length < 2) {
|
|
154
156
|
return null;
|
|
155
157
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-monitor.js","sourceRoot":"","sources":["../../../src/tools/background/resource-monitor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Resource Monitor for Background Tasks\n *\n * Platform-specific resource usage monitoring for child processes.\n * Supports Linux (/proc filesystem) and macOS (ps command).\n */\n\nimport { execSync } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\n\n/**\n * Resource usage snapshot for a process.\n */\nexport interface TaskResourceUsage {\n\t/** Resident set size in kilobytes */\n\tmaxRssKb?: number;\n\t/** User-mode CPU time in milliseconds */\n\tuserMs?: number;\n\t/** System-mode CPU time in milliseconds */\n\tsystemMs?: number;\n}\n\n/**\n * Clock ticks per second on Linux systems.\n * Standard value for most distributions.\n */\nconst CLOCK_TICKS_PER_SECOND = 100;\n\n/**\n * Extracts fields from /proc/<pid>/stat content.\n *\n * ## /proc/<pid>/stat Format\n *\n * Fields are space-separated. Key fields (0-indexed after parsing):\n * - Field 0: pid\n * - Field 1: comm (command name in parentheses)\n * - Field 2: state (R, S, D, Z, T, etc.)\n *\n * After the comm field:\n * - Index 11 (utime): User mode CPU time in clock ticks\n * - Index 12 (stime): Kernel mode CPU time in clock ticks\n *\n * ## Why lastIndexOf?\n *\n * The command name can contain \")\" characters. For example:\n * `12345 (node (v18)) S 1234 ...`\n * Using lastIndexOf(\") \") ensures we find the real end of the comm field.\n *\n * @param statRaw - Raw content of /proc/<pid>/stat\n * @returns Array of fields starting from field 3 (state), or null if parse fails\n */\nexport function extractProcStatFields(statRaw: string): string[] | null {\n\tconst trimmed = statRaw.trim();\n\t// Find the closing parenthesis of the command name field\n\t// Use lastIndexOf because command name itself can contain \")\"\n\tconst splitIndex = trimmed.lastIndexOf(\") \");\n\tif (splitIndex === -1) {\n\t\treturn null;\n\t}\n\t// Everything after \") \" is the remaining fields, space-separated\n\tconst remainder = trimmed.slice(splitIndex + 2).trim();\n\tif (!remainder) {\n\t\treturn null;\n\t}\n\t// Split on whitespace to get individual fields\n\treturn remainder.split(/\\s+/);\n}\n\n/**\n * Monitors resource usage for background processes.\n *\n * Provides platform-specific implementations:\n * - Linux: Reads /proc/<pid>/stat and /proc/<pid>/status\n * - macOS: Uses ps command\n */\nexport class ResourceMonitor {\n\tprivate readonly monitoringMode: \"proc\" | \"ps\" | \"disabled\";\n\n\tconstructor() {\n\t\tthis.monitoringMode = this.detectMonitoringMode();\n\t}\n\n\t/**\n\t * Detect which monitoring mode to use based on platform.\n\t */\n\tprivate detectMonitoringMode(): \"proc\" | \"ps\" | \"disabled\" {\n\t\tif (process.platform === \"linux\") return \"proc\";\n\t\tif (process.platform === \"darwin\") return \"ps\";\n\t\treturn \"disabled\";\n\t}\n\n\t/**\n\t * Get resource usage for a process.\n\t *\n\t * @param pid - Process ID to monitor\n\t * @returns Resource usage snapshot, or null if unavailable\n\t */\n\tgetUsage(pid: number): TaskResourceUsage | null {\n\t\tswitch (this.monitoringMode) {\n\t\t\tcase \"proc\":\n\t\t\t\treturn this.readUsageFromProc(pid);\n\t\t\tcase \"ps\":\n\t\t\t\treturn this.readUsageFromPs(pid);\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Check if monitoring is available on this platform.\n\t */\n\tisAvailable(): boolean {\n\t\treturn this.monitoringMode !== \"disabled\";\n\t}\n\n\t/**\n\t * Get the current monitoring mode.\n\t */\n\tgetMode(): \"proc\" | \"ps\" | \"disabled\" {\n\t\treturn this.monitoringMode;\n\t}\n\n\t/**\n\t * Read resource usage from Linux /proc filesystem.\n\t */\n\tprivate readUsageFromProc(pid: number): TaskResourceUsage | null {\n\t\tconst usage: TaskResourceUsage = {};\n\n\t\t// Read memory from /proc/<pid>/status\n\t\ttry {\n\t\t\tconst status = readFileSync(`/proc/${pid}/status`, \"utf8\");\n\t\t\tconst match = status.match(/VmRSS:\\s+(\\d+)\\s+kB/i);\n\t\t\tif (match?.[1]) {\n\t\t\t\tconst rssValue = Number.parseInt(match[1], 10);\n\t\t\t\tif (Number.isFinite(rssValue)) {\n\t\t\t\t\tusage.maxRssKb = Math.max(rssValue, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore inability to read status (process likely exited)\n\t\t}\n\n\t\t// Read CPU time from /proc/<pid>/stat\n\t\ttry {\n\t\t\tconst statRaw = readFileSync(`/proc/${pid}/stat`, \"utf8\").trim();\n\t\t\tconst fields = extractProcStatFields(statRaw);\n\t\t\tif (fields) {\n\t\t\t\tconst userTicks = Number.parseInt(fields[11] ?? \"\", 10);\n\t\t\t\tconst systemTicks = Number.parseInt(fields[12] ?? \"\", 10);\n\t\t\t\tconst msPerTick = 1000 / CLOCK_TICKS_PER_SECOND;\n\n\t\t\t\tif (Number.isFinite(userTicks)) {\n\t\t\t\t\tusage.userMs = Math.max(userTicks * msPerTick, 0);\n\t\t\t\t}\n\t\t\t\tif (Number.isFinite(systemTicks)) {\n\t\t\t\t\tusage.systemMs = Math.max(systemTicks * msPerTick, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore stat read errors; may not be available\n\t\t}\n\n\t\treturn Object.keys(usage).length > 0 ? usage : null;\n\t}\n\n\t/**\n\t * Read resource usage using macOS ps command.\n\t */\n\tprivate readUsageFromPs(pid: number): TaskResourceUsage | null {\n\t\ttry {\n\t\t\tconst output = execSync(`ps -o rss= -o time= -p ${pid}`, {\n\t\t\t\tencoding: \"utf-8\",\n\t\t\t})\n\t\t\t\t.trim()\n\t\t\t\t.split(/\\s+/)\n\t\t\t\t.filter(Boolean);\n\n\t\t\tif (output.length < 2) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst rssKb = Number.parseInt(output[0] ?? \"\", 10);\n\t\t\tconst timeMs = this.parsePsTimeToMs(output[1] ?? \"\");\n\t\t\tconst usage: TaskResourceUsage = {};\n\n\t\t\tif (Number.isFinite(rssKb)) {\n\t\t\t\tusage.maxRssKb = Math.max(rssKb, 0);\n\t\t\t}\n\t\t\tif (Number.isFinite(timeMs)) {\n\t\t\t\t// ps only reports total CPU time; treat as user time for limit enforcement\n\t\t\t\tusage.userMs = Math.max(timeMs, 0);\n\t\t\t}\n\n\t\t\treturn Object.keys(usage).length > 0 ? usage : null;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Parse ps time format to milliseconds.\n\t * Supports formats: [[dd-]hh:]mm:ss\n\t */\n\tprivate parsePsTimeToMs(timeText: string): number {\n\t\tconst daySplit = timeText.split(\"-\");\n\t\tlet dayPortion = 0;\n\t\tlet timePortion = timeText;\n\n\t\tif (daySplit.length === 2) {\n\t\t\tdayPortion = Number.parseInt(daySplit[0] ?? \"0\", 10);\n\t\t\ttimePortion = daySplit[1] ?? \"\";\n\t\t}\n\n\t\tconst parts = timePortion.split(\":\").map((p) => Number.parseInt(p, 10));\n\n\t\tif (parts.length < 2 || parts.some((n) => Number.isNaN(n))) {\n\t\t\treturn Number.NaN;\n\t\t}\n\n\t\tconst [hoursOrMinutes, minutesOrSeconds, seconds] =\n\t\t\tparts.length === 3 ? parts : [0, parts[0] ?? 0, parts[1] ?? 0];\n\n\t\tconst hours = (parts.length === 3 ? hoursOrMinutes : 0) ?? 0;\n\t\tconst minutes =\n\t\t\t(parts.length === 3 ? minutesOrSeconds : hoursOrMinutes) ?? 0;\n\t\tconst secs = (parts.length === 3 ? seconds : minutesOrSeconds) ?? 0;\n\n\t\tconst totalSeconds =\n\t\t\t(dayPortion || 0) * 24 * 3600 + hours * 3600 + minutes * 60 + secs;\n\n\t\treturn totalSeconds * 1000;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"resource-monitor.js","sourceRoot":"","sources":["../../../src/tools/background/resource-monitor.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Resource Monitor for Background Tasks\n *\n * Platform-specific resource usage monitoring for child processes.\n * Supports Linux (/proc filesystem) and macOS (ps command).\n */\n\nimport { spawnSync } from \"node:child_process\";\nimport { readFileSync } from \"node:fs\";\n\n/**\n * Resource usage snapshot for a process.\n */\nexport interface TaskResourceUsage {\n\t/** Resident set size in kilobytes */\n\tmaxRssKb?: number;\n\t/** User-mode CPU time in milliseconds */\n\tuserMs?: number;\n\t/** System-mode CPU time in milliseconds */\n\tsystemMs?: number;\n}\n\n/**\n * Clock ticks per second on Linux systems.\n * Standard value for most distributions.\n */\nconst CLOCK_TICKS_PER_SECOND = 100;\n\n/**\n * Extracts fields from /proc/<pid>/stat content.\n *\n * ## /proc/<pid>/stat Format\n *\n * Fields are space-separated. Key fields (0-indexed after parsing):\n * - Field 0: pid\n * - Field 1: comm (command name in parentheses)\n * - Field 2: state (R, S, D, Z, T, etc.)\n *\n * After the comm field:\n * - Index 11 (utime): User mode CPU time in clock ticks\n * - Index 12 (stime): Kernel mode CPU time in clock ticks\n *\n * ## Why lastIndexOf?\n *\n * The command name can contain \")\" characters. For example:\n * `12345 (node (v18)) S 1234 ...`\n * Using lastIndexOf(\") \") ensures we find the real end of the comm field.\n *\n * @param statRaw - Raw content of /proc/<pid>/stat\n * @returns Array of fields starting from field 3 (state), or null if parse fails\n */\nexport function extractProcStatFields(statRaw: string): string[] | null {\n\tconst trimmed = statRaw.trim();\n\t// Find the closing parenthesis of the command name field\n\t// Use lastIndexOf because command name itself can contain \")\"\n\tconst splitIndex = trimmed.lastIndexOf(\") \");\n\tif (splitIndex === -1) {\n\t\treturn null;\n\t}\n\t// Everything after \") \" is the remaining fields, space-separated\n\tconst remainder = trimmed.slice(splitIndex + 2).trim();\n\tif (!remainder) {\n\t\treturn null;\n\t}\n\t// Split on whitespace to get individual fields\n\treturn remainder.split(/\\s+/);\n}\n\n/**\n * Monitors resource usage for background processes.\n *\n * Provides platform-specific implementations:\n * - Linux: Reads /proc/<pid>/stat and /proc/<pid>/status\n * - macOS: Uses ps command\n */\nexport class ResourceMonitor {\n\tprivate readonly monitoringMode: \"proc\" | \"ps\" | \"disabled\";\n\n\tconstructor() {\n\t\tthis.monitoringMode = this.detectMonitoringMode();\n\t}\n\n\t/**\n\t * Detect which monitoring mode to use based on platform.\n\t */\n\tprivate detectMonitoringMode(): \"proc\" | \"ps\" | \"disabled\" {\n\t\tif (process.platform === \"linux\") return \"proc\";\n\t\tif (process.platform === \"darwin\") return \"ps\";\n\t\treturn \"disabled\";\n\t}\n\n\t/**\n\t * Get resource usage for a process.\n\t *\n\t * @param pid - Process ID to monitor\n\t * @returns Resource usage snapshot, or null if unavailable\n\t */\n\tgetUsage(pid: number): TaskResourceUsage | null {\n\t\tswitch (this.monitoringMode) {\n\t\t\tcase \"proc\":\n\t\t\t\treturn this.readUsageFromProc(pid);\n\t\t\tcase \"ps\":\n\t\t\t\treturn this.readUsageFromPs(pid);\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Check if monitoring is available on this platform.\n\t */\n\tisAvailable(): boolean {\n\t\treturn this.monitoringMode !== \"disabled\";\n\t}\n\n\t/**\n\t * Get the current monitoring mode.\n\t */\n\tgetMode(): \"proc\" | \"ps\" | \"disabled\" {\n\t\treturn this.monitoringMode;\n\t}\n\n\t/**\n\t * Read resource usage from Linux /proc filesystem.\n\t */\n\tprivate readUsageFromProc(pid: number): TaskResourceUsage | null {\n\t\tconst usage: TaskResourceUsage = {};\n\n\t\t// Read memory from /proc/<pid>/status\n\t\ttry {\n\t\t\tconst status = readFileSync(`/proc/${pid}/status`, \"utf8\");\n\t\t\tconst match = status.match(/VmRSS:\\s+(\\d+)\\s+kB/i);\n\t\t\tif (match?.[1]) {\n\t\t\t\tconst rssValue = Number.parseInt(match[1], 10);\n\t\t\t\tif (Number.isFinite(rssValue)) {\n\t\t\t\t\tusage.maxRssKb = Math.max(rssValue, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore inability to read status (process likely exited)\n\t\t}\n\n\t\t// Read CPU time from /proc/<pid>/stat\n\t\ttry {\n\t\t\tconst statRaw = readFileSync(`/proc/${pid}/stat`, \"utf8\").trim();\n\t\t\tconst fields = extractProcStatFields(statRaw);\n\t\t\tif (fields) {\n\t\t\t\tconst userTicks = Number.parseInt(fields[11] ?? \"\", 10);\n\t\t\t\tconst systemTicks = Number.parseInt(fields[12] ?? \"\", 10);\n\t\t\t\tconst msPerTick = 1000 / CLOCK_TICKS_PER_SECOND;\n\n\t\t\t\tif (Number.isFinite(userTicks)) {\n\t\t\t\t\tusage.userMs = Math.max(userTicks * msPerTick, 0);\n\t\t\t\t}\n\t\t\t\tif (Number.isFinite(systemTicks)) {\n\t\t\t\t\tusage.systemMs = Math.max(systemTicks * msPerTick, 0);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore stat read errors; may not be available\n\t\t}\n\n\t\treturn Object.keys(usage).length > 0 ? usage : null;\n\t}\n\n\t/**\n\t * Read resource usage using macOS ps command.\n\t */\n\tprivate readUsageFromPs(pid: number): TaskResourceUsage | null {\n\t\ttry {\n\t\t\tconst result = spawnSync(\n\t\t\t\t\"ps\",\n\t\t\t\t[\"-o\", \"rss=\", \"-o\", \"time=\", \"-p\", String(pid)],\n\t\t\t\t{\n\t\t\t\t\tencoding: \"utf-8\",\n\t\t\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t\t\t},\n\t\t\t);\n\t\t\tif (result.error || result.status !== 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst output = result.stdout.trim().split(/\\s+/).filter(Boolean);\n\n\t\t\tif (output.length < 2) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst rssKb = Number.parseInt(output[0] ?? \"\", 10);\n\t\t\tconst timeMs = this.parsePsTimeToMs(output[1] ?? \"\");\n\t\t\tconst usage: TaskResourceUsage = {};\n\n\t\t\tif (Number.isFinite(rssKb)) {\n\t\t\t\tusage.maxRssKb = Math.max(rssKb, 0);\n\t\t\t}\n\t\t\tif (Number.isFinite(timeMs)) {\n\t\t\t\t// ps only reports total CPU time; treat as user time for limit enforcement\n\t\t\t\tusage.userMs = Math.max(timeMs, 0);\n\t\t\t}\n\n\t\t\treturn Object.keys(usage).length > 0 ? usage : null;\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t/**\n\t * Parse ps time format to milliseconds.\n\t * Supports formats: [[dd-]hh:]mm:ss\n\t */\n\tprivate parsePsTimeToMs(timeText: string): number {\n\t\tconst daySplit = timeText.split(\"-\");\n\t\tlet dayPortion = 0;\n\t\tlet timePortion = timeText;\n\n\t\tif (daySplit.length === 2) {\n\t\t\tdayPortion = Number.parseInt(daySplit[0] ?? \"0\", 10);\n\t\t\ttimePortion = daySplit[1] ?? \"\";\n\t\t}\n\n\t\tconst parts = timePortion.split(\":\").map((p) => Number.parseInt(p, 10));\n\n\t\tif (parts.length < 2 || parts.some((n) => Number.isNaN(n))) {\n\t\t\treturn Number.NaN;\n\t\t}\n\n\t\tconst [hoursOrMinutes, minutesOrSeconds, seconds] =\n\t\t\tparts.length === 3 ? parts : [0, parts[0] ?? 0, parts[1] ?? 0];\n\n\t\tconst hours = (parts.length === 3 ? hoursOrMinutes : 0) ?? 0;\n\t\tconst minutes =\n\t\t\t(parts.length === 3 ? minutesOrSeconds : hoursOrMinutes) ?? 0;\n\t\tconst secs = (parts.length === 3 ? seconds : minutesOrSeconds) ?? 0;\n\n\t\tconst totalSeconds =\n\t\t\t(dayPortion || 0) * 24 * 3600 + hours * 3600 + minutes * 60 + secs;\n\n\t\treturn totalSeconds * 1000;\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parallel-ripgrep.d.ts","sourceRoot":"","sources":["../../src/tools/parallel-ripgrep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;
|
|
1
|
+
{"version":3,"file":"parallel-ripgrep.d.ts","sourceRoot":"","sources":["../../src/tools/parallel-ripgrep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AA+GH;;;GAGG;AACH,KAAK,WAAW,GAAG;IAClB,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,sDAAsD;IACtD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;GAGG;AACH,KAAK,sBAAsB,GAAG;IAC7B,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,iDAAiD;IACjD,SAAS,EAAE,OAAO,CAAC;CACnB,CAAC;AA+HF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0O9B,CAAC"}
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
import { promises as fs } from "node:fs";
|
|
23
23
|
import { resolve as resolvePath } from "node:path";
|
|
24
24
|
import { Type } from "@sinclair/typebox";
|
|
25
|
-
import { formatRipgrepCommand, globSchema, isRipgrepPathError, parseRipgrepJson, pathSchema, runRipgrep, toArray, } from "./ripgrep-utils.js";
|
|
25
|
+
import { formatRipgrepCommand, globSchema, isRipgrepPathError, normalizeRipgrepPathArgs, parseRipgrepJson, pathSchema, runRipgrep, toArray, } from "./ripgrep-utils.js";
|
|
26
26
|
import { createTool, expandUserPath } from "./tool-dsl.js";
|
|
27
27
|
/** Maximum number of line ranges to include in detailed output */
|
|
28
28
|
const RANGE_DETAIL_LIMIT = 200;
|
|
@@ -202,7 +202,7 @@ export const parallelRipgrepTool = createTool({
|
|
|
202
202
|
(beforeContext !== undefined || afterContext !== undefined)) {
|
|
203
203
|
throw new Error("Use either context or before/after context options, not both.");
|
|
204
204
|
}
|
|
205
|
-
const pathArgs = toArray(paths);
|
|
205
|
+
const pathArgs = normalizeRipgrepPathArgs(toArray(paths));
|
|
206
206
|
const globArgs = toArray(glob);
|
|
207
207
|
const commandCwd = cwd ? resolvePath(expandUserPath(cwd)) : process.cwd();
|
|
208
208
|
const before = beforeContext ?? context ?? 0;
|