@morphllm/morphsdk 0.2.121 → 0.2.123

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 (186) hide show
  1. package/dist/{chunk-L4PK4VC7.js → chunk-5OJE7GH4.js} +2 -2
  2. package/dist/chunk-63VHBANJ.js +22 -0
  3. package/dist/chunk-63VHBANJ.js.map +1 -0
  4. package/dist/{chunk-BDKXYMU2.js → chunk-ANPZFWYV.js} +2 -2
  5. package/dist/{chunk-DL3Y3R6A.js → chunk-BJ2764MK.js} +2 -2
  6. package/dist/{chunk-JBIFS33U.js → chunk-DBSOONOY.js} +2 -2
  7. package/dist/chunk-ETTCJWJK.js +113 -0
  8. package/dist/chunk-ETTCJWJK.js.map +1 -0
  9. package/dist/{chunk-EJYFE73S.js → chunk-FMKJ72KT.js} +3 -3
  10. package/dist/{chunk-EJYFE73S.js.map → chunk-FMKJ72KT.js.map} +1 -1
  11. package/dist/{chunk-7QZFNYOH.js → chunk-GXFJLL5O.js} +2 -2
  12. package/dist/chunk-H3U7J5RI.js +98 -0
  13. package/dist/chunk-H3U7J5RI.js.map +1 -0
  14. package/dist/{chunk-MAAULSSQ.js → chunk-HVBJ4UO6.js} +2 -2
  15. package/dist/{chunk-3HBZXN6E.js → chunk-K74GLGST.js} +2 -2
  16. package/dist/{chunk-EZFXR52Q.js → chunk-KL3AMLGL.js} +2 -2
  17. package/dist/{chunk-YMOTJ6ZP.js → chunk-L426IMZD.js} +2 -2
  18. package/dist/{chunk-C3BQUIFE.js → chunk-MXSGTN7R.js} +145 -9
  19. package/dist/chunk-MXSGTN7R.js.map +1 -0
  20. package/dist/{chunk-266SWRHK.js → chunk-OFJYDTQI.js} +2 -2
  21. package/dist/chunk-OTOVGCG6.js +42 -0
  22. package/dist/chunk-OTOVGCG6.js.map +1 -0
  23. package/dist/{chunk-W37KJB25.js → chunk-QD7KPI7A.js} +2 -2
  24. package/dist/chunk-QGRFAVGK.js +112 -0
  25. package/dist/chunk-QGRFAVGK.js.map +1 -0
  26. package/dist/{chunk-WEBUKGPK.js → chunk-UHL2ZEWG.js} +3 -3
  27. package/dist/{chunk-CIFPLFBQ.js → chunk-UJS3AIWS.js} +2 -2
  28. package/dist/{chunk-FV3R3JGV.js → chunk-UX65IRCX.js} +2 -2
  29. package/dist/{chunk-L5C6E32T.js → chunk-V3HLOZK2.js} +1 -1
  30. package/dist/{chunk-L5C6E32T.js.map → chunk-V3HLOZK2.js.map} +1 -1
  31. package/dist/{chunk-7IZUNRPZ.js → chunk-V4KBK66V.js} +54 -15
  32. package/dist/{chunk-7IZUNRPZ.js.map → chunk-V4KBK66V.js.map} +1 -1
  33. package/dist/{chunk-AI3ZCOCT.js → chunk-WE75QX2B.js} +1 -1
  34. package/dist/chunk-WYYR2EU6.js +29 -0
  35. package/dist/chunk-WYYR2EU6.js.map +1 -0
  36. package/dist/{chunk-GNRMDXJA.js → chunk-XXL62KSJ.js} +2 -2
  37. package/dist/{chunk-QDGB6FLI.js → chunk-ZZCMAFN7.js} +5 -5
  38. package/dist/chunk-ZZCMAFN7.js.map +1 -0
  39. package/dist/{client-Bp3MRcJc.d.ts → client-JHPwle1Z.d.ts} +46 -1
  40. package/dist/client.cjs +287 -12
  41. package/dist/client.cjs.map +1 -1
  42. package/dist/client.d.ts +2 -2
  43. package/dist/client.js +23 -21
  44. package/dist/edge.cjs +2 -2
  45. package/dist/edge.cjs.map +1 -1
  46. package/dist/edge.js +4 -4
  47. package/dist/index.cjs +287 -12
  48. package/dist/index.cjs.map +1 -1
  49. package/dist/index.d.ts +2 -2
  50. package/dist/index.js +24 -22
  51. package/dist/modelrouter/core.cjs +2 -2
  52. package/dist/modelrouter/core.cjs.map +1 -1
  53. package/dist/modelrouter/core.js +3 -3
  54. package/dist/modelrouter/index.cjs +2 -2
  55. package/dist/modelrouter/index.cjs.map +1 -1
  56. package/dist/modelrouter/index.js +3 -3
  57. package/dist/tools/browser/anthropic.cjs +2 -2
  58. package/dist/tools/browser/anthropic.cjs.map +1 -1
  59. package/dist/tools/browser/anthropic.js +5 -5
  60. package/dist/tools/browser/core.cjs +2 -2
  61. package/dist/tools/browser/core.cjs.map +1 -1
  62. package/dist/tools/browser/core.js +4 -4
  63. package/dist/tools/browser/index.cjs +2 -2
  64. package/dist/tools/browser/index.cjs.map +1 -1
  65. package/dist/tools/browser/index.js +7 -7
  66. package/dist/tools/browser/openai.cjs +2 -2
  67. package/dist/tools/browser/openai.cjs.map +1 -1
  68. package/dist/tools/browser/openai.js +5 -5
  69. package/dist/tools/browser/profiles/core.cjs +2 -2
  70. package/dist/tools/browser/profiles/core.cjs.map +1 -1
  71. package/dist/tools/browser/profiles/core.js +3 -3
  72. package/dist/tools/browser/profiles/index.cjs +2 -2
  73. package/dist/tools/browser/profiles/index.cjs.map +1 -1
  74. package/dist/tools/browser/profiles/index.js +3 -3
  75. package/dist/tools/browser/vercel.cjs +2 -2
  76. package/dist/tools/browser/vercel.cjs.map +1 -1
  77. package/dist/tools/browser/vercel.js +5 -5
  78. package/dist/tools/codebase_search/anthropic.cjs +2 -2
  79. package/dist/tools/codebase_search/anthropic.cjs.map +1 -1
  80. package/dist/tools/codebase_search/anthropic.js +4 -4
  81. package/dist/tools/codebase_search/core.cjs +2 -2
  82. package/dist/tools/codebase_search/core.cjs.map +1 -1
  83. package/dist/tools/codebase_search/core.js +3 -3
  84. package/dist/tools/codebase_search/index.cjs +2 -2
  85. package/dist/tools/codebase_search/index.cjs.map +1 -1
  86. package/dist/tools/codebase_search/index.js +6 -6
  87. package/dist/tools/codebase_search/openai.cjs +2 -2
  88. package/dist/tools/codebase_search/openai.cjs.map +1 -1
  89. package/dist/tools/codebase_search/openai.js +4 -4
  90. package/dist/tools/codebase_search/vercel.cjs +2 -2
  91. package/dist/tools/codebase_search/vercel.cjs.map +1 -1
  92. package/dist/tools/codebase_search/vercel.js +4 -4
  93. package/dist/tools/fastapply/anthropic.cjs +2 -2
  94. package/dist/tools/fastapply/anthropic.cjs.map +1 -1
  95. package/dist/tools/fastapply/anthropic.js +4 -4
  96. package/dist/tools/fastapply/apply.cjs +2 -2
  97. package/dist/tools/fastapply/apply.cjs.map +1 -1
  98. package/dist/tools/fastapply/apply.js +2 -2
  99. package/dist/tools/fastapply/core.cjs +2 -2
  100. package/dist/tools/fastapply/core.cjs.map +1 -1
  101. package/dist/tools/fastapply/core.js +3 -3
  102. package/dist/tools/fastapply/index.cjs +2 -2
  103. package/dist/tools/fastapply/index.cjs.map +1 -1
  104. package/dist/tools/fastapply/index.js +6 -6
  105. package/dist/tools/fastapply/openai.cjs +2 -2
  106. package/dist/tools/fastapply/openai.cjs.map +1 -1
  107. package/dist/tools/fastapply/openai.js +4 -4
  108. package/dist/tools/fastapply/vercel.cjs +2 -2
  109. package/dist/tools/fastapply/vercel.cjs.map +1 -1
  110. package/dist/tools/fastapply/vercel.js +4 -4
  111. package/dist/tools/index.cjs +2 -2
  112. package/dist/tools/index.cjs.map +1 -1
  113. package/dist/tools/index.js +6 -6
  114. package/dist/tools/utils/resilience.cjs +2 -2
  115. package/dist/tools/utils/resilience.cjs.map +1 -1
  116. package/dist/tools/utils/resilience.js +2 -2
  117. package/dist/tools/warp_grep/agent/runner.cjs +5 -5
  118. package/dist/tools/warp_grep/agent/runner.cjs.map +1 -1
  119. package/dist/tools/warp_grep/agent/runner.js +2 -2
  120. package/dist/tools/warp_grep/anthropic.cjs +476 -5
  121. package/dist/tools/warp_grep/anthropic.cjs.map +1 -1
  122. package/dist/tools/warp_grep/anthropic.d.ts +62 -2
  123. package/dist/tools/warp_grep/anthropic.js +11 -5
  124. package/dist/tools/warp_grep/client.cjs +187 -12
  125. package/dist/tools/warp_grep/client.cjs.map +1 -1
  126. package/dist/tools/warp_grep/client.d.ts +58 -2
  127. package/dist/tools/warp_grep/client.js +9 -3
  128. package/dist/tools/warp_grep/gemini.cjs +475 -5
  129. package/dist/tools/warp_grep/gemini.cjs.map +1 -1
  130. package/dist/tools/warp_grep/gemini.d.ts +62 -2
  131. package/dist/tools/warp_grep/gemini.js +69 -4
  132. package/dist/tools/warp_grep/gemini.js.map +1 -1
  133. package/dist/tools/warp_grep/index.cjs +228 -12
  134. package/dist/tools/warp_grep/index.cjs.map +1 -1
  135. package/dist/tools/warp_grep/index.d.ts +52 -3
  136. package/dist/tools/warp_grep/index.js +26 -5
  137. package/dist/tools/warp_grep/openai.cjs +482 -5
  138. package/dist/tools/warp_grep/openai.cjs.map +1 -1
  139. package/dist/tools/warp_grep/openai.d.ts +62 -2
  140. package/dist/tools/warp_grep/openai.js +11 -5
  141. package/dist/tools/warp_grep/providers/code_storage_http.cjs +53 -0
  142. package/dist/tools/warp_grep/providers/code_storage_http.cjs.map +1 -0
  143. package/dist/tools/warp_grep/providers/code_storage_http.d.ts +23 -0
  144. package/dist/tools/warp_grep/providers/code_storage_http.js +8 -0
  145. package/dist/tools/warp_grep/providers/code_storage_http.js.map +1 -0
  146. package/dist/tools/warp_grep/providers/remote.d.ts +1 -1
  147. package/dist/tools/warp_grep/utils/github.cjs +46 -0
  148. package/dist/tools/warp_grep/utils/github.cjs.map +1 -0
  149. package/dist/tools/warp_grep/utils/github.d.ts +13 -0
  150. package/dist/tools/warp_grep/utils/github.js +8 -0
  151. package/dist/tools/warp_grep/utils/github.js.map +1 -0
  152. package/dist/tools/warp_grep/vercel.cjs +245 -5
  153. package/dist/tools/warp_grep/vercel.cjs.map +1 -1
  154. package/dist/tools/warp_grep/vercel.d.ts +60 -2
  155. package/dist/tools/warp_grep/vercel.js +11 -5
  156. package/dist/{types-D5p8QErL.d.ts → types-DY_hq2eZ.d.ts} +53 -1
  157. package/dist/version.cjs +2 -2
  158. package/dist/version.cjs.map +1 -1
  159. package/dist/version.js +1 -1
  160. package/package.json +2 -2
  161. package/dist/chunk-C3BQUIFE.js.map +0 -1
  162. package/dist/chunk-CXP63PHW.js +0 -61
  163. package/dist/chunk-CXP63PHW.js.map +0 -1
  164. package/dist/chunk-KW7OEGZK.js +0 -9
  165. package/dist/chunk-KW7OEGZK.js.map +0 -1
  166. package/dist/chunk-QDGB6FLI.js.map +0 -1
  167. package/dist/chunk-U5UDFQXK.js +0 -66
  168. package/dist/chunk-U5UDFQXK.js.map +0 -1
  169. package/dist/chunk-XERAWJ3H.js +0 -53
  170. package/dist/chunk-XERAWJ3H.js.map +0 -1
  171. /package/dist/{chunk-L4PK4VC7.js.map → chunk-5OJE7GH4.js.map} +0 -0
  172. /package/dist/{chunk-BDKXYMU2.js.map → chunk-ANPZFWYV.js.map} +0 -0
  173. /package/dist/{chunk-DL3Y3R6A.js.map → chunk-BJ2764MK.js.map} +0 -0
  174. /package/dist/{chunk-JBIFS33U.js.map → chunk-DBSOONOY.js.map} +0 -0
  175. /package/dist/{chunk-7QZFNYOH.js.map → chunk-GXFJLL5O.js.map} +0 -0
  176. /package/dist/{chunk-MAAULSSQ.js.map → chunk-HVBJ4UO6.js.map} +0 -0
  177. /package/dist/{chunk-3HBZXN6E.js.map → chunk-K74GLGST.js.map} +0 -0
  178. /package/dist/{chunk-EZFXR52Q.js.map → chunk-KL3AMLGL.js.map} +0 -0
  179. /package/dist/{chunk-YMOTJ6ZP.js.map → chunk-L426IMZD.js.map} +0 -0
  180. /package/dist/{chunk-266SWRHK.js.map → chunk-OFJYDTQI.js.map} +0 -0
  181. /package/dist/{chunk-W37KJB25.js.map → chunk-QD7KPI7A.js.map} +0 -0
  182. /package/dist/{chunk-WEBUKGPK.js.map → chunk-UHL2ZEWG.js.map} +0 -0
  183. /package/dist/{chunk-CIFPLFBQ.js.map → chunk-UJS3AIWS.js.map} +0 -0
  184. /package/dist/{chunk-FV3R3JGV.js.map → chunk-UX65IRCX.js.map} +0 -0
  185. /package/dist/{chunk-AI3ZCOCT.js.map → chunk-WE75QX2B.js.map} +0 -0
  186. /package/dist/{chunk-GNRMDXJA.js.map → chunk-XXL62KSJ.js.map} +0 -0
