@morphllm/morphsdk 0.2.81 → 0.2.83

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 (77) hide show
  1. package/dist/{chunk-4NI25AKV.js → chunk-4KMBU6T3.js} +2 -2
  2. package/dist/{chunk-XT5ZO6ES.js → chunk-5PNMAWLC.js} +8 -2
  3. package/dist/chunk-5PNMAWLC.js.map +1 -0
  4. package/dist/{chunk-X6A64F2F.js → chunk-HPR6BJA7.js} +5 -5
  5. package/dist/{chunk-4VMIPD4G.js → chunk-HRK53IKL.js} +8 -6
  6. package/dist/chunk-HRK53IKL.js.map +1 -0
  7. package/dist/{chunk-NTTQJM6O.js → chunk-LXG37353.js} +2 -2
  8. package/dist/{chunk-467MCW5R.js → chunk-P2O5JKE5.js} +2 -2
  9. package/dist/{chunk-PHJQ4N3T.js → chunk-PUGSTXLO.js} +2 -2
  10. package/dist/{chunk-B3UC7UVA.js → chunk-QOYI77CN.js} +30 -8
  11. package/dist/chunk-QOYI77CN.js.map +1 -0
  12. package/dist/{chunk-Z2HDXUH7.js → chunk-RL4JBZ3T.js} +2 -2
  13. package/dist/{chunk-OFMDENAQ.js → chunk-S27A4NQM.js} +2 -2
  14. package/dist/{client-CSINf0lQ.d.ts → client-CsO9LifG.d.ts} +1 -1
  15. package/dist/client.cjs +38 -8
  16. package/dist/client.cjs.map +1 -1
  17. package/dist/client.d.ts +2 -2
  18. package/dist/client.js +10 -10
  19. package/dist/index.cjs +38 -8
  20. package/dist/index.cjs.map +1 -1
  21. package/dist/index.d.ts +2 -2
  22. package/dist/index.js +10 -10
  23. package/dist/tools/warp_grep/agent/config.cjs +7 -1
  24. package/dist/tools/warp_grep/agent/config.cjs.map +1 -1
  25. package/dist/tools/warp_grep/agent/config.d.ts +1 -0
  26. package/dist/tools/warp_grep/agent/config.js +1 -1
  27. package/dist/tools/warp_grep/agent/runner.cjs +34 -6
  28. package/dist/tools/warp_grep/agent/runner.cjs.map +1 -1
  29. package/dist/tools/warp_grep/agent/runner.js +3 -3
  30. package/dist/tools/warp_grep/agent/types.cjs.map +1 -1
  31. package/dist/tools/warp_grep/agent/types.d.ts +16 -1
  32. package/dist/tools/warp_grep/anthropic.cjs +36 -7
  33. package/dist/tools/warp_grep/anthropic.cjs.map +1 -1
  34. package/dist/tools/warp_grep/anthropic.d.ts +1 -1
  35. package/dist/tools/warp_grep/anthropic.js +7 -7
  36. package/dist/tools/warp_grep/client.cjs +38 -8
  37. package/dist/tools/warp_grep/client.cjs.map +1 -1
  38. package/dist/tools/warp_grep/client.d.ts +1 -1
  39. package/dist/tools/warp_grep/client.js +6 -6
  40. package/dist/tools/warp_grep/gemini.cjs +36 -7
  41. package/dist/tools/warp_grep/gemini.cjs.map +1 -1
  42. package/dist/tools/warp_grep/gemini.d.ts +1 -1
  43. package/dist/tools/warp_grep/gemini.js +6 -6
  44. package/dist/tools/warp_grep/harness.cjs +7 -1
  45. package/dist/tools/warp_grep/harness.cjs.map +1 -1
  46. package/dist/tools/warp_grep/harness.js +3 -3
  47. package/dist/tools/warp_grep/index.cjs +38 -8
  48. package/dist/tools/warp_grep/index.cjs.map +1 -1
  49. package/dist/tools/warp_grep/index.d.ts +1 -1
  50. package/dist/tools/warp_grep/index.js +6 -6
  51. package/dist/tools/warp_grep/openai.cjs +36 -7
  52. package/dist/tools/warp_grep/openai.cjs.map +1 -1
  53. package/dist/tools/warp_grep/openai.d.ts +1 -1
  54. package/dist/tools/warp_grep/openai.js +7 -7
  55. package/dist/tools/warp_grep/providers/local.cjs +7 -1
  56. package/dist/tools/warp_grep/providers/local.cjs.map +1 -1
  57. package/dist/tools/warp_grep/providers/local.js +2 -2
  58. package/dist/tools/warp_grep/providers/remote.cjs +7 -1
  59. package/dist/tools/warp_grep/providers/remote.cjs.map +1 -1
  60. package/dist/tools/warp_grep/providers/remote.d.ts +1 -1
  61. package/dist/tools/warp_grep/providers/remote.js +2 -2
  62. package/dist/tools/warp_grep/vercel.cjs +36 -7
  63. package/dist/tools/warp_grep/vercel.cjs.map +1 -1
  64. package/dist/tools/warp_grep/vercel.d.ts +1 -1
  65. package/dist/tools/warp_grep/vercel.js +7 -7
  66. package/dist/{types-CnvVDM63.d.ts → types-Cv4LpqVl.d.ts} +2 -0
  67. package/package.json +1 -1
  68. package/dist/chunk-4VMIPD4G.js.map +0 -1
  69. package/dist/chunk-B3UC7UVA.js.map +0 -1
  70. package/dist/chunk-XT5ZO6ES.js.map +0 -1
  71. /package/dist/{chunk-4NI25AKV.js.map → chunk-4KMBU6T3.js.map} +0 -0
  72. /package/dist/{chunk-X6A64F2F.js.map → chunk-HPR6BJA7.js.map} +0 -0
  73. /package/dist/{chunk-NTTQJM6O.js.map → chunk-LXG37353.js.map} +0 -0
  74. /package/dist/{chunk-467MCW5R.js.map → chunk-P2O5JKE5.js.map} +0 -0
  75. /package/dist/{chunk-PHJQ4N3T.js.map → chunk-PUGSTXLO.js.map} +0 -0
  76. /package/dist/{chunk-Z2HDXUH7.js.map → chunk-RL4JBZ3T.js.map} +0 -0
  77. /package/dist/{chunk-OFMDENAQ.js.map → chunk-S27A4NQM.js.map} +0 -0
