@morphllm/morphsdk 0.2.162 → 0.2.164

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 (172) hide show
  1. package/dist/{chunk-OGMHU4PJ.js → chunk-3HVVQHHX.js} +9 -2
  2. package/dist/chunk-3HVVQHHX.js.map +1 -0
  3. package/dist/{chunk-JVKGSMEF.js → chunk-3NWJ74R4.js} +2 -2
  4. package/dist/{chunk-XUV5B27P.js → chunk-4DDD65QF.js} +2 -2
  5. package/dist/{chunk-DRTPCCEI.js → chunk-4FZXI4FI.js} +2 -2
  6. package/dist/chunk-5AM23TC7.js +42 -0
  7. package/dist/chunk-5AM23TC7.js.map +1 -0
  8. package/dist/{chunk-CNFHKQ42.js → chunk-BFNH475L.js} +2 -2
  9. package/dist/{chunk-ZG3YLRR5.js → chunk-CFCNSELX.js} +8 -2
  10. package/dist/chunk-CFCNSELX.js.map +1 -0
  11. package/dist/{chunk-NKUGRAYU.js → chunk-CRU3FQ54.js} +2 -2
  12. package/dist/{chunk-DXMNKPB6.js → chunk-DKPC5ZVX.js} +2 -2
  13. package/dist/{chunk-PWGBAVQ5.js → chunk-DVCIADH3.js} +2 -2
  14. package/dist/{chunk-LECHLXI4.js → chunk-EAIAZ2GD.js} +17 -6
  15. package/dist/chunk-EAIAZ2GD.js.map +1 -0
  16. package/dist/{chunk-4GQNYJBB.js → chunk-ECELX2KF.js} +9 -12
  17. package/dist/chunk-ECELX2KF.js.map +1 -0
  18. package/dist/{chunk-YRHM3RCQ.js → chunk-EPYCKNQ3.js} +2 -2
  19. package/dist/{chunk-OOE2TKKY.js → chunk-MRYULNMU.js} +12 -21
  20. package/dist/chunk-MRYULNMU.js.map +1 -0
  21. package/dist/{chunk-4U5JFT6X.js → chunk-MVMB6GBY.js} +33 -26
  22. package/dist/{chunk-4U5JFT6X.js.map → chunk-MVMB6GBY.js.map} +1 -1
  23. package/dist/{chunk-UKT3CKC7.js → chunk-N4SSQFYN.js} +2 -2
  24. package/dist/{chunk-7QMX45QD.js → chunk-NKFMGSUH.js} +33 -6
  25. package/dist/chunk-NKFMGSUH.js.map +1 -0
  26. package/dist/{chunk-LZQBVEY2.js → chunk-NMRQWMTH.js} +35 -27
  27. package/dist/chunk-NMRQWMTH.js.map +1 -0
  28. package/dist/{chunk-UVRC4LKZ.js → chunk-Q7XZ6JGW.js} +2 -2
  29. package/dist/{chunk-UZX7SY33.js → chunk-RR7P4SMP.js} +2 -2
  30. package/dist/{chunk-UETFIUIG.js → chunk-VCFUU5TL.js} +2 -2
  31. package/dist/{chunk-5XTA7GCY.js → chunk-VDMF4WWF.js} +2 -2
  32. package/dist/{chunk-YBKT2UOK.js → chunk-XULEBEBX.js} +2 -2
  33. package/dist/{chunk-Y4NYT5L6.js → chunk-YOF3N2EL.js} +11 -26
  34. package/dist/chunk-YOF3N2EL.js.map +1 -0
  35. package/dist/{chunk-4Q6VFODP.js → chunk-ZEEHRQYJ.js} +2 -2
  36. package/dist/{chunk-VQSLLYKE.js → chunk-ZEMLB2KV.js} +2 -2
  37. package/dist/client.cjs +185 -115
  38. package/dist/client.cjs.map +1 -1
  39. package/dist/client.d.ts +1 -1
  40. package/dist/client.js +25 -24
  41. package/dist/edge.cjs +83 -50
  42. package/dist/edge.cjs.map +1 -1
  43. package/dist/edge.js +5 -4
  44. package/dist/index.cjs +187 -115
  45. package/dist/index.cjs.map +1 -1
  46. package/dist/index.d.ts +1 -1
  47. package/dist/index.js +29 -28
  48. package/dist/modelrouter/core.cjs +51 -25
  49. package/dist/modelrouter/core.cjs.map +1 -1
  50. package/dist/modelrouter/core.js +4 -3
  51. package/dist/modelrouter/index.cjs +51 -25
  52. package/dist/modelrouter/index.cjs.map +1 -1
  53. package/dist/modelrouter/index.js +4 -3
  54. package/dist/subagents/anthropic.cjs +86 -12
  55. package/dist/subagents/anthropic.cjs.map +1 -1
  56. package/dist/subagents/anthropic.js +5 -4
  57. package/dist/subagents/vercel.cjs +86 -12
  58. package/dist/subagents/vercel.cjs.map +1 -1
  59. package/dist/subagents/vercel.js +5 -4
  60. package/dist/tools/browser/anthropic.cjs +48 -9
  61. package/dist/tools/browser/anthropic.cjs.map +1 -1
  62. package/dist/tools/browser/anthropic.js +6 -5
  63. package/dist/tools/browser/core.cjs +51 -19
  64. package/dist/tools/browser/core.cjs.map +1 -1
  65. package/dist/tools/browser/core.js +5 -4
  66. package/dist/tools/browser/index.cjs +51 -19
  67. package/dist/tools/browser/index.cjs.map +1 -1
  68. package/dist/tools/browser/index.js +10 -9
  69. package/dist/tools/browser/index.js.map +1 -1
  70. package/dist/tools/browser/openai.cjs +48 -9
  71. package/dist/tools/browser/openai.cjs.map +1 -1
  72. package/dist/tools/browser/openai.js +6 -5
  73. package/dist/tools/browser/profiles/core.cjs +7 -1
  74. package/dist/tools/browser/profiles/core.cjs.map +1 -1
  75. package/dist/tools/browser/profiles/core.js +3 -3
  76. package/dist/tools/browser/profiles/index.cjs +7 -1
  77. package/dist/tools/browser/profiles/index.cjs.map +1 -1
  78. package/dist/tools/browser/profiles/index.js +3 -3
  79. package/dist/tools/browser/vercel.cjs +48 -9
  80. package/dist/tools/browser/vercel.cjs.map +1 -1
  81. package/dist/tools/browser/vercel.js +6 -5
  82. package/dist/tools/codebase_search/anthropic.cjs +49 -11
  83. package/dist/tools/codebase_search/anthropic.cjs.map +1 -1
  84. package/dist/tools/codebase_search/anthropic.js +5 -4
  85. package/dist/tools/codebase_search/core.cjs +49 -11
  86. package/dist/tools/codebase_search/core.cjs.map +1 -1
  87. package/dist/tools/codebase_search/core.js +4 -3
  88. package/dist/tools/codebase_search/index.cjs +49 -11
  89. package/dist/tools/codebase_search/index.cjs.map +1 -1
  90. package/dist/tools/codebase_search/index.js +9 -8
  91. package/dist/tools/codebase_search/openai.cjs +49 -11
  92. package/dist/tools/codebase_search/openai.cjs.map +1 -1
  93. package/dist/tools/codebase_search/openai.js +5 -4
  94. package/dist/tools/codebase_search/vercel.cjs +49 -11
  95. package/dist/tools/codebase_search/vercel.cjs.map +1 -1
  96. package/dist/tools/codebase_search/vercel.js +5 -4
  97. package/dist/tools/fastapply/anthropic.cjs +95 -31
  98. package/dist/tools/fastapply/anthropic.cjs.map +1 -1
  99. package/dist/tools/fastapply/anthropic.js +5 -4
  100. package/dist/tools/fastapply/apply.cjs +75 -26
  101. package/dist/tools/fastapply/apply.cjs.map +1 -1
  102. package/dist/tools/fastapply/apply.js +3 -2
  103. package/dist/tools/fastapply/core.cjs +95 -31
  104. package/dist/tools/fastapply/core.cjs.map +1 -1
  105. package/dist/tools/fastapply/core.js +4 -3
  106. package/dist/tools/fastapply/index.cjs +95 -31
  107. package/dist/tools/fastapply/index.cjs.map +1 -1
  108. package/dist/tools/fastapply/index.js +9 -8
  109. package/dist/tools/fastapply/openai.cjs +95 -31
  110. package/dist/tools/fastapply/openai.cjs.map +1 -1
  111. package/dist/tools/fastapply/openai.js +5 -4
  112. package/dist/tools/fastapply/vercel.cjs +95 -31
  113. package/dist/tools/fastapply/vercel.cjs.map +1 -1
  114. package/dist/tools/fastapply/vercel.js +5 -4
  115. package/dist/tools/index.cjs +95 -31
  116. package/dist/tools/index.cjs.map +1 -1
  117. package/dist/tools/index.js +9 -8
  118. package/dist/tools/utils/resilience.cjs +7 -1
  119. package/dist/tools/utils/resilience.cjs.map +1 -1
  120. package/dist/tools/utils/resilience.js +2 -2
  121. package/dist/tools/warp_grep/agent/runner.cjs +75 -5
  122. package/dist/tools/warp_grep/agent/runner.cjs.map +1 -1
  123. package/dist/tools/warp_grep/agent/runner.js +3 -2
  124. package/dist/tools/warp_grep/anthropic.cjs +86 -12
  125. package/dist/tools/warp_grep/anthropic.cjs.map +1 -1
  126. package/dist/tools/warp_grep/anthropic.js +5 -4
  127. package/dist/tools/warp_grep/client.cjs +86 -12
  128. package/dist/tools/warp_grep/client.cjs.map +1 -1
  129. package/dist/tools/warp_grep/client.js +4 -3
  130. package/dist/tools/warp_grep/gemini.cjs +86 -12
  131. package/dist/tools/warp_grep/gemini.cjs.map +1 -1
  132. package/dist/tools/warp_grep/gemini.js +4 -3
  133. package/dist/tools/warp_grep/gemini.js.map +1 -1
  134. package/dist/tools/warp_grep/index.cjs +86 -12
  135. package/dist/tools/warp_grep/index.cjs.map +1 -1
  136. package/dist/tools/warp_grep/index.js +4 -3
  137. package/dist/tools/warp_grep/openai.cjs +86 -12
  138. package/dist/tools/warp_grep/openai.cjs.map +1 -1
  139. package/dist/tools/warp_grep/openai.js +5 -4
  140. package/dist/tools/warp_grep/vercel.cjs +86 -12
  141. package/dist/tools/warp_grep/vercel.cjs.map +1 -1
  142. package/dist/tools/warp_grep/vercel.d.ts +1 -1
  143. package/dist/tools/warp_grep/vercel.js +5 -4
  144. package/dist/version.cjs +7 -1
  145. package/dist/version.cjs.map +1 -1
  146. package/dist/version.js +1 -1
  147. package/package.json +7 -1
  148. package/dist/chunk-4GQNYJBB.js.map +0 -1
  149. package/dist/chunk-7QMX45QD.js.map +0 -1
  150. package/dist/chunk-LECHLXI4.js.map +0 -1
  151. package/dist/chunk-LZQBVEY2.js.map +0 -1
  152. package/dist/chunk-OGMHU4PJ.js.map +0 -1
  153. package/dist/chunk-OOE2TKKY.js.map +0 -1
  154. package/dist/chunk-Y4NYT5L6.js.map +0 -1
  155. package/dist/chunk-ZG3YLRR5.js.map +0 -1
  156. package/dist/{chunk-JVKGSMEF.js.map → chunk-3NWJ74R4.js.map} +0 -0
  157. package/dist/{chunk-XUV5B27P.js.map → chunk-4DDD65QF.js.map} +0 -0
  158. package/dist/{chunk-DRTPCCEI.js.map → chunk-4FZXI4FI.js.map} +0 -0
  159. package/dist/{chunk-CNFHKQ42.js.map → chunk-BFNH475L.js.map} +0 -0
  160. package/dist/{chunk-NKUGRAYU.js.map → chunk-CRU3FQ54.js.map} +0 -0
  161. package/dist/{chunk-DXMNKPB6.js.map → chunk-DKPC5ZVX.js.map} +0 -0
  162. package/dist/{chunk-PWGBAVQ5.js.map → chunk-DVCIADH3.js.map} +0 -0
  163. package/dist/{chunk-YRHM3RCQ.js.map → chunk-EPYCKNQ3.js.map} +0 -0
  164. package/dist/{chunk-UKT3CKC7.js.map → chunk-N4SSQFYN.js.map} +0 -0
  165. package/dist/{chunk-UVRC4LKZ.js.map → chunk-Q7XZ6JGW.js.map} +0 -0
  166. package/dist/{chunk-UZX7SY33.js.map → chunk-RR7P4SMP.js.map} +0 -0
  167. package/dist/{chunk-UETFIUIG.js.map → chunk-VCFUU5TL.js.map} +0 -0
  168. package/dist/{chunk-5XTA7GCY.js.map → chunk-VDMF4WWF.js.map} +0 -0
  169. package/dist/{chunk-YBKT2UOK.js.map → chunk-XULEBEBX.js.map} +0 -0
  170. package/dist/{chunk-4Q6VFODP.js.map → chunk-ZEEHRQYJ.js.map} +0 -0
  171. package/dist/{chunk-VQSLLYKE.js.map → chunk-ZEMLB2KV.js.map} +0 -0
  172. package/dist/{client-PkB7g9SA.d.ts → client-DsAAqupx.d.ts} +1 -1
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  createExploreSubagent
3
- } from "../chunk-5XTA7GCY.js";
4
- import "../chunk-OGMHU4PJ.js";
3
+ } from "../chunk-VDMF4WWF.js";
4
+ import "../chunk-3HVVQHHX.js";
5
5
  import "../chunk-63VHBANJ.js";
