@morphllm/morphsdk 0.2.153 → 0.2.154

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 (170) hide show
  1. package/dist/{chunk-MJQNHIUZ.js → chunk-2WAHX6I2.js} +2 -2
  2. package/dist/{chunk-7AWNEVBE.js → chunk-3BTUUH23.js} +2 -2
  3. package/dist/{chunk-NO2FGIQ7.js → chunk-3XO33KPS.js} +2 -2
  4. package/dist/{chunk-NO2FGIQ7.js.map → chunk-3XO33KPS.js.map} +1 -1
  5. package/dist/{chunk-GAZCVVNY.js → chunk-4R6F66B7.js} +2 -2
  6. package/dist/{chunk-QFRDNJXM.js → chunk-5IKDEESU.js} +3 -3
  7. package/dist/{chunk-5D7DDSZQ.js → chunk-A6T6E636.js} +2 -2
  8. package/dist/{chunk-FWHQH6RG.js → chunk-D5UUKDKL.js} +2 -2
  9. package/dist/{chunk-YBVAKGFE.js → chunk-FOKMTUWC.js} +2 -2
  10. package/dist/chunk-GLQWEINZ.js +53 -0
  11. package/dist/chunk-GLQWEINZ.js.map +1 -0
  12. package/dist/{chunk-KM7RICB6.js → chunk-J43SJUCO.js} +1 -1
  13. package/dist/{chunk-UFPDHAZ2.js → chunk-KRRO7FF2.js} +2 -2
  14. package/dist/{chunk-WTMEO2YB.js → chunk-LK4C3NYX.js} +2 -2
  15. package/dist/{chunk-QMLGJK66.js → chunk-MTRH7FMN.js} +2 -2
  16. package/dist/{chunk-I3ZPXGMZ.js → chunk-N4KLUOXK.js} +2 -2
  17. package/dist/{chunk-GKBKSSUA.js → chunk-P57SFOLD.js} +2 -2
  18. package/dist/{chunk-QVWKDO76.js → chunk-PRHEWGWC.js} +20 -20
  19. package/dist/{chunk-77O2YF4B.js → chunk-Q77CT3RI.js} +2 -2
  20. package/dist/{chunk-ZAADJ3ER.js → chunk-QSATHLZJ.js} +2 -2
  21. package/dist/{chunk-AGFVQOGJ.js → chunk-SCVWDNQP.js} +2 -2
  22. package/dist/chunk-SCVWDNQP.js.map +1 -0
  23. package/dist/{chunk-JB4T3K5T.js → chunk-TAGDMT3K.js} +2 -2
  24. package/dist/{chunk-H6RMMTKF.js → chunk-UDI5U6QV.js} +2 -2
  25. package/dist/{chunk-7IQMKVT4.js → chunk-VK76R3IN.js} +2 -2
  26. package/dist/{chunk-MFKR5VVL.js → chunk-WQU6QXSU.js} +17 -16
  27. package/dist/chunk-WQU6QXSU.js.map +1 -0
  28. package/dist/{chunk-Q4DXGXXU.js → chunk-Y5O3A7SU.js} +2 -2
  29. package/dist/{chunk-6FRGRPUO.js → chunk-YKBVE3CE.js} +2 -2
  30. package/dist/{chunk-3VMW3UJY.js → chunk-ZHKANLAQ.js} +2 -2
  31. package/dist/{chunk-QDDT5L5Y.js → chunk-ZSA3NL5T.js} +2 -2
  32. package/dist/client.cjs +140 -97
  33. package/dist/client.cjs.map +1 -1
  34. package/dist/client.js +24 -23
  35. package/dist/edge.cjs +2 -2
  36. package/dist/edge.cjs.map +1 -1
  37. package/dist/edge.js +7 -7
  38. package/dist/index.cjs +140 -97
  39. package/dist/index.cjs.map +1 -1
  40. package/dist/index.js +26 -25
  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 +138 -15
  48. package/dist/subagents/anthropic.cjs.map +1 -1
  49. package/dist/subagents/anthropic.js +6 -4
  50. package/dist/subagents/vercel.cjs +138 -15
  51. package/dist/subagents/vercel.cjs.map +1 -1
  52. package/dist/subagents/vercel.js +6 -4
  53. package/dist/tools/browser/anthropic.cjs +1 -1
  54. package/dist/tools/browser/anthropic.cjs.map +1 -1
  55. package/dist/tools/browser/anthropic.js +5 -5
  56. package/dist/tools/browser/core.cjs +1 -1
  57. package/dist/tools/browser/core.cjs.map +1 -1
  58. package/dist/tools/browser/core.js +4 -4
  59. package/dist/tools/browser/index.cjs +1 -1
  60. package/dist/tools/browser/index.cjs.map +1 -1
  61. package/dist/tools/browser/index.js +7 -7
  62. package/dist/tools/browser/openai.cjs +1 -1
  63. package/dist/tools/browser/openai.cjs.map +1 -1
  64. package/dist/tools/browser/openai.js +5 -5
  65. package/dist/tools/browser/profiles/core.cjs +1 -1
  66. package/dist/tools/browser/profiles/core.cjs.map +1 -1
  67. package/dist/tools/browser/profiles/core.js +3 -3
  68. package/dist/tools/browser/profiles/index.cjs +1 -1
  69. package/dist/tools/browser/profiles/index.cjs.map +1 -1
  70. package/dist/tools/browser/profiles/index.js +3 -3
  71. package/dist/tools/browser/vercel.cjs +1 -1
  72. package/dist/tools/browser/vercel.cjs.map +1 -1
  73. package/dist/tools/browser/vercel.js +5 -5
  74. package/dist/tools/codebase_search/anthropic.cjs +1 -1
  75. package/dist/tools/codebase_search/anthropic.cjs.map +1 -1
  76. package/dist/tools/codebase_search/anthropic.js +4 -4
  77. package/dist/tools/codebase_search/core.cjs +1 -1
  78. package/dist/tools/codebase_search/core.cjs.map +1 -1
  79. package/dist/tools/codebase_search/core.js +3 -3
  80. package/dist/tools/codebase_search/index.cjs +1 -1
  81. package/dist/tools/codebase_search/index.cjs.map +1 -1
  82. package/dist/tools/codebase_search/index.js +6 -6
  83. package/dist/tools/codebase_search/openai.cjs +1 -1
  84. package/dist/tools/codebase_search/openai.cjs.map +1 -1
  85. package/dist/tools/codebase_search/openai.js +4 -4
  86. package/dist/tools/codebase_search/vercel.cjs +1 -1
  87. package/dist/tools/codebase_search/vercel.cjs.map +1 -1
  88. package/dist/tools/codebase_search/vercel.js +4 -4
  89. package/dist/tools/compact/core.cjs +1 -1
  90. package/dist/tools/compact/core.cjs.map +1 -1
  91. package/dist/tools/compact/core.js +1 -1
  92. package/dist/tools/compact/index.cjs +50 -3
  93. package/dist/tools/compact/index.cjs.map +1 -1
  94. package/dist/tools/compact/index.d.ts +10 -0
  95. package/dist/tools/compact/index.js +6 -2
  96. package/dist/tools/fastapply/anthropic.cjs +1 -1
  97. package/dist/tools/fastapply/anthropic.cjs.map +1 -1
  98. package/dist/tools/fastapply/anthropic.js +4 -4
  99. package/dist/tools/fastapply/apply.cjs +1 -1
  100. package/dist/tools/fastapply/apply.cjs.map +1 -1
  101. package/dist/tools/fastapply/apply.js +2 -2
  102. package/dist/tools/fastapply/core.cjs +1 -1
  103. package/dist/tools/fastapply/core.cjs.map +1 -1
  104. package/dist/tools/fastapply/core.js +3 -3
  105. package/dist/tools/fastapply/index.cjs +1 -1
  106. package/dist/tools/fastapply/index.cjs.map +1 -1
  107. package/dist/tools/fastapply/index.js +6 -6
  108. package/dist/tools/fastapply/openai.cjs +1 -1
  109. package/dist/tools/fastapply/openai.cjs.map +1 -1
  110. package/dist/tools/fastapply/openai.js +4 -4
  111. package/dist/tools/fastapply/vercel.cjs +1 -1
  112. package/dist/tools/fastapply/vercel.cjs.map +1 -1
  113. package/dist/tools/fastapply/vercel.js +4 -4
  114. package/dist/tools/index.cjs +1 -1
  115. package/dist/tools/index.cjs.map +1 -1
  116. package/dist/tools/index.js +6 -6
  117. package/dist/tools/utils/resilience.cjs +1 -1
  118. package/dist/tools/utils/resilience.cjs.map +1 -1
  119. package/dist/tools/utils/resilience.js +2 -2
  120. package/dist/tools/warp_grep/agent/runner.cjs +1 -1
  121. package/dist/tools/warp_grep/agent/runner.cjs.map +1 -1
  122. package/dist/tools/warp_grep/agent/runner.js +2 -2
  123. package/dist/tools/warp_grep/anthropic.cjs +138 -15
  124. package/dist/tools/warp_grep/anthropic.cjs.map +1 -1
  125. package/dist/tools/warp_grep/anthropic.js +6 -4
  126. package/dist/tools/warp_grep/client.cjs +138 -15
  127. package/dist/tools/warp_grep/client.cjs.map +1 -1
  128. package/dist/tools/warp_grep/client.js +5 -3
  129. package/dist/tools/warp_grep/gemini.cjs +138 -15
  130. package/dist/tools/warp_grep/gemini.cjs.map +1 -1
  131. package/dist/tools/warp_grep/gemini.js +5 -3
  132. package/dist/tools/warp_grep/gemini.js.map +1 -1
  133. package/dist/tools/warp_grep/index.cjs +138 -15
  134. package/dist/tools/warp_grep/index.cjs.map +1 -1
  135. package/dist/tools/warp_grep/index.js +5 -3
  136. package/dist/tools/warp_grep/openai.cjs +138 -15
  137. package/dist/tools/warp_grep/openai.cjs.map +1 -1
  138. package/dist/tools/warp_grep/openai.js +6 -4
  139. package/dist/tools/warp_grep/vercel.cjs +138 -15
  140. package/dist/tools/warp_grep/vercel.cjs.map +1 -1
  141. package/dist/tools/warp_grep/vercel.js +6 -4
  142. package/dist/version.cjs +1 -1
  143. package/dist/version.cjs.map +1 -1
  144. package/dist/version.js +1 -1
  145. package/package.json +1 -1
  146. package/dist/chunk-AGFVQOGJ.js.map +0 -1
  147. package/dist/chunk-MFKR5VVL.js.map +0 -1
  148. /package/dist/{chunk-MJQNHIUZ.js.map → chunk-2WAHX6I2.js.map} +0 -0
  149. /package/dist/{chunk-7AWNEVBE.js.map → chunk-3BTUUH23.js.map} +0 -0
  150. /package/dist/{chunk-GAZCVVNY.js.map → chunk-4R6F66B7.js.map} +0 -0
  151. /package/dist/{chunk-QFRDNJXM.js.map → chunk-5IKDEESU.js.map} +0 -0
  152. /package/dist/{chunk-5D7DDSZQ.js.map → chunk-A6T6E636.js.map} +0 -0
  153. /package/dist/{chunk-FWHQH6RG.js.map → chunk-D5UUKDKL.js.map} +0 -0
  154. /package/dist/{chunk-YBVAKGFE.js.map → chunk-FOKMTUWC.js.map} +0 -0
  155. /package/dist/{chunk-KM7RICB6.js.map → chunk-J43SJUCO.js.map} +0 -0
  156. /package/dist/{chunk-UFPDHAZ2.js.map → chunk-KRRO7FF2.js.map} +0 -0
  157. /package/dist/{chunk-WTMEO2YB.js.map → chunk-LK4C3NYX.js.map} +0 -0
  158. /package/dist/{chunk-QMLGJK66.js.map → chunk-MTRH7FMN.js.map} +0 -0
  159. /package/dist/{chunk-I3ZPXGMZ.js.map → chunk-N4KLUOXK.js.map} +0 -0
  160. /package/dist/{chunk-GKBKSSUA.js.map → chunk-P57SFOLD.js.map} +0 -0
  161. /package/dist/{chunk-QVWKDO76.js.map → chunk-PRHEWGWC.js.map} +0 -0
  162. /package/dist/{chunk-77O2YF4B.js.map → chunk-Q77CT3RI.js.map} +0 -0
  163. /package/dist/{chunk-ZAADJ3ER.js.map → chunk-QSATHLZJ.js.map} +0 -0
  164. /package/dist/{chunk-JB4T3K5T.js.map → chunk-TAGDMT3K.js.map} +0 -0
  165. /package/dist/{chunk-H6RMMTKF.js.map → chunk-UDI5U6QV.js.map} +0 -0
  166. /package/dist/{chunk-7IQMKVT4.js.map → chunk-VK76R3IN.js.map} +0 -0
  167. /package/dist/{chunk-Q4DXGXXU.js.map → chunk-Y5O3A7SU.js.map} +0 -0
  168. /package/dist/{chunk-6FRGRPUO.js.map → chunk-YKBVE3CE.js.map} +0 -0
  169. /package/dist/{chunk-3VMW3UJY.js.map → chunk-ZHKANLAQ.js.map} +0 -0
  170. /package/dist/{chunk-QDDT5L5Y.js.map → chunk-ZSA3NL5T.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../tools/warp_grep/client.ts"],"sourcesContent":["/**\n * WarpGrep client for programmatic code search\n */\n\nimport { runWarpGrep, runWarpGrepStreaming } from './agent/runner.js';\nimport { RemoteCommandsProvider } from './providers/remote.js';\nimport type { WarpGrepProvider } from './providers/types.js';\nimport type { AgentRunResult, WarpGrepStep } from './agent/types.js';\nimport type {\n WarpGrepClientConfig,\n WarpGrepInput,\n WarpGrepResult,\n WarpGrepContext,\n WarpGrepToolConfig,\n GitHubSearchInput,\n GitHubReadFileInput,\n GitHubReadFileResult,\n RemoteCommands,\n} from './types.js';\nimport { createCodeStorageHttpCommands } from './providers/code_storage_http.js';\nimport { parseGitHubUrl } from './utils/github.js';\nimport { compactFileContexts } from '../compact/utils.js';\n\nconst DEFAULT_CODE_SEARCH_URL = 'https://morphllm.com';\n\n/**\n * Lazy-load LocalRipgrepProvider to avoid importing Node.js-specific\n * modules (child_process, fs) in edge environments like Cloudflare Workers.\n * Only loads when actually needed (i.e., when no remoteCommands or provider is specified).\n */\nasync function getLocalProvider(repoRoot: string, excludes?: string[], allowNames?: string[]): Promise<WarpGrepProvider> {\n const { LocalRipgrepProvider } = await import('./providers/local.js');\n const opts = allowNames?.length ? { allowNames } : undefined;\n return new LocalRipgrepProvider(repoRoot, excludes, opts);\n}\n\n/**\n * WarpGrep client for programmatic code search\n * \n * @example\n * ```typescript\n * import { WarpGrepClient } from '@morphllm/morphsdk';\n * \n * const client = new WarpGrepClient({ morphApiKey: process.env.MORPH_API_KEY });\n * \n * // Simple usage - defaults to LocalRipgrepProvider\n * const result = await client.execute({\n * searchTerm: 'Find authentication middleware',\n * repoRoot: '.'\n * });\n *\n * // With custom excludes\n * const result = await client.execute({\n * searchTerm: 'Find database models',\n * repoRoot: '.',\n * excludes: ['node_modules', '.git', 'dist']\n * });\n * ```\n */\nexport class WarpGrepClient {\n private config: WarpGrepClientConfig;\n\n constructor(config: WarpGrepClientConfig = {}) {\n this.config = { ...config };\n }\n\n /**\n * Execute a code search\n *\n * @param input - Search parameters including searchTerm, repoRoot, and optional provider\n * @returns Search results with relevant code contexts, or an AsyncGenerator if streamSteps is true\n *\n * @example\n * ```typescript\n * // Standard execution\n * const result = await client.execute({\n * searchTerm: 'Find authentication middleware',\n * repoRoot: '.'\n * });\n *\n * if (result.success) {\n * for (const ctx of result.contexts) {\n * console.log(`File: ${ctx.file}`);\n * console.log(ctx.content);\n * }\n * }\n *\n * // Streaming execution\n * const stream = client.execute({\n * searchTerm: 'Find auth middleware',\n * repoRoot: '.',\n * streamSteps: true\n * });\n *\n * for await (const step of stream) {\n * console.log(`Turn ${step.turn}:`, step.toolCalls);\n * }\n * ```\n */\n execute(input: WarpGrepInput & { streamSteps: true }): AsyncGenerator<WarpGrepStep, WarpGrepResult, undefined>;\n execute(input: WarpGrepInput & { streamSteps?: false | undefined }): Promise<WarpGrepResult>;\n execute(input: WarpGrepInput): Promise<WarpGrepResult> | AsyncGenerator<WarpGrepStep, WarpGrepResult, undefined> {\n const toolConfig: WarpGrepToolConfig = {\n repoRoot: input.repoRoot,\n remoteCommands: input.remoteCommands,\n provider: input.provider,\n excludes: input.excludes,\n includes: input.includes,\n debug: input.debug ?? this.config.debug,\n morphApiKey: this.config.morphApiKey,\n morphApiUrl: this.config.morphApiUrl,\n retryConfig: this.config.retryConfig,\n timeout: this.config.timeout,\n search_type: input.search_type,\n };\n\n if (input.streamSteps) {\n return executeToolCallStreaming({ search_term: input.searchTerm }, toolConfig);\n }\n return executeToolCall({ search_term: input.searchTerm }, toolConfig);\n }\n\n /**\n * Search a public GitHub repository\n *\n * @example\n * ```typescript\n * // Simple usage\n * const result = await client.searchGitHub({\n * searchTerm: 'Find authentication middleware',\n * github: 'vercel/next.js',\n * });\n *\n * // With streaming\n * const stream = client.searchGitHub({\n * searchTerm: 'Find auth middleware',\n * github: 'https://github.com/vercel/next.js',\n * streamSteps: true,\n * });\n * for await (const step of stream) {\n * console.log(`Turn ${step.turn}:`, step.toolCalls);\n * }\n * ```\n */\n searchGitHub(input: GitHubSearchInput & { streamSteps: true }): AsyncGenerator<WarpGrepStep, WarpGrepResult, undefined>;\n searchGitHub(input: GitHubSearchInput & { streamSteps?: false | undefined }): Promise<WarpGrepResult>;\n searchGitHub(input: GitHubSearchInput): Promise<WarpGrepResult> | AsyncGenerator<WarpGrepStep, WarpGrepResult, undefined> {\n if (input.streamSteps) {\n return this._searchGitHubStreaming(input);\n }\n return this._searchGitHubAsync(input);\n }\n\n /**\n * Read a single file from a public GitHub repository\n *\n * @example\n * ```typescript\n * const result = await client.readGitHubFile({\n * github: 'vercel/next.js',\n * path: 'src/server/app-render/index.tsx',\n * startLine: 1,\n * endLine: 50,\n * });\n * if (result.success) console.log(result.content);\n * ```\n */\n async readGitHubFile(input: GitHubReadFileInput): Promise<GitHubReadFileResult> {\n return executeGitHubReadFile(input, { timeout: this.config.timeout });\n }\n\n private async _resolveGitHubRepo(input: GitHubSearchInput): Promise<{ repo: string; remoteCommands: RemoteCommands }> {\n const { owner, repo } = parseGitHubUrl(input.github);\n const baseUrl = this.config.codeSearchUrl || DEFAULT_CODE_SEARCH_URL;\n const importRes = await fetch(`${baseUrl}/api/code-search/get-or-create?url=${encodeURIComponent(`${owner}/${repo}`)}`);\n if (!importRes.ok) {\n const text = await importRes.text().catch(() => importRes.statusText);\n throw new Error(`Failed to import repo ${owner}/${repo}: ${text}`);\n }\n const { repoId, defaultBranch } = await importRes.json();\n return {\n repo,\n remoteCommands: createCodeStorageHttpCommands({ baseUrl, repoId, branch: input.branch || defaultBranch }),\n };\n }\n\n private async _searchGitHubAsync(input: GitHubSearchInput): Promise<WarpGrepResult> {\n try {\n const { remoteCommands } = await this._resolveGitHubRepo(input);\n return this.execute({\n searchTerm: input.searchTerm,\n repoRoot: '.',\n remoteCommands,\n });\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n }\n\n private async *_searchGitHubStreaming(input: GitHubSearchInput): AsyncGenerator<WarpGrepStep, WarpGrepResult, undefined> {\n let remoteCommands: RemoteCommands;\n try {\n ({ remoteCommands } = await this._resolveGitHubRepo(input));\n } catch (error) {\n return { success: false, error: error instanceof Error ? error.message : String(error) };\n }\n\n const generator = this.execute({\n searchTerm: input.searchTerm,\n repoRoot: '.',\n remoteCommands,\n streamSteps: true,\n });\n\n let result: WarpGrepResult;\n for (;;) {\n const { value, done } = await generator.next();\n if (done) {\n result = value;\n break;\n }\n yield value;\n }\n return result;\n }\n}\n\n/**\n * Execute a warp grep search directly\n *\n * @param input - Search parameters\n * @param config - Optional client configuration\n * @returns Search results, or an AsyncGenerator if streamSteps is true\n *\n * @example\n * ```typescript\n * import { executeWarpGrep } from '@morphllm/morphsdk/tools/warp-grep';\n *\n * const result = await executeWarpGrep({\n * searchTerm: 'Find authentication middleware',\n * repoRoot: '.'\n * });\n *\n * // Streaming\n * const stream = executeWarpGrep({\n * searchTerm: 'Find auth',\n * repoRoot: '.',\n * streamSteps: true\n * });\n * for await (const step of stream) {\n * console.log(step.turn, step.toolCalls);\n * }\n * ```\n */\nexport function executeWarpGrep(\n input: WarpGrepInput & { streamSteps: true },\n config?: WarpGrepClientConfig\n): AsyncGenerator<WarpGrepStep, WarpGrepResult, undefined>;\nexport function executeWarpGrep(\n input: WarpGrepInput & { streamSteps?: false | undefined },\n config?: WarpGrepClientConfig\n): Promise<WarpGrepResult>;\nexport function executeWarpGrep(\n input: WarpGrepInput,\n config?: WarpGrepClientConfig\n): Promise<WarpGrepResult> | AsyncGenerator<WarpGrepStep, WarpGrepResult, undefined> {\n const client = new WarpGrepClient(config);\n if (input.streamSteps) {\n return client.execute({ ...input, streamSteps: true });\n }\n return client.execute({ ...input, streamSteps: false });\n}\n\nexport async function executeToolCall(\n input: { search_term: string } | string,\n config: WarpGrepToolConfig\n): Promise<WarpGrepResult> {\n const parsed = typeof input === 'string' ? JSON.parse(input) : input;\n\n // Priority: remoteCommands > provider > LocalRipgrepProvider (lazy-loaded for edge compatibility)\n const allowNames = config.search_type === 'node_modules' ? ['node_modules'] : undefined;\n const provider = config.remoteCommands\n ? new RemoteCommandsProvider(config.repoRoot, config.remoteCommands)\n : config.provider ?? await getLocalProvider(config.repoRoot, config.excludes, allowNames);\n\n const result = await runWarpGrep({\n searchTerm: parsed.search_term,\n repoRoot: config.repoRoot,\n provider,\n excludes: config.excludes,\n includes: config.includes,\n debug: config.debug ?? false,\n morphApiKey: config.morphApiKey,\n morphApiUrl: config.morphApiUrl,\n retryConfig: config.retryConfig,\n timeout: config.timeout,\n search_type: config.search_type,\n });\n\n return processAgentResult(result, parsed.search_term, config.morphApiKey, config.morphApiUrl);\n}\n\n/**\n * Helper to process AgentRunResult into WarpGrepResult\n */\nasync function processAgentResult(\n result: AgentRunResult,\n searchTerm: string,\n apiKey?: string,\n apiUrl?: string\n): Promise<WarpGrepResult> {\n const finish = result.finish;\n if (result.terminationReason !== 'completed' || !finish?.metadata) {\n const errorDetails = result.errors?.map(e => e.message).join('; ') || 'unknown reason';\n console.error(`[warp_grep] processAgentResult failed. Reason: ${result.terminationReason}. Errors: ${errorDetails}. Turns: ${result.timings?.turns?.length ?? 0}`);\n return { success: false, error: `Search did not complete: ${errorDetails}` };\n }\n\n const contexts: WarpGrepContext[] = (finish.resolved ?? []).map(r => ({\n file: r.path,\n content: r.content,\n lines: r.ranges,\n }));\n\n try {\n const compactable = contexts.map(c => ({ path: c.file, content: c.content }));\n const compacted = await compactFileContexts(compactable, searchTerm, apiKey, apiUrl);\n for (let i = 0; i < contexts.length; i++) {\n contexts[i].content = compacted[i].content;\n }\n } catch (error) {\n console.error(`[warp_grep] Failed to compact result contexts:`, error);\n }\n\n return { success: true, contexts, summary: finish.payload };\n}\n\n/**\n * Streaming version of executeToolCall that yields WarpGrepStep for each turn.\n */\nexport async function* executeToolCallStreaming(\n input: { search_term: string } | string,\n config: WarpGrepToolConfig\n): AsyncGenerator<WarpGrepStep, WarpGrepResult, undefined> {\n const parsed = typeof input === 'string' ? JSON.parse(input) : input;\n\n // Priority: remoteCommands > provider > LocalRipgrepProvider (lazy-loaded for edge compatibility)\n const allowNames = config.search_type === 'node_modules' ? ['node_modules'] : undefined;\n const provider = config.remoteCommands\n ? new RemoteCommandsProvider(config.repoRoot, config.remoteCommands)\n : config.provider ?? await getLocalProvider(config.repoRoot, config.excludes, allowNames);\n\n const generator = runWarpGrepStreaming({\n searchTerm: parsed.search_term,\n repoRoot: config.repoRoot,\n provider,\n excludes: config.excludes,\n includes: config.includes,\n debug: config.debug ?? false,\n morphApiKey: config.morphApiKey,\n morphApiUrl: config.morphApiUrl,\n retryConfig: config.retryConfig,\n timeout: config.timeout,\n search_type: config.search_type,\n });\n\n // Forward all yielded steps\n let agentResult: AgentRunResult;\n for (;;) {\n const { value, done } = await generator.next();\n if (done) {\n agentResult = value;\n break;\n }\n yield value;\n }\n\n return processAgentResult(agentResult, parsed.search_term, config.morphApiKey, config.morphApiUrl);\n}\n\n/**\n * Fetch raw file content from a public GitHub repository.\n * Tries the given branch first, then falls back to main/master/develop.\n */\nasync function fetchRawGitHubFile(\n owner: string,\n repo: string,\n filePath: string,\n branch?: string,\n timeout?: number,\n): Promise<{ content: string; branch: string }> {\n const branches = branch ? [branch] : ['HEAD'];\n const fallbacks = ['main', 'master', 'develop'];\n\n const fetchWithTimeout = (url: string) =>\n timeout ? fetch(url, { signal: AbortSignal.timeout(timeout) }) : fetch(url);\n\n for (const b of branches) {\n const url = `https://raw.githubusercontent.com/${owner}/${repo}/${b}/${filePath}`;\n const res = await fetchWithTimeout(url);\n if (res.ok) return { content: await res.text(), branch: b };\n }\n\n for (const fb of fallbacks) {\n if (branch && fb === branch) continue;\n const url = `https://raw.githubusercontent.com/${owner}/${repo}/${fb}/${filePath}`;\n const res = await fetchWithTimeout(url);\n if (res.ok) return { content: await res.text(), branch: fb };\n }\n\n throw new Error(`File not found: ${owner}/${repo}/${filePath}`);\n}\n\n/**\n * Read a single file (or line range) from a public GitHub repository\n */\nexport async function executeGitHubReadFile(\n input: GitHubReadFileInput,\n config?: { timeout?: number },\n): Promise<GitHubReadFileResult> {\n try {\n const { owner, repo } = parseGitHubUrl(input.github);\n const { content: raw, branch } = await fetchRawGitHubFile(\n owner, repo, input.path, input.branch, config?.timeout,\n );\n\n const allLines = raw.split('\\n');\n const totalLines = allLines.length;\n const start = Math.max(1, input.startLine ?? 1);\n const end = Math.min(totalLines, input.endLine ?? totalLines);\n\n const selected = allLines.slice(start - 1, end);\n const padWidth = String(end).length;\n const numbered = selected\n .map((line, i) => `${String(start + i).padStart(padWidth)}|${line}`)\n .join('\\n');\n\n return {\n success: true,\n content: numbered,\n path: input.path,\n github: `${owner}/${repo}`,\n branch,\n lineRange: [start, end],\n totalLines,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Format a GitHub read file result for display or tool responses\n */\nexport function formatGitHubReadFileResult(result: GitHubReadFileResult): string {\n if (!result.success) {\n return `Failed to read file: ${result.error}`;\n }\n\n const rangeStr = result.lineRange\n ? ` (lines ${result.lineRange[0]}-${result.lineRange[1]} of ${result.totalLines})`\n : '';\n\n return `File: ${result.github}/${result.path}${rangeStr}\\n\\n${result.content}`;\n}\n\n/**\n * Format warp grep results for display or tool responses\n * \n * @param result - The search result\n * @returns Formatted string representation\n */\nexport function formatResult(result: WarpGrepResult): string {\n if (!result.success) {\n return `Search failed: ${result.error}`;\n }\n\n if (!result.contexts || result.contexts.length === 0) {\n return 'No relevant code found. Try rephrasing your search term.';\n }\n\n const parts: string[] = [];\n parts.push(`Morph Fast Context subagent performed search on repository:\\n`);\n parts.push('Relevant context found:');\n\n for (const ctx of result.contexts) {\n const rangeStr = !ctx.lines || ctx.lines === '*'\n ? '*'\n : ctx.lines.map(([s, e]) => `${s}-${e}`).join(',');\n parts.push(`- ${ctx.file}:${rangeStr}`);\n }\n\n parts.push('\\nHere is the content of files:\\n');\n\n for (const ctx of result.contexts) {\n const rangeStr = !ctx.lines || ctx.lines === '*'\n ? ''\n : ` lines=\"${ctx.lines.map(([s, e]) => `${s}-${e}`).join(',')}\"`;\n parts.push(`<file path=\"${ctx.file}\"${rangeStr}>`);\n parts.push(ctx.content);\n parts.push('</file>\\n');\n }\n\n return parts.join('\\n');\n}\n\n"],"mappings":";;;;;;;;;;;;;;;;;;AAuBA,IAAM,0BAA0B;AAOhC,eAAe,iBAAiB,UAAkB,UAAqB,YAAkD;AACvH,QAAM,EAAE,qBAAqB,IAAI,MAAM,OAAO,sCAAsB;AACpE,QAAM,OAAO,YAAY,SAAS,EAAE,WAAW,IAAI;AACnD,SAAO,IAAI,qBAAqB,UAAU,UAAU,IAAI;AAC1D;AAyBO,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EAER,YAAY,SAA+B,CAAC,GAAG;AAC7C,SAAK,SAAS,EAAE,GAAG,OAAO;AAAA,EAC5B;AAAA,EAqCA,QAAQ,OAAyG;AAC/G,UAAM,aAAiC;AAAA,MACrC,UAAU,MAAM;AAAA,MAChB,gBAAgB,MAAM;AAAA,MACtB,UAAU,MAAM;AAAA,MAChB,UAAU,MAAM;AAAA,MAChB,UAAU,MAAM;AAAA,MAChB,OAAO,MAAM,SAAS,KAAK,OAAO;AAAA,MAClC,aAAa,KAAK,OAAO;AAAA,MACzB,aAAa,KAAK,OAAO;AAAA,MACzB,aAAa,KAAK,OAAO;AAAA,MACzB,SAAS,KAAK,OAAO;AAAA,MACrB,aAAa,MAAM;AAAA,IACrB;AAEA,QAAI,MAAM,aAAa;AACrB,aAAO,yBAAyB,EAAE,aAAa,MAAM,WAAW,GAAG,UAAU;AAAA,IAC/E;AACA,WAAO,gBAAgB,EAAE,aAAa,MAAM,WAAW,GAAG,UAAU;AAAA,EACtE;AAAA,EA0BA,aAAa,OAA6G;AACxH,QAAI,MAAM,aAAa;AACrB,aAAO,KAAK,uBAAuB,KAAK;AAAA,IAC1C;AACA,WAAO,KAAK,mBAAmB,KAAK;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,eAAe,OAA2D;AAC9E,WAAO,sBAAsB,OAAO,EAAE,SAAS,KAAK,OAAO,QAAQ,CAAC;AAAA,EACtE;AAAA,EAEA,MAAc,mBAAmB,OAAqF;AACpH,UAAM,EAAE,OAAO,KAAK,IAAI,eAAe,MAAM,MAAM;AACnD,UAAM,UAAU,KAAK,OAAO,iBAAiB;AAC7C,UAAM,YAAY,MAAM,MAAM,GAAG,OAAO,sCAAsC,mBAAmB,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC,EAAE;AACtH,QAAI,CAAC,UAAU,IAAI;AACjB,YAAM,OAAO,MAAM,UAAU,KAAK,EAAE,MAAM,MAAM,UAAU,UAAU;AACpE,YAAM,IAAI,MAAM,yBAAyB,KAAK,IAAI,IAAI,KAAK,IAAI,EAAE;AAAA,IACnE;AACA,UAAM,EAAE,QAAQ,cAAc,IAAI,MAAM,UAAU,KAAK;AACvD,WAAO;AAAA,MACL;AAAA,MACA,gBAAgB,8BAA8B,EAAE,SAAS,QAAQ,QAAQ,MAAM,UAAU,cAAc,CAAC;AAAA,IAC1G;AAAA,EACF;AAAA,EAEA,MAAc,mBAAmB,OAAmD;AAClF,QAAI;AACF,YAAM,EAAE,eAAe,IAAI,MAAM,KAAK,mBAAmB,KAAK;AAC9D,aAAO,KAAK,QAAQ;AAAA,QAClB,YAAY,MAAM;AAAA,QAClB,UAAU;AAAA,QACV;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,aAAO,EAAE,SAAS,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE;AAAA,IACzF;AAAA,EACF;AAAA,EAEA,OAAe,uBAAuB,OAAmF;AACvH,QAAI;AACJ,QAAI;AACF,OAAC,EAAE,eAAe,IAAI,MAAM,KAAK,mBAAmB,KAAK;AAAA,IAC3D,SAAS,OAAO;AACd,aAAO,EAAE,SAAS,OAAO,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE;AAAA,IACzF;AAEA,UAAM,YAAY,KAAK,QAAQ;AAAA,MAC7B,YAAY,MAAM;AAAA,MAClB,UAAU;AAAA,MACV;AAAA,MACA,aAAa;AAAA,IACf,CAAC;AAED,QAAI;AACJ,eAAS;AACP,YAAM,EAAE,OAAO,KAAK,IAAI,MAAM,UAAU,KAAK;AAC7C,UAAI,MAAM;AACR,iBAAS;AACT;AAAA,MACF;AACA,YAAM;AAAA,IACR;AACA,WAAO;AAAA,EACT;AACF;AAqCO,SAAS,gBACd,OACA,QACmF;AACnF,QAAM,SAAS,IAAI,eAAe,MAAM;AACxC,MAAI,MAAM,aAAa;AACrB,WAAO,OAAO,QAAQ,EAAE,GAAG,OAAO,aAAa,KAAK,CAAC;AAAA,EACvD;AACA,SAAO,OAAO,QAAQ,EAAE,GAAG,OAAO,aAAa,MAAM,CAAC;AACxD;AAEA,eAAsB,gBACpB,OACA,QACyB;AACzB,QAAM,SAAS,OAAO,UAAU,WAAW,KAAK,MAAM,KAAK,IAAI;AAG/D,QAAM,aAAa,OAAO,gBAAgB,iBAAiB,CAAC,cAAc,IAAI;AAC9E,QAAM,WAAW,OAAO,iBACpB,IAAI,uBAAuB,OAAO,UAAU,OAAO,cAAc,IACjE,OAAO,YAAY,MAAM,iBAAiB,OAAO,UAAU,OAAO,UAAU,UAAU;AAE1F,QAAM,SAAS,MAAM,YAAY;AAAA,IAC/B,YAAY,OAAO;AAAA,IACnB,UAAU,OAAO;AAAA,IACjB;AAAA,IACA,UAAU,OAAO;AAAA,IACjB,UAAU,OAAO;AAAA,IACjB,OAAO,OAAO,SAAS;AAAA,IACvB,aAAa,OAAO;AAAA,IACpB,aAAa,OAAO;AAAA,IACpB,aAAa,OAAO;AAAA,IACpB,SAAS,OAAO;AAAA,IAChB,aAAa,OAAO;AAAA,EACtB,CAAC;AAED,SAAO,mBAAmB,QAAQ,OAAO,aAAa,OAAO,aAAa,OAAO,WAAW;AAC9F;AAKA,eAAe,mBACb,QACA,YACA,QACA,QACyB;AACzB,QAAM,SAAS,OAAO;AACtB,MAAI,OAAO,sBAAsB,eAAe,CAAC,QAAQ,UAAU;AACjE,UAAM,eAAe,OAAO,QAAQ,IAAI,OAAK,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK;AACtE,YAAQ,MAAM,kDAAkD,OAAO,iBAAiB,aAAa,YAAY,YAAY,OAAO,SAAS,OAAO,UAAU,CAAC,EAAE;AACjK,WAAO,EAAE,SAAS,OAAO,OAAO,4BAA4B,YAAY,GAAG;AAAA,EAC7E;AAEA,QAAM,YAA+B,OAAO,YAAY,CAAC,GAAG,IAAI,QAAM;AAAA,IACpE,MAAM,EAAE;AAAA,IACR,SAAS,EAAE;AAAA,IACX,OAAO,EAAE;AAAA,EACX,EAAE;AAEF,MAAI;AACF,UAAM,cAAc,SAAS,IAAI,QAAM,EAAE,MAAM,EAAE,MAAM,SAAS,EAAE,QAAQ,EAAE;AAC5E,UAAM,YAAY,MAAM,oBAAoB,aAAa,YAAY,QAAQ,MAAM;AACnF,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,eAAS,CAAC,EAAE,UAAU,UAAU,CAAC,EAAE;AAAA,IACrC;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,kDAAkD,KAAK;AAAA,EACvE;AAEA,SAAO,EAAE,SAAS,MAAM,UAAU,SAAS,OAAO,QAAQ;AAC5D;AAKA,gBAAuB,yBACrB,OACA,QACyD;AACzD,QAAM,SAAS,OAAO,UAAU,WAAW,KAAK,MAAM,KAAK,IAAI;AAG/D,QAAM,aAAa,OAAO,gBAAgB,iBAAiB,CAAC,cAAc,IAAI;AAC9E,QAAM,WAAW,OAAO,iBACpB,IAAI,uBAAuB,OAAO,UAAU,OAAO,cAAc,IACjE,OAAO,YAAY,MAAM,iBAAiB,OAAO,UAAU,OAAO,UAAU,UAAU;AAE1F,QAAM,YAAY,qBAAqB;AAAA,IACrC,YAAY,OAAO;AAAA,IACnB,UAAU,OAAO;AAAA,IACjB;AAAA,IACA,UAAU,OAAO;AAAA,IACjB,UAAU,OAAO;AAAA,IACjB,OAAO,OAAO,SAAS;AAAA,IACvB,aAAa,OAAO;AAAA,IACpB,aAAa,OAAO;AAAA,IACpB,aAAa,OAAO;AAAA,IACpB,SAAS,OAAO;AAAA,IAChB,aAAa,OAAO;AAAA,EACtB,CAAC;AAGD,MAAI;AACJ,aAAS;AACP,UAAM,EAAE,OAAO,KAAK,IAAI,MAAM,UAAU,KAAK;AAC7C,QAAI,MAAM;AACR,oBAAc;AACd;AAAA,IACF;AACA,UAAM;AAAA,EACR;AAEA,SAAO,mBAAmB,aAAa,OAAO,aAAa,OAAO,aAAa,OAAO,WAAW;AACnG;AAMA,eAAe,mBACb,OACA,MACA,UACA,QACA,SAC8C;AAC9C,QAAM,WAAW,SAAS,CAAC,MAAM,IAAI,CAAC,MAAM;AAC5C,QAAM,YAAY,CAAC,QAAQ,UAAU,SAAS;AAE9C,QAAM,mBAAmB,CAAC,QACxB,UAAU,MAAM,KAAK,EAAE,QAAQ,YAAY,QAAQ,OAAO,EAAE,CAAC,IAAI,MAAM,GAAG;AAE5E,aAAW,KAAK,UAAU;AACxB,UAAM,MAAM,qCAAqC,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,QAAQ;AAC/E,UAAM,MAAM,MAAM,iBAAiB,GAAG;AACtC,QAAI,IAAI,GAAI,QAAO,EAAE,SAAS,MAAM,IAAI,KAAK,GAAG,QAAQ,EAAE;AAAA,EAC5D;AAEA,aAAW,MAAM,WAAW;AAC1B,QAAI,UAAU,OAAO,OAAQ;AAC7B,UAAM,MAAM,qCAAqC,KAAK,IAAI,IAAI,IAAI,EAAE,IAAI,QAAQ;AAChF,UAAM,MAAM,MAAM,iBAAiB,GAAG;AACtC,QAAI,IAAI,GAAI,QAAO,EAAE,SAAS,MAAM,IAAI,KAAK,GAAG,QAAQ,GAAG;AAAA,EAC7D;AAEA,QAAM,IAAI,MAAM,mBAAmB,KAAK,IAAI,IAAI,IAAI,QAAQ,EAAE;AAChE;AAKA,eAAsB,sBACpB,OACA,QAC+B;AAC/B,MAAI;AACF,UAAM,EAAE,OAAO,KAAK,IAAI,eAAe,MAAM,MAAM;AACnD,UAAM,EAAE,SAAS,KAAK,OAAO,IAAI,MAAM;AAAA,MACrC;AAAA,MAAO;AAAA,MAAM,MAAM;AAAA,MAAM,MAAM;AAAA,MAAQ,QAAQ;AAAA,IACjD;AAEA,UAAM,WAAW,IAAI,MAAM,IAAI;AAC/B,UAAM,aAAa,SAAS;AAC5B,UAAM,QAAQ,KAAK,IAAI,GAAG,MAAM,aAAa,CAAC;AAC9C,UAAM,MAAM,KAAK,IAAI,YAAY,MAAM,WAAW,UAAU;AAE5D,UAAM,WAAW,SAAS,MAAM,QAAQ,GAAG,GAAG;AAC9C,UAAM,WAAW,OAAO,GAAG,EAAE;AAC7B,UAAM,WAAW,SACd,IAAI,CAAC,MAAM,MAAM,GAAG,OAAO,QAAQ,CAAC,EAAE,SAAS,QAAQ,CAAC,IAAI,IAAI,EAAE,EAClE,KAAK,IAAI;AAEZ,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS;AAAA,MACT,MAAM,MAAM;AAAA,MACZ,QAAQ,GAAG,KAAK,IAAI,IAAI;AAAA,MACxB;AAAA,MACA,WAAW,CAAC,OAAO,GAAG;AAAA,MACtB;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC9D;AAAA,EACF;AACF;AAKO,SAAS,2BAA2B,QAAsC;AAC/E,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,wBAAwB,OAAO,KAAK;AAAA,EAC7C;AAEA,QAAM,WAAW,OAAO,YACpB,WAAW,OAAO,UAAU,CAAC,CAAC,IAAI,OAAO,UAAU,CAAC,CAAC,OAAO,OAAO,UAAU,MAC7E;AAEJ,SAAO,SAAS,OAAO,MAAM,IAAI,OAAO,IAAI,GAAG,QAAQ;AAAA;AAAA,EAAO,OAAO,OAAO;AAC9E;AAQO,SAAS,aAAa,QAAgC;AAC3D,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,kBAAkB,OAAO,KAAK;AAAA,EACvC;AAEA,MAAI,CAAC,OAAO,YAAY,OAAO,SAAS,WAAW,GAAG;AACpD,WAAO;AAAA,EACT;AAEA,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK;AAAA,CAA+D;AAC1E,QAAM,KAAK,yBAAyB;AAEpC,aAAW,OAAO,OAAO,UAAU;AACjC,UAAM,WAAW,CAAC,IAAI,SAAS,IAAI,UAAU,MACzC,MACA,IAAI,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,GAAG;AACnD,UAAM,KAAK,KAAK,IAAI,IAAI,IAAI,QAAQ,EAAE;AAAA,EACxC;AAEA,QAAM,KAAK,mCAAmC;AAE9C,aAAW,OAAO,OAAO,UAAU;AACjC,UAAM,WAAW,CAAC,IAAI,SAAS,IAAI,UAAU,MACzC,KACA,WAAW,IAAI,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,GAAG,CAAC;AAC/D,UAAM,KAAK,eAAe,IAAI,IAAI,IAAI,QAAQ,GAAG;AACjD,UAAM,KAAK,IAAI,OAAO;AACtB,UAAM,KAAK,WAAW;AAAA,EACxB;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-2HMEZZKK.js";
4
4
  import {
5
5
  executeBrowserTask
6
- } from "./chunk-QFRDNJXM.js";
6
+ } from "./chunk-5IKDEESU.js";
7
7
  import {
8
8
  __export
9
9
  } from "./chunk-PZ5AY32C.js";
@@ -54,4 +54,4 @@ export {
54
54
  browserTool,
55
55
  vercel_exports
56
56
  };
57
- //# sourceMappingURL=chunk-Q4DXGXXU.js.map
57
+ //# sourceMappingURL=chunk-Y5O3A7SU.js.map
@@ -20,7 +20,7 @@ import {
20
20
  } from "./chunk-I3J46TSB.js";
21
21
  import {
22
22
  SDK_VERSION
23
- } from "./chunk-NO2FGIQ7.js";
23
+ } from "./chunk-3XO33KPS.js";
24
24
 
25
25
  // tools/warp_grep/agent/runner.ts
26
26
  import OpenAI from "openai";
@@ -398,4 +398,4 @@ export {
398
398
  runWarpGrepStreaming,
399
399
  runWarpGrep
400
400
  };
401
- //# sourceMappingURL=chunk-6FRGRPUO.js.map
401
+ //# sourceMappingURL=chunk-YKBVE3CE.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-63WE2C5R.js";
5
5
  import {
6
6
  executeEditFile
7
- } from "./chunk-KM7RICB6.js";
7
+ } from "./chunk-J43SJUCO.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-3VMW3UJY.js.map
94
+ //# sourceMappingURL=chunk-ZHKANLAQ.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  SDK_VERSION
3
- } from "./chunk-NO2FGIQ7.js";
3
+ } from "./chunk-3XO33KPS.js";
4
4
 