@@ -53,9 +53,15 @@ module.exports = __toCommonJS(warp_grep_exports);
53
53
  var import_zod = require("zod");
54
54
 
55
55
  // tools/warp_grep/agent/config.ts
56
+ var parseEnvTimeout = (envValue, defaultMs) => {
57
+ if (!envValue) return defaultMs;
58
+ const parsed = parseInt(envValue, 10);
59
+ return isNaN(parsed) || parsed <= 0 ? defaultMs : parsed;
60
+ };
56
61
  var AGENT_CONFIG = {
57
62
  MAX_TURNS: 4,
58
- TIMEOUT_MS: 3e4,
63
+ /** Default timeout for model calls. Can be overridden via MORPH_WARP_GREP_TIMEOUT env var (in ms) */
64
+ TIMEOUT_MS: parseEnvTimeout(process.env.MORPH_WARP_GREP_TIMEOUT, 3e4),
59
65
  MAX_CONTEXT_CHARS: 54e4,
60
66
  MAX_OUTPUT_LINES: 200,
61
67
  MAX_READ_LINES: 800,
@@ -1005,7 +1011,8 @@ async function callModel(messages, model, options = {}) {
1005
1011
  },
1006
1012
  options.retryConfig
1007
1013
  );
1008
- const resp = await withTimeout(fetchPromise, AGENT_CONFIG.TIMEOUT_MS, "morph-warp-grep request timed out");
1014
+ const timeoutMs = options.timeout ?? AGENT_CONFIG.TIMEOUT_MS;
1015
+ const resp = await withTimeout(fetchPromise, timeoutMs, "morph-warp-grep request timed out");
1009
1016
  if (!resp.ok) {
1010
1017
  if (resp.status === 404) {
1011
1018
  throw new Error(
@@ -1023,10 +1030,15 @@ async function callModel(messages, model, options = {}) {
1023
1030
  return content;
1024
1031
  }
1025
1032
  async function runWarpGrep(config) {
1033
+ const totalStart = Date.now();
1034
+ const timeoutMs = config.timeout ?? AGENT_CONFIG.TIMEOUT_MS;
1035
+ const timings = { turns: [], timeout_ms: timeoutMs };
1026
1036
  const repoRoot = import_path2.default.resolve(config.repoRoot || process.cwd());
1027
1037
  const messages = [];
1028
1038
  messages.push({ role: "system", content: getSystemPrompt() });
1039
+ const initialStateStart = Date.now();
1029
1040
  const initialState = await buildInitialState(repoRoot, config.query, config.provider);
1041
+ timings.initial_state_ms = Date.now() - initialStateStart;
1030
1042
  messages.push({ role: "user", content: initialState });
1031
1043
  const maxTurns = AGENT_CONFIG.MAX_TURNS;
1032
1044
  const model = config.model || DEFAULT_MODEL;
@@ -1035,21 +1047,29 @@ async function runWarpGrep(config) {
1035
1047
  let finishMeta;
1036
1048
  let terminationReason = "terminated";
1037
1049
  for (let turn = 1; turn <= maxTurns; turn += 1) {
1050
+ const turnMetrics = { turn, morph_api_ms: 0, local_tools_ms: 0 };
1038
1051
  enforceContextLimit(messages);
1052
+ const modelCallStart = Date.now();
1039
1053
  const assistantContent = await callModel(messages, model, {
1040
1054
  morphApiKey: config.morphApiKey,
1041
1055
  morphApiUrl: config.morphApiUrl,
1042
- retryConfig: config.retryConfig
1056
+ retryConfig: config.retryConfig,
1057
+ timeout: timeoutMs
1043
1058
  }).catch((e) => {
1044
1059
  errors.push({ message: e instanceof Error ? e.message : String(e) });
1045
1060
  return "";
1046
1061
  });
1047
- if (!assistantContent) break;
1062
+ turnMetrics.morph_api_ms = Date.now() - modelCallStart;
1063
+ if (!assistantContent) {
1064
+ timings.turns.push(turnMetrics);
1065
+ break;
1066
+ }
1048
1067
  messages.push({ role: "assistant", content: assistantContent });
1049
1068
  const toolCalls = parser.parse(assistantContent);
1050
1069
  if (toolCalls.length === 0) {
1051
1070
  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" });
1052
1071
  terminationReason = "terminated";
1072
+ timings.turns.push(turnMetrics);
1053
1073
  break;
1054
1074
  }
1055
1075
  const finishCalls = toolCalls.filter((c) => c.name === "finish");
@@ -1090,7 +1110,9 @@ async function runWarpGrep(config) {
1090
1110
  )
1091
1111
  );
1092
1112
  }
1113
+ const toolExecStart = Date.now();
1093
1114
  const allResults = await Promise.all(allPromises);
1115
+ turnMetrics.local_tools_ms = Date.now() - toolExecStart;
1094
1116
  for (const result of allResults) {
1095
1117
  formatted.push(result);
1096
1118
  }
@@ -1099,6 +1121,7 @@ async function runWarpGrep(config) {
1099
1121
  const contextBudget = calculateContextBudget(messages);
1100
1122
  messages.push({ role: "user", content: formatted.join("\n") + turnMessage + "\n" + contextBudget });
1101
1123
  }
1124
+ timings.turns.push(turnMetrics);
1102
1125
  if (finishCalls.length) {
1103
1126
  const fc = finishCalls[0];
1104
1127
  const files = fc.arguments?.files ?? [];
@@ -1108,7 +1131,8 @@ async function runWarpGrep(config) {
1108
1131
  }
1109
1132
  }
1110
1133
  if (terminationReason !== "completed" || !finishMeta) {
1111
- return { terminationReason, messages, errors };
1134
+ timings.total_ms = Date.now() - totalStart;
1135
+ return { terminationReason, messages, errors, timings };
1112
1136
  }
1113
1137
  const parts = ["Relevant context found:"];
1114
1138
  for (const f of finishMeta.files) {
@@ -1116,6 +1140,7 @@ async function runWarpGrep(config) {
1116
1140
  parts.push(`- ${f.path}: ${ranges}`);
1117
1141
  }
1118
1142
  const payload = parts.join("\n");
1143
+ const finishResolutionStart = Date.now();
1119
1144
  const fileReadErrors = [];
1120
1145
  const resolved = await readFinishFiles(
1121
1146
  repoRoot,
@@ -1135,13 +1160,16 @@ async function runWarpGrep(config) {
1135
1160
  }
1136
1161
  }
1137
1162
  );
1163
+ timings.finish_resolution_ms = Date.now() - finishResolutionStart;
1138
1164
  if (fileReadErrors.length > 0) {
1139
1165
  errors.push(...fileReadErrors.map((e) => ({ message: `File read error: ${e.path} - ${e.error}` })));
1140
1166
  }
1167
+ timings.total_ms = Date.now() - totalStart;
1141
1168
  return {
1142
1169
  terminationReason: "completed",
1143
1170
  messages,
1144
- finish: { payload, metadata: finishMeta, resolved }
1171
+ finish: { payload, metadata: finishMeta, resolved },
1172
+ timings
1145
1173
  };
1146
1174
  }
1147
1175
 
@@ -1770,7 +1798,8 @@ var WarpGrepClient = class {
1770
1798
  debug: input.debug ?? this.config.debug,
1771
1799
  morphApiKey: this.config.morphApiKey,
1772
1800
  morphApiUrl: this.config.morphApiUrl,
1773
- retryConfig: this.config.retryConfig
1801
+ retryConfig: this.config.retryConfig,
1802
+ timeout: this.config.timeout
1774
1803
  }
1775
1804
  );
1776
1805
  }
@@ -1791,7 +1820,8 @@ async function executeToolCall(input, config) {
1791
1820
  debug: config.debug ?? false,
1792
1821
  morphApiKey: config.morphApiKey,
1793
1822
  morphApiUrl: config.morphApiUrl,
1794
- retryConfig: config.retryConfig
1823
+ retryConfig: config.retryConfig,
1824
+ timeout: config.timeout
1795
1825
  });
1796
1826
  const finish = result.finish;
1797
1827
  if (result.terminationReason !== "completed" || !finish?.metadata) {