@morphllm/morphsdk 0.2.140 → 0.2.141

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 (175) hide show
  1. package/dist/{chunk-AKQSF324.js → chunk-2K2C2DPH.js} +2 -2
  2. package/dist/{chunk-QTQOUDQ3.js → chunk-3JOF6FGO.js} +15 -9
  3. package/dist/chunk-3JOF6FGO.js.map +1 -0
  4. package/dist/{chunk-NX5TNZUM.js → chunk-4PN7X26R.js} +2 -2
  5. package/dist/{chunk-JOQU6S23.js → chunk-5KU6AATB.js} +2 -2
  6. package/dist/{chunk-ECRKRLYL.js → chunk-5OQ2AP7P.js} +2 -2
  7. package/dist/{chunk-W72VYYLC.js → chunk-6SVFDE4H.js} +2 -2
  8. package/dist/{chunk-JXZASY3L.js → chunk-75NHDUXI.js} +2 -2
  9. package/dist/{chunk-JXZASY3L.js.map → chunk-75NHDUXI.js.map} +1 -1
  10. package/dist/{chunk-DRGK45GP.js → chunk-A7OVKFPP.js} +2 -2
  11. package/dist/{chunk-5TBKX7BU.js → chunk-B7V3HVH7.js} +2 -2
  12. package/dist/{chunk-LN5K5NTI.js → chunk-BCN3YI7H.js} +2 -2
  13. package/dist/{chunk-7SJZSOHL.js → chunk-DYJVBYME.js} +2 -2
  14. package/dist/{chunk-GONXM4HR.js → chunk-FRM547JD.js} +2 -2
  15. package/dist/{chunk-TQOC3LGM.js → chunk-GFFNRGTT.js} +25 -25
  16. package/dist/{chunk-XOMV4AIH.js → chunk-HKV7FSAI.js} +2 -2
  17. package/dist/{chunk-N5ZSTQ7H.js → chunk-I4RBXS4N.js} +3 -3
  18. package/dist/{chunk-4GCK5HBB.js → chunk-JH24YGQH.js} +2 -2
  19. package/dist/{chunk-D6ABTGRU.js → chunk-K6L4PBWM.js} +1 -1
  20. package/dist/{chunk-ZTKJTCIG.js → chunk-L6JHSH5T.js} +2 -2
  21. package/dist/{chunk-2UGM64A6.js → chunk-NGLNSM22.js} +2 -2
  22. package/dist/{chunk-W4UQMCH3.js → chunk-OBNCXJ2S.js} +2 -2
  23. package/dist/{chunk-NSA24AKY.js → chunk-SKE7JGL3.js} +8 -5
  24. package/dist/chunk-SKE7JGL3.js.map +1 -0
  25. package/dist/{chunk-XQMAOAF2.js → chunk-TFHKD6N6.js} +2 -2
  26. package/dist/{chunk-WECWVBX4.js → chunk-U3ZEE256.js} +2 -2
  27. package/dist/{chunk-UIBAKBGN.js → chunk-UDBPVAFE.js} +2 -2
  28. package/dist/{chunk-A4EHCYHH.js → chunk-VINAJ2PT.js} +2 -2
  29. package/dist/{client-B4fX3i7W.d.ts → client-BcO_qte8.d.ts} +1 -1
  30. package/dist/client.cjs +20 -11
  31. package/dist/client.cjs.map +1 -1
  32. package/dist/client.d.ts +2 -2
  33. package/dist/client.js +24 -24
  34. package/dist/edge.cjs +1 -1
  35. package/dist/edge.cjs.map +1 -1
  36. package/dist/edge.js +4 -4
  37. package/dist/index.cjs +20 -11
  38. package/dist/index.cjs.map +1 -1
  39. package/dist/index.d.ts +2 -2
  40. package/dist/index.js +28 -28
  41. package/dist/modelrouter/core.cjs +1 -1
  42. package/dist/modelrouter/core.cjs.map +1 -1
  43. package/dist/modelrouter/core.js +3 -3
  44. package/dist/modelrouter/index.cjs +1 -1
  45. package/dist/modelrouter/index.cjs.map +1 -1
  46. package/dist/modelrouter/index.js +3 -3
  47. package/dist/subagents/anthropic.cjs +20 -11
  48. package/dist/subagents/anthropic.cjs.map +1 -1
  49. package/dist/subagents/anthropic.d.ts +1 -1
  50. package/dist/subagents/anthropic.js +4 -4
  51. package/dist/subagents/index.d.ts +1 -1
  52. package/dist/subagents/prompts.d.ts +1 -1
  53. package/dist/subagents/types.d.ts +1 -1
  54. package/dist/subagents/vercel.cjs +20 -11
  55. package/dist/subagents/vercel.cjs.map +1 -1
  56. package/dist/subagents/vercel.d.ts +1 -1
  57. package/dist/subagents/vercel.js +4 -4
  58. package/dist/tools/browser/anthropic.cjs +1 -1
  59. package/dist/tools/browser/anthropic.cjs.map +1 -1
  60. package/dist/tools/browser/anthropic.js +5 -5
  61. package/dist/tools/browser/core.cjs +1 -1
  62. package/dist/tools/browser/core.cjs.map +1 -1
  63. package/dist/tools/browser/core.js +4 -4
  64. package/dist/tools/browser/index.cjs +1 -1
  65. package/dist/tools/browser/index.cjs.map +1 -1
  66. package/dist/tools/browser/index.js +7 -7
  67. package/dist/tools/browser/openai.cjs +1 -1
  68. package/dist/tools/browser/openai.cjs.map +1 -1
  69. package/dist/tools/browser/openai.js +5 -5
  70. package/dist/tools/browser/profiles/core.cjs +1 -1
  71. package/dist/tools/browser/profiles/core.cjs.map +1 -1
  72. package/dist/tools/browser/profiles/core.js +3 -3
  73. package/dist/tools/browser/profiles/index.cjs +1 -1
  74. package/dist/tools/browser/profiles/index.cjs.map +1 -1
  75. package/dist/tools/browser/profiles/index.js +3 -3
  76. package/dist/tools/browser/vercel.cjs +1 -1
  77. package/dist/tools/browser/vercel.cjs.map +1 -1
  78. package/dist/tools/browser/vercel.js +5 -5
  79. package/dist/tools/codebase_search/anthropic.cjs +1 -1
  80. package/dist/tools/codebase_search/anthropic.cjs.map +1 -1
  81. package/dist/tools/codebase_search/anthropic.js +4 -4
  82. package/dist/tools/codebase_search/core.cjs +1 -1
  83. package/dist/tools/codebase_search/core.cjs.map +1 -1
  84. package/dist/tools/codebase_search/core.js +3 -3
  85. package/dist/tools/codebase_search/index.cjs +1 -1
  86. package/dist/tools/codebase_search/index.cjs.map +1 -1
  87. package/dist/tools/codebase_search/index.js +8 -8
  88. package/dist/tools/codebase_search/openai.cjs +1 -1
  89. package/dist/tools/codebase_search/openai.cjs.map +1 -1
  90. package/dist/tools/codebase_search/openai.js +4 -4
  91. package/dist/tools/codebase_search/vercel.cjs +1 -1
  92. package/dist/tools/codebase_search/vercel.cjs.map +1 -1
  93. package/dist/tools/codebase_search/vercel.js +4 -4
  94. package/dist/tools/fastapply/anthropic.cjs +1 -1
  95. package/dist/tools/fastapply/anthropic.cjs.map +1 -1
  96. package/dist/tools/fastapply/anthropic.js +4 -4
  97. package/dist/tools/fastapply/apply.cjs +1 -1
  98. package/dist/tools/fastapply/apply.cjs.map +1 -1
  99. package/dist/tools/fastapply/apply.js +2 -2
  100. package/dist/tools/fastapply/core.cjs +1 -1
  101. package/dist/tools/fastapply/core.cjs.map +1 -1
  102. package/dist/tools/fastapply/core.js +3 -3
  103. package/dist/tools/fastapply/index.cjs +1 -1
  104. package/dist/tools/fastapply/index.cjs.map +1 -1
  105. package/dist/tools/fastapply/index.js +6 -6
  106. package/dist/tools/fastapply/openai.cjs +1 -1
  107. package/dist/tools/fastapply/openai.cjs.map +1 -1
  108. package/dist/tools/fastapply/openai.js +4 -4
  109. package/dist/tools/fastapply/vercel.cjs +1 -1
  110. package/dist/tools/fastapply/vercel.cjs.map +1 -1
  111. package/dist/tools/fastapply/vercel.js +4 -4
  112. package/dist/tools/index.cjs +1 -1
  113. package/dist/tools/index.cjs.map +1 -1
  114. package/dist/tools/index.js +6 -6
  115. package/dist/tools/utils/resilience.cjs +1 -1
  116. package/dist/tools/utils/resilience.cjs.map +1 -1
  117. package/dist/tools/utils/resilience.js +2 -2
  118. package/dist/tools/warp_grep/agent/runner.cjs +7 -4
  119. package/dist/tools/warp_grep/agent/runner.cjs.map +1 -1
  120. package/dist/tools/warp_grep/agent/runner.js +2 -2
  121. package/dist/tools/warp_grep/anthropic.cjs +20 -11
  122. package/dist/tools/warp_grep/anthropic.cjs.map +1 -1
  123. package/dist/tools/warp_grep/anthropic.d.ts +1 -1
  124. package/dist/tools/warp_grep/anthropic.js +4 -4
  125. package/dist/tools/warp_grep/client.cjs +20 -11
  126. package/dist/tools/warp_grep/client.cjs.map +1 -1
  127. package/dist/tools/warp_grep/client.d.ts +1 -1
  128. package/dist/tools/warp_grep/client.js +3 -3
  129. package/dist/tools/warp_grep/gemini.cjs +20 -11
  130. package/dist/tools/warp_grep/gemini.cjs.map +1 -1
  131. package/dist/tools/warp_grep/gemini.d.ts +1 -1
  132. package/dist/tools/warp_grep/gemini.js +3 -3
  133. package/dist/tools/warp_grep/index.cjs +20 -11
  134. package/dist/tools/warp_grep/index.cjs.map +1 -1
  135. package/dist/tools/warp_grep/index.d.ts +1 -1
  136. package/dist/tools/warp_grep/index.js +3 -3
  137. package/dist/tools/warp_grep/openai.cjs +20 -11
  138. package/dist/tools/warp_grep/openai.cjs.map +1 -1
  139. package/dist/tools/warp_grep/openai.d.ts +1 -1
  140. package/dist/tools/warp_grep/openai.js +4 -4
  141. package/dist/tools/warp_grep/providers/code_storage_http.d.ts +1 -1
  142. package/dist/tools/warp_grep/providers/remote.d.ts +1 -1
  143. package/dist/tools/warp_grep/vercel.cjs +20 -11
  144. package/dist/tools/warp_grep/vercel.cjs.map +1 -1
  145. package/dist/tools/warp_grep/vercel.d.ts +1 -1
  146. package/dist/tools/warp_grep/vercel.js +4 -4
  147. package/dist/{types-D2PCc7f6.d.ts → types-CtkD4o1_.d.ts} +4 -0
  148. package/dist/version.cjs +1 -1
  149. package/dist/version.cjs.map +1 -1
  150. package/dist/version.js +1 -1
  151. package/package.json +1 -1
  152. package/dist/chunk-NSA24AKY.js.map +0 -1
  153. package/dist/chunk-QTQOUDQ3.js.map +0 -1
  154. /package/dist/{chunk-AKQSF324.js.map → chunk-2K2C2DPH.js.map} +0 -0
  155. /package/dist/{chunk-NX5TNZUM.js.map → chunk-4PN7X26R.js.map} +0 -0
  156. /package/dist/{chunk-JOQU6S23.js.map → chunk-5KU6AATB.js.map} +0 -0
  157. /package/dist/{chunk-ECRKRLYL.js.map → chunk-5OQ2AP7P.js.map} +0 -0
  158. /package/dist/{chunk-W72VYYLC.js.map → chunk-6SVFDE4H.js.map} +0 -0
  159. /package/dist/{chunk-DRGK45GP.js.map → chunk-A7OVKFPP.js.map} +0 -0
  160. /package/dist/{chunk-5TBKX7BU.js.map → chunk-B7V3HVH7.js.map} +0 -0
  161. /package/dist/{chunk-LN5K5NTI.js.map → chunk-BCN3YI7H.js.map} +0 -0
  162. /package/dist/{chunk-7SJZSOHL.js.map → chunk-DYJVBYME.js.map} +0 -0
  163. /package/dist/{chunk-GONXM4HR.js.map → chunk-FRM547JD.js.map} +0 -0
  164. /package/dist/{chunk-TQOC3LGM.js.map → chunk-GFFNRGTT.js.map} +0 -0
  165. /package/dist/{chunk-XOMV4AIH.js.map → chunk-HKV7FSAI.js.map} +0 -0
  166. /package/dist/{chunk-N5ZSTQ7H.js.map → chunk-I4RBXS4N.js.map} +0 -0
  167. /package/dist/{chunk-4GCK5HBB.js.map → chunk-JH24YGQH.js.map} +0 -0
  168. /package/dist/{chunk-D6ABTGRU.js.map → chunk-K6L4PBWM.js.map} +0 -0
  169. /package/dist/{chunk-ZTKJTCIG.js.map → chunk-L6JHSH5T.js.map} +0 -0
  170. /package/dist/{chunk-2UGM64A6.js.map → chunk-NGLNSM22.js.map} +0 -0
  171. /package/dist/{chunk-W4UQMCH3.js.map → chunk-OBNCXJ2S.js.map} +0 -0
  172. /package/dist/{chunk-XQMAOAF2.js.map → chunk-TFHKD6N6.js.map} +0 -0
  173. /package/dist/{chunk-WECWVBX4.js.map → chunk-U3ZEE256.js.map} +0 -0
  174. /package/dist/{chunk-UIBAKBGN.js.map → chunk-UDBPVAFE.js.map} +0 -0
  175. /package/dist/{chunk-A4EHCYHH.js.map → chunk-VINAJ2PT.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../tools/warp_grep/agent/runner.ts"],"sourcesContent":["import { AGENT_CONFIG, DEFAULT_MODEL } from './config.js';\nimport type { AgentRunResult, ChatMessage, SessionConfig, AgentFinish, WarpGrepExecutionMetrics, WarpGrepTurnMetrics, WarpGrepStep } from './types.js';\nimport { LLMResponseParser } from './parser.js';\nimport type { WarpGrepProvider } from '../providers/types.js';\nimport { toolGrep } from './tools/grep.js';\nimport { toolRead } from './tools/read.js';\nimport { toolListDirectory } from './tools/list_directory.js';\nimport { readFinishFiles } from './tools/finish.js';\nimport type { RetryConfig } from '../../utils/resilience.js';\nimport { formatAgentToolOutput } from './formatter.js';\nimport { formatTurnMessage, calculateContextBudget, buildInitialState, enforceContextLimit } from './helpers.js';\nimport OpenAI from 'openai';\nimport { SDK_VERSION } from '../../../version.js';\nimport path from 'path';\n\ntype EventName =\n | 'initial_state'\n | 'round_start'\n | 'round_end'\n | 'finish'\n | 'error';\n\nexport type EventCallback = (name: EventName, payload: Record<string, unknown>) => void;\n\nconst parser = new LLMResponseParser();\n\nconst DEFAULT_API_URL = 'https://api.morphllm.com';\n\ninterface CallModelOptions {\n morphApiKey?: string;\n morphApiUrl?: string;\n retryConfig?: RetryConfig;\n timeout?: number;\n search_type?: string;\n}\n\nasync function callModel(\n messages: ChatMessage[],\n model: string,\n options: CallModelOptions = {}\n): Promise<string> {\n const baseUrl = options.morphApiUrl || DEFAULT_API_URL;\n const apiKey = options.morphApiKey || process.env.MORPH_API_KEY || '';\n const timeoutMs = options.timeout ?? AGENT_CONFIG.TIMEOUT_MS;\n\n // If the URL has a custom path (e.g. /api/gateway), use it as-is as the\n // OpenAI-compatible baseURL. Otherwise append /v1 for the standard Morph API.\n const parsedUrl = new URL(baseUrl);\n const baseURL = parsedUrl.pathname === '/' ? `${baseUrl}/v1` : baseUrl;\n\n const client = new OpenAI({\n apiKey,\n baseURL,\n maxRetries: options.retryConfig?.maxRetries,\n timeout: timeoutMs,\n defaultHeaders: { 'X-Morph-SDK-Version': SDK_VERSION },\n });\n\n const MAX_EMPTY_RETRIES = 1;\n\n for (let attempt = 0; attempt <= MAX_EMPTY_RETRIES; attempt++) {\n let data;\n try {\n data = await client.chat.completions.create({\n model,\n temperature: 0.0,\n max_tokens: 1024,\n messages,\n ...(options.search_type ? { search_type: options.search_type } as Record<string, unknown> : {}),\n });\n } catch (error) {\n if (error instanceof OpenAI.APIError && error.status === 404) {\n const defaultMsg =\n 'The endpoint you are trying to call is likely deprecated. Please update with: npm cache clean --force && npx -y @morphllm/morphmcp@latest or visit: https://morphllm.com/mcp';\n const errorText = error.message?.trim();\n throw new Error(errorText || defaultMsg);\n }\n throw error;\n }\n\n const choice = data?.choices?.[0];\n const content = choice?.message?.content;\n\n if (content && typeof content === 'string') {\n return content;\n }\n\n // Last attempt — throw with diagnostics\n if (attempt === MAX_EMPTY_RETRIES) {\n const finishReason = choice?.finish_reason ?? 'unknown';\n const hasToolCalls = Array.isArray(choice?.message?.tool_calls) && choice.message.tool_calls.length > 0;\n const choicesLen = data?.choices?.length ?? 0;\n const contentType = content === null ? 'null' : content === undefined ? 'undefined' : typeof content;\n\n throw new Error(\n `Invalid response from model: content=${contentType}, finish_reason=${finishReason}, ` +\n `has_tool_calls=${hasToolCalls}, choices_length=${choicesLen}`\n );\n }\n\n // Retry — brief pause before next attempt\n await new Promise(resolve => setTimeout(resolve, 200));\n }\n\n // Unreachable, but satisfies TypeScript\n throw new Error('Invalid response from model');\n}\n\nexport async function runWarpGrep(config: SessionConfig & { provider: WarpGrepProvider }): Promise<AgentRunResult> {\n const totalStart = Date.now();\n const timeoutMs = config.timeout ?? AGENT_CONFIG.TIMEOUT_MS;\n const timings: Partial<WarpGrepExecutionMetrics> = { turns: [], timeout_ms: timeoutMs };\n\n const repoRoot = path.resolve(config.repoRoot || process.cwd());\n const model = config.model || DEFAULT_MODEL;\n const messages: ChatMessage[] = [];\n\n const maxTurns = AGENT_CONFIG.MAX_TURNS;\n\n const initialStateStart = Date.now();\n const initialState = await buildInitialState(repoRoot, config.searchTerm, config.provider, { search_type: config.search_type });\n timings.initial_state_ms = Date.now() - initialStateStart;\n\n messages.push({ role: 'user', content: initialState });\n\n const provider = config.provider;\n const errors: Array<{ message: string }> = [];\n\n let finishMeta: AgentFinish | undefined;\n let terminationReason: AgentRunResult['terminationReason'] = 'terminated';\n\n for (let turn = 1; turn <= maxTurns; turn += 1) {\n const turnMetrics: WarpGrepTurnMetrics = { turn, morph_api_ms: 0, local_tools_ms: 0 };\n\n // Enforce hard context limit before calling model\n enforceContextLimit(messages);\n\n // call model\n const modelCallStart = Date.now();\n const assistantContent = await callModel(messages, model, {\n morphApiKey: config.morphApiKey,\n morphApiUrl: config.morphApiUrl,\n retryConfig: config.retryConfig,\n timeout: timeoutMs,\n search_type: config.search_type,\n }).catch((e: unknown) => {\n const errMsg = e instanceof Error ? e.message : String(e);\n console.error(`[warp_grep] Morph API call failed on turn ${turn}:`, errMsg);\n errors.push({ message: errMsg });\n return '';\n });\n turnMetrics.morph_api_ms = Date.now() - modelCallStart;\n\n if (!assistantContent) {\n console.error(`[warp_grep] Empty response from Morph API on turn ${turn}. Errors so far:`, errors);\n timings.turns!.push(turnMetrics);\n break;\n }\n messages.push({ role: 'assistant', content: assistantContent });\n\n // parse tool calls\n const toolCalls = parser.parse(assistantContent);\n if (toolCalls.length === 0) {\n console.error(`[warp_grep] No tool calls parsed on turn ${turn}. Assistant content (first 500 chars):`, assistantContent.slice(0, 500));\n errors.push({ message: 'No tool calls produced by the model. Your MCP is likely out of date! Update it by running: rm -rf ~/.npm/_npx && npm cache clean --force && npx -y @morphllm/morphmcp@latest' });\n terminationReason = 'terminated';\n timings.turns!.push(turnMetrics);\n break;\n }\n\n const finishCalls = toolCalls.filter(c => c.name === 'finish');\n const grepCalls = toolCalls.filter(c => c.name === 'grep');\n const listDirCalls = toolCalls.filter(c => c.name === 'list_directory');\n const readCalls = toolCalls.filter(c => c.name === 'read');\n const skipCalls = toolCalls.filter(c => c.name === '_skip');\n\n const formatted: string[] = [];\n\n // Surface any skipped commands as feedback to the LLM\n for (const c of skipCalls) {\n const msg = (c.arguments as { message?: string })?.message || 'Command skipped due to parsing error';\n formatted.push(msg);\n }\n\n const allPromises: Array<Promise<string>> = [];\n\n for (const c of grepCalls) {\n const args = (c.arguments ?? {}) as { pattern: string; path: string; glob?: string; context_lines?: number; case_sensitive?: boolean };\n allPromises.push(\n toolGrep(provider, args).then(\n ({ output }) => formatAgentToolOutput('grep', args, output),\n err => formatAgentToolOutput('grep', args, String(err), { isError: true })\n )\n );\n }\n\n for (const c of listDirCalls) {\n const args = (c.arguments ?? {}) as { path: string; pattern?: string | null };\n allPromises.push(\n toolListDirectory(provider, args).then(\n p => formatAgentToolOutput('list_directory', args, p),\n err => formatAgentToolOutput('list_directory', args, String(err), { isError: true })\n )\n );\n }\n\n for (const c of readCalls) {\n const args = (c.arguments ?? {}) as { path: string; start?: number; end?: number; lines?: Array<[number, number]> };\n allPromises.push(\n toolRead(provider, args).then(\n p => formatAgentToolOutput('read', args, p),\n err => formatAgentToolOutput('read', args, String(err), { isError: true })\n )\n );\n }\n\n const toolExecStart = Date.now();\n const allResults = await Promise.all(allPromises);\n turnMetrics.local_tools_ms = Date.now() - toolExecStart;\n\n for (const result of allResults) {\n formatted.push(result);\n }\n\n if (formatted.length > 0) {\n const turnMessage = formatTurnMessage(turn, maxTurns);\n const contextBudget = calculateContextBudget(messages);\n messages.push({ role: 'user', content: formatted.join('\\n') + turnMessage + '\\n' + contextBudget });\n }\n\n timings.turns!.push(turnMetrics);\n\n if (finishCalls.length) {\n const fc = finishCalls[0];\n const files = ((fc.arguments as any)?.files ?? []) as AgentFinish['files'];\n const textResult = (fc.arguments as any)?.textResult as string | undefined;\n finishMeta = { files };\n terminationReason = 'completed';\n\n // Text-only finish: model returned a text response instead of file references\n if (files.length === 0) {\n const payload = textResult || 'No relevant code found.';\n timings.turns!.push(turnMetrics);\n timings.total_ms = Date.now() - totalStart;\n return {\n terminationReason: 'completed',\n messages,\n finish: { payload, metadata: finishMeta },\n timings: timings as WarpGrepExecutionMetrics,\n };\n }\n\n break;\n }\n }\n\n if (terminationReason !== 'completed' || !finishMeta) {\n timings.total_ms = Date.now() - totalStart;\n return { terminationReason, messages, errors, timings: timings as WarpGrepExecutionMetrics };\n }\n\n // Build finish payload\n const parts: string[] = ['Relevant context found:'];\n for (const f of finishMeta.files) {\n const ranges = f.lines === '*' ? '*'\n : Array.isArray(f.lines) ? f.lines.map(([s, e]) => `${s}-${e}`).join(', ')\n : '*';\n parts.push(`- ${f.path}: ${ranges}`);\n }\n const payload = parts.join('\\n');\n\n // Resolve file contents for returned ranges\n const finishResolutionStart = Date.now();\n const fileReadErrors: Array<{ path: string; error: string }> = [];\n const resolved = await readFinishFiles(\n repoRoot,\n finishMeta.files,\n async (p: string, s?: number, e?: number) => {\n try {\n const rr = await provider.read({ path: p, start: s, end: e });\n return rr.lines.map(l => {\n const idx = l.indexOf('|');\n return idx >= 0 ? l.slice(idx + 1) : l;\n });\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n fileReadErrors.push({ path: p, error: errorMsg });\n console.error(`[warp_grep] Failed to read file: ${p} - ${errorMsg}`);\n return [`[couldn't find: ${p}]`];\n }\n }\n );\n\n timings.finish_resolution_ms = Date.now() - finishResolutionStart;\n\n if (fileReadErrors.length > 0) {\n errors.push(...fileReadErrors.map(e => ({ message: `File read error: ${e.path} - ${e.error}` })));\n }\n\n timings.total_ms = Date.now() - totalStart;\n return {\n terminationReason: 'completed',\n messages,\n finish: { payload, metadata: finishMeta, resolved },\n timings: timings as WarpGrepExecutionMetrics,\n };\n}\n\n/**\n * Streaming version of runWarpGrep that yields step information after each turn.\n * Yields WarpGrepStep with tool calls for each turn, then returns the final AgentRunResult.\n */\nexport async function* runWarpGrepStreaming(\n config: SessionConfig & { provider: WarpGrepProvider }\n): AsyncGenerator<WarpGrepStep, AgentRunResult, undefined> {\n const totalStart = Date.now();\n const timeoutMs = config.timeout ?? AGENT_CONFIG.TIMEOUT_MS;\n const timings: Partial<WarpGrepExecutionMetrics> = { turns: [], timeout_ms: timeoutMs };\n\n const repoRoot = path.resolve(config.repoRoot || process.cwd());\n const model = config.model || DEFAULT_MODEL;\n const messages: ChatMessage[] = [];\n\n const maxTurns = AGENT_CONFIG.MAX_TURNS;\n\n const initialStateStart = Date.now();\n const initialState = await buildInitialState(repoRoot, config.searchTerm, config.provider, { search_type: config.search_type });\n timings.initial_state_ms = Date.now() - initialStateStart;\n\n messages.push({ role: 'user', content: initialState });\n\n const provider = config.provider;\n const errors: Array<{ message: string }> = [];\n\n let finishMeta: AgentFinish | undefined;\n let terminationReason: AgentRunResult['terminationReason'] = 'terminated';\n\n for (let turn = 1; turn <= maxTurns; turn += 1) {\n const turnMetrics: WarpGrepTurnMetrics = { turn, morph_api_ms: 0, local_tools_ms: 0 };\n\n // Enforce hard context limit before calling model\n enforceContextLimit(messages);\n\n // call model\n const modelCallStart = Date.now();\n const assistantContent = await callModel(messages, model, {\n morphApiKey: config.morphApiKey,\n morphApiUrl: config.morphApiUrl,\n retryConfig: config.retryConfig,\n timeout: timeoutMs,\n search_type: config.search_type,\n }).catch((e: unknown) => {\n const errMsg = e instanceof Error ? e.message : String(e);\n console.error(`[warp_grep:stream] Morph API call failed on turn ${turn}:`, errMsg);\n errors.push({ message: errMsg });\n return '';\n });\n turnMetrics.morph_api_ms = Date.now() - modelCallStart;\n\n if (!assistantContent) {\n console.error(`[warp_grep:stream] Empty response from Morph API on turn ${turn}. Errors so far:`, errors);\n timings.turns!.push(turnMetrics);\n break;\n }\n messages.push({ role: 'assistant', content: assistantContent });\n\n // parse tool calls\n const toolCalls = parser.parse(assistantContent);\n if (toolCalls.length === 0) {\n console.error(`[warp_grep:stream] No tool calls parsed on turn ${turn}. Assistant content (first 500 chars):`, assistantContent.slice(0, 500));\n errors.push({ message: 'No tool calls produced by the model. Your MCP is likely out of date! Update it by running: rm -rf ~/.npm/_npx && npm cache clean --force && npx -y @morphllm/morphmcp@latest' });\n terminationReason = 'terminated';\n timings.turns!.push(turnMetrics);\n break;\n }\n\n // Yield step with tool calls (before execution)\n yield {\n turn,\n toolCalls: toolCalls.map(c => ({\n name: c.name,\n arguments: c.arguments ?? {}\n }))\n };\n\n const finishCalls = toolCalls.filter(c => c.name === 'finish');\n const grepCalls = toolCalls.filter(c => c.name === 'grep');\n const listDirCalls = toolCalls.filter(c => c.name === 'list_directory');\n const readCalls = toolCalls.filter(c => c.name === 'read');\n const skipCalls = toolCalls.filter(c => c.name === '_skip');\n\n const formatted: string[] = [];\n\n // Surface any skipped commands as feedback to the LLM\n for (const c of skipCalls) {\n const msg = (c.arguments as { message?: string })?.message || 'Command skipped due to parsing error';\n formatted.push(msg);\n }\n\n const allPromises: Array<Promise<string>> = [];\n\n for (const c of grepCalls) {\n const args = (c.arguments ?? {}) as { pattern: string; path: string; glob?: string; context_lines?: number; case_sensitive?: boolean };\n allPromises.push(\n toolGrep(provider, args).then(\n ({ output }) => formatAgentToolOutput('grep', args, output),\n err => formatAgentToolOutput('grep', args, String(err), { isError: true })\n )\n );\n }\n\n for (const c of listDirCalls) {\n const args = (c.arguments ?? {}) as { path: string; pattern?: string | null };\n allPromises.push(\n toolListDirectory(provider, args).then(\n p => formatAgentToolOutput('list_directory', args, p),\n err => formatAgentToolOutput('list_directory', args, String(err), { isError: true })\n )\n );\n }\n\n for (const c of readCalls) {\n const args = (c.arguments ?? {}) as { path: string; start?: number; end?: number; lines?: Array<[number, number]> };\n allPromises.push(\n toolRead(provider, args).then(\n p => formatAgentToolOutput('read', args, p),\n err => formatAgentToolOutput('read', args, String(err), { isError: true })\n )\n );\n }\n\n const toolExecStart = Date.now();\n const allResults = await Promise.all(allPromises);\n turnMetrics.local_tools_ms = Date.now() - toolExecStart;\n\n for (const result of allResults) {\n formatted.push(result);\n }\n\n if (formatted.length > 0) {\n const turnMessage = formatTurnMessage(turn, maxTurns);\n const contextBudget = calculateContextBudget(messages);\n messages.push({ role: 'user', content: formatted.join('\\n') + turnMessage + '\\n' + contextBudget });\n }\n\n timings.turns!.push(turnMetrics);\n\n if (finishCalls.length) {\n const fc = finishCalls[0];\n const files = ((fc.arguments as any)?.files ?? []) as AgentFinish['files'];\n const textResult = (fc.arguments as any)?.textResult as string | undefined;\n finishMeta = { files };\n terminationReason = 'completed';\n\n // Text-only finish\n if (files.length === 0) {\n const payload = textResult || 'No relevant code found.';\n timings.total_ms = Date.now() - totalStart;\n return {\n terminationReason: 'completed',\n messages,\n finish: { payload, metadata: finishMeta },\n timings: timings as WarpGrepExecutionMetrics,\n };\n }\n\n break;\n }\n }\n\n if (terminationReason !== 'completed' || !finishMeta) {\n timings.total_ms = Date.now() - totalStart;\n return { terminationReason, messages, errors, timings: timings as WarpGrepExecutionMetrics };\n }\n\n // Build finish payload\n const parts: string[] = ['Relevant context found:'];\n for (const f of finishMeta.files) {\n const ranges = f.lines === '*' ? '*'\n : Array.isArray(f.lines) ? f.lines.map(([s, e]) => `${s}-${e}`).join(', ')\n : '*';\n parts.push(`- ${f.path}: ${ranges}`);\n }\n const payload = parts.join('\\n');\n\n // Resolve file contents for returned ranges\n const finishResolutionStart = Date.now();\n const fileReadErrors: Array<{ path: string; error: string }> = [];\n const resolved = await readFinishFiles(\n repoRoot,\n finishMeta.files,\n async (p: string, s?: number, e?: number) => {\n try {\n const rr = await provider.read({ path: p, start: s, end: e });\n return rr.lines.map(l => {\n const idx = l.indexOf('|');\n return idx >= 0 ? l.slice(idx + 1) : l;\n });\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n fileReadErrors.push({ path: p, error: errorMsg });\n console.error(`[warp_grep] Failed to read file: ${p} - ${errorMsg}`);\n return [`[couldn't find: ${p}]`];\n }\n }\n );\n\n timings.finish_resolution_ms = Date.now() - finishResolutionStart;\n\n if (fileReadErrors.length > 0) {\n errors.push(...fileReadErrors.map(e => ({ message: `File read error: ${e.path} - ${e.error}` })));\n }\n\n timings.total_ms = Date.now() - totalStart;\n return {\n terminationReason: 'completed',\n messages,\n finish: { payload, metadata: finishMeta, resolved },\n timings: timings as WarpGrepExecutionMetrics,\n };\n}\n"],"mappings":"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","names":["payload"]}
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-2HMEZZKK.js";
5
5
  import {
6
6
  executeBrowserTask
7
- } from "./chunk-N5ZSTQ7H.js";
7
+ } from "./chunk-I4RBXS4N.js";
8
8
  import {
9
9
  __export
10
10
  } from "./chunk-PZ5AY32C.js";
@@ -93,4 +93,4 @@ export {
93
93
  createBrowserTool,
94
94
  openai_exports
95
95
  };
96
- //# sourceMappingURL=chunk-XQMAOAF2.js.map
96
+ //# sourceMappingURL=chunk-TFHKD6N6.js.map
@@ -8,7 +8,7 @@ import {
8
8
  executeGitHubReadFile,
9
9
  executeToolCall,
10
10
  executeToolCallStreaming
11
- } from "./chunk-QTQOUDQ3.js";
11
+ } from "./chunk-3JOF6FGO.js";
12
12
 