@@ -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, g as GitHubSearchToolConfig, h as GitHubReadFileToolConfig, e as GitHubReadFileInput, f as GitHubReadFileResult } from '../../types-DY_hq2eZ.js';
5
5
  import './agent/types.js';
6
6
  import '../utils/resilience.js';
7
7
  import './providers/types.js';
@@ -110,5 +110,65 @@ 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
+ };
146
+ /**
147
+ * Create a GitHub read file tool for Google Gemini SDK
148
+ *
149
+ * @param config - Optional configuration (timeout)
150
+ * @returns Gemini FunctionDeclaration with execute and formatResult methods
151
+ *
152
+ * @example
153
+ * ```typescript
154
+ * import { GoogleGenerativeAI } from '@google/generative-ai';
155
+ * import { createGitHubReadFileTool } from '@morphllm/morphsdk/tools/warp-grep/gemini';
156
+ *
157
+ * const tool = createGitHubReadFileTool();
158
+ *
159
+ * const genAI = new GoogleGenerativeAI(process.env.GOOGLE_API_KEY);
160
+ * const model = genAI.getGenerativeModel({
161
+ * model: 'gemini-2.0-flash',
162
+ * tools: [{ functionDeclarations: [tool] }]
163
+ * });
164
+ *
165
+ * const result = await tool.execute({ github: 'vercel/next.js', path: 'package.json' });
166
+ * console.log(tool.formatResult(result));
167
+ * ```
168
+ */
169
+ declare function createGitHubReadFileTool(config?: GitHubReadFileToolConfig): FunctionDeclaration & {
170
+ execute: (input: GitHubReadFileInput) => Promise<GitHubReadFileResult>;
171
+ formatResult: (result: GitHubReadFileResult) => string;
172
+ };
113
173
 