5
5
  // tools/utils/resilience.ts
6
6
  var DEFAULT_RETRY_CONFIG = {
@@ -91,4 +91,4 @@ export {
91
91
  withTimeout,
92
92
  MorphError
93
93
  };
94
- //# sourceMappingURL=chunk-QDDT5L5Y.js.map
94
+ //# sourceMappingURL=chunk-ZSA3NL5T.js.map
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.153",
39
+ version: "0.2.154",
40
40
  description: "TypeScript SDK and CLI for Morph Fast Apply integration",
41
41
  type: "module",
42
42
  main: "./dist/index.cjs",
@@ -3463,6 +3463,131 @@ function parseGitHubUrl(input) {
3463
3463
  );
3464
3464
  }
3465
3465
 
3466
+ // tools/compact/core.ts
3467
+ var DEFAULT_API_URL4 = "https://api.morphllm.com";
3468
+ var DEFAULT_TIMEOUT2 = 12e4;
3469
+ var CompactClient = class {
3470
+ config;
3471
+ constructor(config = {}) {
3472
+ this.config = {
3473
+ ...config,
3474
+ morphApiUrl: config.morphApiUrl ?? DEFAULT_API_URL4,
3475
+ timeout: config.timeout ?? DEFAULT_TIMEOUT2
3476
+ };
3477
+ }
3478
+ /**
3479
+ * Compact messages or text via /v1/compact.
3480
+ * Returns per-message `compacted_line_ranges` showing which lines were removed.
3481
+ *
3482
+ * @example
3483
+ * ```typescript
3484
+ * const client = new CompactClient({ morphApiKey: 'sk-...' });
3485
+ * const result = await client.compact({
3486
+ * input: codeFile,
3487
+ * query: "authentication",
3488
+ * compressionRatio: 0.5,
3489
+ * });
3490
+ * console.log(result.output);
3491
+ * ```
3492
+ */
3493
+ async compact(input) {
3494
+ const apiKey = this.config.morphApiKey || (typeof process !== "undefined" ? process.env?.MORPH_API_KEY : void 0);
3495
+ const debug = this.config.debug || false;
3496
+ if (!apiKey) {
3497
+ throw new Error(
3498
+ "Morph API key not found. Set MORPH_API_KEY environment variable or pass morphApiKey in config."
3499
+ );
3500
+ }
3501
+ const url = `${this.config.morphApiUrl}/v1/compact`;
3502
+ if (debug) {
3503
+ console.log(`[Compact] Calling ${url}`);
3504
+ }
3505
+ const body = {
3506
+ compression_ratio: input.compressionRatio ?? 0.5,
3507
+ preserve_recent: input.preserveRecent ?? 2,
3508
+ model: input.model ?? "morph-compactor",
3509
+ include_line_ranges: input.includeLineRanges ?? true,
3510
+ include_markers: input.includeMarkers ?? true
3511
+ };
3512
+ if (input.query !== void 0) {
3513
+ body.query = input.query;
3514
+ }
3515
+ if (input.messages) {
3516
+ body.messages = input.messages;
3517
+ } else if (typeof input.input === "string") {
3518
+ body.input = input.input;
3519
+ } else if (Array.isArray(input.input)) {
3520
+ body.messages = input.input;
3521
+ } else {
3522
+ throw new Error("Either 'input' or 'messages' must be provided");
3523
+ }
3524
+ const startTime = Date.now();
3525
+ const response = await fetch(url, {
3526
+ method: "POST",
3527
+ headers: {
3528
+ "Authorization": `Bearer ${apiKey}`,
3529
+ "Content-Type": "application/json"
3530
+ },
3531
+ body: JSON.stringify(body),
3532
+ signal: AbortSignal.timeout(this.config.timeout)
3533
+ });
3534
+ if (!response.ok) {
3535
+ const text = await response.text();
3536
+ throw new Error(`Compact API error ${response.status}: ${text}`);
3537
+ }
3538
+ const data = await response.json();
3539
+ if (debug) {
3540
+ console.log(`[Compact] compact() done in ${Date.now() - startTime}ms`);
3541
+ }
3542
+ return data;
3543
+ }
3544
+ };
3545
+
3546
+ // tools/compact/utils.ts
3547
+ async function compactFileContexts(files, query, apiKey, apiUrl, maxTokens = 1e4, maxConcurrency = 3) {
3548
+ const totalLength = files.reduce((sum, file) => sum + file.content.length, 0);
3549
+ const estimatedTokens = totalLength / 3;
3550
+ if (estimatedTokens <= maxTokens) {
3551
+ return files;
3552
+ }
3553
+ let compressionRatio = maxTokens / estimatedTokens;
3554
+ compressionRatio = Math.max(0.3, Math.min(0.99, compressionRatio));
3555
+ const client = new CompactClient({
3556
+ morphApiKey: apiKey,
3557
+ morphApiUrl: apiUrl
3558
+ });
3559
+ const results = [];
3560
+ const inProgress = /* @__PURE__ */ new Set();
3561
+ for (const file of files) {
3562
+ if (file.content.length < 500) {
3563
+ results.push({ path: file.path, content: file.content });
3564
+ continue;
3565
+ }
3566
+ const task = async () => {
3567
+ try {
3568
+ const result = await client.compact({
3569
+ input: file.content,
3570
+ query,
3571
+ compressionRatio,
3572
+ preserveRecent: 0
3573
+ });
3574
+ results.push({ path: file.path, content: result.output });
3575
+ } catch (error) {
3576
+ console.error(`[compactFileContexts] Failed to compact file ${file.path}:`, error);
3577
+ results.push({ path: file.path, content: file.content });
3578
+ }
3579
+ };
3580
+ const promise = task().finally(() => inProgress.delete(promise));
3581
+ inProgress.add(promise);
3582
+ if (inProgress.size >= maxConcurrency) {
3583
+ await Promise.race(inProgress);
3584
+ }
3585
+ }
3586
+ await Promise.all(inProgress);
3587
+ const orderMap = new Map(files.map((f, i) => [f.path, i]));
3588
+ return results.sort((a, b) => (orderMap.get(a.path) ?? 0) - (orderMap.get(b.path) ?? 0));
3589
+ }
3590
+
3466
3591
  // tools/warp_grep/client.ts