13
13
  // tools/warp_grep/vercel.ts
14
14
  import { tool } from "ai";
@@ -115,4 +115,4 @@ export {
115
115
  createGitHubReadFileTool,
116
116
  vercel_default
117
117
  };
118
- //# sourceMappingURL=chunk-WECWVBX4.js.map
118
+ //# sourceMappingURL=chunk-U3ZEE256.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-63WE2C5R.js";
5
5
  import {
6
6
  executeEditFile
7
- } from "./chunk-D6ABTGRU.js";
7
+ } from "./chunk-K6L4PBWM.js";
8
8
  import {
9
9
  __export
10
10
  } from "./chunk-PZ5AY32C.js";
@@ -91,4 +91,4 @@ export {
91
91
  openai_default,
92
92
  openai_exports
93
93
  };
94
- //# sourceMappingURL=chunk-UIBAKBGN.js.map
94
+ //# sourceMappingURL=chunk-UDBPVAFE.js.map
@@ -14,7 +14,7 @@ import {
14
14
  executeToolCall,
15
15
  formatGitHubReadFileResult,
16
16
  formatResult
17
- } from "./chunk-QTQOUDQ3.js";
17
+ } from "./chunk-3JOF6FGO.js";
18
18
 
19
19
  // tools/warp_grep/anthropic.ts
