@morphllm/morphsdk 0.2.120 → 0.2.122

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 (204) hide show
  1. package/dist/{chunk-7TM4RBXE.js → chunk-2AQLRL4U.js} +2 -2
  2. package/dist/{chunk-XQ4KEOJT.js → chunk-2MJEULZU.js} +2 -2
  3. package/dist/{chunk-SNY2UKHQ.js → chunk-3PMFQ5AV.js} +4 -4
  4. package/dist/{chunk-A54BOCBI.js → chunk-4GEBF5OH.js} +2 -2
  5. package/dist/{chunk-VVEK5JSH.js → chunk-4IU2K63O.js} +4 -4
  6. package/dist/{chunk-HCN2MLSO.js → chunk-4LA3OT4Q.js} +28 -4
  7. package/dist/chunk-4LA3OT4Q.js.map +1 -0
  8. package/dist/{chunk-HBWOWL7L.js → chunk-5UUJULLM.js} +2 -2
  9. package/dist/chunk-63VHBANJ.js +22 -0
  10. package/dist/chunk-63VHBANJ.js.map +1 -0
  11. package/dist/{chunk-L5C6E32T.js → chunk-64KNVHR4.js} +1 -1
  12. package/dist/{chunk-L5C6E32T.js.map → chunk-64KNVHR4.js.map} +1 -1
  13. package/dist/{chunk-2BPPWIJI.js → chunk-73GZ6KUK.js} +2 -2
  14. package/dist/{chunk-NW6PJIID.js → chunk-7KOUCN6T.js} +2 -2
  15. package/dist/{chunk-NLDYHLRB.js → chunk-EBROW6GK.js} +2 -2
  16. package/dist/{chunk-TVPEH6FF.js → chunk-GTANVDUZ.js} +2 -2
  17. package/dist/chunk-J267T54M.js +76 -0
  18. package/dist/chunk-J267T54M.js.map +1 -0
  19. package/dist/{chunk-KW7OEGZK.js → chunk-KJZMKDDP.js} +16 -2
  20. package/dist/{chunk-KW7OEGZK.js.map → chunk-KJZMKDDP.js.map} +1 -1
  21. package/dist/{chunk-4VLTYTEY.js → chunk-L4URLBKV.js} +3 -3
  22. package/dist/{chunk-T7F3DIRK.js → chunk-LE24SVVU.js} +2 -2
  23. package/dist/{chunk-BVINWDTA.js → chunk-MQWEZJTP.js} +6 -6
  24. package/dist/{chunk-6ODXYTLF.js → chunk-OTGBQEVH.js} +2 -2
  25. package/dist/{chunk-7HKYJ2MW.js → chunk-OWISPSLH.js} +2 -2
  26. package/dist/{chunk-HQAPRX5T.js → chunk-QGE7FGGT.js} +4 -4
  27. package/dist/{chunk-4RO43W62.js → chunk-RNKHRNSG.js} +8 -3
  28. package/dist/chunk-RNKHRNSG.js.map +1 -0
  29. package/dist/{chunk-RZ4VC4BG.js → chunk-T3T4LGRD.js} +30 -3
  30. package/dist/chunk-T3T4LGRD.js.map +1 -0
  31. package/dist/{chunk-FZUUET6R.js → chunk-TBLMIAIH.js} +28 -3
  32. package/dist/chunk-TBLMIAIH.js.map +1 -0
  33. package/dist/{chunk-RODHADNG.js → chunk-TXT3W4QK.js} +69 -11
  34. package/dist/chunk-TXT3W4QK.js.map +1 -0
  35. package/dist/{chunk-P4EPXC2Q.js → chunk-UDGJQBTC.js} +70 -17
  36. package/dist/{chunk-P4EPXC2Q.js.map → chunk-UDGJQBTC.js.map} +1 -1
  37. package/dist/chunk-WYYR2EU6.js +29 -0
  38. package/dist/chunk-WYYR2EU6.js.map +1 -0
  39. package/dist/{chunk-5HPN4VL2.js → chunk-ZHRT6F72.js} +1 -1
  40. package/dist/{client-D7iO2TbA.d.ts → client-BJrzbMYL.d.ts} +52 -2
  41. package/dist/client.cjs +302 -9
  42. package/dist/client.cjs.map +1 -1
  43. package/dist/client.d.ts +5 -2
  44. package/dist/client.js +25 -22
  45. package/dist/edge.cjs +81 -2
  46. package/dist/edge.cjs.map +1 -1
  47. package/dist/edge.d.ts +3 -0
  48. package/dist/edge.js +8 -4
  49. package/dist/index.cjs +304 -9
  50. package/dist/index.cjs.map +1 -1
  51. package/dist/index.d.ts +5 -2
  52. package/dist/index.js +30 -24
  53. package/dist/modelrouter/core.cjs +7 -2
  54. package/dist/modelrouter/core.cjs.map +1 -1
  55. package/dist/modelrouter/core.js +3 -3
  56. package/dist/modelrouter/index.cjs +7 -2
  57. package/dist/modelrouter/index.cjs.map +1 -1
  58. package/dist/modelrouter/index.js +3 -3
  59. package/dist/tools/browser/anthropic.cjs +7 -2
  60. package/dist/tools/browser/anthropic.cjs.map +1 -1
  61. package/dist/tools/browser/anthropic.js +5 -5
  62. package/dist/tools/browser/core.cjs +7 -2
  63. package/dist/tools/browser/core.cjs.map +1 -1
  64. package/dist/tools/browser/core.js +4 -4
  65. package/dist/tools/browser/index.cjs +7 -2
  66. package/dist/tools/browser/index.cjs.map +1 -1
  67. package/dist/tools/browser/index.js +7 -7
  68. package/dist/tools/browser/openai.cjs +7 -2
  69. package/dist/tools/browser/openai.cjs.map +1 -1
  70. package/dist/tools/browser/openai.js +5 -5
  71. package/dist/tools/browser/profiles/core.cjs +7 -2
  72. package/dist/tools/browser/profiles/core.cjs.map +1 -1
  73. package/dist/tools/browser/profiles/core.js +3 -3
  74. package/dist/tools/browser/profiles/index.cjs +7 -2
  75. package/dist/tools/browser/profiles/index.cjs.map +1 -1
  76. package/dist/tools/browser/profiles/index.js +3 -3
  77. package/dist/tools/browser/vercel.cjs +7 -2
  78. package/dist/tools/browser/vercel.cjs.map +1 -1
  79. package/dist/tools/browser/vercel.js +5 -5
  80. package/dist/tools/codebase_search/anthropic.cjs +7 -2
  81. package/dist/tools/codebase_search/anthropic.cjs.map +1 -1
  82. package/dist/tools/codebase_search/anthropic.js +4 -4
  83. package/dist/tools/codebase_search/core.cjs +7 -2
  84. package/dist/tools/codebase_search/core.cjs.map +1 -1
  85. package/dist/tools/codebase_search/core.js +3 -3
  86. package/dist/tools/codebase_search/index.cjs +7 -2
  87. package/dist/tools/codebase_search/index.cjs.map +1 -1
  88. package/dist/tools/codebase_search/index.js +6 -6
  89. package/dist/tools/codebase_search/openai.cjs +7 -2
  90. package/dist/tools/codebase_search/openai.cjs.map +1 -1
  91. package/dist/tools/codebase_search/openai.js +4 -4
  92. package/dist/tools/codebase_search/vercel.cjs +7 -2
  93. package/dist/tools/codebase_search/vercel.cjs.map +1 -1
  94. package/dist/tools/codebase_search/vercel.js +4 -4
  95. package/dist/tools/compact/core.cjs +110 -0
  96. package/dist/tools/compact/core.cjs.map +1 -0
  97. package/dist/tools/compact/core.d.ts +37 -0
  98. package/dist/tools/compact/core.js +8 -0
  99. package/dist/tools/compact/core.js.map +1 -0
  100. package/dist/tools/compact/index.cjs +112 -0
  101. package/dist/tools/compact/index.cjs.map +1 -0
  102. package/dist/tools/compact/index.d.ts +4 -0
  103. package/dist/tools/compact/index.js +8 -0
  104. package/dist/tools/compact/index.js.map +1 -0
  105. package/dist/tools/compact/types.cjs +19 -0
  106. package/dist/tools/compact/types.cjs.map +1 -0
  107. package/dist/tools/compact/types.d.ts +60 -0
  108. package/dist/tools/compact/types.js +1 -0
  109. package/dist/tools/compact/types.js.map +1 -0
  110. package/dist/tools/fastapply/anthropic.cjs +7 -2
  111. package/dist/tools/fastapply/anthropic.cjs.map +1 -1
  112. package/dist/tools/fastapply/anthropic.js +4 -4
  113. package/dist/tools/fastapply/apply.cjs +7 -2
  114. package/dist/tools/fastapply/apply.cjs.map +1 -1
  115. package/dist/tools/fastapply/apply.js +2 -2
  116. package/dist/tools/fastapply/core.cjs +7 -2
  117. package/dist/tools/fastapply/core.cjs.map +1 -1
  118. package/dist/tools/fastapply/core.js +3 -3
  119. package/dist/tools/fastapply/index.cjs +7 -2
  120. package/dist/tools/fastapply/index.cjs.map +1 -1
  121. package/dist/tools/fastapply/index.d.ts +1 -1
  122. package/dist/tools/fastapply/index.js +8 -8
  123. package/dist/tools/fastapply/openai.cjs +7 -2
  124. package/dist/tools/fastapply/openai.cjs.map +1 -1
  125. package/dist/tools/fastapply/openai.js +4 -4
  126. package/dist/tools/fastapply/vercel.cjs +7 -2
  127. package/dist/tools/fastapply/vercel.cjs.map +1 -1
  128. package/dist/tools/fastapply/vercel.d.ts +1 -1
  129. package/dist/tools/fastapply/vercel.js +4 -4
  130. package/dist/tools/index.cjs +7 -2
  131. package/dist/tools/index.cjs.map +1 -1
  132. package/dist/tools/index.d.ts +1 -1
  133. package/dist/tools/index.js +8 -8
  134. package/dist/tools/utils/resilience.cjs +7 -2
  135. package/dist/tools/utils/resilience.cjs.map +1 -1
  136. package/dist/tools/utils/resilience.js +2 -2
  137. package/dist/tools/warp_grep/agent/runner.cjs +7 -2
  138. package/dist/tools/warp_grep/agent/runner.cjs.map +1 -1
  139. package/dist/tools/warp_grep/agent/runner.js +3 -3
  140. package/dist/tools/warp_grep/anthropic.cjs +369 -2
  141. package/dist/tools/warp_grep/anthropic.cjs.map +1 -1
  142. package/dist/tools/warp_grep/anthropic.d.ts +35 -2
  143. package/dist/tools/warp_grep/anthropic.js +10 -6
  144. package/dist/tools/warp_grep/client.cjs +109 -9
  145. package/dist/tools/warp_grep/client.cjs.map +1 -1
  146. package/dist/tools/warp_grep/client.d.ts +32 -1
  147. package/dist/tools/warp_grep/client.js +6 -4
  148. package/dist/tools/warp_grep/gemini.cjs +369 -2
  149. package/dist/tools/warp_grep/gemini.cjs.map +1 -1
  150. package/dist/tools/warp_grep/gemini.d.ts +35 -2
  151. package/dist/tools/warp_grep/gemini.js +39 -5
  152. package/dist/tools/warp_grep/gemini.js.map +1 -1
  153. package/dist/tools/warp_grep/harness.js +4 -4
  154. package/dist/tools/warp_grep/index.cjs +128 -9
  155. package/dist/tools/warp_grep/index.cjs.map +1 -1
  156. package/dist/tools/warp_grep/index.d.ts +23 -2
  157. package/dist/tools/warp_grep/index.js +19 -8
  158. package/dist/tools/warp_grep/openai.cjs +372 -2
  159. package/dist/tools/warp_grep/openai.cjs.map +1 -1
  160. package/dist/tools/warp_grep/openai.d.ts +35 -2
  161. package/dist/tools/warp_grep/openai.js +10 -6
  162. package/dist/tools/warp_grep/providers/code_storage_http.cjs +53 -0
  163. package/dist/tools/warp_grep/providers/code_storage_http.cjs.map +1 -0
  164. package/dist/tools/warp_grep/providers/code_storage_http.d.ts +23 -0
  165. package/dist/tools/warp_grep/providers/code_storage_http.js +8 -0
  166. package/dist/tools/warp_grep/providers/code_storage_http.js.map +1 -0
  167. package/dist/tools/warp_grep/providers/remote.d.ts +1 -1
  168. package/dist/tools/warp_grep/utils/github.cjs +46 -0
  169. package/dist/tools/warp_grep/utils/github.cjs.map +1 -0
  170. package/dist/tools/warp_grep/utils/github.d.ts +13 -0
  171. package/dist/tools/warp_grep/utils/github.js +8 -0
  172. package/dist/tools/warp_grep/utils/github.js.map +1 -0
  173. package/dist/tools/warp_grep/vercel.cjs +157 -2
  174. package/dist/tools/warp_grep/vercel.cjs.map +1 -1
  175. package/dist/tools/warp_grep/vercel.d.ts +32 -2
  176. package/dist/tools/warp_grep/vercel.js +10 -6
  177. package/dist/{types-D5p8QErL.d.ts → types-CA7989hK.d.ts} +17 -1
  178. package/dist/version.cjs +7 -2
  179. package/dist/version.cjs.map +1 -1
  180. package/dist/version.js +1 -1
  181. package/package.json +7 -2
  182. package/dist/chunk-4RO43W62.js.map +0 -1
  183. package/dist/chunk-FZUUET6R.js.map +0 -1
  184. package/dist/chunk-HCN2MLSO.js.map +0 -1
  185. package/dist/chunk-RODHADNG.js.map +0 -1
  186. package/dist/chunk-RZ4VC4BG.js.map +0 -1
  187. package/dist/{chunk-7TM4RBXE.js.map → chunk-2AQLRL4U.js.map} +0 -0
  188. package/dist/{chunk-XQ4KEOJT.js.map → chunk-2MJEULZU.js.map} +0 -0
  189. package/dist/{chunk-SNY2UKHQ.js.map → chunk-3PMFQ5AV.js.map} +0 -0
  190. package/dist/{chunk-A54BOCBI.js.map → chunk-4GEBF5OH.js.map} +0 -0
  191. package/dist/{chunk-VVEK5JSH.js.map → chunk-4IU2K63O.js.map} +0 -0
  192. package/dist/{chunk-HBWOWL7L.js.map → chunk-5UUJULLM.js.map} +0 -0
  193. package/dist/{chunk-2BPPWIJI.js.map → chunk-73GZ6KUK.js.map} +0 -0
  194. package/dist/{chunk-NW6PJIID.js.map → chunk-7KOUCN6T.js.map} +0 -0
  195. package/dist/{chunk-NLDYHLRB.js.map → chunk-EBROW6GK.js.map} +0 -0
  196. package/dist/{chunk-TVPEH6FF.js.map → chunk-GTANVDUZ.js.map} +0 -0
  197. package/dist/{chunk-4VLTYTEY.js.map → chunk-L4URLBKV.js.map} +0 -0
  198. package/dist/{chunk-T7F3DIRK.js.map → chunk-LE24SVVU.js.map} +0 -0
  199. package/dist/{chunk-BVINWDTA.js.map → chunk-MQWEZJTP.js.map} +0 -0
  200. package/dist/{chunk-6ODXYTLF.js.map → chunk-OTGBQEVH.js.map} +0 -0
  201. package/dist/{chunk-7HKYJ2MW.js.map → chunk-OWISPSLH.js.map} +0 -0
  202. package/dist/{chunk-HQAPRX5T.js.map → chunk-QGE7FGGT.js.map} +0 -0
  203. package/dist/{chunk-5HPN4VL2.js.map → chunk-ZHRT6F72.js.map} +0 -0
  204. package/dist/{vercel-B1GZ_g9N.d.ts → vercel-BTSPdTA-.d.ts} +2 -2
