@morphllm/morphsdk 0.2.121 → 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 (180) hide show
  1. package/dist/{chunk-L4PK4VC7.js → chunk-2AQLRL4U.js} +2 -2
  2. package/dist/{chunk-266SWRHK.js → chunk-2MJEULZU.js} +2 -2
  3. package/dist/{chunk-YMOTJ6ZP.js → chunk-3PMFQ5AV.js} +2 -2
  4. package/dist/{chunk-EZFXR52Q.js → chunk-4GEBF5OH.js} +2 -2
  5. package/dist/{chunk-BDKXYMU2.js → chunk-4IU2K63O.js} +2 -2
  6. package/dist/{chunk-XERAWJ3H.js → chunk-4LA3OT4Q.js} +28 -4
  7. package/dist/chunk-4LA3OT4Q.js.map +1 -0
  8. package/dist/{chunk-CIFPLFBQ.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-3HBZXN6E.js → chunk-73GZ6KUK.js} +2 -2
  14. package/dist/{chunk-W37KJB25.js → chunk-7KOUCN6T.js} +2 -2
  15. package/dist/{chunk-7QZFNYOH.js → chunk-EBROW6GK.js} +2 -2
  16. package/dist/{chunk-JBIFS33U.js → chunk-GTANVDUZ.js} +2 -2
  17. package/dist/{chunk-KW7OEGZK.js → chunk-KJZMKDDP.js} +16 -2
  18. package/dist/{chunk-KW7OEGZK.js.map → chunk-KJZMKDDP.js.map} +1 -1
  19. package/dist/{chunk-WEBUKGPK.js → chunk-L4URLBKV.js} +3 -3
  20. package/dist/{chunk-MAAULSSQ.js → chunk-LE24SVVU.js} +2 -2
  21. package/dist/{chunk-QDGB6FLI.js → chunk-MQWEZJTP.js} +2 -2
  22. package/dist/{chunk-DL3Y3R6A.js → chunk-OTGBQEVH.js} +2 -2
  23. package/dist/{chunk-GNRMDXJA.js → chunk-OWISPSLH.js} +2 -2
  24. package/dist/{chunk-FV3R3JGV.js → chunk-QGE7FGGT.js} +2 -2
  25. package/dist/{chunk-EJYFE73S.js → chunk-RNKHRNSG.js} +3 -3
  26. package/dist/{chunk-EJYFE73S.js.map → chunk-RNKHRNSG.js.map} +1 -1
  27. package/dist/{chunk-CXP63PHW.js → chunk-T3T4LGRD.js} +30 -3
  28. package/dist/chunk-T3T4LGRD.js.map +1 -0
  29. package/dist/{chunk-U5UDFQXK.js → chunk-TBLMIAIH.js} +28 -3
  30. package/dist/chunk-TBLMIAIH.js.map +1 -0
  31. package/dist/{chunk-C3BQUIFE.js → chunk-TXT3W4QK.js} +67 -9
  32. package/dist/chunk-TXT3W4QK.js.map +1 -0
  33. package/dist/{chunk-7IZUNRPZ.js → chunk-UDGJQBTC.js} +54 -15
  34. package/dist/{chunk-7IZUNRPZ.js.map → chunk-UDGJQBTC.js.map} +1 -1
  35. package/dist/chunk-WYYR2EU6.js +29 -0
  36. package/dist/chunk-WYYR2EU6.js.map +1 -0
  37. package/dist/{chunk-AI3ZCOCT.js → chunk-ZHRT6F72.js} +1 -1
  38. package/dist/{client-Bp3MRcJc.d.ts → client-BJrzbMYL.d.ts} +46 -1
  39. package/dist/client.cjs +214 -9
  40. package/dist/client.cjs.map +1 -1
  41. package/dist/client.d.ts +2 -2
  42. package/dist/client.js +23 -21
  43. package/dist/edge.cjs +2 -2
  44. package/dist/edge.cjs.map +1 -1
  45. package/dist/edge.js +4 -4
  46. package/dist/index.cjs +214 -9
  47. package/dist/index.cjs.map +1 -1
  48. package/dist/index.d.ts +2 -2
  49. package/dist/index.js +24 -22
  50. package/dist/modelrouter/core.cjs +2 -2
  51. package/dist/modelrouter/core.cjs.map +1 -1
  52. package/dist/modelrouter/core.js +3 -3
  53. package/dist/modelrouter/index.cjs +2 -2
  54. package/dist/modelrouter/index.cjs.map +1 -1
  55. package/dist/modelrouter/index.js +3 -3
  56. package/dist/tools/browser/anthropic.cjs +2 -2
  57. package/dist/tools/browser/anthropic.cjs.map +1 -1
  58. package/dist/tools/browser/anthropic.js +5 -5
  59. package/dist/tools/browser/core.cjs +2 -2
  60. package/dist/tools/browser/core.cjs.map +1 -1
  61. package/dist/tools/browser/core.js +4 -4
  62. package/dist/tools/browser/index.cjs +2 -2
  63. package/dist/tools/browser/index.cjs.map +1 -1
  64. package/dist/tools/browser/index.js +7 -7
  65. package/dist/tools/browser/openai.cjs +2 -2
  66. package/dist/tools/browser/openai.cjs.map +1 -1
  67. package/dist/tools/browser/openai.js +5 -5
  68. package/dist/tools/browser/profiles/core.cjs +2 -2
  69. package/dist/tools/browser/profiles/core.cjs.map +1 -1
  70. package/dist/tools/browser/profiles/core.js +3 -3
  71. package/dist/tools/browser/profiles/index.cjs +2 -2
  72. package/dist/tools/browser/profiles/index.cjs.map +1 -1
  73. package/dist/tools/browser/profiles/index.js +3 -3
  74. package/dist/tools/browser/vercel.cjs +2 -2
  75. package/dist/tools/browser/vercel.cjs.map +1 -1
  76. package/dist/tools/browser/vercel.js +5 -5
  77. package/dist/tools/codebase_search/anthropic.cjs +2 -2
  78. package/dist/tools/codebase_search/anthropic.cjs.map +1 -1
  79. package/dist/tools/codebase_search/anthropic.js +4 -4
  80. package/dist/tools/codebase_search/core.cjs +2 -2
  81. package/dist/tools/codebase_search/core.cjs.map +1 -1
  82. package/dist/tools/codebase_search/core.js +3 -3
  83. package/dist/tools/codebase_search/index.cjs +2 -2
  84. package/dist/tools/codebase_search/index.cjs.map +1 -1
  85. package/dist/tools/codebase_search/index.js +6 -6
  86. package/dist/tools/codebase_search/openai.cjs +2 -2
  87. package/dist/tools/codebase_search/openai.cjs.map +1 -1
  88. package/dist/tools/codebase_search/openai.js +4 -4
  89. package/dist/tools/codebase_search/vercel.cjs +2 -2
  90. package/dist/tools/codebase_search/vercel.cjs.map +1 -1
  91. package/dist/tools/codebase_search/vercel.js +4 -4
  92. package/dist/tools/fastapply/anthropic.cjs +2 -2
  93. package/dist/tools/fastapply/anthropic.cjs.map +1 -1
  94. package/dist/tools/fastapply/anthropic.js +4 -4
  95. package/dist/tools/fastapply/apply.cjs +2 -2
  96. package/dist/tools/fastapply/apply.cjs.map +1 -1
  97. package/dist/tools/fastapply/apply.js +2 -2
  98. package/dist/tools/fastapply/core.cjs +2 -2
  99. package/dist/tools/fastapply/core.cjs.map +1 -1
  100. package/dist/tools/fastapply/core.js +3 -3
  101. package/dist/tools/fastapply/index.cjs +2 -2
  102. package/dist/tools/fastapply/index.cjs.map +1 -1
  103. package/dist/tools/fastapply/index.js +6 -6
  104. package/dist/tools/fastapply/openai.cjs +2 -2
  105. package/dist/tools/fastapply/openai.cjs.map +1 -1
  106. package/dist/tools/fastapply/openai.js +4 -4
  107. package/dist/tools/fastapply/vercel.cjs +2 -2
  108. package/dist/tools/fastapply/vercel.cjs.map +1 -1
  109. package/dist/tools/fastapply/vercel.js +4 -4
  110. package/dist/tools/index.cjs +2 -2
  111. package/dist/tools/index.cjs.map +1 -1
  112. package/dist/tools/index.js +6 -6
  113. package/dist/tools/utils/resilience.cjs +2 -2
  114. package/dist/tools/utils/resilience.cjs.map +1 -1
  115. package/dist/tools/utils/resilience.js +2 -2
  116. package/dist/tools/warp_grep/agent/runner.cjs +2 -2
  117. package/dist/tools/warp_grep/agent/runner.cjs.map +1 -1
  118. package/dist/tools/warp_grep/agent/runner.js +2 -2
  119. package/dist/tools/warp_grep/anthropic.cjs +364 -2
  120. package/dist/tools/warp_grep/anthropic.cjs.map +1 -1
  121. package/dist/tools/warp_grep/anthropic.d.ts +35 -2
  122. package/dist/tools/warp_grep/anthropic.js +9 -5
  123. package/dist/tools/warp_grep/client.cjs +104 -9
  124. package/dist/tools/warp_grep/client.cjs.map +1 -1
  125. package/dist/tools/warp_grep/client.d.ts +32 -1
  126. package/dist/tools/warp_grep/client.js +5 -3
  127. package/dist/tools/warp_grep/gemini.cjs +364 -2
  128. package/dist/tools/warp_grep/gemini.cjs.map +1 -1
  129. package/dist/tools/warp_grep/gemini.d.ts +35 -2
  130. package/dist/tools/warp_grep/gemini.js +38 -4
  131. package/dist/tools/warp_grep/gemini.js.map +1 -1
  132. package/dist/tools/warp_grep/index.cjs +123 -9
  133. package/dist/tools/warp_grep/index.cjs.map +1 -1
  134. package/dist/tools/warp_grep/index.d.ts +23 -2
  135. package/dist/tools/warp_grep/index.js +16 -5
  136. package/dist/tools/warp_grep/openai.cjs +367 -2
  137. package/dist/tools/warp_grep/openai.cjs.map +1 -1
  138. package/dist/tools/warp_grep/openai.d.ts +35 -2
  139. package/dist/tools/warp_grep/openai.js +9 -5
  140. package/dist/tools/warp_grep/providers/code_storage_http.cjs +53 -0
  141. package/dist/tools/warp_grep/providers/code_storage_http.cjs.map +1 -0
  142. package/dist/tools/warp_grep/providers/code_storage_http.d.ts +23 -0
  143. package/dist/tools/warp_grep/providers/code_storage_http.js +8 -0
  144. package/dist/tools/warp_grep/providers/code_storage_http.js.map +1 -0
  145. package/dist/tools/warp_grep/providers/remote.d.ts +1 -1
  146. package/dist/tools/warp_grep/utils/github.cjs +46 -0
  147. package/dist/tools/warp_grep/utils/github.cjs.map +1 -0
  148. package/dist/tools/warp_grep/utils/github.d.ts +13 -0
  149. package/dist/tools/warp_grep/utils/github.js +8 -0
  150. package/dist/tools/warp_grep/utils/github.js.map +1 -0
  151. package/dist/tools/warp_grep/vercel.cjs +152 -2
  152. package/dist/tools/warp_grep/vercel.cjs.map +1 -1
  153. package/dist/tools/warp_grep/vercel.d.ts +32 -2
  154. package/dist/tools/warp_grep/vercel.js +9 -5
  155. package/dist/{types-D5p8QErL.d.ts → types-CA7989hK.d.ts} +17 -1
  156. package/dist/version.cjs +2 -2
  157. package/dist/version.cjs.map +1 -1
  158. package/dist/version.js +1 -1
  159. package/package.json +2 -2
  160. package/dist/chunk-C3BQUIFE.js.map +0 -1
  161. package/dist/chunk-CXP63PHW.js.map +0 -1
  162. package/dist/chunk-U5UDFQXK.js.map +0 -1
  163. package/dist/chunk-XERAWJ3H.js.map +0 -1
  164. /package/dist/{chunk-L4PK4VC7.js.map → chunk-2AQLRL4U.js.map} +0 -0
  165. /package/dist/{chunk-266SWRHK.js.map → chunk-2MJEULZU.js.map} +0 -0
  166. /package/dist/{chunk-YMOTJ6ZP.js.map → chunk-3PMFQ5AV.js.map} +0 -0
  167. /package/dist/{chunk-EZFXR52Q.js.map → chunk-4GEBF5OH.js.map} +0 -0
  168. /package/dist/{chunk-BDKXYMU2.js.map → chunk-4IU2K63O.js.map} +0 -0
  169. /package/dist/{chunk-CIFPLFBQ.js.map → chunk-5UUJULLM.js.map} +0 -0
  170. /package/dist/{chunk-3HBZXN6E.js.map → chunk-73GZ6KUK.js.map} +0 -0
  171. /package/dist/{chunk-W37KJB25.js.map → chunk-7KOUCN6T.js.map} +0 -0
  172. /package/dist/{chunk-7QZFNYOH.js.map → chunk-EBROW6GK.js.map} +0 -0
  173. /package/dist/{chunk-JBIFS33U.js.map → chunk-GTANVDUZ.js.map} +0 -0
  174. /package/dist/{chunk-WEBUKGPK.js.map → chunk-L4URLBKV.js.map} +0 -0
  175. /package/dist/{chunk-MAAULSSQ.js.map → chunk-LE24SVVU.js.map} +0 -0
  176. /package/dist/{chunk-QDGB6FLI.js.map → chunk-MQWEZJTP.js.map} +0 -0
  177. /package/dist/{chunk-DL3Y3R6A.js.map → chunk-OTGBQEVH.js.map} +0 -0
  178. /package/dist/{chunk-GNRMDXJA.js.map → chunk-OWISPSLH.js.map} +0 -0
  179. /package/dist/{chunk-FV3R3JGV.js.map → chunk-QGE7FGGT.js.map} +0 -0
  180. /package/dist/{chunk-AI3ZCOCT.js.map → chunk-ZHRT6F72.js.map} +0 -0
