@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.
Files changed (46) hide show
  1. package/dist/cli/commands/operating-plane.d.ts.map +1 -1
  2. package/dist/cli/commands/operating-plane.js +3 -2
  3. package/dist/cli/commands/operating-plane.js.map +1 -1
  4. package/dist/cli/help.js +8 -6
  5. package/dist/cli/help.js.map +1 -1
  6. package/dist/cli.js +201 -96
  7. package/dist/codex/subagent-dispatch-table.d.ts +1 -1
  8. package/dist/codex/subagent-dispatch-table.js +1 -1
  9. package/dist/codex/subagent-dispatch-table.js.map +1 -1
  10. package/dist/node_modules/@evalops/contracts/package.json +1 -1
  11. package/dist/node_modules/@evalops/tui/package.json +1 -1
  12. package/dist/platform/a2a-completion-audit.d.ts +12 -6
  13. package/dist/platform/a2a-completion-audit.d.ts.map +1 -1
  14. package/dist/platform/a2a-completion-audit.js +28 -20
  15. package/dist/platform/a2a-completion-audit.js.map +1 -1
  16. package/dist/platform/a2a-maestro-peer.js +8 -7
  17. package/dist/platform/a2a-maestro-peer.js.map +1 -1
  18. package/dist/platform/a2a-telemetry-inspect.d.ts +2 -2
  19. package/dist/platform/a2a-telemetry-inspect.d.ts.map +1 -1
  20. package/dist/platform/a2a-telemetry-inspect.js +3 -3
  21. package/dist/platform/a2a-telemetry-inspect.js.map +1 -1
  22. package/dist/platform/operating-plane-client.d.ts +2 -2
  23. package/dist/platform/operating-plane-client.d.ts.map +1 -1
  24. package/dist/platform/operating-plane-client.js.map +1 -1
  25. package/dist/platform/operating-plane-summary.d.ts +4 -4
  26. package/dist/platform/operating-plane-summary.d.ts.map +1 -1
  27. package/dist/platform/operating-plane-summary.js +39 -27
  28. package/dist/platform/operating-plane-summary.js.map +1 -1
  29. package/dist/server/session-timeline.d.ts.map +1 -1
  30. package/dist/server/session-timeline.js +112 -2
  31. package/dist/server/session-timeline.js.map +1 -1
  32. package/dist/tools/background/resource-monitor.d.ts.map +1 -1
  33. package/dist/tools/background/resource-monitor.js +8 -6
  34. package/dist/tools/background/resource-monitor.js.map +1 -1
  35. package/dist/tools/parallel-ripgrep.d.ts.map +1 -1
  36. package/dist/tools/parallel-ripgrep.js +2 -2
  37. package/dist/tools/parallel-ripgrep.js.map +1 -1
  38. package/dist/tools/ripgrep-utils.d.ts +1 -0
  39. package/dist/tools/ripgrep-utils.d.ts.map +1 -1
  40. package/dist/tools/ripgrep-utils.js +4 -0
  41. package/dist/tools/ripgrep-utils.js.map +1 -1
  42. package/dist/tools/search.d.ts.map +1 -1
  43. package/dist/tools/search.js +2 -2
  44. package/dist/tools/search.js.map +1 -1
  45. package/dist/version.json +2 -2
  46. 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: pendingRequests.length,
576
- items: sortItems(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;IA+BvB;;;OAGG;IACH,OAAO,CAAC,eAAe;CA6BvB"}
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 { execSync } from "node:child_process";
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 output = execSync(`ps -o rss= -o time= -p ${pid}`, {
147
+ const result = spawnSync("ps", ["-o", "rss=", "-o", "time=", "-p", String(pid)], {
148
148
  encoding: "utf-8",
149
- })
150
- .trim()
151
- .split(/\s+/)
152
- .filter(Boolean);
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;AA8GH;;;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"}
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;