114
- export { type GeminiWarpGrepTool, createMorphWarpGrepTool, createWarpGrepTool, warpGrepFunctionDeclaration as default, execute, warpGrepFunctionDeclaration };
174
+ export { type GeminiWarpGrepTool, createGitHubReadFileTool, createGitHubSearchTool, createMorphWarpGrepTool, createWarpGrepTool, warpGrepFunctionDeclaration as default, execute, warpGrepFunctionDeclaration };
@@ -1,13 +1,22 @@
1
1
  import {
2
+ GITHUB_READ_FILE_DESCRIPTION,
3
+ GITHUB_READ_FILE_TOOL_NAME,
4
+ GITHUB_SEARCH_DESCRIPTION,
5
+ GITHUB_SEARCH_TOOL_NAME,
2
6
  WARP_GREP_DESCRIPTION,
3
7
  WARP_GREP_TOOL_NAME
4
- } from "../../chunk-KW7OEGZK.js";
8
+ } from "../../chunk-OTOVGCG6.js";
5
9
  import {
10
+ WarpGrepClient,
11
+ executeGitHubReadFile,
6
12
  executeToolCall,
13
+ formatGitHubReadFileResult,
7
14
  formatResult
8
- } from "../../chunk-C3BQUIFE.js";
15
+ } from "../../chunk-MXSGTN7R.js";
16
+ import "../../chunk-WYYR2EU6.js";
9
17
  import "../../chunk-PUGSTXLO.js";