6
- import "../chunk-7QMX45QD.js";
6
+ import "../chunk-NKFMGSUH.js";
7
7
  import "../chunk-GVGJIXV2.js";
8
8
  import "../chunk-B3AKP3RA.js";
9
9
  import "../chunk-VNAGVCSP.js";
@@ -12,7 +12,8 @@ import "../chunk-I3J46TSB.js";
12
12
  import "../chunk-GLQWEINZ.js";
13
13
  import "../chunk-ZZ25FZG2.js";
14
14
  import "../chunk-SCVWDNQP.js";
15
- import "../chunk-ZG3YLRR5.js";
15
+ import "../chunk-5AM23TC7.js";
16
+ import "../chunk-CFCNSELX.js";
16
17
  import "../chunk-PZ5AY32C.js";
17
18
  export {
18
19
  createExploreSubagent
@@ -220,7 +220,7 @@ function toRepoRelative(repoRoot, absPath) {
220
220
  }
221
221
  function isSymlink(p) {
222
222
  try {
223
- const st = import_fs.default.lstatSync(p);
223
+ const st = import_fs2.default.lstatSync(p);
224
224
  return st.isSymbolicLink();
225
225
  } catch {
226
226
  return false;
@@ -243,13 +243,13 @@ function fixPathRepetition(fullPath) {
243
243
  }
244
244
  function isTextualFile(filePath, maxBytes = 2e6) {
245
245
  try {
246
- const st = import_fs.default.statSync(filePath);
246
+ const st = import_fs2.default.statSync(filePath);
247
247
  if (!st.isFile()) return false;
248
248
  if (st.size > maxBytes) return false;
249
- const fd = import_fs.default.openSync(filePath, "r");
249
+ const fd = import_fs2.default.openSync(filePath, "r");
250
250
  const buf = Buffer.alloc(512);
251
- const read = import_fs.default.readSync(fd, buf, 0, buf.length, 0);
252
- import_fs.default.closeSync(fd);
251
+ const read = import_fs2.default.readSync(fd, buf, 0, buf.length, 0);
252
+ import_fs2.default.closeSync(fd);
253
253
  for (let i = 0; i < read; i++) {
254
254
  const c = buf[i];
255
255
  if (c === 0) return false;
@@ -259,11 +259,11 @@ function isTextualFile(filePath, maxBytes = 2e6) {
259
259
  return false;
260
260
  }
261
261
  }
262
- var import_fs, import_path4;
262
+ var import_fs2, import_path4;
263
263
  var init_paths = __esm({
264
264
  "tools/warp_grep/utils/paths.ts"() {
265
265
  "use strict";
266
- import_fs = __toESM(require("fs"), 1);
266
+ import_fs2 = __toESM(require("fs"), 1);
267
267
  import_path4 = __toESM(require("path"), 1);
268
268
  }
269
269
  });
@@ -936,7 +936,7 @@ var import_openai = __toESM(require("openai"), 1);
936
936
  // package.json
937
937
  var package_default = {
938
938
  name: "@morphllm/morphsdk",
939
- version: "0.2.162",
939
+ version: "0.2.164",
940
940
  description: "TypeScript SDK and CLI for Morph Fast Apply integration",
941
941
  type: "module",
942
942
  main: "./dist/index.cjs",
@@ -948,6 +948,11 @@ var package_default = {
948
948
  import: "./dist/index.js",
949
949
  require: "./dist/index.cjs"
950
950
  },
951
+ "./logger": {
952
+ types: "./dist/logger.d.ts",
953
+ import: "./dist/logger.js",
954
+ require: "./dist/logger.cjs"
955
+ },
951
956
  "./edge": {
952
957
  types: "./dist/edge.d.ts",
953
958
  import: "./dist/edge.js",
@@ -1106,6 +1111,7 @@ var package_default = {
1106
1111
  "test:browser": "vitest run browser",
1107
1112
  "test:agent": "npx tsx tests/fullAgentTest.ts",
1108
1113
  "test:integration": "npx tsx tests/fullIntegrationTest.ts",
1114
+ "test:e2e": "vitest run --config vitest.e2e.config.ts",
1109
1115
  "release:patch": "npm version patch && npm publish",
1110
1116
  "release:minor": "npm version minor && npm publish",
1111
1117
  "release:major": "npm version major && npm publish"
@@ -1176,6 +1182,46 @@ var SDK_VERSION = package_default.version;
1176
1182
 
1177
1183
  // tools/warp_grep/agent/runner.ts
1178
1184
  var import_path3 = __toESM(require("path"), 1);
1185
+
1186
+ // logger.ts
1187
+ var import_fs = require("fs");
1188
+ var MorphLogger = class {
1189
+ enabled;
1190
+ fileStream;
1191
+ constructor() {
1192
+ this.enabled = process.env.MORPH_DEBUG === "1" || !!process.env.MORPH_LOG_FILE;
1193
+ const f = process.env.MORPH_LOG_FILE;
1194
+ this.fileStream = f ? (0, import_fs.createWriteStream)(f, { flags: "a" }) : null;
1195
+ }
1196
+ debug(component, msg, data) {
1197
+ this._log("debug", component, msg, data);
1198
+ }
1199
+ info(component, msg, data) {
1200
+ this._log("info", component, msg, data);
1201
+ }
1202
+ warn(component, msg, data) {
1203
+ this._log("warn", component, msg, data);
1204
+ }
1205
+ error(component, msg, data) {
1206
+ this._log("error", component, msg, data);
1207
+ }
1208
+ enable() {
1209
+ this.enabled = true;
1210
+ }
1211
+ get isEnabled() {
1212
+ return this.enabled;
1213
+ }
1214
+ _log(level, component, msg, data) {
1215
+ if (level !== "error" && !this.enabled) return;
1216
+ const ts = (/* @__PURE__ */ new Date()).toISOString();
1217
+ const prefix = `[${ts}] [${level.toUpperCase()}] [${component}]`;
1218
+ console.error(data ? `${prefix} ${msg} ${JSON.stringify(data)}` : `${prefix} ${msg}`);
1219
+ this.fileStream?.write(JSON.stringify({ ts, level, component, msg, ...data && { data } }) + "\n");
1220
+ }
1221
+ };
1222
+ var logger = new MorphLogger();
1223
+
1224
+ // tools/warp_grep/agent/runner.ts
1179
1225
  var DEFAULT_API_URL = "https://api.morphllm.com";
1180
1226
  var TOOL_SPECS = [
1181
1227
  {
@@ -1298,6 +1344,8 @@ async function callModel(messages, model, options = {}) {
1298
1344
  defaultHeaders: { "X-Morph-SDK-Version": SDK_VERSION }
1299
1345
  });
1300
1346
  const MAX_EMPTY_RETRIES = 1;
1347
+ logger.debug("WarpGrep", "model_call", { url: baseURL, model, message_count: messages.length });
1348
+ const callStartTime = Date.now();
1301
1349
  for (let attempt = 0; attempt <= MAX_EMPTY_RETRIES; attempt++) {
1302
1350
  let data;
1303
1351
  try {
@@ -1310,10 +1358,16 @@ async function callModel(messages, model, options = {}) {
1310
1358
  ...options.search_type ? { search_type: options.search_type } : {}
1311
1359
  });
1312
1360
  } catch (error) {
1313
- if (error instanceof import_openai.default.APIError && error.status === 404) {
1314
- 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";
1315
- const errorText = error.message?.trim();
1316
- throw new Error(errorText || defaultMsg);
1361
+ const callLatencyMs = Date.now() - callStartTime;
1362
+ if (error instanceof import_openai.default.APIError) {
1363
+ logger.error("WarpGrep", "model_call_error", { status: error.status, error: error.message, latency_ms: callLatencyMs });
1364
+ if (error.status === 404) {
1365
+ 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";
1366
+ const errorText = error.message?.trim();
1367
+ throw new Error(errorText || defaultMsg);
1368
+ }
1369
+ } else {
1370
+ logger.error("WarpGrep", "model_call_error", { status: void 0, error: error instanceof Error ? error.message : String(error), latency_ms: callLatencyMs });
1317
1371
  }
1318
1372
  throw error;
1319
1373
  }
@@ -1332,6 +1386,7 @@ async function callModel(messages, model, options = {}) {
1332
1386
  function: { name: tc.function.name, arguments: tc.function.arguments }
1333
1387
  }));
1334
1388
  if (message.content || toolCalls.length > 0) {
1389
+ logger.debug("WarpGrep", "model_call_complete", { latency_ms: Date.now() - callStartTime, tool_calls_count: toolCalls.length, finish_reason: choice?.finish_reason ?? "unknown" });
1335
1390
  return { content: message.content ?? null, tool_calls: toolCalls };
1336
1391
  }
1337
1392
  if (attempt === MAX_EMPTY_RETRIES) {
@@ -1402,9 +1457,11 @@ async function* runWarpGrepStreaming(config) {
1402
1457
  const model = config.model || DEFAULT_MODEL;
1403
1458
  const messages = [];
1404
1459
  const maxTurns = AGENT_CONFIG.MAX_TURNS;
1460
+ logger.debug("WarpGrep", "session_start", { search_term: config.searchTerm, model, max_turns: maxTurns });
1405
1461
  const initialStateStart = Date.now();
1406
1462
  const initialState = await buildInitialState(repoRoot, config.searchTerm, config.provider, { search_type: config.search_type });
1407
1463
  timings.initial_state_ms = Date.now() - initialStateStart;
1464
+ logger.debug("WarpGrep", "initial_state", { system_prompt_len: initialState.length, user_message_len: initialState.length });
1408
1465
  messages.push({ role: "user", content: initialState });
1409
1466
  const provider = config.provider;
1410
1467
  const errors = [];
@@ -1412,7 +1469,13 @@ async function* runWarpGrepStreaming(config) {
1412
1469
  let terminationReason = "terminated";
1413
1470
  for (let turn = 1; turn <= maxTurns; turn += 1) {
1414
1471
  const turnMetrics = { turn, morph_api_ms: 0, local_tools_ms: 0 };
1472
+ logger.debug("WarpGrep", "turn_start", { turn, message_count: messages.length });
1473
+ const beforeChars = messages.reduce((sum, m) => sum + (typeof m.content === "string" ? m.content.length : 0), 0);
1415
1474
  enforceContextLimit(messages);
1475
+ const afterChars = messages.reduce((sum, m) => sum + (typeof m.content === "string" ? m.content.length : 0), 0);
1476
+ if (afterChars < beforeChars) {
1477
+ logger.debug("WarpGrep", "context_truncated", { before_chars: beforeChars, after_chars: afterChars });
1478
+ }
1416
1479
  const modelCallStart = Date.now();
1417
1480
  const response = await callModel(messages, model, {
1418
1481
  morphApiKey: config.morphApiKey,
@@ -1423,6 +1486,7 @@ async function* runWarpGrepStreaming(config) {
1423
1486
  }).catch((e) => {
1424
1487
  const errMsg = e instanceof Error ? e.message : String(e);
1425
1488
  console.error(`[warp_grep] Morph API call failed on turn ${turn}:`, errMsg);
1489
+ logger.error("WarpGrep", "error", { turn, error: errMsg, phase: "model_call" });
1426
1490
  errors.push({ message: errMsg });
1427
1491
  return null;
1428
1492
  });
@@ -1432,6 +1496,7 @@ async function* runWarpGrepStreaming(config) {
1432
1496
  break;
1433
1497
  }
1434
1498
  const toolCalls = response.tool_calls;
1499
+ logger.debug("WarpGrep", "model_response", { turn, tool_calls: toolCalls.map((tc) => tc.function.name), latency_ms: turnMetrics.morph_api_ms });
1435
1500
  messages.push({
1436
1501
  role: "assistant",
1437
1502
  content: response.content,
@@ -1458,6 +1523,7 @@ async function* runWarpGrepStreaming(config) {
1458
1523
  const files = parseFinishFiles(filesStr);
1459
1524
  finishMeta = { files };
1460
1525
  terminationReason = "completed";
1526
+ logger.debug("WarpGrep", "finish", { turns: turn, files: files.map((f) => f.path) });
1461
1527
  if (files.length === 0) {
1462
1528
  const payload2 = filesStr || "No relevant code found.";
1463
1529
  timings.turns.push(turnMetrics);
@@ -1476,7 +1542,11 @@ async function* runWarpGrepStreaming(config) {
1476
1542
  const results = await Promise.all(
1477
1543
  toolCalls.map(async (tc) => {
1478
1544
  const args = safeParseJSON(tc.function.arguments);
1545
+ const argsSummary = Object.fromEntries(Object.entries(args).map(([k, v]) => [k, typeof v === "string" && v.length > 100 ? v.slice(0, 100) + "..." : v]));
1546
+ logger.debug("WarpGrep", "tool_exec", { turn, tool: tc.function.name, args_summary: argsSummary });
1547
+ const toolStart = Date.now();
1479
1548
  const output = await executeTool(provider, tc.function.name, args, repoRoot).catch((err) => String(err));
1549
+ logger.debug("WarpGrep", "tool_result", { turn, tool: tc.function.name, result_len: output.length, latency_ms: Date.now() - toolStart });
1480
1550
  return { tool_call_id: tc.id, content: output };
1481
1551
  })
1482
1552
  );
@@ -1984,12 +2054,16 @@ var WarpGrepClient = class {
1984
2054
  async _resolveGitHubRepo(input) {
1985
2055
  const { owner, repo } = parseGitHubUrl(input.github);
1986
2056
  const baseUrl = this.config.codeSearchUrl || DEFAULT_CODE_SEARCH_URL;
2057
+ logger.debug("WarpGrep", "github_resolve", { owner_repo: `${owner}/${repo}`, branch: input.branch });
2058
+ const resolveStart = Date.now();
1987
2059
  const importRes = await fetch(`${baseUrl}/api/code-search/get-or-create?url=${encodeURIComponent(`${owner}/${repo}`)}`);
1988
2060
  if (!importRes.ok) {
1989
2061
  const text = await importRes.text().catch(() => importRes.statusText);
2062
+ logger.error("WarpGrep", "github_resolve_failed", { owner_repo: `${owner}/${repo}`, status: importRes.status, error: text });
1990
2063
  throw new Error(`Failed to import repo ${owner}/${repo}: ${text}`);
1991
2064
  }
1992
2065
  const { repoId, defaultBranch } = await importRes.json();
2066
+ logger.debug("WarpGrep", "github_repo_fetched", { repo_id: repoId, default_branch: defaultBranch, latency_ms: Date.now() - resolveStart });
1993
2067
  return {
1994
2068
  repo,
1995
2069
  remoteCommands: createCodeStorageHttpCommands({ baseUrl, repoId, branch: input.branch || defaultBranch })