@@ -1,5 +1,5 @@
1
1
  import { WarpGrepStep } from './agent/types.js';
2
- import { W as WarpGrepClientConfig, a as WarpGrepInput, b as WarpGrepResult, d as WarpGrepToolConfig } from '../../types-D5p8QErL.js';
2
+ import { W as WarpGrepClientConfig, a as WarpGrepInput, b as WarpGrepResult, G as GitHubSearchInput, d as WarpGrepToolConfig } from '../../types-CA7989hK.js';
3
3
  import '../utils/resilience.js';
4
4
  import './providers/types.js';
5
5
 
@@ -72,6 +72,37 @@ declare class WarpGrepClient {
72
72
  execute(input: WarpGrepInput & {
73
73
  streamSteps?: false | undefined;
74
74
  }): Promise<WarpGrepResult>;
75
+ /**
76
+ * Search a public GitHub repository
77
+ *
78
+ * @example
79
+ * ```typescript
80
+ * // Simple usage
81
+ * const result = await client.searchGitHub({
82
+ * query: 'Find authentication middleware',
83
+ * github: 'vercel/next.js',
84
+ * });
85
+ *
86
+ * // With streaming
87
+ * const stream = client.searchGitHub({
88
+ * query: 'Find auth middleware',
89
+ * github: 'https://github.com/vercel/next.js',
90
+ * streamSteps: true,
91
+ * });
92
+ * for await (const step of stream) {
93
+ * console.log(`Turn ${step.turn}:`, step.toolCalls);
94
+ * }
95
+ * ```
96
+ */
97
+ searchGitHub(input: GitHubSearchInput & {
98
+ streamSteps: true;
99
+ }): AsyncGenerator<WarpGrepStep, WarpGrepResult, undefined>;
100
+ searchGitHub(input: GitHubSearchInput & {
101
+ streamSteps?: false | undefined;
102
+ }): Promise<WarpGrepResult>;
103
+ private _resolveGitHubRepo;
104
+ private _searchGitHubAsync;
105
+ private _searchGitHubStreaming;
75
106
  }