20
20
  var INPUT_SCHEMA = {
@@ -90,4 +90,4 @@ export {
90
90
  createGitHubSearchTool,
91
91
  createGitHubReadFileTool
92
92
  };
93
- //# sourceMappingURL=chunk-A4EHCYHH.js.map
93
+ //# sourceMappingURL=chunk-VINAJ2PT.js.map
@@ -8,7 +8,7 @@ import { CompactClient } from './tools/compact/core.js';
8
8
  import { OpenAIRouter, AnthropicRouter, GeminiRouter, RawRouter } from './modelrouter/core.js';
9
9
  import { EditFileConfig, EditFileInput, EditFileResult, EditChanges } from './tools/fastapply/types.js';
10
10
  import { CodebaseSearchConfig, CodebaseSearchInput, CodebaseSearchResult } from './tools/codebase_search/types.js';
11
- import { d as WarpGrepToolConfig, b as WarpGrepResult, g as GitHubSearchToolConfig, c as WarpGrepContext } from './types-D2PCc7f6.js';
11
+ import { d as WarpGrepToolConfig, b as WarpGrepResult, g as GitHubSearchToolConfig, c as WarpGrepContext } from './types-CtkD4o1_.js';
12
12
  import * as openai_resources_index_mjs from 'openai/resources/index.mjs';
13
13
  import { ExploreSubagentConfig, ExploreResult, ExploreSession, ExploreEvent } from './subagents/types.js';
14
14
  import * as _anthropic_ai_sdk_resources_messages_mjs from '@anthropic-ai/sdk/resources/messages.mjs';
package/dist/client.cjs CHANGED
@@ -36,7 +36,7 @@ var init_package = __esm({
36
36
  "package.json"() {
37
37
  package_default = {
38
38
  name: "@morphllm/morphsdk",
39
- version: "0.2.140",
39
+ version: "0.2.141",
40
40
  description: "TypeScript SDK and CLI for Morph Fast Apply integration",
41
41
  type: "module",
42
42
  main: "./dist/index.cjs",
@@ -2888,7 +2888,8 @@ async function callModel(messages, model, options = {}) {
2888
2888
  model,
2889
2889
  temperature: 0,
2890
2890
  max_tokens: 1024,
2891
- messages
2891
+ messages,
2892
+ ...options.search_type ? { search_type: options.search_type } : {}
2892
2893
  });
2893
2894
  } catch (error) {
2894
2895
  if (error instanceof import_openai2.default.APIError && error.status === 404) {
@@ -2940,7 +2941,8 @@ async function runWarpGrep(config) {
2940
2941
  morphApiKey: config.morphApiKey,
2941
2942
  morphApiUrl: config.morphApiUrl,
2942
2943
  retryConfig: config.retryConfig,
2943
- timeout: timeoutMs
2944
+ timeout: timeoutMs,
2945
+ search_type: config.search_type
2944
2946
  }).catch((e) => {
2945
2947
  const errMsg = e instanceof Error ? e.message : String(e);
2946
2948
  console.error(`[warp_grep] Morph API call failed on turn ${turn}:`, errMsg);
@@ -3098,7 +3100,8 @@ async function* runWarpGrepStreaming(config) {
3098
3100
  morphApiKey: config.morphApiKey,
3099
3101
  morphApiUrl: config.morphApiUrl,
3100
3102
  retryConfig: config.retryConfig,
3101
- timeout: timeoutMs
3103
+ timeout: timeoutMs,
3104
+ search_type: config.search_type
3102
3105
  }).catch((e) => {
3103
3106
  const errMsg = e instanceof Error ? e.message : String(e);
3104
3107
  console.error(`[warp_grep:stream] Morph API call failed on turn ${turn}:`, errMsg);
@@ -3469,9 +3472,10 @@ function parseGitHubUrl(input) {
3469
3472
 
3470
3473
  // tools/warp_grep/client.ts
3471
3474
  var DEFAULT_CODE_SEARCH_URL = "https://morphllm.com";
3472
- async function getLocalProvider(repoRoot, excludes) {
3475
+ async function getLocalProvider(repoRoot, excludes, allowNames) {
3473
3476
  const { LocalRipgrepProvider: LocalRipgrepProvider2 } = await Promise.resolve().then(() => (init_local(), local_exports));
3474
- return new LocalRipgrepProvider2(repoRoot, excludes);
3477
+ const opts = allowNames?.length ? { allowNames } : void 0;
3478
+ return new LocalRipgrepProvider2(repoRoot, excludes, opts);
3475
3479
  }
3476
3480
  var WarpGrepClient = class {
3477
3481
  config;
@@ -3489,7 +3493,8 @@ var WarpGrepClient = class {
3489
3493
  morphApiKey: this.config.morphApiKey,
3490
3494
  morphApiUrl: this.config.morphApiUrl,
3491
3495
  retryConfig: this.config.retryConfig,
3492
- timeout: this.config.timeout
3496
+ timeout: this.config.timeout,
3497
+ search_type: input.search_type
3493
3498
  };
3494
3499
  if (input.streamSteps) {
3495
3500
  return executeToolCallStreaming({ search_term: input.searchTerm }, toolConfig);
@@ -3573,7 +3578,8 @@ var WarpGrepClient = class {
3573
3578
  };
3574
3579
  async function executeToolCall(input, config) {
3575
3580
  const parsed = typeof input === "string" ? JSON.parse(input) : input;
3576
- const provider = config.remoteCommands ? new RemoteCommandsProvider(config.repoRoot, config.remoteCommands) : config.provider ?? await getLocalProvider(config.repoRoot, config.excludes);
3581
+ const allowNames = config.search_type === "node_modules" ? ["node_modules"] : void 0;
3582
+ const provider = config.remoteCommands ? new RemoteCommandsProvider(config.repoRoot, config.remoteCommands) : config.provider ?? await getLocalProvider(config.repoRoot, config.excludes, allowNames);
3577
3583
  const result = await runWarpGrep({
3578
3584
  searchTerm: parsed.search_term,
3579
3585
  repoRoot: config.repoRoot,
@@ -3584,7 +3590,8 @@ async function executeToolCall(input, config) {
3584
3590
  morphApiKey: config.morphApiKey,
3585
3591
  morphApiUrl: config.morphApiUrl,
3586
3592
  retryConfig: config.retryConfig,
3587
- timeout: config.timeout
3593
+ timeout: config.timeout,
3594
+ search_type: config.search_type
3588
3595
  });
3589
3596
  const finish = result.finish;
3590
3597
  if (result.terminationReason !== "completed" || !finish?.metadata) {
@@ -3615,7 +3622,8 @@ function processAgentResult(result) {
3615
3622
  }
3616
3623
  async function* executeToolCallStreaming(input, config) {
3617
3624
  const parsed = typeof input === "string" ? JSON.parse(input) : input;
3618
- const provider = config.remoteCommands ? new RemoteCommandsProvider(config.repoRoot, config.remoteCommands) : config.provider ?? await getLocalProvider(config.repoRoot, config.excludes);
3625
+ const allowNames = config.search_type === "node_modules" ? ["node_modules"] : void 0;
3626
+ const provider = config.remoteCommands ? new RemoteCommandsProvider(config.repoRoot, config.remoteCommands) : config.provider ?? await getLocalProvider(config.repoRoot, config.excludes, allowNames);
3619
3627
  const generator = runWarpGrepStreaming({
3620
3628
  searchTerm: parsed.search_term,
3621
3629
  repoRoot: config.repoRoot,
@@ -3626,7 +3634,8 @@ async function* executeToolCallStreaming(input, config) {
3626
3634
  morphApiKey: config.morphApiKey,
3627
3635
  morphApiUrl: config.morphApiUrl,
3628
3636
  retryConfig: config.retryConfig,
3629
- timeout: config.timeout
3637
+ timeout: config.timeout,
3638
+ search_type: config.search_type
3630
3639
  });
3631
3640
  let agentResult;
3632
3641
  for (; ; ) {