@evalops/maestro 0.10.42 → 0.10.44
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 +247 -97
- 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/handlers/hosted-runner-drain.d.ts +28 -0
- package/dist/server/handlers/hosted-runner-drain.d.ts.map +1 -1
- package/dist/server/handlers/hosted-runner-drain.js +55 -2
- package/dist/server/handlers/hosted-runner-drain.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
|
@@ -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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAcvC;;;GAGG;AACH,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAEnC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACpD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,yDAAyD;IACzD,8DAA8D;IAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACb,CAAC;IACD,iEAAiE;IACjE,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACvD,IAAI,CAAC,SAAS,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACb,CAAC;IACD,+CAA+C;IAC/C,OAAO,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,OAAO,eAAe;IAG3B;QACC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;IACnD,CAAC;IAED;;OAEG;IACK,oBAAoB;QAC3B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,OAAO,MAAM,CAAC;QAChD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC/C,OAAO,UAAU,CAAC;IACnB,CAAC;IAED;;;;;OAKG;IACH,QAAQ,CAAC,GAAW;QACnB,QAAQ,IAAI,CAAC,cAAc,EAAE,CAAC;YAC7B,KAAK,MAAM;gBACV,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;YACpC,KAAK,IAAI;gBACR,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YAClC;gBACC,OAAO,IAAI,CAAC;QACd,CAAC;IACF,CAAC;IAED;;OAEG;IACH,WAAW;QACV,OAAO,IAAI,CAAC,cAAc,KAAK,UAAU,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,OAAO;QACN,OAAO,IAAI,CAAC,cAAc,CAAC;IAC5B,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,GAAW;QACpC,MAAM,KAAK,GAAsB,EAAE,CAAC;QAEpC,sCAAsC;QACtC,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,GAAG,SAAS,EAAE,MAAM,CAAC,CAAC;YAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YACnD,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChB,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC/C,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC/B,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;gBACxC,CAAC;YACF,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,0DAA0D;QAC3D,CAAC;QAED,sCAAsC;QACtC,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YACjE,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAC9C,IAAI,MAAM,EAAE,CAAC;gBACZ,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBACxD,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC1D,MAAM,SAAS,GAAG,IAAI,GAAG,sBAAsB,CAAC;gBAEhD,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;oBAChC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC;gBACnD,CAAC;gBACD,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;oBAClC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC;gBACvD,CAAC;YACF,CAAC;QACF,CAAC;QAAC,MAAM,CAAC;YACR,gDAAgD;QACjD,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACrD,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,GAAW;QAClC,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,SAAS,CACvB,IAAI,EACJ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAChD;gBACC,QAAQ,EAAE,OAAO;gBACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;aACjC,CACD,CAAC;YACF,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzC,OAAO,IAAI,CAAC;YACb,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAEjE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,OAAO,IAAI,CAAC;YACb,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACnD,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACrD,MAAM,KAAK,GAAsB,EAAE,CAAC;YAEpC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACrC,CAAC;YACD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7B,2EAA2E;gBAC3E,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACpC,CAAC;YAED,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACR,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;IAED;;;OAGG;IACK,eAAe,CAAC,QAAgB;QACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,WAAW,GAAG,QAAQ,CAAC;QAE3B,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;YACrD,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACjC,CAAC;QAED,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAExE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,OAAO,MAAM,CAAC,GAAG,CAAC;QACnB,CAAC;QAED,MAAM,CAAC,cAAc,EAAE,gBAAgB,EAAE,OAAO,CAAC,GAChD,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAEhE,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7D,MAAM,OAAO,GACZ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAEpE,MAAM,YAAY,GACjB,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC;QAEpE,OAAO,YAAY,GAAG,IAAI,CAAC;IAC5B,CAAC;CACD","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;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parallel-ripgrep.js","sourceRoot":"","sources":["../../src/tools/parallel-ripgrep.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Parallel Ripgrep Tool\n *\n * This tool enables searching for multiple regex patterns simultaneously\n * across a codebase. Unlike running separate ripgrep searches, this tool:\n *\n * 1. Runs all pattern searches in parallel for performance\n * 2. Merges overlapping line ranges to avoid duplicate context\n * 3. Returns consolidated results with per-pattern attribution\n *\n * Use cases:\n * - Finding function definitions AND their usages\n * - Searching for multiple related patterns (e.g., import + export)\n * - Finding all occurrences of related symbols\n *\n * The merging algorithm:\n * 1. Each pattern search returns line matches with context\n * 2. Matches are grouped by file\n * 3. Overlapping/adjacent ranges within a file are merged\n * 4. Final output shows which patterns matched each range\n */\n\nimport { promises as fs } from \"node:fs\";\nimport { resolve as resolvePath } from \"node:path\";\nimport { Type } from \"@sinclair/typebox\";\nimport {\n\tformatRipgrepCommand,\n\tglobSchema,\n\tisRipgrepPathError,\n\tparseRipgrepJson,\n\tpathSchema,\n\trunRipgrep,\n\ttoArray,\n} from \"./ripgrep-utils.js\";\nimport { createTool, expandUserPath } from \"./tool-dsl.js\";\n\n/** Maximum number of line ranges to include in detailed output */\nconst RANGE_DETAIL_LIMIT = 200;\n/** Default max matches per pattern (prevents runaway searches) */\nconst DEFAULT_MAX_RESULTS = 500;\n\nconst parallelRipgrepSchema = Type.Object({\n\tpatterns: Type.Array(Type.String({ minLength: 1 }), {\n\t\tminItems: 1,\n\t\tmaxItems: 10,\n\t\tdescription:\n\t\t\t\"Regex patterns to search for in parallel (1-10). Results are merged when matches overlap.\",\n\t}),\n\tpaths: pathSchema,\n\tglob: globSchema,\n\tignoreCase: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription: \"Case-insensitive search (-i) for all patterns\",\n\t\t\tdefault: false,\n\t\t}),\n\t),\n\tliteral: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription:\n\t\t\t\t\"Treat patterns as literal strings, not regex (--fixed-strings)\",\n\t\t\tdefault: false,\n\t\t}),\n\t),\n\tword: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription: \"Match whole words only (-w)\",\n\t\t\tdefault: false,\n\t\t}),\n\t),\n\tmultiline: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription: \"Enable multiline matching (--multiline)\",\n\t\t\tdefault: false,\n\t\t}),\n\t),\n\tmaxResults: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: \"Max matches per pattern (-m)\",\n\t\t\tminimum: 1,\n\t\t\tmaximum: 1000,\n\t\t}),\n\t),\n\tcontext: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: \"Lines of context before and after each match (-C)\",\n\t\t\tminimum: 0,\n\t\t\tmaximum: 20,\n\t\t}),\n\t),\n\tbeforeContext: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: \"Lines of context before each match (-B)\",\n\t\t\tminimum: 0,\n\t\t\tmaximum: 20,\n\t\t}),\n\t),\n\tafterContext: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: \"Lines of context after each match (-A)\",\n\t\t\tminimum: 0,\n\t\t\tmaximum: 20,\n\t\t}),\n\t),\n\tcwd: Type.Optional(\n\t\tType.String({\n\t\t\tdescription: \"Working directory for ripgrep\",\n\t\t\tminLength: 1,\n\t\t}),\n\t),\n\tincludeHidden: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription: \"Include hidden files (--hidden)\",\n\t\t\tdefault: false,\n\t\t}),\n\t),\n\tuseGitIgnore: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription: \"Respect .gitignore (false to pass --no-ignore)\",\n\t\t\tdefault: true,\n\t\t}),\n\t),\n\theadLimit: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: \"Max number of merged line ranges to return\",\n\t\t\tminimum: 1,\n\t\t\tmaximum: RANGE_DETAIL_LIMIT,\n\t\t}),\n\t),\n});\n\n/**\n * A single merged line range with its content.\n * Represents a contiguous block of lines that matched one or more patterns.\n */\ntype RangeDetail = {\n\t/** Relative path to the file */\n\tfile: string;\n\t/** First line number (1-based) */\n\tstart: number;\n\t/** Last line number (1-based, inclusive) */\n\tend: number;\n\t/** List of patterns that matched within this range */\n\tpatterns: string[];\n\t/** Actual content of the lines */\n\tcontent: string;\n};\n\n/**\n * Detailed output from the parallel ripgrep tool.\n * Includes both summary statistics and the full range details.\n */\ntype ParallelRipgrepDetails = {\n\t/** The ripgrep commands that were executed */\n\tcommands: string[];\n\t/** Working directory for the search */\n\tcwd: string;\n\t/** Total number of individual matches across all patterns */\n\tmatchCount: number;\n\t/** Number of merged line ranges in output */\n\trangeCount: number;\n\t/** The merged and deduplicated line ranges */\n\tranges: RangeDetail[];\n\t/** Whether output was truncated due to limits */\n\ttruncated: boolean;\n};\n\n/**\n * Merge overlapping or adjacent line ranges within a single file.\n *\n * This is the core deduplication logic. Given ranges like:\n * [1-5, 3-8, 10-12]\n * It produces:\n * [1-8, 10-12]\n *\n * Ranges are considered mergeable if they overlap or are exactly adjacent\n * (e.g., 1-5 and 6-10 merge to 1-10).\n *\n * Pattern sets are unioned when ranges merge.\n */\nfunction mergeRanges(\n\tranges: Array<{ start: number; end: number; patterns: Set<string> }>,\n): Array<{\n\tstart: number;\n\tend: number;\n\tpatterns: Set<string>;\n}> {\n\t// Sort by start line to enable single-pass merging\n\tconst sorted = [...ranges].sort((a, b) => a.start - b.start);\n\tconst merged: Array<{ start: number; end: number; patterns: Set<string> }> =\n\t\t[];\n\n\tfor (const range of sorted) {\n\t\tconst last = merged.at(-1);\n\t\t// Check if this range overlaps or is adjacent to the previous one\n\t\t// (start <= end + 1 allows for adjacent ranges to merge)\n\t\tif (last && range.start <= last.end + 1) {\n\t\t\t// Extend the previous range and merge patterns\n\t\t\tlast.end = Math.max(last.end, range.end);\n\t\t\tfor (const pattern of range.patterns) {\n\t\t\t\tlast.patterns.add(pattern);\n\t\t\t}\n\t\t} else {\n\t\t\t// Start a new merged range\n\t\t\tmerged.push({\n\t\t\t\tstart: range.start,\n\t\t\t\tend: range.end,\n\t\t\t\tpatterns: new Set(range.patterns),\n\t\t\t});\n\t\t}\n\t}\n\n\treturn merged;\n}\n\n/**\n * Read file contents for each merged range and build detailed output.\n *\n * This function:\n * 1. Sorts ranges by file then line number for consistent output\n * 2. Reads file contents (with caching to avoid re-reading)\n * 3. Extracts the actual line content for each range\n * 4. Applies the limit to avoid excessive output\n *\n * @param commandCwd - Working directory to resolve relative paths\n * @param ranges - The merged ranges to populate with content\n * @param limit - Maximum number of ranges to include\n */\nasync function buildRangeContent(\n\tcommandCwd: string,\n\tranges: Array<{\n\t\tfile: string;\n\t\tstart: number;\n\t\tend: number;\n\t\tpatterns: Set<string>;\n\t}>,\n\tlimit: number,\n): Promise<{ ranges: RangeDetail[]; truncated: boolean }> {\n\t// Sort for deterministic output: by file, then by line number\n\tconst mergedRanges = ranges.sort((a, b) => {\n\t\tif (a.file === b.file) {\n\t\t\treturn a.start - b.start;\n\t\t}\n\t\treturn a.file.localeCompare(b.file);\n\t});\n\n\tconst truncated = mergedRanges.length > limit;\n\tconst selected = mergedRanges.slice(0, limit);\n\n\t// Cache file contents to avoid re-reading the same file multiple times\n\tconst fileCache = new Map<string, string[]>();\n\tconst results: RangeDetail[] = [];\n\n\tfor (const range of selected) {\n\t\tconst absolutePath = resolvePath(commandCwd, range.file);\n\t\tlet lines: string[];\n\n\t\t// Check cache first\n\t\tif (fileCache.has(absolutePath)) {\n\t\t\tlines = fileCache.get(absolutePath) as string[];\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tconst content = await fs.readFile(absolutePath, \"utf-8\");\n\t\t\t\tlines = content.split(/\\r?\\n/);\n\t\t\t\tfileCache.set(absolutePath, lines);\n\t\t\t} catch {\n\t\t\t\t// Skip files that can't be read (deleted, permissions, etc.)\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t// Clamp range to actual file bounds\n\t\tconst start = Math.max(1, range.start);\n\t\tconst end = Math.min(range.end, lines.length);\n\t\tif (end < start) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Extract the content (lines array is 0-indexed, our ranges are 1-indexed)\n\t\tconst snippet = lines.slice(start - 1, end).join(\"\\n\");\n\t\tresults.push({\n\t\t\tfile: range.file,\n\t\t\tstart,\n\t\t\tend,\n\t\t\tpatterns: Array.from(range.patterns).sort(),\n\t\t\tcontent: snippet,\n\t\t});\n\t}\n\n\treturn { ranges: results, truncated };\n}\n\nexport const parallelRipgrepTool = createTool<\n\ttypeof parallelRipgrepSchema,\n\tParallelRipgrepDetails\n>({\n\tname: \"parallel_ripgrep\",\n\tlabel: \"parallel_ripgrep\",\n\tdescription:\n\t\t\"Search for multiple patterns simultaneously. Runs ripgrep queries in parallel, automatically merges overlapping line ranges, and returns consolidated content. Ideal for finding related code (e.g., function definitions AND usages) or multiple related patterns without duplicate context.\",\n\tschema: parallelRipgrepSchema,\n\tasync run(params, { signal, respond }) {\n\t\tconst {\n\t\t\tpatterns,\n\t\t\tpaths,\n\t\t\tglob,\n\t\t\tignoreCase,\n\t\t\tliteral,\n\t\t\tword,\n\t\t\tmultiline,\n\t\t\tmaxResults,\n\t\t\tcontext,\n\t\t\tbeforeContext,\n\t\t\tafterContext,\n\t\t\tcwd,\n\t\t\tincludeHidden,\n\t\t\tuseGitIgnore = true,\n\t\t\theadLimit,\n\t\t} = params;\n\n\t\tif (\n\t\t\tcontext !== undefined &&\n\t\t\t(beforeContext !== undefined || afterContext !== undefined)\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Use either context or before/after context options, not both.\",\n\t\t\t);\n\t\t}\n\n\t\tconst pathArgs = toArray(paths);\n\t\tconst globArgs = toArray(glob);\n\t\tconst commandCwd = cwd ? resolvePath(expandUserPath(cwd)) : process.cwd();\n\t\tconst before = beforeContext ?? context ?? 0;\n\t\tconst after = afterContext ?? context ?? 0;\n\n\t\tconst baseArgs: string[] = [\n\t\t\t\"--color=never\",\n\t\t\t\"--json\",\n\t\t\t\"-n\",\n\t\t\t\"--with-filename\",\n\t\t];\n\n\t\tif (ignoreCase) {\n\t\t\tbaseArgs.push(\"-i\");\n\t\t}\n\n\t\tif (literal) {\n\t\t\tbaseArgs.push(\"--fixed-strings\");\n\t\t}\n\n\t\tif (word) {\n\t\t\tbaseArgs.push(\"-w\");\n\t\t}\n\n\t\tif (multiline) {\n\t\t\tbaseArgs.push(\"--multiline\");\n\t\t}\n\n\t\tif (includeHidden) {\n\t\t\tbaseArgs.push(\"--hidden\");\n\t\t}\n\n\t\tif (!useGitIgnore) {\n\t\t\tbaseArgs.push(\"--no-ignore\");\n\t\t}\n\n\t\tconst effectiveMaxResults = maxResults ?? DEFAULT_MAX_RESULTS;\n\t\tbaseArgs.push(\"-m\", String(effectiveMaxResults));\n\n\t\tif (context !== undefined) {\n\t\t\tbaseArgs.push(`-C${context}`);\n\t\t}\n\n\t\tif (beforeContext !== undefined) {\n\t\t\tbaseArgs.push(`-B${beforeContext}`);\n\t\t}\n\n\t\tif (afterContext !== undefined) {\n\t\t\tbaseArgs.push(`-A${afterContext}`);\n\t\t}\n\n\t\tfor (const globPattern of globArgs) {\n\t\t\tbaseArgs.push(\"--glob\", globPattern);\n\t\t}\n\n\t\tif (pathArgs.length === 0) {\n\t\t\tpathArgs.push(\".\");\n\t\t}\n\n\t\tconst commands: string[] = [];\n\t\tlet truncatedByBytes = false;\n\t\tconst ripgrepCalls = patterns.map(async (pattern) => {\n\t\t\tconst args = [...baseArgs, \"--\", pattern, ...pathArgs];\n\t\t\tcommands.push(formatRipgrepCommand(args));\n\t\t\tconst result = await runRipgrep(args, signal, commandCwd);\n\t\t\ttruncatedByBytes ||= result.truncated;\n\t\t\treturn { pattern, result };\n\t\t});\n\n\t\tlet results: Array<{\n\t\t\tpattern: string;\n\t\t\tresult: Awaited<ReturnType<typeof runRipgrep>>;\n\t\t}>;\n\t\ttry {\n\t\t\tresults = await Promise.all(ripgrepCalls);\n\t\t} catch (error) {\n\t\t\tconst reason =\n\t\t\t\terror instanceof Error\n\t\t\t\t\t? error.message\n\t\t\t\t\t: `Unknown error: ${String(error)}`;\n\t\t\treturn respond.error(`ripgrep failed\\n\\n${reason}`).detail({\n\t\t\t\tcommands,\n\t\t\t\tcwd: commandCwd,\n\t\t\t\tmatchCount: 0,\n\t\t\t\trangeCount: 0,\n\t\t\t\tranges: [],\n\t\t\t\ttruncated: false,\n\t\t\t});\n\t\t}\n\n\t\tlet matchCount = 0;\n\t\tconst rangesByFile = new Map<\n\t\t\tstring,\n\t\t\tArray<{ start: number; end: number; patterns: Set<string> }>\n\t\t>();\n\n\t\tfor (const { pattern, result } of results) {\n\t\t\tif (result.exitCode === 2) {\n\t\t\t\tconst message = result.stderr.trim() || result.stdout.trim();\n\t\t\t\tif (isRipgrepPathError(message)) {\n\t\t\t\t\treturn respond\n\t\t\t\t\t\t.error(\n\t\t\t\t\t\t\t`ripgrep failed\\n\\n${message.length > 0 ? message : \"ripgrep path lookup failed\"}`,\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.detail({\n\t\t\t\t\t\t\tcommands,\n\t\t\t\t\t\t\tcwd: commandCwd,\n\t\t\t\t\t\t\tmatchCount: 0,\n\t\t\t\t\t\t\trangeCount: 0,\n\t\t\t\t\t\t\tranges: [],\n\t\t\t\t\t\t\ttruncated: false,\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthrow new Error(\n\t\t\t\t\tmessage.length > 0 ? message : \"ripgrep exited with an error\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (result.exitCode === 1 || result.stdout.trim().length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst matches = parseRipgrepJson(result.stdout);\n\t\t\tmatchCount += matches.length;\n\n\t\t\tfor (const match of matches) {\n\t\t\t\tconst start = Math.max(1, match.line - before);\n\t\t\t\tconst end = match.line + after;\n\t\t\t\tconst ranges = rangesByFile.get(match.file) ?? [];\n\t\t\t\tranges.push({ start, end, patterns: new Set([pattern]) });\n\t\t\t\trangesByFile.set(match.file, ranges);\n\t\t\t}\n\t\t}\n\n\t\tif (matchCount === 0) {\n\t\t\treturn respond.text(\"No matches found.\").detail({\n\t\t\t\tcommands,\n\t\t\t\tcwd: commandCwd,\n\t\t\t\tmatchCount,\n\t\t\t\trangeCount: 0,\n\t\t\t\tranges: [],\n\t\t\t\ttruncated: false,\n\t\t\t});\n\t\t}\n\n\t\tconst mergedRanges: Array<{\n\t\t\tfile: string;\n\t\t\tstart: number;\n\t\t\tend: number;\n\t\t\tpatterns: Set<string>;\n\t\t}> = [];\n\t\tfor (const [file, ranges] of rangesByFile.entries()) {\n\t\t\tfor (const range of mergeRanges(ranges)) {\n\t\t\t\tmergedRanges.push({\n\t\t\t\t\tfile,\n\t\t\t\t\tstart: range.start,\n\t\t\t\t\tend: range.end,\n\t\t\t\t\tpatterns: range.patterns,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst rangeLimit = headLimit ?? RANGE_DETAIL_LIMIT;\n\t\tconst { ranges, truncated } = await buildRangeContent(\n\t\t\tcommandCwd,\n\t\t\tmergedRanges,\n\t\t\trangeLimit,\n\t\t);\n\n\t\tconst fileCount = new Set(ranges.map((range) => range.file)).size;\n\t\tconst summaryLines = ranges\n\t\t\t.map((range) => {\n\t\t\t\tconst header = `${range.file}:${range.start}-${range.end} [${range.patterns.join(\", \")}]:`;\n\t\t\t\treturn `${header}\\n${range.content}`;\n\t\t\t})\n\t\t\t.join(\"\\n\\n\");\n\n\t\tconst truncatedNote = truncated\n\t\t\t? `\\n\\n... (showing ${ranges.length} of ${mergedRanges.length} ranges)`\n\t\t\t: truncatedByBytes\n\t\t\t\t? \"\\n\\n... (output truncated due to size limit)\"\n\t\t\t\t: \"\";\n\n\t\treturn respond\n\t\t\t.text(\n\t\t\t\t`Found ${matchCount} match(es) across ${fileCount} file(s) for ${patterns.length} pattern(s). Extracted ${mergedRanges.length} line range(s).\\n\\n${summaryLines}${truncatedNote}`,\n\t\t\t)\n\t\t\t.detail({\n\t\t\t\tcommands,\n\t\t\t\tcwd: commandCwd,\n\t\t\t\tmatchCount,\n\t\t\t\trangeCount: mergedRanges.length,\n\t\t\t\tranges,\n\t\t\t\ttruncated: truncated || truncatedByBytes,\n\t\t\t});\n\t},\n});\n"]}
|
|
1
|
+
{"version":3,"file":"parallel-ripgrep.js","sourceRoot":"","sources":["../../src/tools/parallel-ripgrep.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Parallel Ripgrep Tool\n *\n * This tool enables searching for multiple regex patterns simultaneously\n * across a codebase. Unlike running separate ripgrep searches, this tool:\n *\n * 1. Runs all pattern searches in parallel for performance\n * 2. Merges overlapping line ranges to avoid duplicate context\n * 3. Returns consolidated results with per-pattern attribution\n *\n * Use cases:\n * - Finding function definitions AND their usages\n * - Searching for multiple related patterns (e.g., import + export)\n * - Finding all occurrences of related symbols\n *\n * The merging algorithm:\n * 1. Each pattern search returns line matches with context\n * 2. Matches are grouped by file\n * 3. Overlapping/adjacent ranges within a file are merged\n * 4. Final output shows which patterns matched each range\n */\n\nimport { promises as fs } from \"node:fs\";\nimport { resolve as resolvePath } from \"node:path\";\nimport { Type } from \"@sinclair/typebox\";\nimport {\n\tformatRipgrepCommand,\n\tglobSchema,\n\tisRipgrepPathError,\n\tnormalizeRipgrepPathArgs,\n\tparseRipgrepJson,\n\tpathSchema,\n\trunRipgrep,\n\ttoArray,\n} from \"./ripgrep-utils.js\";\nimport { createTool, expandUserPath } from \"./tool-dsl.js\";\n\n/** Maximum number of line ranges to include in detailed output */\nconst RANGE_DETAIL_LIMIT = 200;\n/** Default max matches per pattern (prevents runaway searches) */\nconst DEFAULT_MAX_RESULTS = 500;\n\nconst parallelRipgrepSchema = Type.Object({\n\tpatterns: Type.Array(Type.String({ minLength: 1 }), {\n\t\tminItems: 1,\n\t\tmaxItems: 10,\n\t\tdescription:\n\t\t\t\"Regex patterns to search for in parallel (1-10). Results are merged when matches overlap.\",\n\t}),\n\tpaths: pathSchema,\n\tglob: globSchema,\n\tignoreCase: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription: \"Case-insensitive search (-i) for all patterns\",\n\t\t\tdefault: false,\n\t\t}),\n\t),\n\tliteral: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription:\n\t\t\t\t\"Treat patterns as literal strings, not regex (--fixed-strings)\",\n\t\t\tdefault: false,\n\t\t}),\n\t),\n\tword: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription: \"Match whole words only (-w)\",\n\t\t\tdefault: false,\n\t\t}),\n\t),\n\tmultiline: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription: \"Enable multiline matching (--multiline)\",\n\t\t\tdefault: false,\n\t\t}),\n\t),\n\tmaxResults: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: \"Max matches per pattern (-m)\",\n\t\t\tminimum: 1,\n\t\t\tmaximum: 1000,\n\t\t}),\n\t),\n\tcontext: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: \"Lines of context before and after each match (-C)\",\n\t\t\tminimum: 0,\n\t\t\tmaximum: 20,\n\t\t}),\n\t),\n\tbeforeContext: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: \"Lines of context before each match (-B)\",\n\t\t\tminimum: 0,\n\t\t\tmaximum: 20,\n\t\t}),\n\t),\n\tafterContext: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: \"Lines of context after each match (-A)\",\n\t\t\tminimum: 0,\n\t\t\tmaximum: 20,\n\t\t}),\n\t),\n\tcwd: Type.Optional(\n\t\tType.String({\n\t\t\tdescription: \"Working directory for ripgrep\",\n\t\t\tminLength: 1,\n\t\t}),\n\t),\n\tincludeHidden: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription: \"Include hidden files (--hidden)\",\n\t\t\tdefault: false,\n\t\t}),\n\t),\n\tuseGitIgnore: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription: \"Respect .gitignore (false to pass --no-ignore)\",\n\t\t\tdefault: true,\n\t\t}),\n\t),\n\theadLimit: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: \"Max number of merged line ranges to return\",\n\t\t\tminimum: 1,\n\t\t\tmaximum: RANGE_DETAIL_LIMIT,\n\t\t}),\n\t),\n});\n\n/**\n * A single merged line range with its content.\n * Represents a contiguous block of lines that matched one or more patterns.\n */\ntype RangeDetail = {\n\t/** Relative path to the file */\n\tfile: string;\n\t/** First line number (1-based) */\n\tstart: number;\n\t/** Last line number (1-based, inclusive) */\n\tend: number;\n\t/** List of patterns that matched within this range */\n\tpatterns: string[];\n\t/** Actual content of the lines */\n\tcontent: string;\n};\n\n/**\n * Detailed output from the parallel ripgrep tool.\n * Includes both summary statistics and the full range details.\n */\ntype ParallelRipgrepDetails = {\n\t/** The ripgrep commands that were executed */\n\tcommands: string[];\n\t/** Working directory for the search */\n\tcwd: string;\n\t/** Total number of individual matches across all patterns */\n\tmatchCount: number;\n\t/** Number of merged line ranges in output */\n\trangeCount: number;\n\t/** The merged and deduplicated line ranges */\n\tranges: RangeDetail[];\n\t/** Whether output was truncated due to limits */\n\ttruncated: boolean;\n};\n\n/**\n * Merge overlapping or adjacent line ranges within a single file.\n *\n * This is the core deduplication logic. Given ranges like:\n * [1-5, 3-8, 10-12]\n * It produces:\n * [1-8, 10-12]\n *\n * Ranges are considered mergeable if they overlap or are exactly adjacent\n * (e.g., 1-5 and 6-10 merge to 1-10).\n *\n * Pattern sets are unioned when ranges merge.\n */\nfunction mergeRanges(\n\tranges: Array<{ start: number; end: number; patterns: Set<string> }>,\n): Array<{\n\tstart: number;\n\tend: number;\n\tpatterns: Set<string>;\n}> {\n\t// Sort by start line to enable single-pass merging\n\tconst sorted = [...ranges].sort((a, b) => a.start - b.start);\n\tconst merged: Array<{ start: number; end: number; patterns: Set<string> }> =\n\t\t[];\n\n\tfor (const range of sorted) {\n\t\tconst last = merged.at(-1);\n\t\t// Check if this range overlaps or is adjacent to the previous one\n\t\t// (start <= end + 1 allows for adjacent ranges to merge)\n\t\tif (last && range.start <= last.end + 1) {\n\t\t\t// Extend the previous range and merge patterns\n\t\t\tlast.end = Math.max(last.end, range.end);\n\t\t\tfor (const pattern of range.patterns) {\n\t\t\t\tlast.patterns.add(pattern);\n\t\t\t}\n\t\t} else {\n\t\t\t// Start a new merged range\n\t\t\tmerged.push({\n\t\t\t\tstart: range.start,\n\t\t\t\tend: range.end,\n\t\t\t\tpatterns: new Set(range.patterns),\n\t\t\t});\n\t\t}\n\t}\n\n\treturn merged;\n}\n\n/**\n * Read file contents for each merged range and build detailed output.\n *\n * This function:\n * 1. Sorts ranges by file then line number for consistent output\n * 2. Reads file contents (with caching to avoid re-reading)\n * 3. Extracts the actual line content for each range\n * 4. Applies the limit to avoid excessive output\n *\n * @param commandCwd - Working directory to resolve relative paths\n * @param ranges - The merged ranges to populate with content\n * @param limit - Maximum number of ranges to include\n */\nasync function buildRangeContent(\n\tcommandCwd: string,\n\tranges: Array<{\n\t\tfile: string;\n\t\tstart: number;\n\t\tend: number;\n\t\tpatterns: Set<string>;\n\t}>,\n\tlimit: number,\n): Promise<{ ranges: RangeDetail[]; truncated: boolean }> {\n\t// Sort for deterministic output: by file, then by line number\n\tconst mergedRanges = ranges.sort((a, b) => {\n\t\tif (a.file === b.file) {\n\t\t\treturn a.start - b.start;\n\t\t}\n\t\treturn a.file.localeCompare(b.file);\n\t});\n\n\tconst truncated = mergedRanges.length > limit;\n\tconst selected = mergedRanges.slice(0, limit);\n\n\t// Cache file contents to avoid re-reading the same file multiple times\n\tconst fileCache = new Map<string, string[]>();\n\tconst results: RangeDetail[] = [];\n\n\tfor (const range of selected) {\n\t\tconst absolutePath = resolvePath(commandCwd, range.file);\n\t\tlet lines: string[];\n\n\t\t// Check cache first\n\t\tif (fileCache.has(absolutePath)) {\n\t\t\tlines = fileCache.get(absolutePath) as string[];\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tconst content = await fs.readFile(absolutePath, \"utf-8\");\n\t\t\t\tlines = content.split(/\\r?\\n/);\n\t\t\t\tfileCache.set(absolutePath, lines);\n\t\t\t} catch {\n\t\t\t\t// Skip files that can't be read (deleted, permissions, etc.)\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t// Clamp range to actual file bounds\n\t\tconst start = Math.max(1, range.start);\n\t\tconst end = Math.min(range.end, lines.length);\n\t\tif (end < start) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Extract the content (lines array is 0-indexed, our ranges are 1-indexed)\n\t\tconst snippet = lines.slice(start - 1, end).join(\"\\n\");\n\t\tresults.push({\n\t\t\tfile: range.file,\n\t\t\tstart,\n\t\t\tend,\n\t\t\tpatterns: Array.from(range.patterns).sort(),\n\t\t\tcontent: snippet,\n\t\t});\n\t}\n\n\treturn { ranges: results, truncated };\n}\n\nexport const parallelRipgrepTool = createTool<\n\ttypeof parallelRipgrepSchema,\n\tParallelRipgrepDetails\n>({\n\tname: \"parallel_ripgrep\",\n\tlabel: \"parallel_ripgrep\",\n\tdescription:\n\t\t\"Search for multiple patterns simultaneously. Runs ripgrep queries in parallel, automatically merges overlapping line ranges, and returns consolidated content. Ideal for finding related code (e.g., function definitions AND usages) or multiple related patterns without duplicate context.\",\n\tschema: parallelRipgrepSchema,\n\tasync run(params, { signal, respond }) {\n\t\tconst {\n\t\t\tpatterns,\n\t\t\tpaths,\n\t\t\tglob,\n\t\t\tignoreCase,\n\t\t\tliteral,\n\t\t\tword,\n\t\t\tmultiline,\n\t\t\tmaxResults,\n\t\t\tcontext,\n\t\t\tbeforeContext,\n\t\t\tafterContext,\n\t\t\tcwd,\n\t\t\tincludeHidden,\n\t\t\tuseGitIgnore = true,\n\t\t\theadLimit,\n\t\t} = params;\n\n\t\tif (\n\t\t\tcontext !== undefined &&\n\t\t\t(beforeContext !== undefined || afterContext !== undefined)\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t\"Use either context or before/after context options, not both.\",\n\t\t\t);\n\t\t}\n\n\t\tconst pathArgs = normalizeRipgrepPathArgs(toArray(paths));\n\t\tconst globArgs = toArray(glob);\n\t\tconst commandCwd = cwd ? resolvePath(expandUserPath(cwd)) : process.cwd();\n\t\tconst before = beforeContext ?? context ?? 0;\n\t\tconst after = afterContext ?? context ?? 0;\n\n\t\tconst baseArgs: string[] = [\n\t\t\t\"--color=never\",\n\t\t\t\"--json\",\n\t\t\t\"-n\",\n\t\t\t\"--with-filename\",\n\t\t];\n\n\t\tif (ignoreCase) {\n\t\t\tbaseArgs.push(\"-i\");\n\t\t}\n\n\t\tif (literal) {\n\t\t\tbaseArgs.push(\"--fixed-strings\");\n\t\t}\n\n\t\tif (word) {\n\t\t\tbaseArgs.push(\"-w\");\n\t\t}\n\n\t\tif (multiline) {\n\t\t\tbaseArgs.push(\"--multiline\");\n\t\t}\n\n\t\tif (includeHidden) {\n\t\t\tbaseArgs.push(\"--hidden\");\n\t\t}\n\n\t\tif (!useGitIgnore) {\n\t\t\tbaseArgs.push(\"--no-ignore\");\n\t\t}\n\n\t\tconst effectiveMaxResults = maxResults ?? DEFAULT_MAX_RESULTS;\n\t\tbaseArgs.push(\"-m\", String(effectiveMaxResults));\n\n\t\tif (context !== undefined) {\n\t\t\tbaseArgs.push(`-C${context}`);\n\t\t}\n\n\t\tif (beforeContext !== undefined) {\n\t\t\tbaseArgs.push(`-B${beforeContext}`);\n\t\t}\n\n\t\tif (afterContext !== undefined) {\n\t\t\tbaseArgs.push(`-A${afterContext}`);\n\t\t}\n\n\t\tfor (const globPattern of globArgs) {\n\t\t\tbaseArgs.push(\"--glob\", globPattern);\n\t\t}\n\n\t\tif (pathArgs.length === 0) {\n\t\t\tpathArgs.push(\".\");\n\t\t}\n\n\t\tconst commands: string[] = [];\n\t\tlet truncatedByBytes = false;\n\t\tconst ripgrepCalls = patterns.map(async (pattern) => {\n\t\t\tconst args = [...baseArgs, \"--\", pattern, ...pathArgs];\n\t\t\tcommands.push(formatRipgrepCommand(args));\n\t\t\tconst result = await runRipgrep(args, signal, commandCwd);\n\t\t\ttruncatedByBytes ||= result.truncated;\n\t\t\treturn { pattern, result };\n\t\t});\n\n\t\tlet results: Array<{\n\t\t\tpattern: string;\n\t\t\tresult: Awaited<ReturnType<typeof runRipgrep>>;\n\t\t}>;\n\t\ttry {\n\t\t\tresults = await Promise.all(ripgrepCalls);\n\t\t} catch (error) {\n\t\t\tconst reason =\n\t\t\t\terror instanceof Error\n\t\t\t\t\t? error.message\n\t\t\t\t\t: `Unknown error: ${String(error)}`;\n\t\t\treturn respond.error(`ripgrep failed\\n\\n${reason}`).detail({\n\t\t\t\tcommands,\n\t\t\t\tcwd: commandCwd,\n\t\t\t\tmatchCount: 0,\n\t\t\t\trangeCount: 0,\n\t\t\t\tranges: [],\n\t\t\t\ttruncated: false,\n\t\t\t});\n\t\t}\n\n\t\tlet matchCount = 0;\n\t\tconst rangesByFile = new Map<\n\t\t\tstring,\n\t\t\tArray<{ start: number; end: number; patterns: Set<string> }>\n\t\t>();\n\n\t\tfor (const { pattern, result } of results) {\n\t\t\tif (result.exitCode === 2) {\n\t\t\t\tconst message = result.stderr.trim() || result.stdout.trim();\n\t\t\t\tif (isRipgrepPathError(message)) {\n\t\t\t\t\treturn respond\n\t\t\t\t\t\t.error(\n\t\t\t\t\t\t\t`ripgrep failed\\n\\n${message.length > 0 ? message : \"ripgrep path lookup failed\"}`,\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.detail({\n\t\t\t\t\t\t\tcommands,\n\t\t\t\t\t\t\tcwd: commandCwd,\n\t\t\t\t\t\t\tmatchCount: 0,\n\t\t\t\t\t\t\trangeCount: 0,\n\t\t\t\t\t\t\tranges: [],\n\t\t\t\t\t\t\ttruncated: false,\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthrow new Error(\n\t\t\t\t\tmessage.length > 0 ? message : \"ripgrep exited with an error\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (result.exitCode === 1 || result.stdout.trim().length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst matches = parseRipgrepJson(result.stdout);\n\t\t\tmatchCount += matches.length;\n\n\t\t\tfor (const match of matches) {\n\t\t\t\tconst start = Math.max(1, match.line - before);\n\t\t\t\tconst end = match.line + after;\n\t\t\t\tconst ranges = rangesByFile.get(match.file) ?? [];\n\t\t\t\tranges.push({ start, end, patterns: new Set([pattern]) });\n\t\t\t\trangesByFile.set(match.file, ranges);\n\t\t\t}\n\t\t}\n\n\t\tif (matchCount === 0) {\n\t\t\treturn respond.text(\"No matches found.\").detail({\n\t\t\t\tcommands,\n\t\t\t\tcwd: commandCwd,\n\t\t\t\tmatchCount,\n\t\t\t\trangeCount: 0,\n\t\t\t\tranges: [],\n\t\t\t\ttruncated: false,\n\t\t\t});\n\t\t}\n\n\t\tconst mergedRanges: Array<{\n\t\t\tfile: string;\n\t\t\tstart: number;\n\t\t\tend: number;\n\t\t\tpatterns: Set<string>;\n\t\t}> = [];\n\t\tfor (const [file, ranges] of rangesByFile.entries()) {\n\t\t\tfor (const range of mergeRanges(ranges)) {\n\t\t\t\tmergedRanges.push({\n\t\t\t\t\tfile,\n\t\t\t\t\tstart: range.start,\n\t\t\t\t\tend: range.end,\n\t\t\t\t\tpatterns: range.patterns,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst rangeLimit = headLimit ?? RANGE_DETAIL_LIMIT;\n\t\tconst { ranges, truncated } = await buildRangeContent(\n\t\t\tcommandCwd,\n\t\t\tmergedRanges,\n\t\t\trangeLimit,\n\t\t);\n\n\t\tconst fileCount = new Set(ranges.map((range) => range.file)).size;\n\t\tconst summaryLines = ranges\n\t\t\t.map((range) => {\n\t\t\t\tconst header = `${range.file}:${range.start}-${range.end} [${range.patterns.join(\", \")}]:`;\n\t\t\t\treturn `${header}\\n${range.content}`;\n\t\t\t})\n\t\t\t.join(\"\\n\\n\");\n\n\t\tconst truncatedNote = truncated\n\t\t\t? `\\n\\n... (showing ${ranges.length} of ${mergedRanges.length} ranges)`\n\t\t\t: truncatedByBytes\n\t\t\t\t? \"\\n\\n... (output truncated due to size limit)\"\n\t\t\t\t: \"\";\n\n\t\treturn respond\n\t\t\t.text(\n\t\t\t\t`Found ${matchCount} match(es) across ${fileCount} file(s) for ${patterns.length} pattern(s). Extracted ${mergedRanges.length} line range(s).\\n\\n${summaryLines}${truncatedNote}`,\n\t\t\t)\n\t\t\t.detail({\n\t\t\t\tcommands,\n\t\t\t\tcwd: commandCwd,\n\t\t\t\tmatchCount,\n\t\t\t\trangeCount: mergedRanges.length,\n\t\t\t\tranges,\n\t\t\t\ttruncated: truncated || truncatedByBytes,\n\t\t\t});\n\t},\n});\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export declare const pathSchema: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>]>>;
|
|
2
2
|
export declare const globSchema: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>]>>;
|
|
3
3
|
export declare function toArray<T>(value: T | T[] | undefined): T[];
|
|
4
|
+
export declare function normalizeRipgrepPathArgs(paths: string[]): string[];
|
|
4
5
|
export declare function formatRipgrepCommand(args: string[]): string;
|
|
5
6
|
export declare function isRipgrepPathError(message: string): boolean;
|
|
6
7
|
export declare function runRipgrep(args: string[], signal?: AbortSignal, cwd?: string): Promise<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ripgrep-utils.d.ts","sourceRoot":"","sources":["../../src/tools/ripgrep-utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ripgrep-utils.d.ts","sourceRoot":"","sources":["../../src/tools/ripgrep-utils.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,UAAU,2LActB,CAAC;AAEF,eAAO,MAAM,UAAU,2LActB,CAAC;AAEF,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,GAAG,CAAC,EAAE,CAK1D;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAElE;AAgHD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAE3D;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAI3D;AAED,wBAAsB,UAAU,CAC/B,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,CAAC,EAAE,WAAW,EACpB,GAAG,CAAC,EAAE,MAAM,GACV,OAAO,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACnB,CAAC,CAoDD;AAED,MAAM,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE,CAmC/D"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
2
|
import { Type } from "@sinclair/typebox";
|
|
3
3
|
import { safeJsonParse } from "../utils/json.js";
|
|
4
|
+
import { expandTildePath } from "../utils/path-expansion.js";
|
|
4
5
|
import { ensureTool } from "./tools-manager.js";
|
|
5
6
|
export const pathSchema = Type.Optional(Type.Union([
|
|
6
7
|
Type.String({
|
|
@@ -28,6 +29,9 @@ export function toArray(value) {
|
|
|
28
29
|
}
|
|
29
30
|
return Array.isArray(value) ? value : [value];
|
|
30
31
|
}
|
|
32
|
+
export function normalizeRipgrepPathArgs(paths) {
|
|
33
|
+
return paths.map((path) => expandTildePath(path));
|
|
34
|
+
}
|
|
31
35
|
const MAX_RIPGREP_OUTPUT_BYTES = 2_000_000; // ~2MB safeguard
|
|
32
36
|
let ripgrepExecutablePromise = null;
|
|
33
37
|
let ripgrepInstallController = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ripgrep-utils.js","sourceRoot":"","sources":["../../src/tools/ripgrep-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { Type } from \"@sinclair/typebox\";\nimport { safeJsonParse } from \"../utils/json.js\";\nimport { ensureTool } from \"./tools-manager.js\";\n\nexport const pathSchema = Type.Optional(\n\tType.Union([\n\t\tType.String({\n\t\t\tdescription: \"Directory or file to search\",\n\t\t\tminLength: 1,\n\t\t}),\n\t\tType.Array(\n\t\t\tType.String({\n\t\t\t\tdescription: \"Multiple directories or files to search\",\n\t\t\t\tminLength: 1,\n\t\t\t}),\n\t\t\t{ minItems: 1 },\n\t\t),\n\t]),\n);\n\nexport const globSchema = Type.Optional(\n\tType.Union([\n\t\tType.String({\n\t\t\tdescription: \"Glob pattern passed to ripgrep\",\n\t\t\tminLength: 1,\n\t\t}),\n\t\tType.Array(\n\t\t\tType.String({\n\t\t\t\tdescription: \"Multiple glob patterns\",\n\t\t\t\tminLength: 1,\n\t\t\t}),\n\t\t\t{ minItems: 1 },\n\t\t),\n\t]),\n);\n\nexport function toArray<T>(value: T | T[] | undefined): T[] {\n\tif (value === undefined) {\n\t\treturn [];\n\t}\n\treturn Array.isArray(value) ? value : [value];\n}\n\nconst MAX_RIPGREP_OUTPUT_BYTES = 2_000_000; // ~2MB safeguard\nlet ripgrepExecutablePromise: Promise<string | null> | null = null;\nlet ripgrepInstallController: AbortController | null = null;\nlet ripgrepExecutableWaiters = 0;\n\nfunction ripgrepAbortError(): Error {\n\treturn new Error(\"ripgrep search aborted before start\");\n}\n\nfunction resetRipgrepExecutablePromise(): void {\n\tripgrepExecutablePromise = null;\n\tripgrepInstallController = null;\n}\n\nfunction getRipgrepExecutablePromise(): Promise<string | null> {\n\tif (!ripgrepExecutablePromise) {\n\t\tconst controller = new AbortController();\n\t\tripgrepInstallController = controller;\n\t\tconst promise = ensureTool(\"rg\", true, controller.signal).then(\n\t\t\t(executable) => {\n\t\t\t\tif (ripgrepInstallController === controller) {\n\t\t\t\t\tripgrepInstallController = null;\n\t\t\t\t}\n\t\t\t\tif (ripgrepExecutablePromise === promise && !executable) {\n\t\t\t\t\tripgrepExecutablePromise = null;\n\t\t\t\t}\n\t\t\t\treturn executable;\n\t\t\t},\n\t\t\t(error) => {\n\t\t\t\tif (ripgrepInstallController === controller) {\n\t\t\t\t\tripgrepInstallController = null;\n\t\t\t\t}\n\t\t\t\tif (ripgrepExecutablePromise === promise) {\n\t\t\t\t\tripgrepExecutablePromise = null;\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t},\n\t\t);\n\t\tripgrepExecutablePromise = promise;\n\t}\n\treturn ripgrepExecutablePromise;\n}\n\nfunction releaseRipgrepExecutableWaiter(signal?: AbortSignal): void {\n\tripgrepExecutableWaiters = Math.max(0, ripgrepExecutableWaiters - 1);\n\tif (signal?.aborted && ripgrepExecutableWaiters === 0) {\n\t\tconst controller = ripgrepInstallController;\n\t\tresetRipgrepExecutablePromise();\n\t\tcontroller?.abort(signal.reason);\n\t}\n}\n\nasync function waitForRipgrepExecutableWithAbort(\n\tpromise: Promise<string | null>,\n\tsignal: AbortSignal,\n): Promise<string | null> {\n\tthrowIfRipgrepAborted(signal);\n\treturn await new Promise<string | null>((resolve, reject) => {\n\t\tconst onAbort = (): void => {\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t\treject(ripgrepAbortError());\n\t\t};\n\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\tpromise.then(resolve, reject).finally(() => {\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t});\n\t});\n}\n\nasync function resolveRipgrepExecutable(signal?: AbortSignal): Promise<string> {\n\tripgrepExecutableWaiters += 1;\n\ttry {\n\t\tconst promise = getRipgrepExecutablePromise();\n\t\tconst executable = signal\n\t\t\t? await waitForRipgrepExecutableWithAbort(promise, signal)\n\t\t\t: await promise;\n\t\tif (!executable) {\n\t\t\tthrow new Error(\"ripgrep is not available and could not be downloaded\");\n\t\t}\n\t\treturn executable;\n\t} finally {\n\t\treleaseRipgrepExecutableWaiter(signal);\n\t}\n}\n\nfunction throwIfRipgrepAborted(signal?: AbortSignal): void {\n\tif (signal?.aborted) {\n\t\tthrow ripgrepAbortError();\n\t}\n}\n\nasync function resolveRipgrepExecutableWithAbort(\n\tsignal?: AbortSignal,\n): Promise<string> {\n\tthrowIfRipgrepAborted(signal);\n\tif (!signal) {\n\t\treturn await resolveRipgrepExecutable();\n\t}\n\n\treturn await resolveRipgrepExecutable(signal);\n}\n\nfunction shellQuoteArg(value: string): string {\n\tif (/^[A-Za-z0-9_/:=.,@%+-]+$/.test(value)) {\n\t\treturn value;\n\t}\n\treturn `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nexport function formatRipgrepCommand(args: string[]): string {\n\treturn [\"rg\", ...args].map(shellQuoteArg).join(\" \");\n}\n\nexport function isRipgrepPathError(message: string): boolean {\n\treturn /No such file or directory|IO error|os error 2|system cannot find the path/i.test(\n\t\tmessage,\n\t);\n}\n\nexport async function runRipgrep(\n\targs: string[],\n\tsignal?: AbortSignal,\n\tcwd?: string,\n): Promise<{\n\tstdout: string;\n\tstderr: string;\n\texitCode: number;\n\ttruncated: boolean;\n}> {\n\tconst executable = await resolveRipgrepExecutableWithAbort(signal);\n\tthrowIfRipgrepAborted(signal);\n\tconst child = spawn(executable, args, {\n\t\tcwd: cwd ?? process.cwd(),\n\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\tsignal,\n\t});\n\n\treturn await new Promise((resolve, reject) => {\n\t\tlet stdout = \"\";\n\t\tlet stderr = \"\";\n\t\tlet truncated = false;\n\n\t\tchild.stdout.setEncoding(\"utf-8\");\n\t\tchild.stdout.on(\"data\", (chunk) => {\n\t\t\tif (stdout.length + chunk.length > MAX_RIPGREP_OUTPUT_BYTES) {\n\t\t\t\ttruncated = true;\n\t\t\t\tstdout += chunk\n\t\t\t\t\t.slice(0, Math.max(0, MAX_RIPGREP_OUTPUT_BYTES - stdout.length))\n\t\t\t\t\t.toString();\n\t\t\t\tchild.kill(\"SIGTERM\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstdout += chunk;\n\t\t});\n\n\t\tchild.stderr.setEncoding(\"utf-8\");\n\t\tchild.stderr.on(\"data\", (chunk) => {\n\t\t\tif (stderr.length + chunk.length > MAX_RIPGREP_OUTPUT_BYTES) {\n\t\t\t\ttruncated = true;\n\t\t\t\tstderr += chunk\n\t\t\t\t\t.slice(0, Math.max(0, MAX_RIPGREP_OUTPUT_BYTES - stderr.length))\n\t\t\t\t\t.toString();\n\t\t\t\tchild.kill(\"SIGTERM\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstderr += chunk;\n\t\t});\n\n\t\tchild.once(\"error\", (error) => {\n\t\t\treject(\n\t\t\t\terror instanceof Error\n\t\t\t\t\t? new Error(`Failed to start ripgrep: ${error.message}`)\n\t\t\t\t\t: new Error(`Failed to start ripgrep: ${String(error)}`),\n\t\t\t);\n\t\t});\n\n\t\tchild.once(\"close\", (code) => {\n\t\t\tresolve({ stdout, stderr, exitCode: code ?? 0, truncated });\n\t\t});\n\t});\n}\n\nexport type RipgrepMatch = {\n\tfile: string;\n\tline: number;\n\tcolumn: number;\n\tmatch: string;\n\tlines: string;\n};\n\nexport function parseRipgrepJson(output: string): RipgrepMatch[] {\n\tconst matches: RipgrepMatch[] = [];\n\tfor (const line of output.split(/\\r?\\n/)) {\n\t\tif (!line.trim()) continue;\n\t\tconst parsed = safeJsonParse<unknown>(line, \"ripgrep output\");\n\t\tif (!parsed.success) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst event = parsed.data as {\n\t\t\ttype?: string;\n\t\t\tdata?: {\n\t\t\t\tpath?: { text?: string };\n\t\t\t\tline_number?: number;\n\t\t\t\tlines?: { text?: string };\n\t\t\t\tsubmatches?: Array<{\n\t\t\t\t\tstart?: number;\n\t\t\t\t\tmatch?: { text?: string };\n\t\t\t\t}>;\n\t\t\t};\n\t\t};\n\t\tif (event.type !== \"match\") {\n\t\t\tcontinue;\n\t\t}\n\t\tconst pathText = event.data?.path?.text ?? \"\";\n\t\tfor (const submatch of event.data?.submatches ?? []) {\n\t\t\tmatches.push({\n\t\t\t\tfile: pathText,\n\t\t\t\tline: event.data?.line_number ?? 0,\n\t\t\t\tcolumn: submatch.start ?? 0,\n\t\t\t\tmatch: submatch.match?.text ?? \"\",\n\t\t\t\tlines: event.data?.lines?.text ?? \"\",\n\t\t\t});\n\t\t}\n\t}\n\treturn matches;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ripgrep-utils.js","sourceRoot":"","sources":["../../src/tools/ripgrep-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { Type } from \"@sinclair/typebox\";\nimport { safeJsonParse } from \"../utils/json.js\";\nimport { expandTildePath } from \"../utils/path-expansion.js\";\nimport { ensureTool } from \"./tools-manager.js\";\n\nexport const pathSchema = Type.Optional(\n\tType.Union([\n\t\tType.String({\n\t\t\tdescription: \"Directory or file to search\",\n\t\t\tminLength: 1,\n\t\t}),\n\t\tType.Array(\n\t\t\tType.String({\n\t\t\t\tdescription: \"Multiple directories or files to search\",\n\t\t\t\tminLength: 1,\n\t\t\t}),\n\t\t\t{ minItems: 1 },\n\t\t),\n\t]),\n);\n\nexport const globSchema = Type.Optional(\n\tType.Union([\n\t\tType.String({\n\t\t\tdescription: \"Glob pattern passed to ripgrep\",\n\t\t\tminLength: 1,\n\t\t}),\n\t\tType.Array(\n\t\t\tType.String({\n\t\t\t\tdescription: \"Multiple glob patterns\",\n\t\t\t\tminLength: 1,\n\t\t\t}),\n\t\t\t{ minItems: 1 },\n\t\t),\n\t]),\n);\n\nexport function toArray<T>(value: T | T[] | undefined): T[] {\n\tif (value === undefined) {\n\t\treturn [];\n\t}\n\treturn Array.isArray(value) ? value : [value];\n}\n\nexport function normalizeRipgrepPathArgs(paths: string[]): string[] {\n\treturn paths.map((path) => expandTildePath(path));\n}\n\nconst MAX_RIPGREP_OUTPUT_BYTES = 2_000_000; // ~2MB safeguard\nlet ripgrepExecutablePromise: Promise<string | null> | null = null;\nlet ripgrepInstallController: AbortController | null = null;\nlet ripgrepExecutableWaiters = 0;\n\nfunction ripgrepAbortError(): Error {\n\treturn new Error(\"ripgrep search aborted before start\");\n}\n\nfunction resetRipgrepExecutablePromise(): void {\n\tripgrepExecutablePromise = null;\n\tripgrepInstallController = null;\n}\n\nfunction getRipgrepExecutablePromise(): Promise<string | null> {\n\tif (!ripgrepExecutablePromise) {\n\t\tconst controller = new AbortController();\n\t\tripgrepInstallController = controller;\n\t\tconst promise = ensureTool(\"rg\", true, controller.signal).then(\n\t\t\t(executable) => {\n\t\t\t\tif (ripgrepInstallController === controller) {\n\t\t\t\t\tripgrepInstallController = null;\n\t\t\t\t}\n\t\t\t\tif (ripgrepExecutablePromise === promise && !executable) {\n\t\t\t\t\tripgrepExecutablePromise = null;\n\t\t\t\t}\n\t\t\t\treturn executable;\n\t\t\t},\n\t\t\t(error) => {\n\t\t\t\tif (ripgrepInstallController === controller) {\n\t\t\t\t\tripgrepInstallController = null;\n\t\t\t\t}\n\t\t\t\tif (ripgrepExecutablePromise === promise) {\n\t\t\t\t\tripgrepExecutablePromise = null;\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t},\n\t\t);\n\t\tripgrepExecutablePromise = promise;\n\t}\n\treturn ripgrepExecutablePromise;\n}\n\nfunction releaseRipgrepExecutableWaiter(signal?: AbortSignal): void {\n\tripgrepExecutableWaiters = Math.max(0, ripgrepExecutableWaiters - 1);\n\tif (signal?.aborted && ripgrepExecutableWaiters === 0) {\n\t\tconst controller = ripgrepInstallController;\n\t\tresetRipgrepExecutablePromise();\n\t\tcontroller?.abort(signal.reason);\n\t}\n}\n\nasync function waitForRipgrepExecutableWithAbort(\n\tpromise: Promise<string | null>,\n\tsignal: AbortSignal,\n): Promise<string | null> {\n\tthrowIfRipgrepAborted(signal);\n\treturn await new Promise<string | null>((resolve, reject) => {\n\t\tconst onAbort = (): void => {\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t\treject(ripgrepAbortError());\n\t\t};\n\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\tpromise.then(resolve, reject).finally(() => {\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t});\n\t});\n}\n\nasync function resolveRipgrepExecutable(signal?: AbortSignal): Promise<string> {\n\tripgrepExecutableWaiters += 1;\n\ttry {\n\t\tconst promise = getRipgrepExecutablePromise();\n\t\tconst executable = signal\n\t\t\t? await waitForRipgrepExecutableWithAbort(promise, signal)\n\t\t\t: await promise;\n\t\tif (!executable) {\n\t\t\tthrow new Error(\"ripgrep is not available and could not be downloaded\");\n\t\t}\n\t\treturn executable;\n\t} finally {\n\t\treleaseRipgrepExecutableWaiter(signal);\n\t}\n}\n\nfunction throwIfRipgrepAborted(signal?: AbortSignal): void {\n\tif (signal?.aborted) {\n\t\tthrow ripgrepAbortError();\n\t}\n}\n\nasync function resolveRipgrepExecutableWithAbort(\n\tsignal?: AbortSignal,\n): Promise<string> {\n\tthrowIfRipgrepAborted(signal);\n\tif (!signal) {\n\t\treturn await resolveRipgrepExecutable();\n\t}\n\n\treturn await resolveRipgrepExecutable(signal);\n}\n\nfunction shellQuoteArg(value: string): string {\n\tif (/^[A-Za-z0-9_/:=.,@%+-]+$/.test(value)) {\n\t\treturn value;\n\t}\n\treturn `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nexport function formatRipgrepCommand(args: string[]): string {\n\treturn [\"rg\", ...args].map(shellQuoteArg).join(\" \");\n}\n\nexport function isRipgrepPathError(message: string): boolean {\n\treturn /No such file or directory|IO error|os error 2|system cannot find the path/i.test(\n\t\tmessage,\n\t);\n}\n\nexport async function runRipgrep(\n\targs: string[],\n\tsignal?: AbortSignal,\n\tcwd?: string,\n): Promise<{\n\tstdout: string;\n\tstderr: string;\n\texitCode: number;\n\ttruncated: boolean;\n}> {\n\tconst executable = await resolveRipgrepExecutableWithAbort(signal);\n\tthrowIfRipgrepAborted(signal);\n\tconst child = spawn(executable, args, {\n\t\tcwd: cwd ?? process.cwd(),\n\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\tsignal,\n\t});\n\n\treturn await new Promise((resolve, reject) => {\n\t\tlet stdout = \"\";\n\t\tlet stderr = \"\";\n\t\tlet truncated = false;\n\n\t\tchild.stdout.setEncoding(\"utf-8\");\n\t\tchild.stdout.on(\"data\", (chunk) => {\n\t\t\tif (stdout.length + chunk.length > MAX_RIPGREP_OUTPUT_BYTES) {\n\t\t\t\ttruncated = true;\n\t\t\t\tstdout += chunk\n\t\t\t\t\t.slice(0, Math.max(0, MAX_RIPGREP_OUTPUT_BYTES - stdout.length))\n\t\t\t\t\t.toString();\n\t\t\t\tchild.kill(\"SIGTERM\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstdout += chunk;\n\t\t});\n\n\t\tchild.stderr.setEncoding(\"utf-8\");\n\t\tchild.stderr.on(\"data\", (chunk) => {\n\t\t\tif (stderr.length + chunk.length > MAX_RIPGREP_OUTPUT_BYTES) {\n\t\t\t\ttruncated = true;\n\t\t\t\tstderr += chunk\n\t\t\t\t\t.slice(0, Math.max(0, MAX_RIPGREP_OUTPUT_BYTES - stderr.length))\n\t\t\t\t\t.toString();\n\t\t\t\tchild.kill(\"SIGTERM\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstderr += chunk;\n\t\t});\n\n\t\tchild.once(\"error\", (error) => {\n\t\t\treject(\n\t\t\t\terror instanceof Error\n\t\t\t\t\t? new Error(`Failed to start ripgrep: ${error.message}`)\n\t\t\t\t\t: new Error(`Failed to start ripgrep: ${String(error)}`),\n\t\t\t);\n\t\t});\n\n\t\tchild.once(\"close\", (code) => {\n\t\t\tresolve({ stdout, stderr, exitCode: code ?? 0, truncated });\n\t\t});\n\t});\n}\n\nexport type RipgrepMatch = {\n\tfile: string;\n\tline: number;\n\tcolumn: number;\n\tmatch: string;\n\tlines: string;\n};\n\nexport function parseRipgrepJson(output: string): RipgrepMatch[] {\n\tconst matches: RipgrepMatch[] = [];\n\tfor (const line of output.split(/\\r?\\n/)) {\n\t\tif (!line.trim()) continue;\n\t\tconst parsed = safeJsonParse<unknown>(line, \"ripgrep output\");\n\t\tif (!parsed.success) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst event = parsed.data as {\n\t\t\ttype?: string;\n\t\t\tdata?: {\n\t\t\t\tpath?: { text?: string };\n\t\t\t\tline_number?: number;\n\t\t\t\tlines?: { text?: string };\n\t\t\t\tsubmatches?: Array<{\n\t\t\t\t\tstart?: number;\n\t\t\t\t\tmatch?: { text?: string };\n\t\t\t\t}>;\n\t\t\t};\n\t\t};\n\t\tif (event.type !== \"match\") {\n\t\t\tcontinue;\n\t\t}\n\t\tconst pathText = event.data?.path?.text ?? \"\";\n\t\tfor (const submatch of event.data?.submatches ?? []) {\n\t\t\tmatches.push({\n\t\t\t\tfile: pathText,\n\t\t\t\tline: event.data?.line_number ?? 0,\n\t\t\t\tcolumn: submatch.start ?? 0,\n\t\t\t\tmatch: submatch.match?.text ?? \"\",\n\t\t\t\tlines: event.data?.lines?.text ?? \"\",\n\t\t\t});\n\t\t}\n\t}\n\treturn matches;\n}\n"]}
|