76
107
  /**
77
108
  * Execute a warp grep search directly
@@ -4,15 +4,17 @@ import {
4
4
  executeToolCallStreaming,
5
5
  executeWarpGrep,
6
6
  formatResult
7
- } from "../../chunk-C3BQUIFE.js";
7
+ } from "../../chunk-TXT3W4QK.js";
8
+ import "../../chunk-WYYR2EU6.js";
8
9
  import "../../chunk-PUGSTXLO.js";
9
- import "../../chunk-QDGB6FLI.js";
10
+ import "../../chunk-63VHBANJ.js";
11
+ import "../../chunk-MQWEZJTP.js";
10
12
  import "../../chunk-3MLWXJTJ.js";
11
13
  import "../../chunk-5PNMAWLC.js";
12
14
  import "../../chunk-APP75CBN.js";
13
15
  import "../../chunk-GHGJAQSJ.js";
14
16
  import "../../chunk-FMLHRJDF.js";
15
- import "../../chunk-EJYFE73S.js";
17
+ import "../../chunk-RNKHRNSG.js";
16
18
  import "../../chunk-PZ5AY32C.js";
17
19
  export {
18
20
  WarpGrepClient,
@@ -572,6 +572,7 @@ Details: ${res.stderr}` : ""}`
572
572
  // tools/warp_grep/gemini.ts
573
573
  var gemini_exports = {};
574
574
  __export(gemini_exports, {
575
+ createGitHubSearchTool: () => createGitHubSearchTool,
575
576
  createMorphWarpGrepTool: () => createMorphWarpGrepTool,
576
577
  createWarpGrepTool: () => createWarpGrepTool,
577
578
  default: () => gemini_default,
@@ -1379,7 +1380,7 @@ var import_openai = __toESM(require("openai"), 1);
1379
1380
  // package.json
1380
1381
  var package_default = {
1381
1382
  name: "@morphllm/morphsdk",
1382
- version: "0.2.121",
1383
+ version: "0.2.122",
1383
1384
  description: "TypeScript SDK and CLI for Morph Fast Apply integration",
1384
1385
  type: "module",
1385
1386
  main: "./dist/index.cjs",
@@ -1521,7 +1522,7 @@ var package_default = {
1521
1522
  "!dist/**/*.test.*"