@@ -1,7 +1,7 @@
1
1
  import { FunctionDeclaration } from '@google/generative-ai';
2
2
  export { formatResult } from './client.js';
3
3
  export { getSystemPrompt } from './agent/prompt.js';
4
- import { d as WarpGrepToolConfig, b as WarpGrepResult } from '../../types-D5p8QErL.js';
4
+ import { d as WarpGrepToolConfig, b as WarpGrepResult, e as GitHubSearchToolConfig } from '../../types-CA7989hK.js';
5
5
  import './agent/types.js';
6
6
  import '../utils/resilience.js';
7
7
  import './providers/types.js';
@@ -110,5 +110,38 @@ interface GeminiWarpGrepTool extends FunctionDeclaration {
110
110
  */
111
111
  declare function createWarpGrepTool(config: WarpGrepToolConfig): GeminiWarpGrepTool;
112
112
  declare const createMorphWarpGrepTool: typeof createWarpGrepTool;
113
+ /**
114
+ * Create a GitHub search tool for Google Gemini SDK
115
+ *
116
+ * @param config - Configuration options (morphApiKey, morphApiUrl, codeSearchUrl, timeout)
117
+ * @returns Gemini FunctionDeclaration with execute and formatResult methods
118
+ *
119
+ * @example
120
+ * ```typescript
121
+ * import { GoogleGenerativeAI } from '@google/generative-ai';
122
+ * import { createGitHubSearchTool } from '@morphllm/morphsdk/tools/warp-grep/gemini';
123
+ *
124
+ * const tool = createGitHubSearchTool({ morphApiKey: process.env.MORPH_API_KEY });
125
+ *
126
+ * const genAI = new GoogleGenerativeAI(process.env.GOOGLE_API_KEY);
127
+ * const model = genAI.getGenerativeModel({
128
+ * model: 'gemini-2.0-flash',
129
+ * tools: [{ functionDeclarations: [tool] }]
130
+ * });
131
+ *
132
+ * // Execute
133
+ * const result = await tool.execute({ query: 'auth middleware', github: 'vercel/next.js' });
134
+ * console.log(tool.formatResult(result));
135
+ * ```
136
+ */
137
+ declare function createGitHubSearchTool(config: GitHubSearchToolConfig): FunctionDeclaration & {
138
+ execute: (input: {
139
+ query: string;
140
+ github: string;
141
+ branch?: string;
142
+ }) => Promise<WarpGrepResult>;
143
+ formatResult: (result: WarpGrepResult) => string;
144
+ getSystemPrompt: () => string;
145
+ };
113
146
 
114
- export { type GeminiWarpGrepTool, createMorphWarpGrepTool, createWarpGrepTool, warpGrepFunctionDeclaration as default, execute, warpGrepFunctionDeclaration };
147
+ export { type GeminiWarpGrepTool, createGitHubSearchTool, createMorphWarpGrepTool, createWarpGrepTool, warpGrepFunctionDeclaration as default, execute, warpGrepFunctionDeclaration };
@@ -1,21 +1,26 @@
1
1
  import {
2
+ GITHUB_SEARCH_DESCRIPTION,
3
+ GITHUB_SEARCH_TOOL_NAME,
2
4
  WARP_GREP_DESCRIPTION,
3
5
  WARP_GREP_TOOL_NAME
4
- } from "../../chunk-KW7OEGZK.js";
6
+ } from "../../chunk-KJZMKDDP.js";
5
7
  import {
8
+ WarpGrepClient,
6
9
  executeToolCall,
7
10
  formatResult
8
- } from "../../chunk-RODHADNG.js";
9
- import "../../chunk-BVINWDTA.js";
11
+ } from "../../chunk-TXT3W4QK.js";
12
+ import "../../chunk-WYYR2EU6.js";
10
13
  import "../../chunk-PUGSTXLO.js";