10
- import "../../chunk-QDGB6FLI.js";
18
+ import "../../chunk-63VHBANJ.js";
19
+ import "../../chunk-ZZCMAFN7.js";
11
20
  import "../../chunk-3MLWXJTJ.js";
12
21
  import "../../chunk-5PNMAWLC.js";
13
22
  import "../../chunk-APP75CBN.js";
@@ -15,7 +24,7 @@ import "../../chunk-GHGJAQSJ.js";
15
24
  import {
16
25
  getSystemPrompt
17
26
  } from "../../chunk-FMLHRJDF.js";
18
- import "../../chunk-EJYFE73S.js";
27
+ import "../../chunk-FMKJ72KT.js";
19
28
  import "../../chunk-PZ5AY32C.js";
20
29
 
21
30
  // tools/warp_grep/gemini.ts
@@ -56,8 +65,64 @@ function createWarpGrepTool(config) {
56
65
  });
57
66
  }
58
67
  var createMorphWarpGrepTool = createWarpGrepTool;
68
+ var GITHUB_SEARCH_PARAMETERS = {
69
+ type: "OBJECT",
70
+ properties: {
71
+ query: { type: "STRING", description: "Natural language search query" },
72
+ github: { type: "STRING", description: 'GitHub URL or "owner/repo" shorthand' },
73
+ branch: { type: "STRING", description: "Branch to search (defaults to repo default branch)" }
74
+ },
75
+ required: ["query", "github"]
76
+ };
77
+ function createGitHubSearchTool(config) {
78
+ const client = new WarpGrepClient(config);
79
+ const declaration = {
80
+ name: GITHUB_SEARCH_TOOL_NAME,
81
+ description: GITHUB_SEARCH_DESCRIPTION,
82
+ parameters: GITHUB_SEARCH_PARAMETERS
83
+ };
84
+ return Object.assign(declaration, {
85
+ execute: async (input) => {
86
+ return client.searchGitHub(input);
87
+ },
88
+ formatResult: (result) => {
89
+ return formatResult(result);
90
+ },
91
+ getSystemPrompt: () => {
92
+ return getSystemPrompt();
93
+ }
94
+ });
95
+ }
96
+ var GITHUB_READ_FILE_PARAMETERS = {
97
+ type: "OBJECT",
98
+ properties: {
99
+ github: { type: "STRING", description: 'owner/repo shorthand (e.g., "vercel/next.js")' },
100
+ path: { type: "STRING", description: "File path within the repository" },
101
+ startLine: { type: "NUMBER", description: "Start line number (1-based)" },
102
+ endLine: { type: "NUMBER", description: "End line number (1-based, inclusive)" },
103
+ branch: { type: "STRING", description: "Branch to read from (defaults to repo default branch)" }
104
+ },
105
+ required: ["github", "path"]
106
+ };
107
+ function createGitHubReadFileTool(config) {
108
+ const declaration = {
109
+ name: GITHUB_READ_FILE_TOOL_NAME,
110
+ description: GITHUB_READ_FILE_DESCRIPTION,
111
+ parameters: GITHUB_READ_FILE_PARAMETERS
112
+ };
113
+ return Object.assign(declaration, {
114
+ execute: async (input) => {
115
+ return executeGitHubReadFile(input, config);
116
+ },
117
+ formatResult: (result) => {
118
+ return formatGitHubReadFileResult(result);
119
+ }
120
+ });
121
+ }
59
122
  var gemini_default = warpGrepFunctionDeclaration;
