@evalops/maestro 0.10.29 → 0.10.31
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/agent/compaction/cut-points.d.ts +157 -0
- package/dist/agent/compaction/cut-points.d.ts.map +1 -0
- package/dist/agent/compaction/cut-points.js +341 -0
- package/dist/agent/compaction/cut-points.js.map +1 -0
- package/dist/agent/compaction.d.ts +4 -144
- package/dist/agent/compaction.d.ts.map +1 -1
- package/dist/agent/compaction.js +5 -340
- package/dist/agent/compaction.js.map +1 -1
- package/dist/agent/transport/events.d.ts +23 -0
- package/dist/agent/transport/events.d.ts.map +1 -0
- package/dist/agent/transport/events.js +69 -0
- package/dist/agent/transport/events.js.map +1 -0
- package/dist/agent/transport.d.ts.map +1 -1
- package/dist/agent/transport.js +1 -68
- package/dist/agent/transport.js.map +1 -1
- package/dist/cli.js +247 -203
- package/dist/node_modules/@evalops/contracts/package.json +1 -1
- package/dist/node_modules/@evalops/tui/package.json +1 -1
- package/dist/server/agent-runtime-ledger.d.ts +18 -3
- package/dist/server/agent-runtime-ledger.d.ts.map +1 -1
- package/dist/server/agent-runtime-ledger.js +45 -1
- package/dist/server/agent-runtime-ledger.js.map +1 -1
- package/dist/tools/parallel-ripgrep.d.ts.map +1 -1
- package/dist/tools/parallel-ripgrep.js +1 -10
- 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 +9 -0
- package/dist/tools/ripgrep-utils.js.map +1 -1
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +4 -4
- package/dist/tools/search.js.map +1 -1
- package/dist/version.json +2 -2
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-runtime-ledger.d.ts","sourceRoot":"","sources":["../../src/server/agent-runtime-ledger.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"agent-runtime-ledger.d.ts","sourceRoot":"","sources":["../../src/server/agent-runtime-ledger.ts"],"names":[],"mappings":"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"}
|
|
@@ -110,6 +110,39 @@ function waitTypeForEntry(kind, timelineItem) {
|
|
|
110
110
|
return "AGENT_RUN_WAIT_TYPE_INPUT";
|
|
111
111
|
return "AGENT_RUN_WAIT_TYPE_APPROVAL";
|
|
112
112
|
}
|
|
113
|
+
function firstEvidenceIdForEvent(event, kind) {
|
|
114
|
+
return event.evidence.find((anchor) => anchor.kind === kind)?.id;
|
|
115
|
+
}
|
|
116
|
+
function hasCorrelation(correlation) {
|
|
117
|
+
return Object.values(correlation).some((value) => typeof value === "string" && value.length > 0);
|
|
118
|
+
}
|
|
119
|
+
function correlationForEvent(event, timelineItem) {
|
|
120
|
+
const pendingRequestId = timelineItem?.pendingRequestId ??
|
|
121
|
+
firstEvidenceIdForEvent(event, "pending_request");
|
|
122
|
+
const approvalRequestId = timelineItem?.approvalRequestId ??
|
|
123
|
+
firstEvidenceIdForEvent(event, "approval_request");
|
|
124
|
+
const toolExecutionId = timelineItem?.toolExecutionId ??
|
|
125
|
+
firstEvidenceIdForEvent(event, "tool_execution");
|
|
126
|
+
const artifactId = timelineItem?.artifactId ?? firstEvidenceIdForEvent(event, "artifact");
|
|
127
|
+
const agentRunId = timelineItem?.agentRunId ?? firstEvidenceIdForEvent(event, "agent_run");
|
|
128
|
+
const parentAgentRunId = timelineItem?.parentAgentRunId ??
|
|
129
|
+
firstEvidenceIdForEvent(event, "parent_agent_run");
|
|
130
|
+
const childAgentRunId = timelineItem?.childAgentRunId ??
|
|
131
|
+
firstEvidenceIdForEvent(event, "child_agent_run");
|
|
132
|
+
const correlation = {
|
|
133
|
+
...(pendingRequestId ? { pendingRequestId } : {}),
|
|
134
|
+
...(timelineItem?.pendingRequestKind
|
|
135
|
+
? { pendingRequestKind: timelineItem.pendingRequestKind }
|
|
136
|
+
: {}),
|
|
137
|
+
...(approvalRequestId ? { approvalRequestId } : {}),
|
|
138
|
+
...(toolExecutionId ? { toolExecutionId } : {}),
|
|
139
|
+
...(artifactId ? { artifactId } : {}),
|
|
140
|
+
...(agentRunId ? { agentRunId } : {}),
|
|
141
|
+
...(parentAgentRunId ? { parentAgentRunId } : {}),
|
|
142
|
+
...(childAgentRunId ? { childAgentRunId } : {}),
|
|
143
|
+
};
|
|
144
|
+
return hasCorrelation(correlation) ? correlation : undefined;
|
|
145
|
+
}
|
|
113
146
|
function buildLedgerEntries(timeline, trajectory) {
|
|
114
147
|
const timelineItemsById = new Map(timeline.items.map((item) => [item.id, item]));
|
|
115
148
|
return trajectory.events.map((event) => {
|
|
@@ -120,6 +153,7 @@ function buildLedgerEntries(timeline, trajectory) {
|
|
|
120
153
|
? timelineItemsById.get(timelineItemId)
|
|
121
154
|
: undefined;
|
|
122
155
|
const waitType = waitTypeForEntry(kind, timelineItem);
|
|
156
|
+
const correlation = correlationForEvent(event, timelineItem);
|
|
123
157
|
return {
|
|
124
158
|
id: `ledger:${event.id}`,
|
|
125
159
|
sequence: event.sequence,
|
|
@@ -138,6 +172,7 @@ function buildLedgerEntries(timeline, trajectory) {
|
|
|
138
172
|
...(event.summary ? { summary: event.summary } : {}),
|
|
139
173
|
relatedIds: event.relatedIds ?? [],
|
|
140
174
|
evidence: event.evidence,
|
|
175
|
+
...(correlation ? { correlation } : {}),
|
|
141
176
|
platformShape: {
|
|
142
177
|
stepKind: stepKindForEntry(kind, event),
|
|
143
178
|
workItemKind: workItemKindForEntry(kind),
|
|
@@ -231,6 +266,7 @@ function workItemPayloadForEntry(sessionId, entry) {
|
|
|
231
266
|
...(entry.toolName ? { toolName: entry.toolName } : {}),
|
|
232
267
|
...(entry.summary ? { summary: entry.summary } : {}),
|
|
233
268
|
...(entry.relatedIds.length > 0 ? { relatedIds: entry.relatedIds } : {}),
|
|
269
|
+
...(entry.correlation ? { correlation: entry.correlation } : {}),
|
|
234
270
|
};
|
|
235
271
|
}
|
|
236
272
|
function terminalEntry(entries) {
|
|
@@ -257,6 +293,11 @@ function terminalOperation(runId, entries) {
|
|
|
257
293
|
payload: {
|
|
258
294
|
state: succeeded ? "succeeded" : "failed",
|
|
259
295
|
timestamp: terminal.timestamp,
|
|
296
|
+
ledgerEntryId: terminal.id,
|
|
297
|
+
trajectoryEventId: terminal.trajectoryEventId,
|
|
298
|
+
eventType: terminal.type,
|
|
299
|
+
title: terminal.title,
|
|
300
|
+
evidenceRefs: evidenceRefsForEntry(terminal),
|
|
260
301
|
...(succeeded
|
|
261
302
|
? {}
|
|
262
303
|
: {
|
|
@@ -294,7 +335,8 @@ function buildPromotionPlan(runId, sessionId, generatedAt, entries) {
|
|
|
294
335
|
},
|
|
295
336
|
];
|
|
296
337
|
for (const entry of entries) {
|
|
297
|
-
const
|
|
338
|
+
const correlation = entry.correlation ?? {};
|
|
339
|
+
const toolExecutionId = correlation.toolExecutionId ?? firstEvidenceId(entry, "tool_execution");
|
|
298
340
|
const evidenceRefs = evidenceRefsForEntry(entry);
|
|
299
341
|
const waitId = entry.platformShape.waitType ? entry.id : undefined;
|
|
300
342
|
operations.push({
|
|
@@ -321,6 +363,7 @@ function buildPromotionPlan(runId, sessionId, generatedAt, entries) {
|
|
|
321
363
|
title: entry.title,
|
|
322
364
|
timestamp: entry.timestamp,
|
|
323
365
|
...(waitId ? { waitId } : {}),
|
|
366
|
+
...correlation,
|
|
324
367
|
...(toolExecutionId ? { toolExecutionId } : {}),
|
|
325
368
|
evidenceRefs,
|
|
326
369
|
completionGate: "maestro_agent_runtime_ledger_recorded",
|
|
@@ -337,6 +380,7 @@ function buildPromotionPlan(runId, sessionId, generatedAt, entries) {
|
|
|
337
380
|
waitType: entry.platformShape.waitType,
|
|
338
381
|
title: entry.title,
|
|
339
382
|
timestamp: entry.timestamp,
|
|
383
|
+
...correlation,
|
|
340
384
|
},
|
|
341
385
|
});
|
|
342
386
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-runtime-ledger.js","sourceRoot":"","sources":["../../src/server/agent-runtime-ledger.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tComposerRunTimelineItem,\n\tComposerRunTimelineResponse,\n\tComposerRunTimelineStatus,\n\tComposerRunTimelineVisibility,\n} from \"@evalops/contracts\";\nimport type { AgentTrajectoryReplayReport } from \"./agent-trajectory-replay.js\";\nimport type {\n\tAgentTrajectoryEvent,\n\tAgentTrajectoryReport,\n} from \"./agent-trajectory.js\";\n\nexport const AGENT_RUNTIME_LEDGER_SCHEMA =\n\t\"evalops.maestro.agent-runtime-ledger.v1\";\nexport const AGENT_RUNTIME_REPLAY_SUMMARY_SCHEMA =\n\t\"evalops.maestro.agent-runtime-replay-summary.v1\";\nexport const AGENT_RUNTIME_PROMOTION_PLAN_SCHEMA =\n\t\"evalops.maestro.agent-runtime-promotion-plan.v1\";\n\nexport type AgentRuntimeLedgerEntryKind =\n\t| \"run\"\n\t| \"message\"\n\t| \"model_call\"\n\t| \"tool_call\"\n\t| \"tool_result\"\n\t| \"wait\"\n\t| \"checkpoint\"\n\t| \"artifact\"\n\t| \"evidence\"\n\t| \"governance\"\n\t| \"context\"\n\t| \"child_run\"\n\t| \"runtime\";\n\nexport type AgentRuntimeLedgerState =\n\t| \"pending\"\n\t| \"running\"\n\t| \"waiting\"\n\t| \"blocked\"\n\t| \"succeeded\"\n\t| \"failed\"\n\t| \"cancelled\"\n\t| \"skipped\";\n\ntype AgentRuntimePromotionStepState = Exclude<\n\tAgentRuntimeLedgerState,\n\t\"blocked\"\n>;\n\nexport interface AgentRuntimeLedgerEntry {\n\tid: string;\n\tsequence: number;\n\ttimestamp: string;\n\tkind: AgentRuntimeLedgerEntryKind;\n\tphase: AgentTrajectoryEvent[\"phase\"];\n\tactor: AgentTrajectoryEvent[\"actor\"];\n\ttype: string;\n\tstate: AgentRuntimeLedgerState;\n\ttitle: string;\n\tvisibility: ComposerRunTimelineVisibility;\n\tsource: ComposerRunTimelineItem[\"source\"];\n\ttimelineItemId?: string;\n\ttrajectoryEventId: string;\n\ttoolName?: string;\n\tsummary?: string;\n\trelatedIds: string[];\n\tevidence: AgentTrajectoryEvent[\"evidence\"];\n\tplatformShape: {\n\t\tstepKind: string;\n\t\tworkItemKind: string;\n\t\twaitType?: string;\n\t};\n}\n\nexport interface AgentRuntimeLedgerReport {\n\tschemaVersion: typeof AGENT_RUNTIME_LEDGER_SCHEMA;\n\trun: {\n\t\tid: string;\n\t\tsessionId: string;\n\t\tsource: ComposerRunTimelineResponse[\"source\"];\n\t\tgeneratedAt: string;\n\t\tplatformBacked: boolean;\n\t\tsessionFile?: string;\n\t\tcwd?: string;\n\t\tmodel?: string;\n\t};\n\tcounts: {\n\t\tentries: number;\n\t\tpromotionOperations: number;\n\t\tbyKind: Record<string, number>;\n\t\tbyState: Record<string, number>;\n\t};\n\tentries: AgentRuntimeLedgerEntry[];\n\treplay: AgentRuntimeLedgerReplaySummary;\n\tpromotion: AgentRuntimePromotionPlan;\n}\n\nexport interface AgentRuntimeLedgerReplaySummary {\n\tschemaVersion: typeof AGENT_RUNTIME_REPLAY_SUMMARY_SCHEMA;\n\tdeterministic: boolean;\n\tevents: number;\n\tdeltas: number;\n\terrors: number;\n\twarnings: number;\n\tcursor: {\n\t\tstartSequence?: number;\n\t\tendSequence?: number;\n\t};\n}\n\nexport interface AgentRuntimePromotionPlan {\n\tschemaVersion: typeof AGENT_RUNTIME_PROMOTION_PLAN_SCHEMA;\n\trunId: string;\n\tsessionId: string;\n\tidempotencyKey: string;\n\toperations: AgentRuntimePromotionOperation[];\n\twarnings: string[];\n}\n\nexport type AgentRuntimePromotionOperation =\n\t| {\n\t\t\toperation: \"handle_trigger\";\n\t\t\tid: string;\n\t\t\tpayload: {\n\t\t\t\tsourceEventType: \"maestro.local_ledger_promote\";\n\t\t\t\tsourceEventId: string;\n\t\t\t\tidempotencyKey: string;\n\t\t\t\tsessionId: string;\n\t\t\t\tgeneratedAt: string;\n\t\t\t};\n\t }\n\t| {\n\t\t\toperation: \"record_run_step\";\n\t\t\tid: string;\n\t\t\tledgerEntryId: string;\n\t\t\tpayload: {\n\t\t\t\tstepId: string;\n\t\t\t\tkind: string;\n\t\t\t\tstate: AgentRuntimePromotionStepState;\n\t\t\t\ttitle: string;\n\t\t\t\ttimestamp: string;\n\t\t\t\ttoolName?: string;\n\t\t\t};\n\t }\n\t| {\n\t\t\toperation: \"record_run_work_item\";\n\t\t\tid: string;\n\t\t\tledgerEntryId: string;\n\t\t\tpayload: {\n\t\t\t\tworkItemId: string;\n\t\t\t\tkind: string;\n\t\t\t\tstate: AgentRuntimeLedgerState;\n\t\t\t\ttitle: string;\n\t\t\t\ttimestamp: string;\n\t\t\t\twaitId?: string;\n\t\t\t\ttoolExecutionId?: string;\n\t\t\t\tevidenceRefs?: string[];\n\t\t\t\tcompletionGate?: string;\n\t\t\t\tpayload?: Record<string, unknown>;\n\t\t\t};\n\t }\n\t| {\n\t\t\toperation: \"wait_run\";\n\t\t\tid: string;\n\t\t\tledgerEntryId: string;\n\t\t\tpayload: {\n\t\t\t\twaitId: string;\n\t\t\t\twaitType: string;\n\t\t\t\ttitle: string;\n\t\t\t\ttimestamp: string;\n\t\t\t};\n\t }\n\t| {\n\t\t\toperation: \"complete_run\" | \"fail_run\";\n\t\t\tid: string;\n\t\t\tpayload: {\n\t\t\t\tstate: \"succeeded\" | \"failed\";\n\t\t\t\ttimestamp: string;\n\t\t\t\treason?: string;\n\t\t\t};\n\t };\n\nexport interface BuildAgentRuntimeLedgerOptions {\n\tsession: {\n\t\tid: string;\n\t\tsessionFile?: string;\n\t\tcwd?: string;\n\t\tmodel?: string;\n\t};\n\ttimeline: ComposerRunTimelineResponse;\n\ttrajectory: AgentTrajectoryReport;\n\treplay: AgentTrajectoryReplayReport;\n}\n\nfunction increment(map: Record<string, number>, key: string): void {\n\tmap[key] = (map[key] ?? 0) + 1;\n}\n\nfunction timelineIdForEvent(event: AgentTrajectoryEvent): string | undefined {\n\treturn event.evidence.find((anchor) => anchor.kind === \"timeline_item\")?.id;\n}\n\nfunction stateForStatus(\n\tstatus: ComposerRunTimelineStatus,\n): AgentRuntimeLedgerState {\n\tswitch (status) {\n\t\tcase \"completed\":\n\t\tcase \"info\":\n\t\tcase \"approved\":\n\t\t\treturn \"succeeded\";\n\t\tcase \"running\":\n\t\t\treturn \"running\";\n\t\tcase \"pending\":\n\t\t\treturn \"waiting\";\n\t\tcase \"denied\":\n\t\t\treturn \"blocked\";\n\t\tcase \"failed\":\n\t\t\treturn \"failed\";\n\t\tdefault:\n\t\t\treturn \"pending\";\n\t}\n}\n\nfunction kindForEvent(\n\tevent: AgentTrajectoryEvent,\n): AgentRuntimeLedgerEntryKind {\n\tswitch (event.kind) {\n\t\tcase \"session\":\n\t\t\treturn \"run\";\n\t\tcase \"message\":\n\t\t\treturn event.actor === \"assistant\" ? \"model_call\" : \"message\";\n\t\tcase \"tool\":\n\t\t\treturn event.type === \"tool.completed\" || event.type === \"tool.failed\"\n\t\t\t\t? \"tool_result\"\n\t\t\t\t: \"tool_call\";\n\t\tcase \"wait\":\n\t\t\treturn \"wait\";\n\t\tcase \"artifact\":\n\t\t\treturn \"artifact\";\n\t\tcase \"evidence\":\n\t\t\treturn \"evidence\";\n\t\tcase \"governance\":\n\t\t\treturn \"governance\";\n\t\tcase \"context\":\n\t\t\treturn event.type.startsWith(\"compaction.\") ? \"checkpoint\" : \"context\";\n\t\tcase \"agent\":\n\t\t\treturn \"child_run\";\n\t\tcase \"runtime\":\n\t\t\treturn \"runtime\";\n\t\tdefault:\n\t\t\treturn \"runtime\";\n\t}\n}\n\nfunction stepKindForEntry(\n\tentryKind: AgentRuntimeLedgerEntryKind,\n\tevent: AgentTrajectoryEvent,\n): string {\n\tif (entryKind === \"model_call\") return \"AGENT_RUN_STEP_KIND_MODEL_CALL\";\n\tif (entryKind === \"tool_call\") return \"AGENT_RUN_STEP_KIND_TOOL_CALL_INTENT\";\n\tif (entryKind === \"tool_result\" && event.status === \"failed\") {\n\t\treturn \"AGENT_RUN_STEP_KIND_ERROR\";\n\t}\n\tif (entryKind === \"tool_result\") return \"AGENT_RUN_STEP_KIND_TOOL_RESULT\";\n\tif (entryKind === \"wait\" || entryKind === \"governance\") {\n\t\treturn \"AGENT_RUN_STEP_KIND_APPROVAL_WAIT\";\n\t}\n\treturn \"AGENT_RUN_STEP_KIND_SYSTEM\";\n}\n\nfunction workItemKindForEntry(kind: AgentRuntimeLedgerEntryKind): string {\n\tswitch (kind) {\n\t\tcase \"message\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_USER_INPUT\";\n\t\tcase \"model_call\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_MODEL_CALL\";\n\t\tcase \"tool_call\":\n\t\tcase \"tool_result\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_TOOL_CALL\";\n\t\tcase \"child_run\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_CHILD_RUN\";\n\t\tcase \"wait\":\n\t\tcase \"governance\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_WAIT\";\n\t\tcase \"checkpoint\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_RECOVERY\";\n\t\tcase \"artifact\":\n\t\tcase \"evidence\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_MEMORY\";\n\t\tdefault:\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_ROOT\";\n\t}\n}\n\nfunction waitTypeForEntry(\n\tkind: AgentRuntimeLedgerEntryKind,\n\ttimelineItem?: ComposerRunTimelineItem,\n): string | undefined {\n\tif (kind !== \"wait\") {\n\t\treturn undefined;\n\t}\n\tswitch (timelineItem?.pendingRequestKind) {\n\t\tcase \"approval\":\n\t\tcase \"tool_retry\":\n\t\t\treturn \"AGENT_RUN_WAIT_TYPE_APPROVAL\";\n\t\tcase \"client_tool\":\n\t\tcase \"mcp_elicitation\":\n\t\tcase \"user_input\":\n\t\t\treturn \"AGENT_RUN_WAIT_TYPE_INPUT\";\n\t}\n\tif (timelineItem?.approvalRequestId) return \"AGENT_RUN_WAIT_TYPE_APPROVAL\";\n\tif (timelineItem?.pendingRequestId) return \"AGENT_RUN_WAIT_TYPE_INPUT\";\n\treturn \"AGENT_RUN_WAIT_TYPE_APPROVAL\";\n}\n\nfunction buildLedgerEntries(\n\ttimeline: ComposerRunTimelineResponse,\n\ttrajectory: AgentTrajectoryReport,\n): AgentRuntimeLedgerEntry[] {\n\tconst timelineItemsById = new Map(\n\t\ttimeline.items.map((item) => [item.id, item] as const),\n\t);\n\treturn trajectory.events.map((event) => {\n\t\tconst kind = kindForEvent(event);\n\t\tconst state = stateForStatus(event.status);\n\t\tconst timelineItemId = timelineIdForEvent(event);\n\t\tconst timelineItem = timelineItemId\n\t\t\t? timelineItemsById.get(timelineItemId)\n\t\t\t: undefined;\n\t\tconst waitType = waitTypeForEntry(kind, timelineItem);\n\t\treturn {\n\t\t\tid: `ledger:${event.id}`,\n\t\t\tsequence: event.sequence,\n\t\t\ttimestamp: event.timestamp,\n\t\t\tkind,\n\t\t\tphase: event.phase,\n\t\t\tactor: event.actor,\n\t\t\ttype: event.type,\n\t\t\tstate,\n\t\t\ttitle: event.title,\n\t\t\tvisibility: event.visibility,\n\t\t\tsource: event.source,\n\t\t\ttrajectoryEventId: event.id,\n\t\t\t...(timelineItemId ? { timelineItemId } : {}),\n\t\t\t...(event.toolName ? { toolName: event.toolName } : {}),\n\t\t\t...(event.summary ? { summary: event.summary } : {}),\n\t\t\trelatedIds: event.relatedIds ?? [],\n\t\t\tevidence: event.evidence,\n\t\t\tplatformShape: {\n\t\t\t\tstepKind: stepKindForEntry(kind, event),\n\t\t\t\tworkItemKind: workItemKindForEntry(kind),\n\t\t\t\t...(waitType ? { waitType } : {}),\n\t\t\t},\n\t\t};\n\t});\n}\n\nfunction replaySummary(\n\treplay: AgentTrajectoryReplayReport,\n\tentries: AgentRuntimeLedgerEntry[],\n): AgentRuntimeLedgerReplaySummary {\n\treturn {\n\t\tschemaVersion: AGENT_RUNTIME_REPLAY_SUMMARY_SCHEMA,\n\t\tdeterministic: replay.counts.deltas === 0 && replay.counts.errors === 0,\n\t\tevents: replay.counts.events,\n\t\tdeltas: replay.counts.deltas,\n\t\terrors: replay.counts.errors,\n\t\twarnings: replay.counts.warnings,\n\t\tcursor: {\n\t\t\t...(entries[0] ? { startSequence: entries[0].sequence } : {}),\n\t\t\t...(entries.at(-1) ? { endSequence: entries.at(-1)?.sequence } : {}),\n\t\t},\n\t};\n}\n\nconst PASSIVE_TERMINAL_ENTRY_KINDS = new Set<AgentRuntimeLedgerEntryKind>([\n\t\"run\",\n\t\"wait\",\n\t\"governance\",\n]);\n\nfunction isTerminalState(state: AgentRuntimeLedgerState): boolean {\n\treturn (\n\t\tstate === \"succeeded\" ||\n\t\tstate === \"skipped\" ||\n\t\tstate === \"failed\" ||\n\t\tstate === \"cancelled\"\n\t);\n}\n\nfunction isTerminalCandidate(entry: AgentRuntimeLedgerEntry): boolean {\n\treturn (\n\t\tisTerminalState(entry.state) &&\n\t\t!PASSIVE_TERMINAL_ENTRY_KINDS.has(entry.kind)\n\t);\n}\n\nfunction runStepStateForEntry(\n\tentry: AgentRuntimeLedgerEntry,\n): AgentRuntimePromotionStepState {\n\treturn entry.state === \"blocked\" ? \"failed\" : entry.state;\n}\n\nfunction firstEvidenceId(\n\tentry: AgentRuntimeLedgerEntry,\n\tkind: AgentTrajectoryEvent[\"evidence\"][number][\"kind\"],\n): string | undefined {\n\treturn entry.evidence.find((anchor) => anchor.kind === kind)?.id;\n}\n\nfunction evidenceRefForAnchor(\n\tanchor: AgentTrajectoryEvent[\"evidence\"][number],\n): string {\n\tswitch (anchor.kind) {\n\t\tcase \"timeline_item\":\n\t\t\treturn `timeline-item:${anchor.id}`;\n\t\tcase \"tool_call\":\n\t\t\treturn `tool-call:${anchor.id}`;\n\t\tcase \"tool_execution\":\n\t\t\treturn `tool-execution:${anchor.id}`;\n\t\tcase \"approval_request\":\n\t\t\treturn `approval-request:${anchor.id}`;\n\t\tcase \"pending_request\":\n\t\t\treturn `pending-request:${anchor.id}`;\n\t\tcase \"agent_run\":\n\t\t\treturn `agent-run:${anchor.id}`;\n\t\tcase \"parent_agent_run\":\n\t\t\treturn `parent-agent-run:${anchor.id}`;\n\t\tcase \"child_agent_run\":\n\t\t\treturn `child-agent-run:${anchor.id}`;\n\t\tdefault:\n\t\t\treturn `${anchor.kind}:${anchor.id}`;\n\t}\n}\n\nfunction uniqueStrings(values: Array<string | undefined>): string[] {\n\treturn values.filter((value, index): value is string => {\n\t\treturn (\n\t\t\ttypeof value === \"string\" &&\n\t\t\tvalue.length > 0 &&\n\t\t\tvalues.indexOf(value) === index\n\t\t);\n\t});\n}\n\nfunction evidenceRefsForEntry(entry: AgentRuntimeLedgerEntry): string[] {\n\treturn uniqueStrings([\n\t\t`trajectory-event:${entry.trajectoryEventId}`,\n\t\t...(entry.timelineItemId ? [`timeline-item:${entry.timelineItemId}`] : []),\n\t\t...entry.evidence.map(evidenceRefForAnchor),\n\t]);\n}\n\nfunction workItemPayloadForEntry(\n\tsessionId: string,\n\tentry: AgentRuntimeLedgerEntry,\n): Record<string, unknown> {\n\treturn {\n\t\tmaestroSessionId: sessionId,\n\t\tledgerEntryId: entry.id,\n\t\ttrajectoryEventId: entry.trajectoryEventId,\n\t\teventType: entry.type,\n\t\tphase: entry.phase,\n\t\tactor: entry.actor,\n\t\tsource: entry.source,\n\t\tstate: entry.state,\n\t\t...(entry.timelineItemId ? { timelineItemId: entry.timelineItemId } : {}),\n\t\t...(entry.toolName ? { toolName: entry.toolName } : {}),\n\t\t...(entry.summary ? { summary: entry.summary } : {}),\n\t\t...(entry.relatedIds.length > 0 ? { relatedIds: entry.relatedIds } : {}),\n\t};\n}\n\nfunction terminalEntry(\n\tentries: AgentRuntimeLedgerEntry[],\n): AgentRuntimeLedgerEntry | undefined {\n\tconst last = entries.at(-1);\n\tif (!last || !isTerminalState(last.state)) return undefined;\n\tif (isTerminalCandidate(last)) return last;\n\tfor (let index = entries.length - 1; index >= 0; index -= 1) {\n\t\tconst entry = entries[index];\n\t\tif (entry && isTerminalCandidate(entry)) return entry;\n\t}\n\treturn undefined;\n}\n\nfunction terminalOperation(\n\trunId: string,\n\tentries: AgentRuntimeLedgerEntry[],\n): AgentRuntimePromotionOperation | undefined {\n\tconst terminal = terminalEntry(entries);\n\tif (!terminal) return undefined;\n\tconst succeeded =\n\t\tterminal.state === \"succeeded\" || terminal.state === \"skipped\";\n\treturn {\n\t\toperation: succeeded ? \"complete_run\" : \"fail_run\",\n\t\tid: `promote:${runId}:terminal`,\n\t\tpayload: {\n\t\t\tstate: succeeded ? \"succeeded\" : \"failed\",\n\t\t\ttimestamp: terminal.timestamp,\n\t\t\t...(succeeded\n\t\t\t\t? {}\n\t\t\t\t: {\n\t\t\t\t\t\treason: `Terminal ledger entry ended in ${terminal.state} state.`,\n\t\t\t\t\t}),\n\t\t},\n\t};\n}\n\nfunction terminalOperationWarning(\n\tentries: AgentRuntimeLedgerEntry[],\n): string | undefined {\n\tconst last = entries.at(-1);\n\tif (!last) {\n\t\treturn \"Terminal operation omitted because no ledger entries were available.\";\n\t}\n\tif (terminalEntry(entries)) {\n\t\treturn undefined;\n\t}\n\tif (isTerminalState(last.state)) {\n\t\treturn \"Terminal operation omitted because no substantive terminal ledger entry was available.\";\n\t}\n\treturn `Terminal operation omitted because final ledger entry ended in ${last.state} state.`;\n}\n\nfunction buildPromotionPlan(\n\trunId: string,\n\tsessionId: string,\n\tgeneratedAt: string,\n\tentries: AgentRuntimeLedgerEntry[],\n): AgentRuntimePromotionPlan {\n\tconst idempotencyKey = `maestro-local-ledger:${sessionId}:${runId}`;\n\tconst operations: AgentRuntimePromotionOperation[] = [\n\t\t{\n\t\t\toperation: \"handle_trigger\",\n\t\t\tid: `promote:${runId}:trigger`,\n\t\t\tpayload: {\n\t\t\t\tsourceEventType: \"maestro.local_ledger_promote\",\n\t\t\t\tsourceEventId: sessionId,\n\t\t\t\tidempotencyKey,\n\t\t\t\tsessionId,\n\t\t\t\tgeneratedAt,\n\t\t\t},\n\t\t},\n\t];\n\n\tfor (const entry of entries) {\n\t\tconst toolExecutionId = firstEvidenceId(entry, \"tool_execution\");\n\t\tconst evidenceRefs = evidenceRefsForEntry(entry);\n\t\tconst waitId = entry.platformShape.waitType ? entry.id : undefined;\n\t\toperations.push({\n\t\t\toperation: \"record_run_step\",\n\t\t\tid: `promote:${entry.id}:step`,\n\t\t\tledgerEntryId: entry.id,\n\t\t\tpayload: {\n\t\t\t\tstepId: entry.id,\n\t\t\t\tkind: entry.platformShape.stepKind,\n\t\t\t\tstate: runStepStateForEntry(entry),\n\t\t\t\ttitle: entry.title,\n\t\t\t\ttimestamp: entry.timestamp,\n\t\t\t\t...(entry.toolName ? { toolName: entry.toolName } : {}),\n\t\t\t},\n\t\t});\n\t\toperations.push({\n\t\t\toperation: \"record_run_work_item\",\n\t\t\tid: `promote:${entry.id}:work-item`,\n\t\t\tledgerEntryId: entry.id,\n\t\t\tpayload: {\n\t\t\t\tworkItemId: entry.id,\n\t\t\t\tkind: entry.platformShape.workItemKind,\n\t\t\t\tstate: entry.state,\n\t\t\t\ttitle: entry.title,\n\t\t\t\ttimestamp: entry.timestamp,\n\t\t\t\t...(waitId ? { waitId } : {}),\n\t\t\t\t...(toolExecutionId ? { toolExecutionId } : {}),\n\t\t\t\tevidenceRefs,\n\t\t\t\tcompletionGate: \"maestro_agent_runtime_ledger_recorded\",\n\t\t\t\tpayload: workItemPayloadForEntry(sessionId, entry),\n\t\t\t},\n\t\t});\n\t\tif (entry.platformShape.waitType) {\n\t\t\toperations.push({\n\t\t\t\toperation: \"wait_run\",\n\t\t\t\tid: `promote:${entry.id}:wait`,\n\t\t\t\tledgerEntryId: entry.id,\n\t\t\t\tpayload: {\n\t\t\t\t\twaitId: entry.id,\n\t\t\t\t\twaitType: entry.platformShape.waitType,\n\t\t\t\t\ttitle: entry.title,\n\t\t\t\t\ttimestamp: entry.timestamp,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n\n\tconst terminal = terminalOperation(runId, entries);\n\tif (terminal) operations.push(terminal);\n\tconst terminalWarning = terminalOperationWarning(entries);\n\tconst warnings = [\n\t\t\"Promotion plan is dry-run only; no Platform AgentRuntime writes were performed.\",\n\t\t...(terminalWarning ? [terminalWarning] : []),\n\t];\n\n\treturn {\n\t\tschemaVersion: AGENT_RUNTIME_PROMOTION_PLAN_SCHEMA,\n\t\trunId,\n\t\tsessionId,\n\t\tidempotencyKey,\n\t\toperations,\n\t\twarnings,\n\t};\n}\n\nexport function buildAgentRuntimeLedgerReport(\n\toptions: BuildAgentRuntimeLedgerOptions,\n): AgentRuntimeLedgerReport {\n\tconst entries = buildLedgerEntries(options.timeline, options.trajectory);\n\tconst byKind: Record<string, number> = {};\n\tconst byState: Record<string, number> = {};\n\tfor (const entry of entries) {\n\t\tincrement(byKind, entry.kind);\n\t\tincrement(byState, entry.state);\n\t}\n\tconst runId = options.trajectory.run.id;\n\tconst sessionId = options.trajectory.run.sessionId;\n\tconst promotion = buildPromotionPlan(\n\t\trunId,\n\t\tsessionId,\n\t\toptions.trajectory.run.generatedAt,\n\t\tentries,\n\t);\n\n\treturn {\n\t\tschemaVersion: AGENT_RUNTIME_LEDGER_SCHEMA,\n\t\trun: {\n\t\t\tid: runId,\n\t\t\tsessionId,\n\t\t\tsource: options.timeline.source,\n\t\t\tgeneratedAt: options.trajectory.run.generatedAt,\n\t\t\tplatformBacked: options.trajectory.run.platformBacked,\n\t\t\t...(options.session.sessionFile\n\t\t\t\t? { sessionFile: options.session.sessionFile }\n\t\t\t\t: {}),\n\t\t\t...(options.session.cwd ? { cwd: options.session.cwd } : {}),\n\t\t\t...(options.session.model ? { model: options.session.model } : {}),\n\t\t},\n\t\tcounts: {\n\t\t\tentries: entries.length,\n\t\t\tpromotionOperations: promotion.operations.length,\n\t\t\tbyKind,\n\t\t\tbyState,\n\t\t},\n\t\tentries,\n\t\treplay: replaySummary(options.replay, entries),\n\t\tpromotion,\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agent-runtime-ledger.js","sourceRoot":"","sources":["../../src/server/agent-runtime-ledger.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tComposerRunTimelineItem,\n\tComposerRunTimelineResponse,\n\tComposerRunTimelineStatus,\n\tComposerRunTimelineVisibility,\n} from \"@evalops/contracts\";\nimport type { AgentTrajectoryReplayReport } from \"./agent-trajectory-replay.js\";\nimport type {\n\tAgentTrajectoryEvent,\n\tAgentTrajectoryReport,\n} from \"./agent-trajectory.js\";\n\nexport const AGENT_RUNTIME_LEDGER_SCHEMA =\n\t\"evalops.maestro.agent-runtime-ledger.v1\";\nexport const AGENT_RUNTIME_REPLAY_SUMMARY_SCHEMA =\n\t\"evalops.maestro.agent-runtime-replay-summary.v1\";\nexport const AGENT_RUNTIME_PROMOTION_PLAN_SCHEMA =\n\t\"evalops.maestro.agent-runtime-promotion-plan.v1\";\n\nexport type AgentRuntimeLedgerEntryKind =\n\t| \"run\"\n\t| \"message\"\n\t| \"model_call\"\n\t| \"tool_call\"\n\t| \"tool_result\"\n\t| \"wait\"\n\t| \"checkpoint\"\n\t| \"artifact\"\n\t| \"evidence\"\n\t| \"governance\"\n\t| \"context\"\n\t| \"child_run\"\n\t| \"runtime\";\n\nexport type AgentRuntimeLedgerState =\n\t| \"pending\"\n\t| \"running\"\n\t| \"waiting\"\n\t| \"blocked\"\n\t| \"succeeded\"\n\t| \"failed\"\n\t| \"cancelled\"\n\t| \"skipped\";\n\ntype AgentRuntimePromotionStepState = Exclude<\n\tAgentRuntimeLedgerState,\n\t\"blocked\"\n>;\n\nexport interface AgentRuntimeLedgerCorrelation {\n\tpendingRequestId?: string;\n\tpendingRequestKind?: ComposerRunTimelineItem[\"pendingRequestKind\"];\n\tapprovalRequestId?: string;\n\ttoolExecutionId?: string;\n\tartifactId?: string;\n\tagentRunId?: string;\n\tparentAgentRunId?: string;\n\tchildAgentRunId?: string;\n}\n\nexport interface AgentRuntimeLedgerEntry {\n\tid: string;\n\tsequence: number;\n\ttimestamp: string;\n\tkind: AgentRuntimeLedgerEntryKind;\n\tphase: AgentTrajectoryEvent[\"phase\"];\n\tactor: AgentTrajectoryEvent[\"actor\"];\n\ttype: string;\n\tstate: AgentRuntimeLedgerState;\n\ttitle: string;\n\tvisibility: ComposerRunTimelineVisibility;\n\tsource: ComposerRunTimelineItem[\"source\"];\n\ttimelineItemId?: string;\n\ttrajectoryEventId: string;\n\ttoolName?: string;\n\tsummary?: string;\n\trelatedIds: string[];\n\tevidence: AgentTrajectoryEvent[\"evidence\"];\n\tcorrelation?: AgentRuntimeLedgerCorrelation;\n\tplatformShape: {\n\t\tstepKind: string;\n\t\tworkItemKind: string;\n\t\twaitType?: string;\n\t};\n}\n\nexport interface AgentRuntimeLedgerReport {\n\tschemaVersion: typeof AGENT_RUNTIME_LEDGER_SCHEMA;\n\trun: {\n\t\tid: string;\n\t\tsessionId: string;\n\t\tsource: ComposerRunTimelineResponse[\"source\"];\n\t\tgeneratedAt: string;\n\t\tplatformBacked: boolean;\n\t\tsessionFile?: string;\n\t\tcwd?: string;\n\t\tmodel?: string;\n\t};\n\tcounts: {\n\t\tentries: number;\n\t\tpromotionOperations: number;\n\t\tbyKind: Record<string, number>;\n\t\tbyState: Record<string, number>;\n\t};\n\tentries: AgentRuntimeLedgerEntry[];\n\treplay: AgentRuntimeLedgerReplaySummary;\n\tpromotion: AgentRuntimePromotionPlan;\n}\n\nexport interface AgentRuntimeLedgerReplaySummary {\n\tschemaVersion: typeof AGENT_RUNTIME_REPLAY_SUMMARY_SCHEMA;\n\tdeterministic: boolean;\n\tevents: number;\n\tdeltas: number;\n\terrors: number;\n\twarnings: number;\n\tcursor: {\n\t\tstartSequence?: number;\n\t\tendSequence?: number;\n\t};\n}\n\nexport interface AgentRuntimePromotionPlan {\n\tschemaVersion: typeof AGENT_RUNTIME_PROMOTION_PLAN_SCHEMA;\n\trunId: string;\n\tsessionId: string;\n\tidempotencyKey: string;\n\toperations: AgentRuntimePromotionOperation[];\n\twarnings: string[];\n}\n\nexport type AgentRuntimePromotionOperation =\n\t| {\n\t\t\toperation: \"handle_trigger\";\n\t\t\tid: string;\n\t\t\tpayload: {\n\t\t\t\tsourceEventType: \"maestro.local_ledger_promote\";\n\t\t\t\tsourceEventId: string;\n\t\t\t\tidempotencyKey: string;\n\t\t\t\tsessionId: string;\n\t\t\t\tgeneratedAt: string;\n\t\t\t};\n\t }\n\t| {\n\t\t\toperation: \"record_run_step\";\n\t\t\tid: string;\n\t\t\tledgerEntryId: string;\n\t\t\tpayload: {\n\t\t\t\tstepId: string;\n\t\t\t\tkind: string;\n\t\t\t\tstate: AgentRuntimePromotionStepState;\n\t\t\t\ttitle: string;\n\t\t\t\ttimestamp: string;\n\t\t\t\ttoolName?: string;\n\t\t\t};\n\t }\n\t| {\n\t\t\toperation: \"record_run_work_item\";\n\t\t\tid: string;\n\t\t\tledgerEntryId: string;\n\t\t\tpayload: {\n\t\t\t\tworkItemId: string;\n\t\t\t\tkind: string;\n\t\t\t\tstate: AgentRuntimeLedgerState;\n\t\t\t\ttitle: string;\n\t\t\t\ttimestamp: string;\n\t\t\t\twaitId?: string;\n\t\t\t\tevidenceRefs?: string[];\n\t\t\t\tcompletionGate?: string;\n\t\t\t\tpayload?: Record<string, unknown>;\n\t\t\t} & AgentRuntimeLedgerCorrelation;\n\t }\n\t| {\n\t\t\toperation: \"wait_run\";\n\t\t\tid: string;\n\t\t\tledgerEntryId: string;\n\t\t\tpayload: {\n\t\t\t\twaitId: string;\n\t\t\t\twaitType: string;\n\t\t\t\ttitle: string;\n\t\t\t\ttimestamp: string;\n\t\t\t} & AgentRuntimeLedgerCorrelation;\n\t }\n\t| {\n\t\t\toperation: \"complete_run\" | \"fail_run\";\n\t\t\tid: string;\n\t\t\tpayload: {\n\t\t\t\tstate: \"succeeded\" | \"failed\";\n\t\t\t\ttimestamp: string;\n\t\t\t\treason?: string;\n\t\t\t\tledgerEntryId: string;\n\t\t\t\ttrajectoryEventId: string;\n\t\t\t\teventType: string;\n\t\t\t\ttitle: string;\n\t\t\t\tevidenceRefs: string[];\n\t\t\t};\n\t };\n\nexport interface BuildAgentRuntimeLedgerOptions {\n\tsession: {\n\t\tid: string;\n\t\tsessionFile?: string;\n\t\tcwd?: string;\n\t\tmodel?: string;\n\t};\n\ttimeline: ComposerRunTimelineResponse;\n\ttrajectory: AgentTrajectoryReport;\n\treplay: AgentTrajectoryReplayReport;\n}\n\nfunction increment(map: Record<string, number>, key: string): void {\n\tmap[key] = (map[key] ?? 0) + 1;\n}\n\nfunction timelineIdForEvent(event: AgentTrajectoryEvent): string | undefined {\n\treturn event.evidence.find((anchor) => anchor.kind === \"timeline_item\")?.id;\n}\n\nfunction stateForStatus(\n\tstatus: ComposerRunTimelineStatus,\n): AgentRuntimeLedgerState {\n\tswitch (status) {\n\t\tcase \"completed\":\n\t\tcase \"info\":\n\t\tcase \"approved\":\n\t\t\treturn \"succeeded\";\n\t\tcase \"running\":\n\t\t\treturn \"running\";\n\t\tcase \"pending\":\n\t\t\treturn \"waiting\";\n\t\tcase \"denied\":\n\t\t\treturn \"blocked\";\n\t\tcase \"failed\":\n\t\t\treturn \"failed\";\n\t\tdefault:\n\t\t\treturn \"pending\";\n\t}\n}\n\nfunction kindForEvent(\n\tevent: AgentTrajectoryEvent,\n): AgentRuntimeLedgerEntryKind {\n\tswitch (event.kind) {\n\t\tcase \"session\":\n\t\t\treturn \"run\";\n\t\tcase \"message\":\n\t\t\treturn event.actor === \"assistant\" ? \"model_call\" : \"message\";\n\t\tcase \"tool\":\n\t\t\treturn event.type === \"tool.completed\" || event.type === \"tool.failed\"\n\t\t\t\t? \"tool_result\"\n\t\t\t\t: \"tool_call\";\n\t\tcase \"wait\":\n\t\t\treturn \"wait\";\n\t\tcase \"artifact\":\n\t\t\treturn \"artifact\";\n\t\tcase \"evidence\":\n\t\t\treturn \"evidence\";\n\t\tcase \"governance\":\n\t\t\treturn \"governance\";\n\t\tcase \"context\":\n\t\t\treturn event.type.startsWith(\"compaction.\") ? \"checkpoint\" : \"context\";\n\t\tcase \"agent\":\n\t\t\treturn \"child_run\";\n\t\tcase \"runtime\":\n\t\t\treturn \"runtime\";\n\t\tdefault:\n\t\t\treturn \"runtime\";\n\t}\n}\n\nfunction stepKindForEntry(\n\tentryKind: AgentRuntimeLedgerEntryKind,\n\tevent: AgentTrajectoryEvent,\n): string {\n\tif (entryKind === \"model_call\") return \"AGENT_RUN_STEP_KIND_MODEL_CALL\";\n\tif (entryKind === \"tool_call\") return \"AGENT_RUN_STEP_KIND_TOOL_CALL_INTENT\";\n\tif (entryKind === \"tool_result\" && event.status === \"failed\") {\n\t\treturn \"AGENT_RUN_STEP_KIND_ERROR\";\n\t}\n\tif (entryKind === \"tool_result\") return \"AGENT_RUN_STEP_KIND_TOOL_RESULT\";\n\tif (entryKind === \"wait\" || entryKind === \"governance\") {\n\t\treturn \"AGENT_RUN_STEP_KIND_APPROVAL_WAIT\";\n\t}\n\treturn \"AGENT_RUN_STEP_KIND_SYSTEM\";\n}\n\nfunction workItemKindForEntry(kind: AgentRuntimeLedgerEntryKind): string {\n\tswitch (kind) {\n\t\tcase \"message\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_USER_INPUT\";\n\t\tcase \"model_call\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_MODEL_CALL\";\n\t\tcase \"tool_call\":\n\t\tcase \"tool_result\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_TOOL_CALL\";\n\t\tcase \"child_run\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_CHILD_RUN\";\n\t\tcase \"wait\":\n\t\tcase \"governance\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_WAIT\";\n\t\tcase \"checkpoint\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_RECOVERY\";\n\t\tcase \"artifact\":\n\t\tcase \"evidence\":\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_MEMORY\";\n\t\tdefault:\n\t\t\treturn \"AGENT_WORK_ITEM_KIND_ROOT\";\n\t}\n}\n\nfunction waitTypeForEntry(\n\tkind: AgentRuntimeLedgerEntryKind,\n\ttimelineItem?: ComposerRunTimelineItem,\n): string | undefined {\n\tif (kind !== \"wait\") {\n\t\treturn undefined;\n\t}\n\tswitch (timelineItem?.pendingRequestKind) {\n\t\tcase \"approval\":\n\t\tcase \"tool_retry\":\n\t\t\treturn \"AGENT_RUN_WAIT_TYPE_APPROVAL\";\n\t\tcase \"client_tool\":\n\t\tcase \"mcp_elicitation\":\n\t\tcase \"user_input\":\n\t\t\treturn \"AGENT_RUN_WAIT_TYPE_INPUT\";\n\t}\n\tif (timelineItem?.approvalRequestId) return \"AGENT_RUN_WAIT_TYPE_APPROVAL\";\n\tif (timelineItem?.pendingRequestId) return \"AGENT_RUN_WAIT_TYPE_INPUT\";\n\treturn \"AGENT_RUN_WAIT_TYPE_APPROVAL\";\n}\n\nfunction firstEvidenceIdForEvent(\n\tevent: AgentTrajectoryEvent,\n\tkind: AgentTrajectoryEvent[\"evidence\"][number][\"kind\"],\n): string | undefined {\n\treturn event.evidence.find((anchor) => anchor.kind === kind)?.id;\n}\n\nfunction hasCorrelation(correlation: AgentRuntimeLedgerCorrelation): boolean {\n\treturn Object.values(correlation).some(\n\t\t(value) => typeof value === \"string\" && value.length > 0,\n\t);\n}\n\nfunction correlationForEvent(\n\tevent: AgentTrajectoryEvent,\n\ttimelineItem?: ComposerRunTimelineItem,\n): AgentRuntimeLedgerCorrelation | undefined {\n\tconst pendingRequestId =\n\t\ttimelineItem?.pendingRequestId ??\n\t\tfirstEvidenceIdForEvent(event, \"pending_request\");\n\tconst approvalRequestId =\n\t\ttimelineItem?.approvalRequestId ??\n\t\tfirstEvidenceIdForEvent(event, \"approval_request\");\n\tconst toolExecutionId =\n\t\ttimelineItem?.toolExecutionId ??\n\t\tfirstEvidenceIdForEvent(event, \"tool_execution\");\n\tconst artifactId =\n\t\ttimelineItem?.artifactId ?? firstEvidenceIdForEvent(event, \"artifact\");\n\tconst agentRunId =\n\t\ttimelineItem?.agentRunId ?? firstEvidenceIdForEvent(event, \"agent_run\");\n\tconst parentAgentRunId =\n\t\ttimelineItem?.parentAgentRunId ??\n\t\tfirstEvidenceIdForEvent(event, \"parent_agent_run\");\n\tconst childAgentRunId =\n\t\ttimelineItem?.childAgentRunId ??\n\t\tfirstEvidenceIdForEvent(event, \"child_agent_run\");\n\tconst correlation: AgentRuntimeLedgerCorrelation = {\n\t\t...(pendingRequestId ? { pendingRequestId } : {}),\n\t\t...(timelineItem?.pendingRequestKind\n\t\t\t? { pendingRequestKind: timelineItem.pendingRequestKind }\n\t\t\t: {}),\n\t\t...(approvalRequestId ? { approvalRequestId } : {}),\n\t\t...(toolExecutionId ? { toolExecutionId } : {}),\n\t\t...(artifactId ? { artifactId } : {}),\n\t\t...(agentRunId ? { agentRunId } : {}),\n\t\t...(parentAgentRunId ? { parentAgentRunId } : {}),\n\t\t...(childAgentRunId ? { childAgentRunId } : {}),\n\t};\n\treturn hasCorrelation(correlation) ? correlation : undefined;\n}\n\nfunction buildLedgerEntries(\n\ttimeline: ComposerRunTimelineResponse,\n\ttrajectory: AgentTrajectoryReport,\n): AgentRuntimeLedgerEntry[] {\n\tconst timelineItemsById = new Map(\n\t\ttimeline.items.map((item) => [item.id, item] as const),\n\t);\n\treturn trajectory.events.map((event) => {\n\t\tconst kind = kindForEvent(event);\n\t\tconst state = stateForStatus(event.status);\n\t\tconst timelineItemId = timelineIdForEvent(event);\n\t\tconst timelineItem = timelineItemId\n\t\t\t? timelineItemsById.get(timelineItemId)\n\t\t\t: undefined;\n\t\tconst waitType = waitTypeForEntry(kind, timelineItem);\n\t\tconst correlation = correlationForEvent(event, timelineItem);\n\t\treturn {\n\t\t\tid: `ledger:${event.id}`,\n\t\t\tsequence: event.sequence,\n\t\t\ttimestamp: event.timestamp,\n\t\t\tkind,\n\t\t\tphase: event.phase,\n\t\t\tactor: event.actor,\n\t\t\ttype: event.type,\n\t\t\tstate,\n\t\t\ttitle: event.title,\n\t\t\tvisibility: event.visibility,\n\t\t\tsource: event.source,\n\t\t\ttrajectoryEventId: event.id,\n\t\t\t...(timelineItemId ? { timelineItemId } : {}),\n\t\t\t...(event.toolName ? { toolName: event.toolName } : {}),\n\t\t\t...(event.summary ? { summary: event.summary } : {}),\n\t\t\trelatedIds: event.relatedIds ?? [],\n\t\t\tevidence: event.evidence,\n\t\t\t...(correlation ? { correlation } : {}),\n\t\t\tplatformShape: {\n\t\t\t\tstepKind: stepKindForEntry(kind, event),\n\t\t\t\tworkItemKind: workItemKindForEntry(kind),\n\t\t\t\t...(waitType ? { waitType } : {}),\n\t\t\t},\n\t\t};\n\t});\n}\n\nfunction replaySummary(\n\treplay: AgentTrajectoryReplayReport,\n\tentries: AgentRuntimeLedgerEntry[],\n): AgentRuntimeLedgerReplaySummary {\n\treturn {\n\t\tschemaVersion: AGENT_RUNTIME_REPLAY_SUMMARY_SCHEMA,\n\t\tdeterministic: replay.counts.deltas === 0 && replay.counts.errors === 0,\n\t\tevents: replay.counts.events,\n\t\tdeltas: replay.counts.deltas,\n\t\terrors: replay.counts.errors,\n\t\twarnings: replay.counts.warnings,\n\t\tcursor: {\n\t\t\t...(entries[0] ? { startSequence: entries[0].sequence } : {}),\n\t\t\t...(entries.at(-1) ? { endSequence: entries.at(-1)?.sequence } : {}),\n\t\t},\n\t};\n}\n\nconst PASSIVE_TERMINAL_ENTRY_KINDS = new Set<AgentRuntimeLedgerEntryKind>([\n\t\"run\",\n\t\"wait\",\n\t\"governance\",\n]);\n\nfunction isTerminalState(state: AgentRuntimeLedgerState): boolean {\n\treturn (\n\t\tstate === \"succeeded\" ||\n\t\tstate === \"skipped\" ||\n\t\tstate === \"failed\" ||\n\t\tstate === \"cancelled\"\n\t);\n}\n\nfunction isTerminalCandidate(entry: AgentRuntimeLedgerEntry): boolean {\n\treturn (\n\t\tisTerminalState(entry.state) &&\n\t\t!PASSIVE_TERMINAL_ENTRY_KINDS.has(entry.kind)\n\t);\n}\n\nfunction runStepStateForEntry(\n\tentry: AgentRuntimeLedgerEntry,\n): AgentRuntimePromotionStepState {\n\treturn entry.state === \"blocked\" ? \"failed\" : entry.state;\n}\n\nfunction firstEvidenceId(\n\tentry: AgentRuntimeLedgerEntry,\n\tkind: AgentTrajectoryEvent[\"evidence\"][number][\"kind\"],\n): string | undefined {\n\treturn entry.evidence.find((anchor) => anchor.kind === kind)?.id;\n}\n\nfunction evidenceRefForAnchor(\n\tanchor: AgentTrajectoryEvent[\"evidence\"][number],\n): string {\n\tswitch (anchor.kind) {\n\t\tcase \"timeline_item\":\n\t\t\treturn `timeline-item:${anchor.id}`;\n\t\tcase \"tool_call\":\n\t\t\treturn `tool-call:${anchor.id}`;\n\t\tcase \"tool_execution\":\n\t\t\treturn `tool-execution:${anchor.id}`;\n\t\tcase \"approval_request\":\n\t\t\treturn `approval-request:${anchor.id}`;\n\t\tcase \"pending_request\":\n\t\t\treturn `pending-request:${anchor.id}`;\n\t\tcase \"agent_run\":\n\t\t\treturn `agent-run:${anchor.id}`;\n\t\tcase \"parent_agent_run\":\n\t\t\treturn `parent-agent-run:${anchor.id}`;\n\t\tcase \"child_agent_run\":\n\t\t\treturn `child-agent-run:${anchor.id}`;\n\t\tdefault:\n\t\t\treturn `${anchor.kind}:${anchor.id}`;\n\t}\n}\n\nfunction uniqueStrings(values: Array<string | undefined>): string[] {\n\treturn values.filter((value, index): value is string => {\n\t\treturn (\n\t\t\ttypeof value === \"string\" &&\n\t\t\tvalue.length > 0 &&\n\t\t\tvalues.indexOf(value) === index\n\t\t);\n\t});\n}\n\nfunction evidenceRefsForEntry(entry: AgentRuntimeLedgerEntry): string[] {\n\treturn uniqueStrings([\n\t\t`trajectory-event:${entry.trajectoryEventId}`,\n\t\t...(entry.timelineItemId ? [`timeline-item:${entry.timelineItemId}`] : []),\n\t\t...entry.evidence.map(evidenceRefForAnchor),\n\t]);\n}\n\nfunction workItemPayloadForEntry(\n\tsessionId: string,\n\tentry: AgentRuntimeLedgerEntry,\n): Record<string, unknown> {\n\treturn {\n\t\tmaestroSessionId: sessionId,\n\t\tledgerEntryId: entry.id,\n\t\ttrajectoryEventId: entry.trajectoryEventId,\n\t\teventType: entry.type,\n\t\tphase: entry.phase,\n\t\tactor: entry.actor,\n\t\tsource: entry.source,\n\t\tstate: entry.state,\n\t\t...(entry.timelineItemId ? { timelineItemId: entry.timelineItemId } : {}),\n\t\t...(entry.toolName ? { toolName: entry.toolName } : {}),\n\t\t...(entry.summary ? { summary: entry.summary } : {}),\n\t\t...(entry.relatedIds.length > 0 ? { relatedIds: entry.relatedIds } : {}),\n\t\t...(entry.correlation ? { correlation: entry.correlation } : {}),\n\t};\n}\n\nfunction terminalEntry(\n\tentries: AgentRuntimeLedgerEntry[],\n): AgentRuntimeLedgerEntry | undefined {\n\tconst last = entries.at(-1);\n\tif (!last || !isTerminalState(last.state)) return undefined;\n\tif (isTerminalCandidate(last)) return last;\n\tfor (let index = entries.length - 1; index >= 0; index -= 1) {\n\t\tconst entry = entries[index];\n\t\tif (entry && isTerminalCandidate(entry)) return entry;\n\t}\n\treturn undefined;\n}\n\nfunction terminalOperation(\n\trunId: string,\n\tentries: AgentRuntimeLedgerEntry[],\n): AgentRuntimePromotionOperation | undefined {\n\tconst terminal = terminalEntry(entries);\n\tif (!terminal) return undefined;\n\tconst succeeded =\n\t\tterminal.state === \"succeeded\" || terminal.state === \"skipped\";\n\treturn {\n\t\toperation: succeeded ? \"complete_run\" : \"fail_run\",\n\t\tid: `promote:${runId}:terminal`,\n\t\tpayload: {\n\t\t\tstate: succeeded ? \"succeeded\" : \"failed\",\n\t\t\ttimestamp: terminal.timestamp,\n\t\t\tledgerEntryId: terminal.id,\n\t\t\ttrajectoryEventId: terminal.trajectoryEventId,\n\t\t\teventType: terminal.type,\n\t\t\ttitle: terminal.title,\n\t\t\tevidenceRefs: evidenceRefsForEntry(terminal),\n\t\t\t...(succeeded\n\t\t\t\t? {}\n\t\t\t\t: {\n\t\t\t\t\t\treason: `Terminal ledger entry ended in ${terminal.state} state.`,\n\t\t\t\t\t}),\n\t\t},\n\t};\n}\n\nfunction terminalOperationWarning(\n\tentries: AgentRuntimeLedgerEntry[],\n): string | undefined {\n\tconst last = entries.at(-1);\n\tif (!last) {\n\t\treturn \"Terminal operation omitted because no ledger entries were available.\";\n\t}\n\tif (terminalEntry(entries)) {\n\t\treturn undefined;\n\t}\n\tif (isTerminalState(last.state)) {\n\t\treturn \"Terminal operation omitted because no substantive terminal ledger entry was available.\";\n\t}\n\treturn `Terminal operation omitted because final ledger entry ended in ${last.state} state.`;\n}\n\nfunction buildPromotionPlan(\n\trunId: string,\n\tsessionId: string,\n\tgeneratedAt: string,\n\tentries: AgentRuntimeLedgerEntry[],\n): AgentRuntimePromotionPlan {\n\tconst idempotencyKey = `maestro-local-ledger:${sessionId}:${runId}`;\n\tconst operations: AgentRuntimePromotionOperation[] = [\n\t\t{\n\t\t\toperation: \"handle_trigger\",\n\t\t\tid: `promote:${runId}:trigger`,\n\t\t\tpayload: {\n\t\t\t\tsourceEventType: \"maestro.local_ledger_promote\",\n\t\t\t\tsourceEventId: sessionId,\n\t\t\t\tidempotencyKey,\n\t\t\t\tsessionId,\n\t\t\t\tgeneratedAt,\n\t\t\t},\n\t\t},\n\t];\n\n\tfor (const entry of entries) {\n\t\tconst correlation = entry.correlation ?? {};\n\t\tconst toolExecutionId =\n\t\t\tcorrelation.toolExecutionId ?? firstEvidenceId(entry, \"tool_execution\");\n\t\tconst evidenceRefs = evidenceRefsForEntry(entry);\n\t\tconst waitId = entry.platformShape.waitType ? entry.id : undefined;\n\t\toperations.push({\n\t\t\toperation: \"record_run_step\",\n\t\t\tid: `promote:${entry.id}:step`,\n\t\t\tledgerEntryId: entry.id,\n\t\t\tpayload: {\n\t\t\t\tstepId: entry.id,\n\t\t\t\tkind: entry.platformShape.stepKind,\n\t\t\t\tstate: runStepStateForEntry(entry),\n\t\t\t\ttitle: entry.title,\n\t\t\t\ttimestamp: entry.timestamp,\n\t\t\t\t...(entry.toolName ? { toolName: entry.toolName } : {}),\n\t\t\t},\n\t\t});\n\t\toperations.push({\n\t\t\toperation: \"record_run_work_item\",\n\t\t\tid: `promote:${entry.id}:work-item`,\n\t\t\tledgerEntryId: entry.id,\n\t\t\tpayload: {\n\t\t\t\tworkItemId: entry.id,\n\t\t\t\tkind: entry.platformShape.workItemKind,\n\t\t\t\tstate: entry.state,\n\t\t\t\ttitle: entry.title,\n\t\t\t\ttimestamp: entry.timestamp,\n\t\t\t\t...(waitId ? { waitId } : {}),\n\t\t\t\t...correlation,\n\t\t\t\t...(toolExecutionId ? { toolExecutionId } : {}),\n\t\t\t\tevidenceRefs,\n\t\t\t\tcompletionGate: \"maestro_agent_runtime_ledger_recorded\",\n\t\t\t\tpayload: workItemPayloadForEntry(sessionId, entry),\n\t\t\t},\n\t\t});\n\t\tif (entry.platformShape.waitType) {\n\t\t\toperations.push({\n\t\t\t\toperation: \"wait_run\",\n\t\t\t\tid: `promote:${entry.id}:wait`,\n\t\t\t\tledgerEntryId: entry.id,\n\t\t\t\tpayload: {\n\t\t\t\t\twaitId: entry.id,\n\t\t\t\t\twaitType: entry.platformShape.waitType,\n\t\t\t\t\ttitle: entry.title,\n\t\t\t\t\ttimestamp: entry.timestamp,\n\t\t\t\t\t...correlation,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n\n\tconst terminal = terminalOperation(runId, entries);\n\tif (terminal) operations.push(terminal);\n\tconst terminalWarning = terminalOperationWarning(entries);\n\tconst warnings = [\n\t\t\"Promotion plan is dry-run only; no Platform AgentRuntime writes were performed.\",\n\t\t...(terminalWarning ? [terminalWarning] : []),\n\t];\n\n\treturn {\n\t\tschemaVersion: AGENT_RUNTIME_PROMOTION_PLAN_SCHEMA,\n\t\trunId,\n\t\tsessionId,\n\t\tidempotencyKey,\n\t\toperations,\n\t\twarnings,\n\t};\n}\n\nexport function buildAgentRuntimeLedgerReport(\n\toptions: BuildAgentRuntimeLedgerOptions,\n): AgentRuntimeLedgerReport {\n\tconst entries = buildLedgerEntries(options.timeline, options.trajectory);\n\tconst byKind: Record<string, number> = {};\n\tconst byState: Record<string, number> = {};\n\tfor (const entry of entries) {\n\t\tincrement(byKind, entry.kind);\n\t\tincrement(byState, entry.state);\n\t}\n\tconst runId = options.trajectory.run.id;\n\tconst sessionId = options.trajectory.run.sessionId;\n\tconst promotion = buildPromotionPlan(\n\t\trunId,\n\t\tsessionId,\n\t\toptions.trajectory.run.generatedAt,\n\t\tentries,\n\t);\n\n\treturn {\n\t\tschemaVersion: AGENT_RUNTIME_LEDGER_SCHEMA,\n\t\trun: {\n\t\t\tid: runId,\n\t\t\tsessionId,\n\t\t\tsource: options.timeline.source,\n\t\t\tgeneratedAt: options.trajectory.run.generatedAt,\n\t\t\tplatformBacked: options.trajectory.run.platformBacked,\n\t\t\t...(options.session.sessionFile\n\t\t\t\t? { sessionFile: options.session.sessionFile }\n\t\t\t\t: {}),\n\t\t\t...(options.session.cwd ? { cwd: options.session.cwd } : {}),\n\t\t\t...(options.session.model ? { model: options.session.model } : {}),\n\t\t},\n\t\tcounts: {\n\t\t\tentries: entries.length,\n\t\t\tpromotionOperations: promotion.operations.length,\n\t\t\tbyKind,\n\t\t\tbyState,\n\t\t},\n\t\tentries,\n\t\treplay: replaySummary(options.replay, entries),\n\t\tpromotion,\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;AA6GH;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4N9B,CAAC"}
|
|
@@ -22,21 +22,12 @@
|
|
|
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 { globSchema, parseRipgrepJson, pathSchema, runRipgrep, toArray, } from "./ripgrep-utils.js";
|
|
25
|
+
import { formatRipgrepCommand, globSchema, 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;
|
|
29
29
|
/** Default max matches per pattern (prevents runaway searches) */
|
|
30
30
|
const DEFAULT_MAX_RESULTS = 500;
|
|
31
|
-
function shellQuoteArg(value) {
|
|
32
|
-
if (/^[A-Za-z0-9_/:=.,@%+-]+$/.test(value)) {
|
|
33
|
-
return value;
|
|
34
|
-
}
|
|
35
|
-
return `'${value.replace(/'/g, "'\\''")}'`;
|
|
36
|
-
}
|
|
37
|
-
function formatRipgrepCommand(args) {
|
|
38
|
-
return ["rg", ...args].map(shellQuoteArg).join(" ");
|
|
39
|
-
}
|
|
40
31
|
const parallelRipgrepSchema = Type.Object({
|
|
41
32
|
patterns: Type.Array(Type.String({ minLength: 1 }), {
|
|
42
33
|
minItems: 1,
|
|
@@ -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\tglobSchema,\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\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\nfunction formatRipgrepCommand(args: string[]): string {\n\treturn [\"rg\", ...args].map(shellQuoteArg).join(\" \");\n}\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\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\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\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 formatRipgrepCommand(args: string[]): string;
|
|
4
5
|
export declare function runRipgrep(args: string[], signal?: AbortSignal, cwd?: string): Promise<{
|
|
5
6
|
stdout: string;
|
|
6
7
|
stderr: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ripgrep-utils.d.ts","sourceRoot":"","sources":["../../src/tools/ripgrep-utils.ts"],"names":[],"mappings":"AAIA,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;
|
|
1
|
+
{"version":3,"file":"ripgrep-utils.d.ts","sourceRoot":"","sources":["../../src/tools/ripgrep-utils.ts"],"names":[],"mappings":"AAIA,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;AAWD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAE3D;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,CAkDD;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"}
|
|
@@ -28,6 +28,15 @@ export function toArray(value) {
|
|
|
28
28
|
return Array.isArray(value) ? value : [value];
|
|
29
29
|
}
|
|
30
30
|
const MAX_RIPGREP_OUTPUT_BYTES = 2_000_000; // ~2MB safeguard
|
|
31
|
+
function shellQuoteArg(value) {
|
|
32
|
+
if (/^[A-Za-z0-9_/:=.,@%+-]+$/.test(value)) {
|
|
33
|
+
return value;
|
|
34
|
+
}
|
|
35
|
+
return `'${value.replace(/'/g, "'\\''")}'`;
|
|
36
|
+
}
|
|
37
|
+
export function formatRipgrepCommand(args) {
|
|
38
|
+
return ["rg", ...args].map(shellQuoteArg).join(" ");
|
|
39
|
+
}
|
|
31
40
|
export async function runRipgrep(args, signal, cwd) {
|
|
32
41
|
const child = spawn("rg", args, {
|
|
33
42
|
cwd: cwd ?? process.cwd(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ripgrep-utils.js","sourceRoot":"","sources":["../../src/tools/ripgrep-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CACtC,IAAI,CAAC,KAAK,CAAC;IACV,IAAI,CAAC,MAAM,CAAC;QACX,WAAW,EAAE,6BAA6B;QAC1C,SAAS,EAAE,CAAC;KACZ,CAAC;IACF,IAAI,CAAC,KAAK,CACT,IAAI,CAAC,MAAM,CAAC;QACX,WAAW,EAAE,yCAAyC;QACtD,SAAS,EAAE,CAAC;KACZ,CAAC,EACF,EAAE,QAAQ,EAAE,CAAC,EAAE,CACf;CACD,CAAC,CACF,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CACtC,IAAI,CAAC,KAAK,CAAC;IACV,IAAI,CAAC,MAAM,CAAC;QACX,WAAW,EAAE,gCAAgC;QAC7C,SAAS,EAAE,CAAC;KACZ,CAAC;IACF,IAAI,CAAC,KAAK,CACT,IAAI,CAAC,MAAM,CAAC;QACX,WAAW,EAAE,wBAAwB;QACrC,SAAS,EAAE,CAAC;KACZ,CAAC,EACF,EAAE,QAAQ,EAAE,CAAC,EAAE,CACf;CACD,CAAC,CACF,CAAC;AAEF,MAAM,UAAU,OAAO,CAAI,KAA0B;IACpD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC;IACX,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,wBAAwB,GAAG,SAAS,CAAC,CAAC,iBAAiB;AAE7D,MAAM,CAAC,KAAK,UAAU,UAAU,CAC/B,IAAc,EACd,MAAoB,EACpB,GAAY;IAOZ,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE;QAC/B,GAAG,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;QACzB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;QACjC,MAAM;KACN,CAAC,CAAC;IAEH,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC5C,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAClC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,IAAI,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,wBAAwB,EAAE,CAAC;gBAC7D,SAAS,GAAG,IAAI,CAAC;gBACjB,MAAM,IAAI,KAAK;qBACb,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,wBAAwB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;qBAC/D,QAAQ,EAAE,CAAC;gBACb,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtB,OAAO;YACR,CAAC;YACD,MAAM,IAAI,KAAK,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAClC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,IAAI,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,wBAAwB,EAAE,CAAC;gBAC7D,SAAS,GAAG,IAAI,CAAC;gBACjB,MAAM,IAAI,KAAK;qBACb,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,wBAAwB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;qBAC/D,QAAQ,EAAE,CAAC;gBACb,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtB,OAAO;YACR,CAAC;YACD,MAAM,IAAI,KAAK,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC7B,MAAM,CACL,KAAK,YAAY,KAAK;gBACrB,CAAC,CAAC,IAAI,KAAK,CAAC,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC;gBACxD,CAAC,CAAC,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CACzD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YAC5B,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC;AAUD,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC9C,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAS;QAC3B,MAAM,MAAM,GAAG,aAAa,CAAU,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAC9D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACrB,SAAS;QACV,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAWpB,CAAC;QACF,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,SAAS;QACV,CAAC;QACD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;QAC9C,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,UAAU,IAAI,EAAE,EAAE,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,WAAW,IAAI,CAAC;gBAClC,MAAM,EAAE,QAAQ,CAAC,KAAK,IAAI,CAAC;gBAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE;gBACjC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE;aACpC,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { Type } from \"@sinclair/typebox\";\nimport { safeJsonParse } from \"../utils/json.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\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 child = spawn(\"rg\", 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\";\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\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 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 child = spawn(\"rg\", 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAIH,OAAO,EACN,KAAK,YAAY,
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAIH,OAAO,EACN,KAAK,YAAY,EAOjB,MAAM,oBAAoB,CAAC;AAkI5B,KAAK,iBAAiB,GAAG;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IAC7C,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqUrB,CAAC"}
|
package/dist/tools/search.js
CHANGED
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
*/
|
|
52
52
|
import { resolve as resolvePath } from "node:path";
|
|
53
53
|
import { Type } from "@sinclair/typebox";
|
|
54
|
-
import { globSchema, parseRipgrepJson, pathSchema, runRipgrep, toArray, } from "./ripgrep-utils.js";
|
|
54
|
+
import { formatRipgrepCommand, globSchema, parseRipgrepJson, pathSchema, runRipgrep, toArray, } from "./ripgrep-utils.js";
|
|
55
55
|
import { createTool, expandUserPath } from "./tool-dsl.js";
|
|
56
56
|
const searchSchema = Type.Object({
|
|
57
57
|
pattern: Type.String({
|
|
@@ -240,6 +240,7 @@ Examples:
|
|
|
240
240
|
else {
|
|
241
241
|
args.push(".");
|
|
242
242
|
}
|
|
243
|
+
const command = formatRipgrepCommand(args);
|
|
243
244
|
let result;
|
|
244
245
|
try {
|
|
245
246
|
result = await runRipgrep(args, signal, commandCwd);
|
|
@@ -249,14 +250,13 @@ Examples:
|
|
|
249
250
|
? error.message
|
|
250
251
|
: `Unknown error: ${String(error)}`;
|
|
251
252
|
return respond
|
|
252
|
-
.
|
|
253
|
-
.detail({ command
|
|
253
|
+
.error(`ripgrep failed\n\n${reason}`)
|
|
254
|
+
.detail({ command, cwd: commandCwd });
|
|
254
255
|
}
|
|
255
256
|
if (result.exitCode === 2) {
|
|
256
257
|
const message = result.stderr.trim() || result.stdout.trim();
|
|
257
258
|
throw new Error(message.length > 0 ? message : "ripgrep exited with an error");
|
|
258
259
|
}
|
|
259
|
-
const command = ["rg", ...args].join(" ");
|
|
260
260
|
if (result.exitCode === 1 || result.stdout.trim().length === 0) {
|
|
261
261
|
// Use correct format in detail based on mode
|
|
262
262
|
const detailFormat = outputMode === "files"
|