14
+ import "../../chunk-63VHBANJ.js";
15
+ import "../../chunk-MQWEZJTP.js";
11
16
  import "../../chunk-3MLWXJTJ.js";
17
+ import "../../chunk-5PNMAWLC.js";
12
18
  import "../../chunk-APP75CBN.js";
13
19
  import "../../chunk-GHGJAQSJ.js";
14
20
  import {
15
21
  getSystemPrompt
16
22
  } from "../../chunk-FMLHRJDF.js";
17
- import "../../chunk-5PNMAWLC.js";
18
- import "../../chunk-4RO43W62.js";
23
+ import "../../chunk-RNKHRNSG.js";
19
24
  import "../../chunk-PZ5AY32C.js";
20
25
 
21
26
  // tools/warp_grep/gemini.ts
@@ -56,8 +61,37 @@ function createWarpGrepTool(config) {
56
61
  });
57
62
  }
58
63
  var createMorphWarpGrepTool = createWarpGrepTool;
64
+ var GITHUB_SEARCH_PARAMETERS = {
65
+ type: "OBJECT",
66
+ properties: {
67
+ query: { type: "STRING", description: "Natural language search query" },
68
+ github: { type: "STRING", description: 'GitHub URL or "owner/repo" shorthand' },
69
+ branch: { type: "STRING", description: "Branch to search (defaults to repo default branch)" }
70
+ },
71
+ required: ["query", "github"]
72
+ };
73
+ function createGitHubSearchTool(config) {
74
+ const client = new WarpGrepClient(config);
75
+ const declaration = {
76
+ name: GITHUB_SEARCH_TOOL_NAME,
77
+ description: GITHUB_SEARCH_DESCRIPTION,
78
+ parameters: GITHUB_SEARCH_PARAMETERS
79
+ };
80
+ return Object.assign(declaration, {
81
+ execute: async (input) => {
82
+ return client.searchGitHub(input);
83
+ },
84
+ formatResult: (result) => {
85
+ return formatResult(result);
86
+ },
87
+ getSystemPrompt: () => {
88
+ return getSystemPrompt();
89
+ }
90
+ });
91
+ }
59
92
  var gemini_default = warpGrepFunctionDeclaration;