3467
3592
  var DEFAULT_CODE_SEARCH_URL = "https://morphllm.com";
3468
3593
  async function getLocalProvider(repoRoot, excludes, allowNames) {
@@ -3585,20 +3710,9 @@ async function executeToolCall(input, config) {
3585
3710
  timeout: config.timeout,
3586
3711
  search_type: config.search_type
3587
3712
  });
3588
- const finish = result.finish;
3589
- if (result.terminationReason !== "completed" || !finish?.metadata) {
3590
- const errorDetails = result.errors?.map((e) => e.message).join("; ") || "unknown reason";
3591
- console.error(`[warp_grep] executeToolCall failed. Reason: ${result.terminationReason}. Errors: ${errorDetails}. Turns: ${result.timings?.turns?.length ?? 0}`);
3592
- return { success: false, error: `Search did not complete: ${errorDetails}` };
3593
- }
3594
- const contexts = (finish.resolved ?? []).map((r) => ({
3595
- file: r.path,
3596
- content: r.content,
3597
- lines: r.ranges
3598
- }));
3599
- return { success: true, contexts, summary: finish.payload };
3713
+ return processAgentResult(result, parsed.search_term, config.morphApiKey, config.morphApiUrl);
3600
3714
  }
3601
- function processAgentResult(result) {
3715
+ async function processAgentResult(result, searchTerm, apiKey, apiUrl) {
3602
3716
  const finish = result.finish;
3603
3717
  if (result.terminationReason !== "completed" || !finish?.metadata) {
3604
3718
  const errorDetails = result.errors?.map((e) => e.message).join("; ") || "unknown reason";
@@ -3610,6 +3724,15 @@ function processAgentResult(result) {
3610
3724
  content: r.content,
3611
3725
  lines: r.ranges
3612
3726
  }));
3727
+ try {
3728
+ const compactable = contexts.map((c) => ({ path: c.file, content: c.content }));
3729
+ const compacted = await compactFileContexts(compactable, searchTerm, apiKey, apiUrl);
3730
+ for (let i = 0; i < contexts.length; i++) {
3731
+ contexts[i].content = compacted[i].content;
3732
+ }
3733
+ } catch (error) {
3734
+ console.error(`[warp_grep] Failed to compact result contexts:`, error);
3735
+ }
3613
3736
  return { success: true, contexts, summary: finish.payload };
3614
3737
  }