1522
1523
  ],
1523
1524
  scripts: {
1524
- 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",
1525
+ 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",
1525
1526
  prepare: "npm run build",
1526
1527
  typecheck: "tsc --noEmit",
1527
1528
  lint: "eslint .",
@@ -1812,6 +1813,171 @@ async function runWarpGrep(config) {
1812
1813
  timings
1813
1814
  };
1814
1815
  }
1816
+ async function* runWarpGrepStreaming(config) {
1817
+ const totalStart = Date.now();
1818
+ const timeoutMs = config.timeout ?? AGENT_CONFIG.TIMEOUT_MS;
1819
+ const timings = { turns: [], timeout_ms: timeoutMs };
1820
+ const repoRoot = import_path2.default.resolve(config.repoRoot || process.cwd());
1821
+ const messages = [];
1822
+ messages.push({ role: "system", content: getSystemPrompt() });
1823
+ const initialStateStart = Date.now();
1824
+ const initialState = await buildInitialState(repoRoot, config.query, config.provider);
1825
+ timings.initial_state_ms = Date.now() - initialStateStart;
1826
+ messages.push({ role: "user", content: initialState });
1827
+ const maxTurns = AGENT_CONFIG.MAX_TURNS;
1828
+ const model = config.model || DEFAULT_MODEL;
1829
+ const provider = config.provider;
1830
+ const errors = [];
1831
+ let finishMeta;
1832
+ let terminationReason = "terminated";
1833
+ for (let turn = 1; turn <= maxTurns; turn += 1) {
1834
+ const turnMetrics = { turn, morph_api_ms: 0, local_tools_ms: 0 };
1835
+ enforceContextLimit(messages);
1836
+ const modelCallStart = Date.now();
1837
+ const assistantContent = await callModel(messages, model, {
1838
+ morphApiKey: config.morphApiKey,
1839
+ morphApiUrl: config.morphApiUrl,
1840
+ retryConfig: config.retryConfig,
1841
+ timeout: timeoutMs
1842
+ }).catch((e) => {
1843
+ const errMsg = e instanceof Error ? e.message : String(e);
1844
+ console.error(`[warp_grep:stream] Morph API call failed on turn ${turn}:`, errMsg);
1845
+ errors.push({ message: errMsg });
1846
+ return "";
1847
+ });
1848
+ turnMetrics.morph_api_ms = Date.now() - modelCallStart;
1849
+ if (!assistantContent) {
1850
+ console.error(`[warp_grep:stream] Empty response from Morph API on turn ${turn}. Errors so far:`, errors);
1851
+ timings.turns.push(turnMetrics);
1852
+ break;
1853
+ }
1854
+ messages.push({ role: "assistant", content: assistantContent });
1855
+ const toolCalls = parser.parse(assistantContent);
1856
+ if (toolCalls.length === 0) {
1857
+ console.error(`[warp_grep:stream] No tool calls parsed on turn ${turn}. Assistant content (first 500 chars):`, assistantContent.slice(0, 500));
1858
+ errors.push({ message: "No tool calls produced by the model. Your MCP is likely out of date! Update it by running: rm -rf ~/.npm/_npx && npm cache clean --force && npx -y @morphllm/morphmcp@latest" });
1859
+ terminationReason = "terminated";
1860
+ timings.turns.push(turnMetrics);
1861
+ break;
1862
+ }
1863
+ yield {
1864
+ turn,
1865
+ toolCalls: toolCalls.map((c) => ({
1866
+ name: c.name,
1867
+ arguments: c.arguments ?? {}
1868
+ }))
1869
+ };
1870
+ const finishCalls = toolCalls.filter((c) => c.name === "finish");
1871
+ const grepCalls = toolCalls.filter((c) => c.name === "grep");
1872
+ const listDirCalls = toolCalls.filter((c) => c.name === "list_directory");
1873
+ const readCalls = toolCalls.filter((c) => c.name === "read");
1874
+ const skipCalls = toolCalls.filter((c) => c.name === "_skip");
1875
+ const formatted = [];
1876
+ for (const c of skipCalls) {
1877
+ const msg = c.arguments?.message || "Command skipped due to parsing error";
1878
+ formatted.push(msg);
1879
+ }
1880
+ const allPromises = [];
1881
+ for (const c of grepCalls) {
1882
+ const args = c.arguments ?? {};
1883
+ allPromises.push(
1884
+ toolGrep(provider, args).then(
1885
+ ({ output }) => formatAgentToolOutput("grep", args, output, { isError: false }),
1886
+ (err) => formatAgentToolOutput("grep", args, String(err), { isError: true })
1887
+ )
1888
+ );
1889
+ }
1890
+ for (const c of listDirCalls) {
1891
+ const args = c.arguments ?? {};
1892
+ allPromises.push(
1893
+ toolListDirectory(provider, args).then(
1894
+ (p) => formatAgentToolOutput("list_directory", args, p, { isError: false }),
1895
+ (err) => formatAgentToolOutput("list_directory", args, String(err), { isError: true })
1896
+ )
1897
+ );
1898
+ }
1899
+ for (const c of readCalls) {
1900
+ const args = c.arguments ?? {};
1901
+ allPromises.push(
1902
+ toolRead(provider, args).then(
1903
+ (p) => formatAgentToolOutput("read", args, p, { isError: false }),
1904
+ (err) => formatAgentToolOutput("read", args, String(err), { isError: true })
1905
+ )
1906
+ );
1907
+ }
1908
+ const toolExecStart = Date.now();
1909
+ const allResults = await Promise.all(allPromises);
1910
+ turnMetrics.local_tools_ms = Date.now() - toolExecStart;
1911
+ for (const result of allResults) {
1912
+ formatted.push(result);
1913
+ }
1914
+ if (formatted.length > 0) {
1915
+ const turnMessage = formatTurnMessage(turn, maxTurns);
1916
+ const contextBudget = calculateContextBudget(messages);
1917
+ messages.push({ role: "user", content: formatted.join("\n") + turnMessage + "\n" + contextBudget });
1918
+ }
1919
+ timings.turns.push(turnMetrics);
1920
+ if (finishCalls.length) {
1921
+ const fc = finishCalls[0];
1922
+ const files = fc.arguments?.files ?? [];
1923
+ const textResult = fc.arguments?.textResult;
1924
+ finishMeta = { files };
1925
+ terminationReason = "completed";
1926
+ if (files.length === 0) {
1927
+ const payload2 = textResult || "No relevant code found.";
1928
+ timings.total_ms = Date.now() - totalStart;
1929
+ return {
1930
+ terminationReason: "completed",
1931
+ messages,
1932
+ finish: { payload: payload2, metadata: finishMeta },
1933
+ timings
1934
+ };
1935
+ }
1936
+ break;
1937
+ }
1938
+ }
1939
+ if (terminationReason !== "completed" || !finishMeta) {
1940
+ timings.total_ms = Date.now() - totalStart;
1941
+ return { terminationReason, messages, errors, timings };
1942
+ }
1943
+ const parts = ["Relevant context found:"];
1944
+ for (const f of finishMeta.files) {
1945
+ const ranges = f.lines === "*" ? "*" : Array.isArray(f.lines) ? f.lines.map(([s, e]) => `${s}-${e}`).join(", ") : "*";
1946
+ parts.push(`- ${f.path}: ${ranges}`);
1947
+ }
1948
+ const payload = parts.join("\n");
1949
+ const finishResolutionStart = Date.now();
1950
+ const fileReadErrors = [];
1951
+ const resolved = await readFinishFiles(
1952
+ repoRoot,
1953
+ finishMeta.files,
1954
+ async (p, s, e) => {
1955
+ try {
1956
+ const rr = await provider.read({ path: p, start: s, end: e });
1957
+ return rr.lines.map((l) => {
1958
+ const idx = l.indexOf("|");
1959
+ return idx >= 0 ? l.slice(idx + 1) : l;
1960
+ });
1961
+ } catch (err) {
1962
+ const errorMsg = err instanceof Error ? err.message : String(err);
1963
+ fileReadErrors.push({ path: p, error: errorMsg });
1964
+ console.error(`[warp_grep] Failed to read file: ${p} - ${errorMsg}`);
1965
+ return [`[couldn't find: ${p}]`];
1966
+ }
1967
+ }
1968
+ );
1969
+ timings.finish_resolution_ms = Date.now() - finishResolutionStart;
1970
+ if (fileReadErrors.length > 0) {
1971
+ errors.push(...fileReadErrors.map((e) => ({ message: `File read error: ${e.path} - ${e.error}` })));
1972
+ }
1973
+ timings.total_ms = Date.now() - totalStart;
1974
+ return {
1975
+ terminationReason: "completed",
1976
+ messages,
1977
+ finish: { payload, metadata: finishMeta, resolved },
1978
+ timings
1979
+ };
1980
+ }
1815
1981
 
