@morphllm/morphsdk 0.2.60 → 0.2.63

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/dist/{chunk-2CASO3ZO.js → chunk-3SHLMXBV.js} +4 -4
  2. package/dist/{chunk-2CASO3ZO.js.map → chunk-3SHLMXBV.js.map} +1 -1
  3. package/dist/{chunk-6N6ZYZYD.js → chunk-3WMLFUAR.js} +3 -3
  4. package/dist/{chunk-TPP2UGQP.js → chunk-563RLKFC.js} +21 -7
  5. package/dist/chunk-563RLKFC.js.map +1 -0
  6. package/dist/chunk-5FUTL2UF.js +22 -0
  7. package/dist/{chunk-YV75OQTE.js → chunk-5QRN3JNB.js} +10 -34
  8. package/dist/chunk-5QRN3JNB.js.map +1 -0
  9. package/dist/{chunk-IUG2FHNN.js → chunk-BHNJEBQJ.js} +2 -2
  10. package/dist/{chunk-6Y5JB4JC.js → chunk-DCIUCDWJ.js} +15 -7
  11. package/dist/{chunk-6Y5JB4JC.js.map → chunk-DCIUCDWJ.js.map} +1 -1
  12. package/dist/{chunk-4VGOBA2J.js → chunk-GJ573YH3.js} +3 -3
  13. package/dist/{chunk-3IQIT6MC.js → chunk-GM5VR33N.js} +3 -3
  14. package/dist/{chunk-QZNGKOCZ.js → chunk-IXNSTNS7.js} +2 -2
  15. package/dist/{chunk-ZO4PPFCZ.js → chunk-JNOZPU44.js} +2 -2
  16. package/dist/{chunk-5QIWYEHJ.js → chunk-PKPJWARB.js} +2 -2
  17. package/dist/{chunk-ILJ3J5IA.js → chunk-PNIQNTXR.js} +3 -3
  18. package/dist/{chunk-FN4EP3WY.js → chunk-T6677HCA.js} +8 -8
  19. package/dist/{chunk-374N3GIA.js → chunk-TTBXKDCT.js} +3 -3
  20. package/dist/client.cjs +53 -46
  21. package/dist/client.cjs.map +1 -1
  22. package/dist/client.js +14 -14
  23. package/dist/{finish-kXAcUJyB.d.ts → finish-pPJfB0uO.d.ts} +2 -2
  24. package/dist/git/client.js +1 -1
  25. package/dist/git/config.js +1 -1
  26. package/dist/git/index.js +1 -1
  27. package/dist/index.cjs +53 -46
  28. package/dist/index.cjs.map +1 -1
  29. package/dist/index.js +15 -15
  30. package/dist/lib-GEPX5Y3T.js +14 -0
  31. package/dist/lib-GEPX5Y3T.js.map +1 -0
  32. package/dist/modelrouter/core.js +1 -1
  33. package/dist/modelrouter/index.js +1 -1
  34. package/dist/tools/browser/anthropic.js +1 -1
  35. package/dist/tools/browser/core.js +1 -1
  36. package/dist/tools/browser/index.js +1 -1
  37. package/dist/tools/browser/live.js +1 -1
  38. package/dist/tools/browser/openai.js +1 -1
  39. package/dist/tools/browser/prompts.js +1 -1
  40. package/dist/tools/browser/vercel.js +1 -1
  41. package/dist/tools/codebase_search/anthropic.js +1 -1
  42. package/dist/tools/codebase_search/core.js +1 -1
  43. package/dist/tools/codebase_search/index.js +1 -1
  44. package/dist/tools/codebase_search/openai.js +1 -1
  45. package/dist/tools/codebase_search/prompts.js +1 -1
  46. package/dist/tools/codebase_search/vercel.js +1 -1
  47. package/dist/tools/fastapply/anthropic.js +2 -2
  48. package/dist/tools/fastapply/core.js +1 -1
  49. package/dist/tools/fastapply/index.js +4 -4
  50. package/dist/tools/fastapply/openai.js +2 -2
  51. package/dist/tools/fastapply/prompts.js +1 -1
  52. package/dist/tools/fastapply/vercel.js +2 -2
  53. package/dist/tools/index.js +4 -4
  54. package/dist/tools/utils/resilience.js +1 -1
  55. package/dist/tools/warp_grep/agent/config.js +1 -1
  56. package/dist/tools/warp_grep/agent/formatter.js +1 -1
  57. package/dist/tools/warp_grep/agent/parser.cjs +9 -33
  58. package/dist/tools/warp_grep/agent/parser.cjs.map +1 -1
  59. package/dist/tools/warp_grep/agent/parser.js +2 -2
  60. package/dist/tools/warp_grep/agent/prompt.js +1 -1
  61. package/dist/tools/warp_grep/agent/runner.cjs +21 -40
  62. package/dist/tools/warp_grep/agent/runner.cjs.map +1 -1
  63. package/dist/tools/warp_grep/agent/runner.js +4 -4
  64. package/dist/tools/warp_grep/agent/types.cjs.map +1 -1
  65. package/dist/tools/warp_grep/agent/types.d.ts +2 -2
  66. package/dist/tools/warp_grep/anthropic.cjs +53 -46
  67. package/dist/tools/warp_grep/anthropic.cjs.map +1 -1
  68. package/dist/tools/warp_grep/anthropic.js +8 -8
  69. package/dist/tools/warp_grep/client.cjs +53 -46
  70. package/dist/tools/warp_grep/client.cjs.map +1 -1
  71. package/dist/tools/warp_grep/client.js +7 -7
  72. package/dist/tools/warp_grep/gemini.cjs +53 -46
  73. package/dist/tools/warp_grep/gemini.cjs.map +1 -1
  74. package/dist/tools/warp_grep/gemini.js +8 -8
  75. package/dist/tools/warp_grep/harness.cjs +55 -45
  76. package/dist/tools/warp_grep/harness.cjs.map +1 -1
  77. package/dist/tools/warp_grep/harness.d.ts +1 -1
  78. package/dist/tools/warp_grep/harness.js +5 -5
  79. package/dist/tools/warp_grep/harness.js.map +1 -1
  80. package/dist/tools/warp_grep/index.cjs +56 -46
  81. package/dist/tools/warp_grep/index.cjs.map +1 -1
  82. package/dist/tools/warp_grep/index.d.ts +1 -1
  83. package/dist/tools/warp_grep/index.js +11 -11
  84. package/dist/tools/warp_grep/openai.cjs +53 -46
  85. package/dist/tools/warp_grep/openai.cjs.map +1 -1
  86. package/dist/tools/warp_grep/openai.js +8 -8
  87. package/dist/tools/warp_grep/providers/local.cjs +32 -6
  88. package/dist/tools/warp_grep/providers/local.cjs.map +1 -1
  89. package/dist/tools/warp_grep/providers/local.js +3 -3
  90. package/dist/tools/warp_grep/providers/remote.js +1 -1
  91. package/dist/tools/warp_grep/utils/files.js +1 -1
  92. package/dist/tools/warp_grep/utils/paths.js +1 -1
  93. package/dist/tools/warp_grep/utils/ripgrep.cjs +42 -6
  94. package/dist/tools/warp_grep/utils/ripgrep.cjs.map +1 -1
  95. package/dist/tools/warp_grep/utils/ripgrep.js +2 -2
  96. package/dist/tools/warp_grep/vercel.cjs +53 -46
  97. package/dist/tools/warp_grep/vercel.cjs.map +1 -1
  98. package/dist/tools/warp_grep/vercel.js +8 -8
  99. package/package.json +5 -3
  100. package/dist/chunk-PZ5AY32C.js +0 -10
  101. package/dist/chunk-TPP2UGQP.js.map +0 -1
  102. package/dist/chunk-YV75OQTE.js.map +0 -1
  103. /package/dist/{chunk-6N6ZYZYD.js.map → chunk-3WMLFUAR.js.map} +0 -0
  104. /package/dist/{chunk-PZ5AY32C.js.map → chunk-5FUTL2UF.js.map} +0 -0
  105. /package/dist/{chunk-IUG2FHNN.js.map → chunk-BHNJEBQJ.js.map} +0 -0
  106. /package/dist/{chunk-4VGOBA2J.js.map → chunk-GJ573YH3.js.map} +0 -0
  107. /package/dist/{chunk-3IQIT6MC.js.map → chunk-GM5VR33N.js.map} +0 -0
  108. /package/dist/{chunk-QZNGKOCZ.js.map → chunk-IXNSTNS7.js.map} +0 -0
  109. /package/dist/{chunk-ZO4PPFCZ.js.map → chunk-JNOZPU44.js.map} +0 -0
  110. /package/dist/{chunk-5QIWYEHJ.js.map → chunk-PKPJWARB.js.map} +0 -0
  111. /package/dist/{chunk-ILJ3J5IA.js.map → chunk-PNIQNTXR.js.map} +0 -0
  112. /package/dist/{chunk-FN4EP3WY.js.map → chunk-T6677HCA.js.map} +0 -0
  113. /package/dist/{chunk-374N3GIA.js.map → chunk-TTBXKDCT.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../tools/warp_grep/harness.ts"],"sourcesContent":["/**\n * Warp Grep Harness Primitives\n *\n * Building blocks for custom agent harnesses.\n * Use these when you want to control the agent loop yourself.\n *\n * @example\n * ```typescript\n * import {\n * parseToolCalls,\n * SYSTEM_PROMPT,\n * formatToolResult,\n * formatTurnMessage,\n * formatListDirectoryTree,\n * calculateContextBudget,\n * buildInitialState,\n * toolGrep,\n * toolRead,\n * toolListDirectory,\n * resolveFinishFiles,\n * AGENT_CONFIG,\n * LocalRipgrepProvider,\n * type ToolCall,\n * type WarpGrepProvider,\n * } from '@morphllm/morphsdk/tools/warp-grep/harness';\n *\n * const provider = new LocalRipgrepProvider(repoRoot);\n * const messages = [\n * { role: 'system', content: SYSTEM_PROMPT },\n * { role: 'user', content: await buildInitialState(repoRoot, query, provider) },\n * ];\n *\n * for (let turn = 1; turn <= AGENT_CONFIG.MAX_TURNS; turn++) {\n * const response = await myModel(messages);\n * messages.push({ role: 'assistant', content: response });\n *\n * const toolCalls = parseToolCalls(response);\n * const results: string[] = [];\n *\n * for (const call of toolCalls) {\n * if (call.name === 'finish') {\n * return await resolveFinishFiles(provider, call.arguments.files);\n * }\n *\n * let output: string;\n * if (call.name === 'grep') {\n * const r = await toolGrep(provider, call.arguments);\n * output = r.output;\n * } else if (call.name === 'read') {\n * output = await toolRead(provider, call.arguments);\n * } else if (call.name === 'list_directory') {\n * output = await toolListDirectory(provider, call.arguments);\n * }\n *\n * results.push(formatToolResult(call.name, call.arguments, output));\n * }\n *\n * const turnMsg = formatTurnMessage(turn, AGENT_CONFIG.MAX_TURNS);\n * const budget = calculateContextBudget(messages);\n * messages.push({ role: 'user', content: results.join('\\n') + turnMsg + '\\n' + budget });\n * }\n * ```\n */\n\nimport { LLMResponseParser } from './agent/parser.js';\nimport type { ToolCall, ToolName, FinishFileSpec, ChatMessage } from './agent/types.js';\nimport type { WarpGrepProvider, GrepResult, ReadResult, ListDirectoryEntry } from './providers/types.js';\n\n// ════════════════════════════════════════════════════════════════════════════\n// PARSING\n// ════════════════════════════════════════════════════════════════════════════\n\nexport { LLMResponseParser };\n\nconst parser = new LLMResponseParser();\n\nexport function parseToolCalls(text: string): ToolCall[] {\n return parser.parse(text);\n}\n\n// ════════════════════════════════════════════════════════════════════════════\n// SYSTEM PROMPT\n// ════════════════════════════════════════════════════════════════════════════\n\nexport { SYSTEM_PROMPT, getSystemPrompt } from './agent/prompt.js';\n\n// ════════════════════════════════════════════════════════════════════════════\n// FORMATTING\n// ════════════════════════════════════════════════════════════════════════════\n\nexport { formatAgentToolOutput as formatToolResult } from './agent/formatter.js';\n\n// ════════════════════════════════════════════════════════════════════════════\n// HELPERS - same functions runner.ts uses\n// ════════════════════════════════════════════════════════════════════════════\n\nexport {\n formatTurnMessage,\n calculateContextBudget,\n buildInitialState,\n formatListDirectoryTree,\n} from './agent/helpers.js';\n\n// ════════════════════════════════════════════════════════════════════════════\n// TOOL EXECUTORS\n// ════════════════════════════════════════════════════════════════════════════\n\nexport { toolGrep } from './agent/tools/grep.js';\nexport { toolRead } from './agent/tools/read.js';\nexport { toolListDirectory } from './agent/tools/list_directory.js';\nexport { readFinishFiles, normalizeFinishFiles } from './agent/tools/finish.js';\n\n// ════════════════════════════════════════════════════════════════════════════\n// FINISH RESOLUTION (convenience wrapper)\n// ════════════════════════════════════════════════════════════════════════════\n\nimport { readFinishFiles } from './agent/tools/finish.js';\n\nexport type ResolvedFile = { path: string; content: string };\n\nexport async function resolveFinishFiles(\n provider: WarpGrepProvider,\n files: FinishFileSpec[]\n): Promise<ResolvedFile[]> {\n return readFinishFiles('', files, async (p, s, e) => {\n const r = await provider.read({ path: p, start: s, end: e });\n return r.lines.map((l) => {\n const idx = l.indexOf('|');\n return idx >= 0 ? l.slice(idx + 1) : l;\n });\n });\n}\n\n// ════════════════════════════════════════════════════════════════════════════\n// CONFIG + CONSTANTS\n// ════════════════════════════════════════════════════════════════════════════\n\nexport { AGENT_CONFIG, DEFAULT_EXCLUDES } from './agent/config.js';\n\n// ════════════════════════════════════════════════════════════════════════════\n// PROVIDER + TYPES\n// ════════════════════════════════════════════════════════════════════════════\n\nexport { LocalRipgrepProvider } from './providers/local.js';\n\nexport type {\n ToolCall,\n ToolName,\n FinishFileSpec,\n ChatMessage,\n WarpGrepProvider,\n GrepResult,\n ReadResult,\n ListDirectoryEntry,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0EA,IAAM,SAAS,IAAI,kBAAkB;AAE9B,SAAS,eAAe,MAA0B;AACvD,SAAO,OAAO,MAAM,IAAI;AAC1B;AA0CA,eAAsB,mBACpB,UACA,OACyB;AACzB,SAAO,gBAAgB,IAAI,OAAO,OAAO,GAAG,GAAG,MAAM;AACnD,UAAM,IAAI,MAAM,SAAS,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,EAAE,CAAC;AAC3D,WAAO,EAAE,MAAM,IAAI,CAAC,MAAM;AACxB,YAAM,MAAM,EAAE,QAAQ,GAAG;AACzB,aAAO,OAAO,IAAI,EAAE,MAAM,MAAM,CAAC,IAAI;AAAA,IACvC,CAAC;AAAA,EACH,CAAC;AACH;","names":[]}
1
+ {"version":3,"sources":["../../../tools/warp_grep/harness.ts"],"sourcesContent":["/**\n * Warp Grep Harness Primitives\n *\n * Building blocks for custom agent harnesses.\n * Use these when you want to control the agent loop yourself.\n *\n * @example\n * ```typescript\n * import {\n * parseToolCalls,\n * SYSTEM_PROMPT,\n * formatToolResult,\n * formatTurnMessage,\n * formatListDirectoryTree,\n * calculateContextBudget,\n * buildInitialState,\n * toolGrep,\n * toolRead,\n * toolListDirectory,\n * resolveFinishFiles,\n * AGENT_CONFIG,\n * LocalRipgrepProvider,\n * type ToolCall,\n * type WarpGrepProvider,\n * } from '@morphllm/morphsdk/tools/warp-grep/harness';\n *\n * const provider = new LocalRipgrepProvider(repoRoot);\n * const messages = [\n * { role: 'system', content: SYSTEM_PROMPT },\n * { role: 'user', content: await buildInitialState(repoRoot, query, provider) },\n * ];\n *\n * for (let turn = 1; turn <= AGENT_CONFIG.MAX_TURNS; turn++) {\n * const response = await myModel(messages);\n * messages.push({ role: 'assistant', content: response });\n *\n * const toolCalls = parseToolCalls(response);\n * const results: string[] = [];\n *\n * for (const call of toolCalls) {\n * if (call.name === 'finish') {\n * return await resolveFinishFiles(provider, call.arguments.files);\n * }\n *\n * let output: string;\n * if (call.name === 'grep') {\n * const r = await toolGrep(provider, call.arguments);\n * output = r.output;\n * } else if (call.name === 'read') {\n * output = await toolRead(provider, call.arguments);\n * } else if (call.name === 'list_directory') {\n * output = await toolListDirectory(provider, call.arguments);\n * }\n *\n * results.push(formatToolResult(call.name, call.arguments, output));\n * }\n *\n * const turnMsg = formatTurnMessage(turn, AGENT_CONFIG.MAX_TURNS);\n * const budget = calculateContextBudget(messages);\n * messages.push({ role: 'user', content: results.join('\\n') + turnMsg + '\\n' + budget });\n * }\n * ```\n */\n\nimport { LLMResponseParser } from './agent/parser.js';\nimport type { ToolCall, ToolName, FinishFileSpec, ChatMessage } from './agent/types.js';\nimport type { WarpGrepProvider, GrepResult, ReadResult, ListDirectoryEntry } from './providers/types.js';\n\n// ════════════════════════════════════════════════════════════════════════════\n// PARSING\n// ════════════════════════════════════════════════════════════════════════════\n\nexport { LLMResponseParser };\n\nconst parser = new LLMResponseParser();\n\nexport function parseToolCalls(text: string): ToolCall[] {\n return parser.parse(text);\n}\n\n// ════════════════════════════════════════════════════════════════════════════\n// SYSTEM PROMPT\n// ════════════════════════════════════════════════════════════════════════════\n\nexport { SYSTEM_PROMPT, getSystemPrompt } from './agent/prompt.js';\n\n// ════════════════════════════════════════════════════════════════════════════\n// FORMATTING\n// ════════════════════════════════════════════════════════════════════════════\n\nexport { formatAgentToolOutput as formatToolResult } from './agent/formatter.js';\n\n// ════════════════════════════════════════════════════════════════════════════\n// HELPERS - same functions runner.ts uses\n// ════════════════════════════════════════════════════════════════════════════\n\nexport {\n formatTurnMessage,\n calculateContextBudget,\n buildInitialState,\n formatListDirectoryTree,\n} from './agent/helpers.js';\n\n// ════════════════════════════════════════════════════════════════════════════\n// TOOL EXECUTORS\n// ════════════════════════════════════════════════════════════════════════════\n\nexport { toolGrep } from './agent/tools/grep.js';\nexport { toolRead } from './agent/tools/read.js';\nexport { toolListDirectory } from './agent/tools/list_directory.js';\nexport { readFinishFiles, normalizeFinishFiles } from './agent/tools/finish.js';\n\n// ════════════════════════════════════════════════════════════════════════════\n// FINISH RESOLUTION (convenience wrapper)\n// ════════════════════════════════════════════════════════════════════════════\n\nimport { readFinishFiles } from './agent/tools/finish.js';\n\nexport type ResolvedFile = { path: string; content: string };\n\nexport async function resolveFinishFiles(\n provider: WarpGrepProvider,\n files: FinishFileSpec[]\n): Promise<ResolvedFile[]> {\n return readFinishFiles('', files, async (p, s?, e?) => {\n const r = await provider.read({ path: p, start: s, end: e });\n return r.lines.map((l) => {\n const idx = l.indexOf('|');\n return idx >= 0 ? l.slice(idx + 1) : l;\n });\n });\n}\n\n// ════════════════════════════════════════════════════════════════════════════\n// CONFIG + CONSTANTS\n// ════════════════════════════════════════════════════════════════════════════\n\nexport { AGENT_CONFIG, DEFAULT_EXCLUDES } from './agent/config.js';\n\n// ════════════════════════════════════════════════════════════════════════════\n// PROVIDER + TYPES\n// ════════════════════════════════════════════════════════════════════════════\n\nexport { LocalRipgrepProvider } from './providers/local.js';\n\nexport type {\n ToolCall,\n ToolName,\n FinishFileSpec,\n ChatMessage,\n WarpGrepProvider,\n GrepResult,\n ReadResult,\n ListDirectoryEntry,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0EA,IAAM,SAAS,IAAI,kBAAkB;AAE9B,SAAS,eAAe,MAA0B;AACvD,SAAO,OAAO,MAAM,IAAI;AAC1B;AA0CA,eAAsB,mBACpB,UACA,OACyB;AACzB,SAAO,gBAAgB,IAAI,OAAO,OAAO,GAAG,GAAI,MAAO;AACrD,UAAM,IAAI,MAAM,SAAS,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,EAAE,CAAC;AAC3D,WAAO,EAAE,MAAM,IAAI,CAAC,MAAM;AACxB,YAAM,MAAM,EAAE,QAAQ,GAAG;AACzB,aAAO,OAAO,IAAI,EAAE,MAAM,MAAM,CAAC,IAAI;AAAA,IACvC,CAAC;AAAA,EACH,CAAC;AACH;","names":[]}
@@ -5,6 +5,9 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __commonJS = (cb, mod) => function __require() {
9
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
10
+ };
8
11
  var __export = (target, all) => {
9
12
  for (var name in all)
10
13
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -27,6 +30,15 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
27
30
  ));
28
31
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
32
 
33
+ // node_modules/@vscode/ripgrep/lib/index.js
34
+ var require_lib = __commonJS({
35
+ "node_modules/@vscode/ripgrep/lib/index.js"(exports2, module2) {
36
+ "use strict";
37
+ var path5 = require("path");
38
+ module2.exports.rgPath = path5.join(__dirname, `../bin/rg${process.platform === "win32" ? ".exe" : ""}`);
39
+ }
40
+ });
41
+
30
42
  // tools/warp_grep/index.ts
31
43
  var warp_grep_exports = {};
32
44
  __export(warp_grep_exports, {
@@ -419,19 +431,19 @@ function parseNestedXmlTools(text) {
419
431
  const filePath = getXmlElementText(fileContent, "path");
420
432
  const linesStr = getXmlElementText(fileContent, "lines");
421
433
  if (filePath && linesStr) {
422
- const ranges = [];
423
- for (const rangeStr of linesStr.split(",")) {
424
- if (rangeStr.trim() === "*") {
425
- ranges.push([1, 999999]);
426
- } else {
434
+ if (linesStr.trim() === "*") {
435
+ files.push({ path: filePath, lines: "*" });
436
+ } else {
437
+ const ranges = [];
438
+ for (const rangeStr of linesStr.split(",")) {
427
439
  const [s, e] = rangeStr.split("-").map((v) => parseInt(v.trim(), 10));
428
440
  if (Number.isFinite(s) && Number.isFinite(e)) {
429
441
  ranges.push([s, e]);
430
442
  }
431
443
  }
432
- }
433
- if (ranges.length > 0) {
434
- files.push({ path: filePath, lines: ranges });
444
+ if (ranges.length > 0) {
445
+ files.push({ path: filePath, lines: ranges });
446
+ }
435
447
  }
436
448
  }
437
449
  }
@@ -443,33 +455,9 @@ function parseNestedXmlTools(text) {
443
455
  return tools;
444
456
  }
445
457
  function preprocessText(text) {
446
- let processed = text.replace(/<think>[\s\S]*?<\/think>/gi, "");
458
+ const processed = text.replace(/<think>[\s\S]*?<\/think>/gi, "").replace(/<\/?tool_call>/gi, "");
447
459
  const nestedTools = parseNestedXmlTools(processed);
448
- const openingTagRegex = /<tool_call>|<tool>/gi;
449
- const closingTagRegex = /<\/tool_call>|<\/tool>/gi;
450
- const openingMatches = processed.match(openingTagRegex) || [];
451
- const closingMatches = processed.match(closingTagRegex) || [];
452
- if (openingMatches.length > closingMatches.length) {
453
- const lastClosingMatch = /<\/tool_call>|<\/tool>/gi;
454
- let lastClosingIndex = -1;
455
- let match;
456
- while ((match = lastClosingMatch.exec(processed)) !== null) {
457
- lastClosingIndex = match.index + match[0].length;
458
- }
459
- if (lastClosingIndex > 0) {
460
- processed = processed.slice(0, lastClosingIndex);
461
- }
462
- }
463
460
  const toolCallLines = [];
464
- const toolTagRegex = /<tool_call>([\s\S]*?)<\/tool_call>|<tool>([\s\S]*?)<\/tool>/gi;
465
- let tagMatch;
466
- while ((tagMatch = toolTagRegex.exec(processed)) !== null) {
467
- const content = (tagMatch[1] || tagMatch[2] || "").trim();
468
- if (content) {
469
- const lines = content.split(/\r?\n/).map((l) => l.trim()).filter((l) => l);
470
- toolCallLines.push(...lines);
471
- }
472
- }
473
461
  const allLines = processed.split(/\r?\n/).map((l) => l.trim());
474
462
  for (const line of allLines) {
475
463
  if (!line) continue;
@@ -685,6 +673,9 @@ async function toolListDirectory(provider, args) {
685
673
  // tools/warp_grep/agent/tools/finish.ts
686
674
  function normalizeFinishFiles(files) {
687
675
  return files.map((f) => {
676
+ if (f.lines === "*") {
677
+ return { path: f.path, lines: "*" };
678
+ }
688
679
  const merged = mergeRanges(f.lines);
689
680
  return { path: f.path, lines: merged };
690
681
  });
@@ -692,13 +683,18 @@ function normalizeFinishFiles(files) {
692
683
  async function readFinishFiles(repoRoot, files, reader) {
693
684
  const out = [];
694
685
  for (const f of files) {
695
- const ranges = mergeRanges(f.lines);
696
- const chunks = [];
697
- for (const [s, e] of ranges) {
698
- const lines = await reader(f.path, s, e);
699
- chunks.push(lines.join("\n"));
686
+ if (f.lines === "*") {
687
+ const lines = await reader(f.path);
688
+ out.push({ path: f.path, ranges: "*", content: lines.join("\n") });
689
+ } else {
690
+ const ranges = mergeRanges(f.lines);
691
+ const chunks = [];
692
+ for (const [s, e] of ranges) {
693
+ const lines = await reader(f.path, s, e);
694
+ chunks.push(lines.join("\n"));
695
+ }
696
+ out.push({ path: f.path, ranges, content: chunks.join("\n") });
700
697
  }
701
- out.push({ path: f.path, ranges, content: chunks.join("\n") });
702
698
  }
703
699
  return out;
704
700
  }
@@ -1099,7 +1095,7 @@ async function runWarpGrep(config) {
1099
1095
  }
1100
1096
  const parts = ["Relevant context found:"];
1101
1097
  for (const f of finishMeta.files) {
1102
- const ranges = f.lines.map(([s, e]) => `${s}-${e}`).join(", ");
1098
+ const ranges = f.lines === "*" ? "*" : f.lines.map(([s, e]) => `${s}-${e}`).join(", ");
1103
1099
  parts.push(`- ${f.path}: ${ranges}`);
1104
1100
  }
1105
1101
  const payload = parts.join("\n");
@@ -1138,9 +1134,20 @@ var import_path4 = __toESM(require("path"), 1);
1138
1134
 
1139
1135
  // tools/warp_grep/utils/ripgrep.ts
1140
1136
  var import_child_process = require("child_process");
1141
- var import_ripgrep = require("@vscode/ripgrep");
1142
1137
  var resolvedRgPath = null;
1143
1138
  var rgPathChecked = false;
1139
+ var bundledRgPath = null;
1140
+ async function getBundledRgPath() {
1141
+ if (bundledRgPath !== null) return bundledRgPath;
1142
+ try {
1143
+ const module2 = await Promise.resolve().then(() => __toESM(require_lib(), 1));
1144
+ bundledRgPath = module2.rgPath;
1145
+ return bundledRgPath;
1146
+ } catch {
1147
+ bundledRgPath = "";
1148
+ return null;
1149
+ }
1150
+ }
1144
1151
  function spawnRg(rgBinary, args, opts) {
1145
1152
  return new Promise((resolve) => {
1146
1153
  const child = (0, import_child_process.spawn)(rgBinary, args, {
@@ -1171,11 +1178,14 @@ async function runRipgrep(args, opts) {
1171
1178
  return spawnRg(resolvedRgPath, args, opts);
1172
1179
  }
1173
1180
  if (!rgPathChecked) {
1174
- const result = await spawnRg(import_ripgrep.rgPath, args, opts);
1175
- if (!isBinaryFailure(result)) {
1176
- resolvedRgPath = import_ripgrep.rgPath;
1177
- rgPathChecked = true;
1178
- return result;
1181
+ const bundledPath = await getBundledRgPath();
1182
+ if (bundledPath) {
1183
+ const result = await spawnRg(bundledPath, args, opts);
1184
+ if (!isBinaryFailure(result)) {
1185
+ resolvedRgPath = bundledPath;
1186
+ rgPathChecked = true;
1187
+ return result;
1188
+ }
1179
1189
  }
1180
1190
  const fallbackResult = await spawnRg("rg", args, opts);
1181
1191
  if (!isBinaryFailure(fallbackResult)) {