3615
3738
  async function* executeToolCallStreaming(input, config) {
@@ -3638,7 +3761,7 @@ async function* executeToolCallStreaming(input, config) {
3638
3761
  }
3639
3762
  yield value;
3640
3763
  }
3641
- return processAgentResult(agentResult);
3764
+ return processAgentResult(agentResult, parsed.search_term, config.morphApiKey, config.morphApiUrl);
3642
3765
  }
3643
3766
  async function fetchRawGitHubFile(owner, repo, filePath, branch, timeout) {
3644
3767
  const branches = branch ? [branch] : ["HEAD"];
@@ -3746,7 +3869,7 @@ var PermissionError = class extends GitHubError {
3746
3869
 
3747
3870
  // tools/github/core.ts
3748
3871
  var DEFAULT_BASE_URL = "https://api.morphllm.com";
3749
- var DEFAULT_TIMEOUT2 = 3e4;
3872
+ var DEFAULT_TIMEOUT3 = 3e4;
3750
3873
  var GitHubClient = class {
3751
3874
  apiKey;
3752
3875
  baseUrl;
@@ -3777,7 +3900,7 @@ var GitHubClient = class {
3777
3900
  constructor(config = {}) {
3778
3901
  this.apiKey = config.apiKey || process.env.MORPH_API_KEY || "";
3779
3902
  this.baseUrl = config.baseUrl || DEFAULT_BASE_URL;
3780
- this.timeout = config.timeout || DEFAULT_TIMEOUT2;
3903
+ this.timeout = config.timeout || DEFAULT_TIMEOUT3;
3781
3904
  this.debug = config.debug || false;
3782
3905
  this.defaultInstallationId = config.installationId;
3783
3906
  if (!this.apiKey) {
@@ -4609,86 +4732,6 @@ var MorphGit = class {
4609
4732
  var import_isomorphic_git2 = __toESM(require("isomorphic-git"), 1);
4610
4733
  var import_node2 = __toESM(require("isomorphic-git/http/node"), 1);
4611
4734
 
4612
- // tools/compact/core.ts
4613
- var DEFAULT_API_URL4 = "http://192.222.56.183:8811";
4614
- var DEFAULT_TIMEOUT3 = 12e4;
4615
- var CompactClient = class {
4616
- config;
4617
- constructor(config = {}) {
4618
- this.config = {
4619
- ...config,
4620
- morphApiUrl: config.morphApiUrl ?? DEFAULT_API_URL4,
4621
- timeout: config.timeout ?? DEFAULT_TIMEOUT3
4622
- };
4623
- }
4624
- /**
4625
- * Compact messages or text via /v1/compact.
4626
- * Returns per-message `compacted_line_ranges` showing which lines were removed.
4627
- *
4628
- * @example
4629
- * ```typescript
4630
- * const client = new CompactClient({ morphApiKey: 'sk-...' });
4631
- * const result = await client.compact({
4632
- * input: codeFile,
4633
- * query: "authentication",
4634
- * compressionRatio: 0.5,
4635
- * });
4636
- * console.log(result.output);
4637
- * ```
4638
- */
4639
- async compact(input) {
4640
- const apiKey = this.config.morphApiKey || (typeof process !== "undefined" ? process.env?.MORPH_API_KEY : void 0);
4641
- const debug = this.config.debug || false;
4642
- if (!apiKey) {
4643
- throw new Error(
4644
- "Morph API key not found. Set MORPH_API_KEY environment variable or pass morphApiKey in config."
4645
- );
4646
- }
4647
- const url = `${this.config.morphApiUrl}/v1/compact`;
4648
- if (debug) {
4649
- console.log(`[Compact] Calling ${url}`);
4650
- }
4651
- const body = {
4652
- compression_ratio: input.compressionRatio ?? 0.5,
4653
- preserve_recent: input.preserveRecent ?? 2,
4654
- model: input.model ?? "morph-compactor",
4655
- include_line_ranges: input.includeLineRanges ?? true,
4656
- include_markers: input.includeMarkers ?? true
4657
- };
4658
- if (input.query !== void 0) {
4659
- body.query = input.query;
4660
- }
4661
- if (input.messages) {
4662
- body.messages = input.messages;
4663
- } else if (typeof input.input === "string") {
4664
- body.input = input.input;
4665
- } else if (Array.isArray(input.input)) {
4666
- body.messages = input.input;
4667
- } else {
4668
- throw new Error("Either 'input' or 'messages' must be provided");
4669
- }
4670
- const startTime = Date.now();
4671
- const response = await fetch(url, {
4672
- method: "POST",
4673
- headers: {
4674
- "Authorization": `Bearer ${apiKey}`,
4675
- "Content-Type": "application/json"
4676
- },
4677
- body: JSON.stringify(body),
4678
- signal: AbortSignal.timeout(this.config.timeout)
4679
- });
4680
- if (!response.ok) {
4681
- const text = await response.text();
4682
- throw new Error(`Compact API error ${response.status}: ${text}`);
4683
- }
4684
- const data = await response.json();
4685
- if (debug) {
4686
- console.log(`[Compact] compact() done in ${Date.now() - startTime}ms`);
4687
- }
4688
- return data;
4689
- }
4690
- };
4691
-
4692
4735
  // modelrouter/core.ts
4693
4736
  var DEFAULT_CONFIG3 = {
4694
4737
  apiUrl: "https://api.morphllm.com",