1816
1982
  // tools/warp_grep/providers/remote.ts
1817
1983
  init_config();
@@ -1994,11 +2160,136 @@ var RemoteCommandsProvider = class {
1994
2160
  }
1995
2161
  };
1996
2162
 
2163
+ // tools/warp_grep/providers/code_storage_http.ts
2164
+ async function post(url, body, op) {
2165
+ const res = await fetch(url, {
2166
+ method: "POST",
2167
+ headers: { "Content-Type": "application/json" },
2168
+ body: JSON.stringify(body)
2169
+ });
2170
+ if (!res.ok) {
2171
+ const text = await res.text().catch(() => res.statusText);
2172
+ throw new Error(`${op} failed (${res.status}): ${text}`);
2173
+ }
2174
+ const data = await res.json();
2175
+ if (data.error) throw new Error(data.error);
2176
+ return data.stdout;
2177
+ }
2178
+ function createCodeStorageHttpCommands(config) {
2179
+ const { baseUrl, repoId, branch } = config;
2180
+ const encodedRepoId = encodeURIComponent(repoId);
2181
+ return {
2182
+ grep: (pattern, path5, glob) => post(`${baseUrl}/api/code-search/${encodedRepoId}/grep`, { pattern, path: path5, glob, branch }, "grep"),
2183
+ read: (path5, start, end) => post(`${baseUrl}/api/code-search/${encodedRepoId}/read`, { path: path5, start, end, branch }, "read"),
2184
+ listDir: (path5, maxDepth) => post(`${baseUrl}/api/code-search/${encodedRepoId}/list`, { path: path5, maxDepth, branch }, "list")
2185
+ };
2186
+ }
2187
+
2188
+ // tools/warp_grep/utils/github.ts
2189
+ function parseGitHubUrl(input) {
2190
+ input = input.trim();
2191
+ const urlPattern = /^(?:https?:\/\/)?github\.com\/([^\/]+)\/([^\/\?\#]+)/;
2192
+ const match = input.match(urlPattern);
2193
+ if (match) {
2194
+ return { owner: match[1], repo: match[2].replace(/\.git$/, "") };
2195
+ }
2196
+ const shortPattern = /^([^\/]+)\/([^\/]+)$/;
2197
+ const shortMatch = input.match(shortPattern);
2198
+ if (shortMatch && !shortMatch[1].includes(".")) {
2199
+ return { owner: shortMatch[1], repo: shortMatch[2].replace(/\.git$/, "") };
2200
+ }
2201
+ throw new Error(
2202
+ `Invalid GitHub URL or shorthand: "${input}". Expected "owner/repo" or "https://github.com/owner/repo"`
2203
+ );
2204
+ }
2205
+
1997
2206
  // tools/warp_grep/client.ts
2207
+ var DEFAULT_CODE_SEARCH_URL = "https://morphllm.com";
1998
2208
  async function getLocalProvider(repoRoot, excludes) {
1999
2209
  const { LocalRipgrepProvider: LocalRipgrepProvider2 } = await Promise.resolve().then(() => (init_local(), local_exports));
2000
2210
  return new LocalRipgrepProvider2(repoRoot, excludes);
2001
2211
  }
2212
+ var WarpGrepClient = class {
2213
+ config;
2214
+ constructor(config = {}) {
2215
+ this.config = { ...config };
2216
+ }
2217
+ execute(input) {
2218
+ const toolConfig = {
2219
+ repoRoot: input.repoRoot,
2220
+ remoteCommands: input.remoteCommands,
2221
+ provider: input.provider,
2222
+ excludes: input.excludes,
2223
+ includes: input.includes,
2224
+ debug: input.debug ?? this.config.debug,
2225
+ morphApiKey: this.config.morphApiKey,
2226
+ morphApiUrl: this.config.morphApiUrl,
2227
+ retryConfig: this.config.retryConfig,
2228
+ timeout: this.config.timeout
2229
+ };
2230
+ if (input.streamSteps) {
2231
+ return executeToolCallStreaming({ query: input.query }, toolConfig);
2232
+ }
2233
+ return executeToolCall({ query: input.query }, toolConfig);
2234
+ }
2235
+ searchGitHub(input) {
2236
+ if (input.streamSteps) {
2237
+ return this._searchGitHubStreaming(input);
2238
+ }
2239
+ return this._searchGitHubAsync(input);
2240
+ }
2241
+ async _resolveGitHubRepo(input) {
2242
+ const { owner, repo } = parseGitHubUrl(input.github);
2243
+ const baseUrl = this.config.codeSearchUrl || DEFAULT_CODE_SEARCH_URL;
2244
+ const importRes = await fetch(`${baseUrl}/api/code-search/get-or-create?url=${encodeURIComponent(`${owner}/${repo}`)}`);
2245
+ if (!importRes.ok) {
2246
+ const text = await importRes.text().catch(() => importRes.statusText);
2247
+ throw new Error(`Failed to import repo ${owner}/${repo}: ${text}`);
2248
+ }
2249
+ const { repoId, defaultBranch } = await importRes.json();
2250
+ return {
2251
+ repo,
2252
+ remoteCommands: createCodeStorageHttpCommands({ baseUrl, repoId, branch: input.branch || defaultBranch })
2253
+ };
2254
+ }
2255
+ async _searchGitHubAsync(input) {
2256
+ try {
2257
+ const { repo, remoteCommands } = await this._resolveGitHubRepo(input);
2258
+ return this.execute({
2259
+ query: input.query,
2260
+ repoRoot: repo,
2261
+ remoteCommands
2262
+ });
2263
+ } catch (error) {
2264
+ return { success: false, error: error instanceof Error ? error.message : String(error) };
2265
+ }
2266
+ }
2267
+ async *_searchGitHubStreaming(input) {
2268
+ let repo;
2269
+ let remoteCommands;
2270
+ try {
2271
+ ({ repo, remoteCommands } = await this._resolveGitHubRepo(input));
2272
+ } catch (error) {
2273
+ return { success: false, error: error instanceof Error ? error.message : String(error) };
2274
+ }
2275
+ const generator = this.execute({
2276
+ query: input.query,
2277
+ repoRoot: repo,
2278
+ remoteCommands,
2279
+ streamSteps: true
2280
+ });
2281
+ let result;
2282
+ for (; ; ) {
2283
+ const { value, done } = await generator.next();
2284
+ if (done) {
2285
+ result = value;
2286
+ break;
2287
+ }
2288
+ yield value;
2289
+ }
2290
+ return result;
2291
+ }
2292
+ };
2002
2293
  async function executeToolCall(input, config) {
2003
2294
  const parsed = typeof input === "string" ? JSON.parse(input) : input;
2004
2295
  const provider = config.remoteCommands ? new RemoteCommandsProvider(config.repoRoot, config.remoteCommands) : config.provider ?? await getLocalProvider(config.repoRoot, config.excludes);
@@ -2027,6 +2318,46 @@ async function executeToolCall(input, config) {
2027
2318
  }));
2028
2319
  return { success: true, contexts, summary: finish.payload };
2029
2320
  }