60
93
  export {
94
+ createGitHubSearchTool,
61
95
  createMorphWarpGrepTool,
62
96
  createWarpGrepTool,
63
97
  gemini_default as default,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../tools/warp_grep/gemini.ts"],"sourcesContent":["/**\n * Google Gemini SDK adapter for morph-warp-grep tool\n * \n * Requires @google/generative-ai as a peer dependency.\n * Install with: npm install @google/generative-ai\n */\n\nimport type { FunctionDeclaration, FunctionDeclarationSchema } from '@google/generative-ai';\nimport { executeToolCall, formatResult } from './client.js';\nimport { WARP_GREP_DESCRIPTION, WARP_GREP_TOOL_NAME, getSystemPrompt } from './prompts.js';\nimport type { WarpGrepToolConfig, WarpGrepResult } from './types.js';\n\n// Use plain object to avoid runtime import of SchemaType enum\nconst TOOL_PARAMETERS = {\n type: 'OBJECT',\n properties: {\n query: { \n type: 'STRING', \n description: 'Free-form repository question' \n },\n },\n required: ['query'],\n} as unknown as FunctionDeclarationSchema;\n\n/**\n * Gemini-native warp grep function declaration\n * \n * @example\n * ```typescript\n * import { GoogleGenerativeAI } from '@google/generative-ai';\n * import { warpGrepFunctionDeclaration, execute } from '@morphllm/morphsdk/tools/warp-grep/gemini';\n * \n * const genAI = new GoogleGenerativeAI(process.env.GOOGLE_API_KEY);\n * const model = genAI.getGenerativeModel({\n * model: 'gemini-2.0-flash',\n * tools: [{ functionDeclarations: [warpGrepFunctionDeclaration] }]\n * });\n * \n * const chat = model.startChat();\n * const result = await chat.sendMessage('Find authentication middleware');\n * \n * // Handle function call\n * const call = result.response.functionCalls()?.[0];\n * if (call) {\n * const searchResult = await execute(call.args, { repoRoot: '.' });\n * console.log(searchResult);\n * }\n * ```\n */\nexport const warpGrepFunctionDeclaration: FunctionDeclaration = {\n name: WARP_GREP_TOOL_NAME,\n description: WARP_GREP_DESCRIPTION,\n parameters: TOOL_PARAMETERS,\n};\n\n/**\n * Execute warp grep search\n * \n * @param input - Tool input with query\n * @param config - Configuration with repoRoot and optional provider\n * @returns Search results\n */\nexport async function execute(\n input: { query: string } | string,\n config: WarpGrepToolConfig\n): Promise<WarpGrepResult> {\n return executeToolCall(input, config);\n}\n\nexport { formatResult, getSystemPrompt };\n\n/**\n * Gemini tool with execute method attached\n */\nexport interface GeminiWarpGrepTool extends FunctionDeclaration {\n execute: (input: unknown) => Promise<WarpGrepResult>;\n formatResult: (result: WarpGrepResult) => string;\n getSystemPrompt: () => string;\n}\n\n/**\n * Create a custom warp grep tool with configuration and methods\n * \n * @param config - Configuration options\n * @returns Function declaration with execute and formatResult methods\n * \n * @example Local usage\n * ```typescript\n * import { GoogleGenerativeAI } from '@google/generative-ai';\n * import { createMorphWarpGrepTool } from '@morphllm/morphsdk/tools/warp-grep/gemini';\n * \n * const tool = createMorphWarpGrepTool({ repoRoot: '.' });\n * \n * const genAI = new GoogleGenerativeAI(process.env.GOOGLE_API_KEY);\n * const model = genAI.getGenerativeModel({\n * model: 'gemini-2.0-flash',\n * tools: [{ functionDeclarations: [tool] }]\n * });\n * \n * const chat = model.startChat();\n * const result = await chat.sendMessage('Find authentication middleware');\n * \n * // Handle function call\n * const call = result.response.functionCalls()?.[0];\n * if (call && call.name === tool.name) {\n * const searchResult = await tool.execute(call.args);\n * console.log(tool.formatResult(searchResult));\n * \n * // Send result back to model\n * await chat.sendMessage([{\n * functionResponse: {\n * name: call.name,\n * response: { result: tool.formatResult(searchResult) }\n * }\n * }]);\n * }\n * ```\n * \n * @example Remote sandbox (E2B, Modal, etc.)\n * ```typescript\n * const tool = createMorphWarpGrepTool({\n * repoRoot: '/home/repo',\n * remoteCommands: {\n * grep: async (pattern, path) => (await sandbox.run(`rg '${pattern}' '${path}'`)).stdout,\n * read: async (path, start, end) => (await sandbox.run(`sed -n '${start},${end}p' '${path}'`)).stdout,\n * listDir: async (path, maxDepth) => (await sandbox.run(`find '${path}' -maxdepth ${maxDepth}`)).stdout,\n * },\n * });\n * ```\n */\nexport function createWarpGrepTool(config: WarpGrepToolConfig): GeminiWarpGrepTool {\n const declaration: FunctionDeclaration = {\n name: config.name ?? WARP_GREP_TOOL_NAME,\n description: config.description ?? WARP_GREP_DESCRIPTION,\n parameters: TOOL_PARAMETERS,\n };\n\n return Object.assign(declaration, {\n execute: async (input: unknown): Promise<WarpGrepResult> => {\n return executeToolCall(input as { query: string } | string, config);\n },\n formatResult: (result: WarpGrepResult): string => {\n return formatResult(result);\n },\n getSystemPrompt: (): string => {\n return getSystemPrompt();\n },\n });\n}\n\n// Legacy alias for backwards compatibility\nexport const createMorphWarpGrepTool = createWarpGrepTool;\n\nexport default warpGrepFunctionDeclaration;\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAaA,IAAM,kBAAkB;AAAA,EACtB,MAAM;AAAA,EACN,YAAY;AAAA,IACV,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,UAAU,CAAC,OAAO;AACpB;AA2BO,IAAM,8BAAmD;AAAA,EAC9D,MAAM;AAAA,EACN,aAAa;AAAA,EACb,YAAY;AACd;AASA,eAAsB,QACpB,OACA,QACyB;AACzB,SAAO,gBAAgB,OAAO,MAAM;AACtC;AA+DO,SAAS,mBAAmB,QAAgD;AACjF,QAAM,cAAmC;AAAA,IACvC,MAAM,OAAO,QAAQ;AAAA,IACrB,aAAa,OAAO,eAAe;AAAA,IACnC,YAAY;AAAA,EACd;AAEA,SAAO,OAAO,OAAO,aAAa;AAAA,IAChC,SAAS,OAAO,UAA4C;AAC1D,aAAO,gBAAgB,OAAqC,MAAM;AAAA,IACpE;AAAA,IACA,cAAc,CAAC,WAAmC;AAChD,aAAO,aAAa,MAAM;AAAA,IAC5B;AAAA,IACA,iBAAiB,MAAc;AAC7B,aAAO,gBAAgB;AAAA,IACzB;AAAA,EACF,CAAC;AACH;AAGO,IAAM,0BAA0B;AAEvC,IAAO,iBAAQ;","names":[]}
1
+ {"version":3,"sources":["../../../tools/warp_grep/gemini.ts"],"sourcesContent":["/**\n * Google Gemini SDK adapter for morph-warp-grep tool\n * \n * Requires @google/generative-ai as a peer dependency.\n * Install with: npm install @google/generative-ai\n */\n\nimport type { FunctionDeclaration, FunctionDeclarationSchema } from '@google/generative-ai';\nimport { executeToolCall, formatResult, WarpGrepClient } from './client.js';\nimport { WARP_GREP_DESCRIPTION, WARP_GREP_TOOL_NAME, GITHUB_SEARCH_TOOL_NAME, GITHUB_SEARCH_DESCRIPTION, getSystemPrompt } from './prompts.js';\nimport type { WarpGrepToolConfig, WarpGrepResult, GitHubSearchToolConfig } from './types.js';\n\n// Use plain object to avoid runtime import of SchemaType enum\nconst TOOL_PARAMETERS = {\n type: 'OBJECT',\n properties: {\n query: { \n type: 'STRING', \n description: 'Free-form repository question' \n },\n },\n required: ['query'],\n} as unknown as FunctionDeclarationSchema;\n\n/**\n * Gemini-native warp grep function declaration\n * \n * @example\n * ```typescript\n * import { GoogleGenerativeAI } from '@google/generative-ai';\n * import { warpGrepFunctionDeclaration, execute } from '@morphllm/morphsdk/tools/warp-grep/gemini';\n * \n * const genAI = new GoogleGenerativeAI(process.env.GOOGLE_API_KEY);\n * const model = genAI.getGenerativeModel({\n * model: 'gemini-2.0-flash',\n * tools: [{ functionDeclarations: [warpGrepFunctionDeclaration] }]\n * });\n * \n * const chat = model.startChat();\n * const result = await chat.sendMessage('Find authentication middleware');\n * \n * // Handle function call\n * const call = result.response.functionCalls()?.[0];\n * if (call) {\n * const searchResult = await execute(call.args, { repoRoot: '.' });\n * console.log(searchResult);\n * }\n * ```\n */\nexport const warpGrepFunctionDeclaration: FunctionDeclaration = {\n name: WARP_GREP_TOOL_NAME,\n description: WARP_GREP_DESCRIPTION,\n parameters: TOOL_PARAMETERS,\n};\n\n/**\n * Execute warp grep search\n * \n * @param input - Tool input with query\n * @param config - Configuration with repoRoot and optional provider\n * @returns Search results\n */\nexport async function execute(\n input: { query: string } | string,\n config: WarpGrepToolConfig\n): Promise<WarpGrepResult> {\n return executeToolCall(input, config);\n}\n\nexport { formatResult, getSystemPrompt };\n\n/**\n * Gemini tool with execute method attached\n */\nexport interface GeminiWarpGrepTool extends FunctionDeclaration {\n execute: (input: unknown) => Promise<WarpGrepResult>;\n formatResult: (result: WarpGrepResult) => string;\n getSystemPrompt: () => string;\n}\n\n/**\n * Create a custom warp grep tool with configuration and methods\n * \n * @param config - Configuration options\n * @returns Function declaration with execute and formatResult methods\n * \n * @example Local usage\n * ```typescript\n * import { GoogleGenerativeAI } from '@google/generative-ai';\n * import { createMorphWarpGrepTool } from '@morphllm/morphsdk/tools/warp-grep/gemini';\n * \n * const tool = createMorphWarpGrepTool({ repoRoot: '.' });\n * \n * const genAI = new GoogleGenerativeAI(process.env.GOOGLE_API_KEY);\n * const model = genAI.getGenerativeModel({\n * model: 'gemini-2.0-flash',\n * tools: [{ functionDeclarations: [tool] }]\n * });\n * \n * const chat = model.startChat();\n * const result = await chat.sendMessage('Find authentication middleware');\n * \n * // Handle function call\n * const call = result.response.functionCalls()?.[0];\n * if (call && call.name === tool.name) {\n * const searchResult = await tool.execute(call.args);\n * console.log(tool.formatResult(searchResult));\n * \n * // Send result back to model\n * await chat.sendMessage([{\n * functionResponse: {\n * name: call.name,\n * response: { result: tool.formatResult(searchResult) }\n * }\n * }]);\n * }\n * ```\n * \n * @example Remote sandbox (E2B, Modal, etc.)\n * ```typescript\n * const tool = createMorphWarpGrepTool({\n * repoRoot: '/home/repo',\n * remoteCommands: {\n * grep: async (pattern, path) => (await sandbox.run(`rg '${pattern}' '${path}'`)).stdout,\n * read: async (path, start, end) => (await sandbox.run(`sed -n '${start},${end}p' '${path}'`)).stdout,\n * listDir: async (path, maxDepth) => (await sandbox.run(`find '${path}' -maxdepth ${maxDepth}`)).stdout,\n * },\n * });\n * ```\n */\nexport function createWarpGrepTool(config: WarpGrepToolConfig): GeminiWarpGrepTool {\n const declaration: FunctionDeclaration = {\n name: config.name ?? WARP_GREP_TOOL_NAME,\n description: config.description ?? WARP_GREP_DESCRIPTION,\n parameters: TOOL_PARAMETERS,\n };\n\n return Object.assign(declaration, {\n execute: async (input: unknown): Promise<WarpGrepResult> => {\n return executeToolCall(input as { query: string } | string, config);\n },\n formatResult: (result: WarpGrepResult): string => {\n return formatResult(result);\n },\n getSystemPrompt: (): string => {\n return getSystemPrompt();\n },\n });\n}\n\n// Legacy alias for backwards compatibility\nexport const createMorphWarpGrepTool = createWarpGrepTool;\n\nconst GITHUB_SEARCH_PARAMETERS = {\n type: 'OBJECT',\n properties: {\n query: { type: 'STRING', description: 'Natural language search query' },\n github: { type: 'STRING', description: 'GitHub URL or \"owner/repo\" shorthand' },\n branch: { type: 'STRING', description: 'Branch to search (defaults to repo default branch)' },\n },\n required: ['query', 'github'],\n} as unknown as FunctionDeclarationSchema;\n\n/**\n * Create a GitHub search tool for Google Gemini SDK\n *\n * @param config - Configuration options (morphApiKey, morphApiUrl, codeSearchUrl, timeout)\n * @returns Gemini FunctionDeclaration with execute and formatResult methods\n *\n * @example\n * ```typescript\n * import { GoogleGenerativeAI } from '@google/generative-ai';\n * import { createGitHubSearchTool } from '@morphllm/morphsdk/tools/warp-grep/gemini';\n *\n * const tool = createGitHubSearchTool({ morphApiKey: process.env.MORPH_API_KEY });\n *\n * const genAI = new GoogleGenerativeAI(process.env.GOOGLE_API_KEY);\n * const model = genAI.getGenerativeModel({\n * model: 'gemini-2.0-flash',\n * tools: [{ functionDeclarations: [tool] }]\n * });\n *\n * // Execute\n * const result = await tool.execute({ query: 'auth middleware', github: 'vercel/next.js' });\n * console.log(tool.formatResult(result));\n * ```\n */\nexport function createGitHubSearchTool(config: GitHubSearchToolConfig) {\n const client = new WarpGrepClient(config);\n\n const declaration: FunctionDeclaration = {\n name: GITHUB_SEARCH_TOOL_NAME,\n description: GITHUB_SEARCH_DESCRIPTION,\n parameters: GITHUB_SEARCH_PARAMETERS,\n };\n\n return Object.assign(declaration, {\n execute: async (input: { query: string; github: string; branch?: string }): Promise<WarpGrepResult> => {\n return client.searchGitHub(input);\n },\n formatResult: (result: WarpGrepResult): string => {\n return formatResult(result);\n },\n getSystemPrompt: (): string => {\n return getSystemPrompt();\n },\n });\n}\n\nexport default warpGrepFunctionDeclaration;\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,IAAM,kBAAkB;AAAA,EACtB,MAAM;AAAA,EACN,YAAY;AAAA,IACV,OAAO;AAAA,MACL,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,UAAU,CAAC,OAAO;AACpB;AA2BO,IAAM,8BAAmD;AAAA,EAC9D,MAAM;AAAA,EACN,aAAa;AAAA,EACb,YAAY;AACd;AASA,eAAsB,QACpB,OACA,QACyB;AACzB,SAAO,gBAAgB,OAAO,MAAM;AACtC;AA+DO,SAAS,mBAAmB,QAAgD;AACjF,QAAM,cAAmC;AAAA,IACvC,MAAM,OAAO,QAAQ;AAAA,IACrB,aAAa,OAAO,eAAe;AAAA,IACnC,YAAY;AAAA,EACd;AAEA,SAAO,OAAO,OAAO,aAAa;AAAA,IAChC,SAAS,OAAO,UAA4C;AAC1D,aAAO,gBAAgB,OAAqC,MAAM;AAAA,IACpE;AAAA,IACA,cAAc,CAAC,WAAmC;AAChD,aAAO,aAAa,MAAM;AAAA,IAC5B;AAAA,IACA,iBAAiB,MAAc;AAC7B,aAAO,gBAAgB;AAAA,IACzB;AAAA,EACF,CAAC;AACH;AAGO,IAAM,0BAA0B;AAEvC,IAAM,2BAA2B;AAAA,EAC/B,MAAM;AAAA,EACN,YAAY;AAAA,IACV,OAAO,EAAE,MAAM,UAAU,aAAa,gCAAgC;AAAA,IACtE,QAAQ,EAAE,MAAM,UAAU,aAAa,uCAAuC;AAAA,IAC9E,QAAQ,EAAE,MAAM,UAAU,aAAa,qDAAqD;AAAA,EAC9F;AAAA,EACA,UAAU,CAAC,SAAS,QAAQ;AAC9B;AA0BO,SAAS,uBAAuB,QAAgC;AACrE,QAAM,SAAS,IAAI,eAAe,MAAM;AAExC,QAAM,cAAmC;AAAA,IACvC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAEA,SAAO,OAAO,OAAO,aAAa;AAAA,IAChC,SAAS,OAAO,UAAuF;AACrG,aAAO,OAAO,aAAa,KAAK;AAAA,IAClC;AAAA,IACA,cAAc,CAAC,WAAmC;AAChD,aAAO,aAAa,MAAM;AAAA,IAC5B;AAAA,IACA,iBAAiB,MAAc;AAC7B,aAAO,gBAAgB;AAAA,IACzB;AAAA,EACF,CAAC;AACH;AAEA,IAAO,iBAAQ;","names":[]}
@@ -15,6 +15,10 @@ import {
15
15
  toolListDirectory,
16
16
  toolRead
17
17
  } from "../../chunk-3MLWXJTJ.js";
18
+ import {
19
+ AGENT_CONFIG,
20
+ DEFAULT_EXCLUDES
21
+ } from "../../chunk-5PNMAWLC.js";
18
22
  import {
19
23
  formatAgentToolOutput
20
24
  } from "../../chunk-APP75CBN.js";
@@ -25,10 +29,6 @@ import {
25
29
  SYSTEM_PROMPT,
26
30
  getSystemPrompt
27
31
  } from "../../chunk-FMLHRJDF.js";
28
- import {
29
- AGENT_CONFIG,
30
- DEFAULT_EXCLUDES
31
- } from "../../chunk-5PNMAWLC.js";
32
32
  import "../../chunk-PZ5AY32C.js";
33
33
 
34
34
  // tools/warp_grep/harness.ts
@@ -572,12 +572,16 @@ Details: ${res.stderr}` : ""}`
572
572
  // tools/warp_grep/index.ts
573
573
  var warp_grep_exports = {};
574
574
  __export(warp_grep_exports, {
575
+ GITHUB_SEARCH_DESCRIPTION: () => GITHUB_SEARCH_DESCRIPTION,
576
+ GITHUB_SEARCH_INPUT_SCHEMA: () => GITHUB_SEARCH_INPUT_SCHEMA,
577
+ GITHUB_SEARCH_TOOL_NAME: () => GITHUB_SEARCH_TOOL_NAME,
575
578
  LocalRipgrepProvider: () => LocalRipgrepProvider,
576
579
  RemoteCommandsProvider: () => RemoteCommandsProvider,
577
580
  WARP_GREP_DESCRIPTION: () => WARP_GREP_DESCRIPTION,
578
581
  WARP_GREP_SYSTEM_PROMPT: () => SYSTEM_PROMPT,
579
582
  WARP_GREP_TOOL_NAME: () => WARP_GREP_TOOL_NAME,
580
583
  WarpGrepClient: () => WarpGrepClient,
584
+ createCodeStorageHttpCommands: () => createCodeStorageHttpCommands,
581
585
  executeToolCall: () => executeToolCall,
582
586
  executeWarpGrep: () => executeWarpGrep,
583
587
  fixPathRepetition: () => fixPathRepetition,
@@ -1400,7 +1404,7 @@ var import_openai = __toESM(require("openai"), 1);
1400
1404
  // package.json
1401
1405
  var package_default = {
1402
1406
  name: "@morphllm/morphsdk",
1403
- version: "0.2.120",
1407
+ version: "0.2.122",
1404
1408
  description: "TypeScript SDK and CLI for Morph Fast Apply integration",
1405
1409
  type: "module",
1406
1410
  main: "./dist/index.cjs",
@@ -1526,6 +1530,11 @@ var package_default = {
1526
1530
  types: "./dist/modelrouter/index.d.ts",
1527
1531
  import: "./dist/modelrouter/index.js",
1528
1532
  require: "./dist/modelrouter/index.cjs"
1533
+ },
1534
+ "./tools/compact": {
1535
+ types: "./dist/tools/compact/index.d.ts",
1536
+ import: "./dist/tools/compact/index.js",
1537
+ require: "./dist/tools/compact/index.cjs"
1529
1538
  }
1530
1539
  },
1531
1540
  files: [
@@ -1537,7 +1546,7 @@ var package_default = {
1537
1546
  "!dist/**/*.test.*"
1538
1547
  ],
1539
1548
  scripts: {
1540
- build: "tsup version.ts index.ts edge.ts client.ts tools/index.ts tools/fastapply/index.ts tools/fastapply/core.ts tools/fastapply/apply.ts tools/fastapply/types.ts tools/fastapply/prompts.ts tools/fastapply/anthropic.ts tools/fastapply/openai.ts tools/fastapply/vercel.ts tools/codebase_search/index.ts tools/codebase_search/core.ts tools/codebase_search/types.ts tools/codebase_search/prompts.ts tools/codebase_search/anthropic.ts tools/codebase_search/openai.ts tools/codebase_search/vercel.ts tools/warp_grep/index.ts tools/warp_grep/client.ts tools/warp_grep/openai.ts tools/warp_grep/anthropic.ts tools/warp_grep/vercel.ts tools/warp_grep/gemini.ts tools/warp_grep/harness.ts tools/warp_grep/agent/config.ts tools/warp_grep/agent/prompt.ts tools/warp_grep/agent/parser.ts tools/warp_grep/agent/runner.ts tools/warp_grep/agent/types.ts tools/warp_grep/agent/formatter.ts tools/warp_grep/providers/types.ts tools/warp_grep/providers/local.ts tools/warp_grep/providers/remote.ts tools/warp_grep/tools/grep.ts tools/warp_grep/tools/analyse.ts tools/warp_grep/tools/read.ts tools/warp_grep/tools/finish.ts tools/warp_grep/utils/paths.ts tools/warp_grep/utils/ripgrep.ts tools/warp_grep/utils/format.ts tools/warp_grep/utils/files.ts git/index.ts git/client.ts git/config.ts git/types.ts tools/browser/index.ts tools/browser/core.ts tools/browser/types.ts tools/browser/prompts.ts tools/browser/anthropic.ts tools/browser/openai.ts tools/browser/vercel.ts tools/browser/live.ts tools/browser/errors.ts tools/browser/profiles/index.ts tools/browser/profiles/core.ts tools/browser/profiles/types.ts modelrouter/index.ts modelrouter/core.ts modelrouter/types.ts tools/utils/resilience.ts --format esm,cjs --sourcemap --clean --dts --dts-resolve",
1549
+ build: "tsup version.ts index.ts edge.ts client.ts tools/index.ts tools/fastapply/index.ts tools/fastapply/core.ts tools/fastapply/apply.ts tools/fastapply/types.ts tools/fastapply/prompts.ts tools/fastapply/anthropic.ts tools/fastapply/openai.ts tools/fastapply/vercel.ts tools/codebase_search/index.ts tools/codebase_search/core.ts tools/codebase_search/types.ts tools/codebase_search/prompts.ts tools/codebase_search/anthropic.ts tools/codebase_search/openai.ts tools/codebase_search/vercel.ts tools/warp_grep/index.ts tools/warp_grep/client.ts tools/warp_grep/openai.ts tools/warp_grep/anthropic.ts tools/warp_grep/vercel.ts tools/warp_grep/gemini.ts tools/warp_grep/harness.ts tools/warp_grep/agent/config.ts tools/warp_grep/agent/prompt.ts tools/warp_grep/agent/parser.ts tools/warp_grep/agent/runner.ts tools/warp_grep/agent/types.ts tools/warp_grep/agent/formatter.ts tools/warp_grep/providers/types.ts tools/warp_grep/providers/local.ts tools/warp_grep/providers/remote.ts tools/warp_grep/providers/code_storage_http.ts tools/warp_grep/tools/grep.ts tools/warp_grep/tools/analyse.ts tools/warp_grep/tools/read.ts tools/warp_grep/tools/finish.ts tools/warp_grep/utils/paths.ts tools/warp_grep/utils/github.ts tools/warp_grep/utils/ripgrep.ts tools/warp_grep/utils/format.ts tools/warp_grep/utils/files.ts git/index.ts git/client.ts git/config.ts git/types.ts tools/browser/index.ts tools/browser/core.ts tools/browser/types.ts tools/browser/prompts.ts tools/browser/anthropic.ts tools/browser/openai.ts tools/browser/vercel.ts tools/browser/live.ts tools/browser/errors.ts tools/browser/profiles/index.ts tools/browser/profiles/core.ts tools/browser/profiles/types.ts modelrouter/index.ts modelrouter/core.ts modelrouter/types.ts tools/compact/index.ts tools/compact/core.ts tools/compact/types.ts tools/utils/resilience.ts --format esm,cjs --sourcemap --clean --dts --dts-resolve",
1541
1550
  prepare: "npm run build",
1542
1551
  typecheck: "tsc --noEmit",
1543
1552
  lint: "eslint .",
@@ -2175,7 +2184,51 @@ var RemoteCommandsProvider = class {
2175
2184
  }
2176
2185
  };
2177
2186
 
2187
+ // tools/warp_grep/providers/code_storage_http.ts
2188
+ async function post(url, body, op) {
2189
+ const res = await fetch(url, {
2190
+ method: "POST",
2191
+ headers: { "Content-Type": "application/json" },
2192
+ body: JSON.stringify(body)
2193
+ });
2194
+ if (!res.ok) {
2195
+ const text = await res.text().catch(() => res.statusText);
2196
+ throw new Error(`${op} failed (${res.status}): ${text}`);
2197
+ }
2198
+ const data = await res.json();
2199
+ if (data.error) throw new Error(data.error);
2200
+ return data.stdout;
2201
+ }
2202
+ function createCodeStorageHttpCommands(config) {
2203
+ const { baseUrl, repoId, branch } = config;
2204
+ const encodedRepoId = encodeURIComponent(repoId);
2205
+ return {
2206
+ grep: (pattern, path5, glob) => post(`${baseUrl}/api/code-search/${encodedRepoId}/grep`, { pattern, path: path5, glob, branch }, "grep"),
2207
+ read: (path5, start, end) => post(`${baseUrl}/api/code-search/${encodedRepoId}/read`, { path: path5, start, end, branch }, "read"),
2208
+ listDir: (path5, maxDepth) => post(`${baseUrl}/api/code-search/${encodedRepoId}/list`, { path: path5, maxDepth, branch }, "list")
2209
+ };
2210
+ }
2211
+
2212
+ // tools/warp_grep/utils/github.ts
2213
+ function parseGitHubUrl(input) {
2214
+ input = input.trim();
2215
+ const urlPattern = /^(?:https?:\/\/)?github\.com\/([^\/]+)\/([^\/\?\#]+)/;
2216
+ const match = input.match(urlPattern);
2217
+ if (match) {
2218
+ return { owner: match[1], repo: match[2].replace(/\.git$/, "") };
2219
+ }
2220
+ const shortPattern = /^([^\/]+)\/([^\/]+)$/;
2221
+ const shortMatch = input.match(shortPattern);
2222
+ if (shortMatch && !shortMatch[1].includes(".")) {
2223
+ return { owner: shortMatch[1], repo: shortMatch[2].replace(/\.git$/, "") };
2224
+ }
2225
+ throw new Error(
2226
+ `Invalid GitHub URL or shorthand: "${input}". Expected "owner/repo" or "https://github.com/owner/repo"`
2227
+ );
2228
+ }
2229
+
2178
2230
  // tools/warp_grep/client.ts
2231
+ var DEFAULT_CODE_SEARCH_URL = "https://morphllm.com";
2179
2232
  async function getLocalProvider(repoRoot, excludes) {
2180
2233
  const { LocalRipgrepProvider: LocalRipgrepProvider2 } = await Promise.resolve().then(() => (init_local(), local_exports));
2181
2234
  return new LocalRipgrepProvider2(repoRoot, excludes);
@@ -2183,13 +2236,7 @@ async function getLocalProvider(repoRoot, excludes) {
2183
2236
  var WarpGrepClient = class {
2184
2237
  config;
2185
2238
  constructor(config = {}) {
2186
- this.config = {
2187
- morphApiKey: config.morphApiKey,
2188
- morphApiUrl: config.morphApiUrl,
2189
- debug: config.debug,
2190
- timeout: config.timeout,
2191
- retryConfig: config.retryConfig
2192
- };
2239
+ this.config = { ...config };
2193
2240
  }
2194
2241
  execute(input) {
2195
2242
  const toolConfig = {
@@ -2209,6 +2256,63 @@ var WarpGrepClient = class {
2209
2256
  }
2210
2257
  return executeToolCall({ query: input.query }, toolConfig);
2211
2258
  }
2259
+ searchGitHub(input) {
2260
+ if (input.streamSteps) {
2261
+ return this._searchGitHubStreaming(input);
2262
+ }
2263
+ return this._searchGitHubAsync(input);
2264
+ }
2265
+ async _resolveGitHubRepo(input) {
2266
+ const { owner, repo } = parseGitHubUrl(input.github);
2267
+ const baseUrl = this.config.codeSearchUrl || DEFAULT_CODE_SEARCH_URL;
2268
+ const importRes = await fetch(`${baseUrl}/api/code-search/get-or-create?url=${encodeURIComponent(`${owner}/${repo}`)}`);
2269
+ if (!importRes.ok) {
2270
+ const text = await importRes.text().catch(() => importRes.statusText);
2271
+ throw new Error(`Failed to import repo ${owner}/${repo}: ${text}`);
2272
+ }
2273
+ const { repoId, defaultBranch } = await importRes.json();
2274
+ return {
2275
+ repo,
2276
+ remoteCommands: createCodeStorageHttpCommands({ baseUrl, repoId, branch: input.branch || defaultBranch })
2277
+ };
2278
+ }
2279
+ async _searchGitHubAsync(input) {
2280
+ try {
2281
+ const { repo, remoteCommands } = await this._resolveGitHubRepo(input);
2282
+ return this.execute({
2283
+ query: input.query,
2284
+ repoRoot: repo,
2285
+ remoteCommands
2286
+ });
2287
+ } catch (error) {
2288
+ return { success: false, error: error instanceof Error ? error.message : String(error) };
2289
+ }
2290
+ }
2291
+ async *_searchGitHubStreaming(input) {
2292
+ let repo;
2293
+ let remoteCommands;
2294
+ try {
2295
+ ({ repo, remoteCommands } = await this._resolveGitHubRepo(input));
2296
+ } catch (error) {
2297
+ return { success: false, error: error instanceof Error ? error.message : String(error) };
2298
+ }
2299
+ const generator = this.execute({
2300
+ query: input.query,
2301
+ repoRoot: repo,
2302
+ remoteCommands,
2303
+ streamSteps: true
2304
+ });
2305
+ let result;
2306
+ for (; ; ) {
2307
+ const { value, done } = await generator.next();
2308
+ if (done) {
2309
+ result = value;
2310
+ break;
2311
+ }
2312
+ yield value;
2313
+ }
2314
+ return result;
2315
+ }
2212
2316
  };
2213
2317
  function executeWarpGrep(input, config) {
2214
2318
  const client = new WarpGrepClient(config);
@@ -2313,6 +2417,17 @@ function formatResult(result) {
2313
2417
  // tools/warp_grep/prompts.ts
2314
2418
  var WARP_GREP_TOOL_NAME = "warpgrep_codebase_search";
2315
2419
  var WARP_GREP_DESCRIPTION = 'IMPORTANT: If you need to explore the codebase to gather context, and the task does not involve a single file or function which is provided by name, you should ALWAYS use the warpgrep codebase search tool first instead of running search commands. When the task requires exploration beyond a single known file, invoke warpgrep first with a natural-language query describing the target functionality, bug, or architectural concern. Warp Grep is a fast and accurate tool that can search for all relevant context in a codebase. Keep queries action-oriented (e.g., "Find where billing invoices are generated and emailed"), and after reviewing the summarized results, you may verify important findings with other search tools or direct file reads to ensure completeness. Warp Grep can be used for query types like: find function responsible for <small feature>; find code that does <description>; find code path for <big feature>; Where does <minimal error message> come from?; or any query of that type. When a task requires exploration beyond a single known file, ALWAYS default to warpgrep codebase search before other search mechanisms.';
2420
+ var GITHUB_SEARCH_TOOL_NAME = "warpgrep_github_search";
2421
+ var GITHUB_SEARCH_DESCRIPTION = "Search a public GitHub repository using WarpGrep. Provide a GitHub URL or owner/repo shorthand and a natural language query.";
2422
+ var GITHUB_SEARCH_INPUT_SCHEMA = {
2423
+ type: "object",
2424
+ properties: {
2425
+ query: { type: "string", description: "Natural language search query describing what to find in the repository" },
2426
+ github: { type: "string", description: 'GitHub repository URL or owner/repo shorthand (e.g., "vercel/next.js" or "https://github.com/vercel/next.js")' },
2427
+ branch: { type: "string", description: "Branch to search (defaults to the repository default branch)" }
2428
+ },
2429
+ required: ["query", "github"]
2430
+ };
2316
2431
 
2317
2432
  // tools/warp_grep/providers/index.ts
2318
2433
  init_local();
@@ -2329,12 +2444,16 @@ var warpGrepInputSchema = import_zod.z.object({
2329
2444
  });
2330
2445
  // Annotate the CommonJS export names for ESM import in node:
2331
2446
  0 && (module.exports = {
2447
+ GITHUB_SEARCH_DESCRIPTION,
2448
+ GITHUB_SEARCH_INPUT_SCHEMA,
2449
+ GITHUB_SEARCH_TOOL_NAME,
2332
2450
  LocalRipgrepProvider,
2333
2451
  RemoteCommandsProvider,
2334
2452
  WARP_GREP_DESCRIPTION,
2335
2453
  WARP_GREP_SYSTEM_PROMPT,
2336
2454
  WARP_GREP_TOOL_NAME,
2337
2455
  WarpGrepClient,
2456
+ createCodeStorageHttpCommands,
2338
2457
  executeToolCall,
2339
2458
  executeWarpGrep,
2340
2459
  fixPathRepetition,