60
123
  export {
124
+ createGitHubReadFileTool,
125
+ createGitHubSearchTool,
61
126
  createMorphWarpGrepTool,
62
127
  createWarpGrepTool,
63
128
  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, executeGitHubReadFile, formatGitHubReadFileResult } from './client.js';\nimport { WARP_GREP_DESCRIPTION, WARP_GREP_TOOL_NAME, GITHUB_SEARCH_TOOL_NAME, GITHUB_SEARCH_DESCRIPTION, GITHUB_READ_FILE_TOOL_NAME, GITHUB_READ_FILE_DESCRIPTION, GITHUB_READ_FILE_INPUT_SCHEMA, getSystemPrompt } from './prompts.js';\nimport type { WarpGrepToolConfig, WarpGrepResult, GitHubSearchToolConfig, GitHubReadFileInput, GitHubReadFileResult, GitHubReadFileToolConfig } 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\nconst GITHUB_READ_FILE_PARAMETERS = {\n type: 'OBJECT',\n properties: {\n github: { type: 'STRING', description: 'owner/repo shorthand (e.g., \"vercel/next.js\")' },\n path: { type: 'STRING', description: 'File path within the repository' },\n startLine: { type: 'NUMBER', description: 'Start line number (1-based)' },\n endLine: { type: 'NUMBER', description: 'End line number (1-based, inclusive)' },\n branch: { type: 'STRING', description: 'Branch to read from (defaults to repo default branch)' },\n },\n required: ['github', 'path'],\n} as unknown as FunctionDeclarationSchema;\n\n/**\n * Create a GitHub read file tool for Google Gemini SDK\n *\n * @param config - Optional configuration (timeout)\n * @returns Gemini FunctionDeclaration with execute and formatResult methods\n *\n * @example\n * ```typescript\n * import { GoogleGenerativeAI } from '@google/generative-ai';\n * import { createGitHubReadFileTool } from '@morphllm/morphsdk/tools/warp-grep/gemini';\n *\n * const tool = createGitHubReadFileTool();\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 result = await tool.execute({ github: 'vercel/next.js', path: 'package.json' });\n * console.log(tool.formatResult(result));\n * ```\n */\nexport function createGitHubReadFileTool(config?: GitHubReadFileToolConfig) {\n const declaration: FunctionDeclaration = {\n name: GITHUB_READ_FILE_TOOL_NAME,\n description: GITHUB_READ_FILE_DESCRIPTION,\n parameters: GITHUB_READ_FILE_PARAMETERS,\n };\n\n return Object.assign(declaration, {\n execute: async (input: GitHubReadFileInput): Promise<GitHubReadFileResult> => {\n return executeGitHubReadFile(input, config);\n },\n formatResult: (result: GitHubReadFileResult): string => {\n return formatGitHubReadFileResult(result);\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,IAAM,8BAA8B;AAAA,EAClC,MAAM;AAAA,EACN,YAAY;AAAA,IACV,QAAQ,EAAE,MAAM,UAAU,aAAa,gDAAgD;AAAA,IACvF,MAAM,EAAE,MAAM,UAAU,aAAa,kCAAkC;AAAA,IACvE,WAAW,EAAE,MAAM,UAAU,aAAa,8BAA8B;AAAA,IACxE,SAAS,EAAE,MAAM,UAAU,aAAa,uCAAuC;AAAA,IAC/E,QAAQ,EAAE,MAAM,UAAU,aAAa,wDAAwD;AAAA,EACjG;AAAA,EACA,UAAU,CAAC,UAAU,MAAM;AAC7B;AAyBO,SAAS,yBAAyB,QAAmC;AAC1E,QAAM,cAAmC;AAAA,IACvC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAEA,SAAO,OAAO,OAAO,aAAa;AAAA,IAChC,SAAS,OAAO,UAA8D;AAC5E,aAAO,sBAAsB,OAAO,MAAM;AAAA,IAC5C;AAAA,IACA,cAAc,CAAC,WAAyC;AACtD,aAAO,2BAA2B,MAAM;AAAA,IAC1C;AAAA,EACF,CAAC;AACH;AAEA,IAAO,iBAAQ;","names":[]}
@@ -572,15 +572,24 @@ Details: ${res.stderr}` : ""}`
572
572
  // tools/warp_grep/index.ts
573
573
  var warp_grep_exports = {};
574
574
  __export(warp_grep_exports, {
575
+ GITHUB_READ_FILE_DESCRIPTION: () => GITHUB_READ_FILE_DESCRIPTION,
576
+ GITHUB_READ_FILE_INPUT_SCHEMA: () => GITHUB_READ_FILE_INPUT_SCHEMA,
577
+ GITHUB_READ_FILE_TOOL_NAME: () => GITHUB_READ_FILE_TOOL_NAME,
578
+ GITHUB_SEARCH_DESCRIPTION: () => GITHUB_SEARCH_DESCRIPTION,
579
+ GITHUB_SEARCH_INPUT_SCHEMA: () => GITHUB_SEARCH_INPUT_SCHEMA,
580
+ GITHUB_SEARCH_TOOL_NAME: () => GITHUB_SEARCH_TOOL_NAME,
575
581
  LocalRipgrepProvider: () => LocalRipgrepProvider,
576
582
  RemoteCommandsProvider: () => RemoteCommandsProvider,
577
583
  WARP_GREP_DESCRIPTION: () => WARP_GREP_DESCRIPTION,
578
584
  WARP_GREP_SYSTEM_PROMPT: () => SYSTEM_PROMPT,
579
585
  WARP_GREP_TOOL_NAME: () => WARP_GREP_TOOL_NAME,
580
586
  WarpGrepClient: () => WarpGrepClient,
587
+ createCodeStorageHttpCommands: () => createCodeStorageHttpCommands,
588
+ executeGitHubReadFile: () => executeGitHubReadFile,
581
589
  executeToolCall: () => executeToolCall,
582
590
  executeWarpGrep: () => executeWarpGrep,
583
591
  fixPathRepetition: () => fixPathRepetition,
592
+ formatGitHubReadFileResult: () => formatGitHubReadFileResult,
584
593
  formatResult: () => formatResult,
585
594
  getSystemPrompt: () => getSystemPrompt,
586
595
  normalizeFinishFiles: () => normalizeFinishFiles,
@@ -1400,7 +1409,7 @@ var import_openai = __toESM(require("openai"), 1);
1400
1409
  // package.json
1401
1410
  var package_default = {
1402
1411
  name: "@morphllm/morphsdk",
1403
- version: "0.2.121",
1412
+ version: "0.2.123",
1404
1413
  description: "TypeScript SDK and CLI for Morph Fast Apply integration",
1405
1414
  type: "module",
1406
1415
  main: "./dist/index.cjs",
@@ -1542,7 +1551,7 @@ var package_default = {
1542
1551
  "!dist/**/*.test.*"
1543
1552
  ],
1544
1553
  scripts: {
1545
- 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/compact/index.ts tools/compact/core.ts tools/compact/types.ts tools/utils/resilience.ts --format esm,cjs --sourcemap --clean --dts --dts-resolve",
1554
+ 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",
1546
1555
  prepare: "npm run build",
1547
1556
  typecheck: "tsc --noEmit",
1548
1557
  lint: "eslint .",
@@ -1650,9 +1659,9 @@ async function callModel(messages, model, options = {}) {
1650
1659
  });
1651
1660
  } catch (error) {
1652
1661
  if (error instanceof import_openai.default.APIError && error.status === 404) {
1653
- throw new Error(
1654
- "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"
1655
- );
1662
+ const defaultMsg = "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";
1663
+ const errorText = error.message?.trim();
1664
+ throw new Error(errorText || defaultMsg);
1656
1665
  }
1657
1666
  throw error;
1658
1667
  }
@@ -2180,7 +2189,51 @@ var RemoteCommandsProvider = class {
2180
2189
  }
2181
2190
  };
2182
2191
 
2192
+ // tools/warp_grep/providers/code_storage_http.ts
2193
+ async function post(url, body, op) {
2194
+ const res = await fetch(url, {
2195
+ method: "POST",
2196
+ headers: { "Content-Type": "application/json" },
2197
+ body: JSON.stringify(body)
2198
+ });
2199
+ if (!res.ok) {
2200
+ const text = await res.text().catch(() => res.statusText);
2201
+ throw new Error(`${op} failed (${res.status}): ${text}`);
2202
+ }
2203
+ const data = await res.json();
2204
+ if (data.error) throw new Error(data.error);
2205
+ return data.stdout;
2206
+ }
2207
+ function createCodeStorageHttpCommands(config) {
2208
+ const { baseUrl, repoId, branch } = config;
2209
+ const encodedRepoId = encodeURIComponent(repoId);
2210
+ return {
2211
+ grep: (pattern, path5, glob) => post(`${baseUrl}/api/code-search/${encodedRepoId}/grep`, { pattern, path: path5, glob, branch }, "grep"),
2212
+ read: (path5, start, end) => post(`${baseUrl}/api/code-search/${encodedRepoId}/read`, { path: path5, start, end, branch }, "read"),
2213
+ listDir: (path5, maxDepth) => post(`${baseUrl}/api/code-search/${encodedRepoId}/list`, { path: path5, maxDepth, branch }, "list")
2214
+ };
2215
+ }
2216
+
2217
+ // tools/warp_grep/utils/github.ts
2218
+ function parseGitHubUrl(input) {
2219
+ input = input.trim();
2220
+ const urlPattern = /^(?:https?:\/\/)?github\.com\/([^\/]+)\/([^\/\?\#]+)/;
2221
+ const match = input.match(urlPattern);
2222
+ if (match) {
2223
+ return { owner: match[1], repo: match[2].replace(/\.git$/, "") };
2224
+ }
2225
+ const shortPattern = /^([^\/]+)\/([^\/]+)$/;
2226
+ const shortMatch = input.match(shortPattern);
2227
+ if (shortMatch && !shortMatch[1].includes(".")) {
2228
+ return { owner: shortMatch[1], repo: shortMatch[2].replace(/\.git$/, "") };
2229
+ }
2230
+ throw new Error(
2231
+ `Invalid GitHub URL or shorthand: "${input}". Expected "owner/repo" or "https://github.com/owner/repo"`
2232
+ );
2233
+ }
2234
+
2183
2235
  // tools/warp_grep/client.ts
2236
+ var DEFAULT_CODE_SEARCH_URL = "https://morphllm.com";
2184
2237
  async function getLocalProvider(repoRoot, excludes) {
2185
2238
  const { LocalRipgrepProvider: LocalRipgrepProvider2 } = await Promise.resolve().then(() => (init_local(), local_exports));
2186
2239
  return new LocalRipgrepProvider2(repoRoot, excludes);
@@ -2188,13 +2241,7 @@ async function getLocalProvider(repoRoot, excludes) {
2188
2241
  var WarpGrepClient = class {
2189
2242
  config;
2190
2243
  constructor(config = {}) {
2191
- this.config = {
2192
- morphApiKey: config.morphApiKey,
2193
- morphApiUrl: config.morphApiUrl,
2194
- debug: config.debug,
2195
- timeout: config.timeout,
2196
- retryConfig: config.retryConfig
2197
- };
2244
+ this.config = { ...config };
2198
2245
  }
2199
2246
  execute(input) {
2200
2247
  const toolConfig = {
@@ -2214,6 +2261,80 @@ var WarpGrepClient = class {
2214
2261
  }
2215
2262
  return executeToolCall({ query: input.query }, toolConfig);
2216
2263
  }
2264
+ searchGitHub(input) {
2265
+ if (input.streamSteps) {
2266
+ return this._searchGitHubStreaming(input);
2267
+ }
2268
+ return this._searchGitHubAsync(input);
2269
+ }
2270
+ /**
2271
+ * Read a single file from a public GitHub repository
2272
+ *
2273
+ * @example
2274
+ * ```typescript
2275
+ * const result = await client.readGitHubFile({
2276
+ * github: 'vercel/next.js',
2277
+ * path: 'src/server/app-render/index.tsx',
2278
+ * startLine: 1,
2279
+ * endLine: 50,
2280
+ * });
2281
+ * if (result.success) console.log(result.content);
2282
+ * ```
2283
+ */
2284
+ async readGitHubFile(input) {
2285
+ return executeGitHubReadFile(input, { timeout: this.config.timeout });
2286
+ }
2287
+ async _resolveGitHubRepo(input) {
2288
+ const { owner, repo } = parseGitHubUrl(input.github);
2289
+ const baseUrl = this.config.codeSearchUrl || DEFAULT_CODE_SEARCH_URL;
2290
+ const importRes = await fetch(`${baseUrl}/api/code-search/get-or-create?url=${encodeURIComponent(`${owner}/${repo}`)}`);
2291
+ if (!importRes.ok) {
2292
+ const text = await importRes.text().catch(() => importRes.statusText);
2293
+ throw new Error(`Failed to import repo ${owner}/${repo}: ${text}`);
2294
+ }
2295
+ const { repoId, defaultBranch } = await importRes.json();
2296
+ return {
2297
+ repo,
2298
+ remoteCommands: createCodeStorageHttpCommands({ baseUrl, repoId, branch: input.branch || defaultBranch })
2299
+ };
2300
+ }
2301
+ async _searchGitHubAsync(input) {
2302
+ try {
2303
+ const { repo, remoteCommands } = await this._resolveGitHubRepo(input);
2304
+ return this.execute({
2305
+ query: input.query,
2306
+ repoRoot: repo,
2307
+ remoteCommands
2308
+ });
2309
+ } catch (error) {
2310
+ return { success: false, error: error instanceof Error ? error.message : String(error) };
2311
+ }
2312
+ }
2313
+ async *_searchGitHubStreaming(input) {
2314
+ let repo;
2315
+ let remoteCommands;
2316
+ try {
2317
+ ({ repo, remoteCommands } = await this._resolveGitHubRepo(input));
2318
+ } catch (error) {
2319
+ return { success: false, error: error instanceof Error ? error.message : String(error) };
2320
+ }
2321
+ const generator = this.execute({
2322
+ query: input.query,
2323
+ repoRoot: repo,
2324
+ remoteCommands,
2325
+ streamSteps: true
2326
+ });
2327
+ let result;
2328
+ for (; ; ) {
2329
+ const { value, done } = await generator.next();
2330
+ if (done) {
2331
+ result = value;
2332
+ break;
2333
+ }
2334
+ yield value;
2335
+ }
2336
+ return result;
2337
+ }
2217
2338
  };
2218
2339
  function executeWarpGrep(input, config) {
2219
2340
  const client = new WarpGrepClient(config);
@@ -2290,6 +2411,65 @@ async function* executeToolCallStreaming(input, config) {
2290
2411
  }
2291
2412
  return processAgentResult(agentResult);
2292
2413
  }
2414
+ async function fetchRawGitHubFile(owner, repo, filePath, branch, timeout) {
2415
+ const branches = branch ? [branch] : ["HEAD"];
2416
+ const fallbacks = ["main", "master", "develop"];
2417
+ const fetchWithTimeout = (url) => timeout ? fetch(url, { signal: AbortSignal.timeout(timeout) }) : fetch(url);
2418
+ for (const b of branches) {
2419
+ const url = `https://raw.githubusercontent.com/${owner}/${repo}/${b}/${filePath}`;
2420
+ const res = await fetchWithTimeout(url);
2421
+ if (res.ok) return { content: await res.text(), branch: b };
2422
+ }
2423
+ for (const fb of fallbacks) {
2424
+ if (branch && fb === branch) continue;
2425
+ const url = `https://raw.githubusercontent.com/${owner}/${repo}/${fb}/${filePath}`;
2426
+ const res = await fetchWithTimeout(url);
2427
+ if (res.ok) return { content: await res.text(), branch: fb };
2428
+ }
2429
+ throw new Error(`File not found: ${owner}/${repo}/${filePath}`);
2430
+ }
2431
+ async function executeGitHubReadFile(input, config) {
2432
+ try {
2433
+ const { owner, repo } = parseGitHubUrl(input.github);
2434
+ const { content: raw, branch } = await fetchRawGitHubFile(
2435
+ owner,
2436
+ repo,
2437
+ input.path,
2438
+ input.branch,
2439
+ config?.timeout
2440
+ );
2441
+ const allLines = raw.split("\n");
2442
+ const totalLines = allLines.length;
2443
+ const start = Math.max(1, input.startLine ?? 1);
2444
+ const end = Math.min(totalLines, input.endLine ?? totalLines);
2445
+ const selected = allLines.slice(start - 1, end);
2446
+ const padWidth = String(end).length;
2447
+ const numbered = selected.map((line, i) => `${String(start + i).padStart(padWidth)}|${line}`).join("\n");
2448
+ return {
2449
+ success: true,
2450
+ content: numbered,
2451
+ path: input.path,
2452
+ github: `${owner}/${repo}`,
2453
+ branch,
2454
+ lineRange: [start, end],
2455
+ totalLines
2456
+ };
2457
+ } catch (error) {
2458
+ return {
2459
+ success: false,
2460
+ error: error instanceof Error ? error.message : String(error)
2461
+ };
2462
+ }
2463
+ }
2464
+ function formatGitHubReadFileResult(result) {
2465
+ if (!result.success) {
2466
+ return `Failed to read file: ${result.error}`;
2467
+ }
2468
+ const rangeStr = result.lineRange ? ` (lines ${result.lineRange[0]}-${result.lineRange[1]} of ${result.totalLines})` : "";
2469
+ return `File: ${result.github}/${result.path}${rangeStr}
2470
+
2471
+ ${result.content}`;
2472
+ }
2293
2473
  function formatResult(result) {
2294
2474
  if (!result.success) {
2295
2475
  return `Search failed: ${result.error}`;
@@ -2318,6 +2498,33 @@ function formatResult(result) {
2318
2498
  // tools/warp_grep/prompts.ts
2319
2499
  var WARP_GREP_TOOL_NAME = "warpgrep_codebase_search";
2320
2500
  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.';
2501
+ var GITHUB_WARP_GREP_SEARCH_TOOL_NAME = "warpgrep_github_search";
2502
+ var GITHUB_WARP_GREP_SEARCH_DESCRIPTION = 'IMPORTANT: If you need to explore the codebase of a public GitHub repository (not your local workspace), use warpgrep_github_search instead of warpgrep_codebase_search. When the task requires understanding code in an external repo, invoke warpgrep_github_search with a GitHub URL or owner/repo shorthand (e.g., vercel/next.js) and a natural-language query describing the target functionality, bug, or architectural concern. WarpGrep searches GitHub repos the same way it searches local codebases: fast and accurate. Keep queries action-oriented (e.g., "Find where how the new use workflow directive works"), and after reviewing the results, you may verify important findings with other tools or direct file reads. WarpGrep 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 involves exploring code in an external public repo, ALWAYS use warpgrep_github_search.';
2503
+ var GITHUB_WARP_GREP_SEARCH_INPUT_SCHEMA = {
2504
+ type: "object",
2505
+ properties: {
2506
+ query: { type: "string", description: "Natural language search query describing what to find in the repository" },
2507
+ github: { type: "string", description: 'owner/repo shorthand (ex: "vercel/next.js" for "https://github.com/vercel/next.js")' },
2508
+ branch: { type: "string", description: "Branch to search (defaults to the repository default branch)" }
2509
+ },
2510
+ required: ["query", "github"]
2511
+ };
2512
+ var GITHUB_SEARCH_TOOL_NAME = GITHUB_WARP_GREP_SEARCH_TOOL_NAME;
2513
+ var GITHUB_SEARCH_DESCRIPTION = GITHUB_WARP_GREP_SEARCH_DESCRIPTION;
2514
+ var GITHUB_SEARCH_INPUT_SCHEMA = GITHUB_WARP_GREP_SEARCH_INPUT_SCHEMA;
2515
+ var GITHUB_READ_FILE_TOOL_NAME = "readfile_github_search";
2516
+ var GITHUB_READ_FILE_DESCRIPTION = "Read a single file (or a line range) from a public GitHub repository. Use this when you already know the exact file path you want to read, for example after finding it via warpgrep_github_search results. Takes owner/repo shorthand and the file path within the repo. Optionally specify startLine and endLine (1-based) to read a specific range. Returns the file content with line numbers.";
2517
+ var GITHUB_READ_FILE_INPUT_SCHEMA = {
2518
+ type: "object",
2519
+ properties: {
2520
+ github: { type: "string", description: 'owner/repo shorthand (e.g., "vercel/next.js")' },
2521
+ path: { type: "string", description: 'File path within the repository (e.g., "src/server/index.ts")' },
2522
+ startLine: { type: "number", description: "Start line number (1-based). Omit to start from beginning." },
2523
+ endLine: { type: "number", description: "End line number (1-based, inclusive). Omit to read to the end." },
2524
+ branch: { type: "string", description: "Branch to read from (defaults to the repository default branch)" }
2525
+ },
2526
+ required: ["github", "path"]
2527
+ };
2321
2528
 
2322
2529
  // tools/warp_grep/providers/index.ts
2323
2530
  init_local();
@@ -2334,15 +2541,24 @@ var warpGrepInputSchema = import_zod.z.object({
2334
2541
  });
2335
2542
  // Annotate the CommonJS export names for ESM import in node:
2336
2543
  0 && (module.exports = {
2544
+ GITHUB_READ_FILE_DESCRIPTION,
2545
+ GITHUB_READ_FILE_INPUT_SCHEMA,
2546
+ GITHUB_READ_FILE_TOOL_NAME,
2547
+ GITHUB_SEARCH_DESCRIPTION,
2548
+ GITHUB_SEARCH_INPUT_SCHEMA,
2549
+ GITHUB_SEARCH_TOOL_NAME,
2337
2550
  LocalRipgrepProvider,
2338
2551
  RemoteCommandsProvider,
2339
2552
  WARP_GREP_DESCRIPTION,
2340
2553
  WARP_GREP_SYSTEM_PROMPT,
2341
2554
  WARP_GREP_TOOL_NAME,
2342
2555
  WarpGrepClient,
2556
+ createCodeStorageHttpCommands,
2557
+ executeGitHubReadFile,
2343
2558
  executeToolCall,
2344
2559
  executeWarpGrep,
2345
2560
  fixPathRepetition,
2561
+ formatGitHubReadFileResult,
2346
2562
  formatResult,
2347
2563
  getSystemPrompt,
2348
2564
  normalizeFinishFiles,