2321
+ function processAgentResult(result) {
2322
+ const finish = result.finish;
2323
+ if (result.terminationReason !== "completed" || !finish?.metadata) {
2324
+ const errorDetails = result.errors?.map((e) => e.message).join("; ") || "unknown reason";
2325
+ console.error(`[warp_grep] processAgentResult failed. Reason: ${result.terminationReason}. Errors: ${errorDetails}. Turns: ${result.timings?.turns?.length ?? 0}`);
2326
+ return { success: false, error: `Search did not complete: ${errorDetails}` };
2327
+ }
2328
+ const contexts = (finish.resolved ?? []).map((r) => ({
2329
+ file: r.path,
2330
+ content: r.content,
2331
+ lines: r.ranges
2332
+ }));
2333
+ return { success: true, contexts, summary: finish.payload };
2334
+ }
2335
+ async function* executeToolCallStreaming(input, config) {
2336
+ const parsed = typeof input === "string" ? JSON.parse(input) : input;
2337
+ const provider = config.remoteCommands ? new RemoteCommandsProvider(config.repoRoot, config.remoteCommands) : config.provider ?? await getLocalProvider(config.repoRoot, config.excludes);
2338
+ const generator = runWarpGrepStreaming({
2339
+ query: parsed.query,
2340
+ repoRoot: config.repoRoot,
2341
+ provider,
2342
+ excludes: config.excludes,
2343
+ includes: config.includes,
2344
+ debug: config.debug ?? false,
2345
+ morphApiKey: config.morphApiKey,
2346
+ morphApiUrl: config.morphApiUrl,
2347
+ retryConfig: config.retryConfig,
2348
+ timeout: config.timeout
2349
+ });
2350
+ let agentResult;
2351
+ for (; ; ) {
2352
+ const { value, done } = await generator.next();
2353
+ if (done) {
2354
+ agentResult = value;
2355
+ break;
2356
+ }
2357
+ yield value;
2358
+ }
2359
+ return processAgentResult(agentResult);
2360
+ }
2030
2361
  function formatResult(result) {
2031
2362
  if (!result.success) {
2032
2363
  return `Search failed: ${result.error}`;
@@ -2055,6 +2386,8 @@ function formatResult(result) {
2055
2386
  // tools/warp_grep/prompts.ts
2056
2387
  var WARP_GREP_TOOL_NAME = "warpgrep_codebase_search";
2057
2388
  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.';
2389
+ var GITHUB_SEARCH_TOOL_NAME = "warpgrep_github_search";
2390
+ var GITHUB_SEARCH_DESCRIPTION = "Search a public GitHub repository using WarpGrep. Provide a GitHub URL or owner/repo shorthand and a natural language query.";
2058
2391
 
2059
2392
  // tools/warp_grep/gemini.ts
2060
2393
  var TOOL_PARAMETERS = {
@@ -2094,9 +2427,38 @@ function createWarpGrepTool(config) {
2094
2427
  });
2095
2428
  }
2096
2429
  var createMorphWarpGrepTool = createWarpGrepTool;
2430
+ var GITHUB_SEARCH_PARAMETERS = {
2431
+ type: "OBJECT",
2432
+ properties: {
2433
+ query: { type: "STRING", description: "Natural language search query" },
2434
+ github: { type: "STRING", description: 'GitHub URL or "owner/repo" shorthand' },
2435
+ branch: { type: "STRING", description: "Branch to search (defaults to repo default branch)" }
2436
+ },
2437
+ required: ["query", "github"]
2438
+ };
2439
+ function createGitHubSearchTool(config) {
2440
+ const client = new WarpGrepClient(config);
2441
+ const declaration = {
2442
+ name: GITHUB_SEARCH_TOOL_NAME,
2443
+ description: GITHUB_SEARCH_DESCRIPTION,
2444
+ parameters: GITHUB_SEARCH_PARAMETERS
2445
+ };
2446
+ return Object.assign(declaration, {
2447
+ execute: async (input) => {
2448
+ return client.searchGitHub(input);
2449
+ },
2450
+ formatResult: (result) => {
2451
+ return formatResult(result);
2452
+ },
2453
+ getSystemPrompt: () => {
2454
+ return getSystemPrompt();
2455
+ }
2456
+ });
2457
+ }
2097
2458
  var gemini_default = warpGrepFunctionDeclaration;
2098
2459
  // Annotate the CommonJS export names for ESM import in node:
2099
2460
  0 && (module.exports = {
2461
+ createGitHubSearchTool,
2100
2462
  createMorphWarpGrepTool,
2101
2463
  createWarpGrepTool,
2102
2464
  execute,