@mastra/core 1.5.0 → 1.6.0
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.
- package/CHANGELOG.md +386 -0
- package/dist/agent/index.cjs +13 -13
- package/dist/agent/index.js +2 -2
- package/dist/agent/message-list/adapters/AIV5Adapter.d.ts.map +1 -1
- package/dist/agent/message-list/conversion/output-converter.d.ts.map +1 -1
- package/dist/agent/message-list/index.cjs +18 -18
- package/dist/agent/message-list/index.js +1 -1
- package/dist/agent/workflows/prepare-stream/index.d.ts +7 -7
- package/dist/agent/workflows/prepare-stream/prepare-memory-step.d.ts +7 -7
- package/dist/agent/workflows/prepare-stream/schema.d.ts +11 -11
- package/dist/{chunk-CQ4Z6ZAV.cjs → chunk-3U3XFMGJ.cjs} +7 -7
- package/dist/{chunk-CQ4Z6ZAV.cjs.map → chunk-3U3XFMGJ.cjs.map} +1 -1
- package/dist/{chunk-D57U4II4.js → chunk-4WG5K4CK.js} +9 -8
- package/dist/chunk-4WG5K4CK.js.map +1 -0
- package/dist/{chunk-UZFGMMKU.js → chunk-5K45E5VE.js} +37 -3
- package/dist/chunk-5K45E5VE.js.map +1 -0
- package/dist/{chunk-OQ5LZ6OV.cjs → chunk-5VQPSWPG.cjs} +149 -61
- package/dist/chunk-5VQPSWPG.cjs.map +1 -0
- package/dist/{chunk-AIRMLZ43.js → chunk-7EXW4AAG.js} +4 -4
- package/dist/{chunk-AIRMLZ43.js.map → chunk-7EXW4AAG.js.map} +1 -1
- package/dist/{chunk-S4VVZI4E.cjs → chunk-AYHSPIT6.cjs} +326 -5
- package/dist/chunk-AYHSPIT6.cjs.map +1 -0
- package/dist/{chunk-YW54RH77.cjs → chunk-DB7U2C5B.cjs} +12 -5
- package/dist/chunk-DB7U2C5B.cjs.map +1 -0
- package/dist/{chunk-DST75PA4.js → chunk-DGS2KGDI.js} +4 -4
- package/dist/{chunk-DST75PA4.js.map → chunk-DGS2KGDI.js.map} +1 -1
- package/dist/{chunk-YIN5F7VO.js → chunk-EEU5NHHU.js} +4254 -3958
- package/dist/chunk-EEU5NHHU.js.map +1 -0
- package/dist/{chunk-A6EWCOGA.cjs → chunk-H5S4PS44.cjs} +197 -27
- package/dist/chunk-H5S4PS44.cjs.map +1 -0
- package/dist/{chunk-3YMDR4OL.cjs → chunk-HTAUP7ER.cjs} +4 -4
- package/dist/{chunk-3YMDR4OL.cjs.map → chunk-HTAUP7ER.cjs.map} +1 -1
- package/dist/{chunk-OHLVZVIK.js → chunk-IC5OUWKJ.js} +12 -5
- package/dist/chunk-IC5OUWKJ.js.map +1 -0
- package/dist/{chunk-MZIMV2BB.js → chunk-IHDE4CJV.js} +244 -213
- package/dist/chunk-IHDE4CJV.js.map +1 -0
- package/dist/{chunk-3KJW4EMO.js → chunk-IHEYJDJP.js} +3 -3
- package/dist/{chunk-3KJW4EMO.js.map → chunk-IHEYJDJP.js.map} +1 -1
- package/dist/{chunk-CXVMDV2B.js → chunk-IOY7Y5GV.js} +197 -27
- package/dist/chunk-IOY7Y5GV.js.map +1 -0
- package/dist/{chunk-MDC6VYA6.cjs → chunk-KAVAKMOQ.cjs} +4 -8
- package/dist/chunk-KAVAKMOQ.cjs.map +1 -0
- package/dist/{chunk-7WC7ALDW.cjs → chunk-LNKS4TJ6.cjs} +6 -6
- package/dist/{chunk-7WC7ALDW.cjs.map → chunk-LNKS4TJ6.cjs.map} +1 -1
- package/dist/{chunk-R3364RAL.js → chunk-MWGGSA5Q.js} +4 -4
- package/dist/{chunk-R3364RAL.js.map → chunk-MWGGSA5Q.js.map} +1 -1
- package/dist/{chunk-QSN5KQXZ.cjs → chunk-O7PZ4VOO.cjs} +11 -11
- package/dist/{chunk-QSN5KQXZ.cjs.map → chunk-O7PZ4VOO.cjs.map} +1 -1
- package/dist/chunk-OQDRPRKM.cjs +46 -0
- package/dist/chunk-OQDRPRKM.cjs.map +1 -0
- package/dist/{chunk-YV2YGQRY.js → chunk-RHKNKJNM.js} +101 -13
- package/dist/chunk-RHKNKJNM.js.map +1 -0
- package/dist/{chunk-TPDMP7OD.js → chunk-RHYZ6CQN.js} +4 -8
- package/dist/chunk-RHYZ6CQN.js.map +1 -0
- package/dist/{chunk-G5JVVFIG.cjs → chunk-RZNHRIM7.cjs} +9 -9
- package/dist/{chunk-G5JVVFIG.cjs.map → chunk-RZNHRIM7.cjs.map} +1 -1
- package/dist/{chunk-JZ6TH4HQ.cjs → chunk-TL2TTA4X.cjs} +4260 -3962
- package/dist/chunk-TL2TTA4X.cjs.map +1 -0
- package/dist/{chunk-KNXZ7KYL.cjs → chunk-TVPANHLE.cjs} +40 -2
- package/dist/chunk-TVPANHLE.cjs.map +1 -0
- package/dist/{chunk-7S6LA43E.cjs → chunk-VJWRJWSC.cjs} +278 -248
- package/dist/chunk-VJWRJWSC.cjs.map +1 -0
- package/dist/chunk-X2HAI3OX.js +39 -0
- package/dist/chunk-X2HAI3OX.js.map +1 -0
- package/dist/{chunk-FZ5DRHKE.js → chunk-XB3DA67Q.js} +325 -5
- package/dist/chunk-XB3DA67Q.js.map +1 -0
- package/dist/{chunk-NUV3BLRH.cjs → chunk-XWZAKKFT.cjs} +17 -16
- package/dist/chunk-XWZAKKFT.cjs.map +1 -0
- package/dist/{chunk-4GB2GS4S.js → chunk-YM6245EM.js} +5 -5
- package/dist/{chunk-4GB2GS4S.js.map → chunk-YM6245EM.js.map} +1 -1
- package/dist/datasets/index.cjs +17 -17
- package/dist/datasets/index.js +2 -2
- package/dist/docs/SKILL.md +2 -1
- package/dist/docs/assets/SOURCE_MAP.json +417 -391
- package/dist/docs/references/docs-memory-observational-memory.md +2 -0
- package/dist/docs/references/docs-streaming-tool-streaming.md +6 -0
- package/dist/docs/references/docs-workspace-filesystem.md +21 -1
- package/dist/docs/references/reference-harness-harness-class.md +645 -0
- package/dist/docs/references/reference-memory-memory-class.md +1 -1
- package/dist/docs/references/reference-memory-observational-memory.md +1 -0
- package/dist/docs/references/reference-workspace-local-filesystem.md +25 -0
- package/dist/docs/references/reference-workspace-workspace-class.md +1 -24
- package/dist/docs/references/reference.md +1 -0
- package/dist/editor/types.d.ts +20 -1
- package/dist/editor/types.d.ts.map +1 -1
- package/dist/evals/base.d.ts.map +1 -1
- package/dist/evals/index.cjs +20 -20
- package/dist/evals/index.js +3 -3
- package/dist/evals/scoreTraces/index.cjs +5 -5
- package/dist/evals/scoreTraces/index.js +2 -2
- package/dist/events/index.cjs +6 -2
- package/dist/events/index.d.ts +1 -0
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +1 -1
- package/dist/harness/harness.d.ts +105 -35
- package/dist/harness/harness.d.ts.map +1 -1
- package/dist/harness/index.cjs +472 -64
- package/dist/harness/index.cjs.map +1 -1
- package/dist/harness/index.d.ts +2 -1
- package/dist/harness/index.d.ts.map +1 -1
- package/dist/harness/index.js +468 -62
- package/dist/harness/index.js.map +1 -1
- package/dist/harness/tools.d.ts +38 -0
- package/dist/harness/tools.d.ts.map +1 -1
- package/dist/harness/types.d.ts +64 -9
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/index.cjs +2 -2
- package/dist/index.js +1 -1
- package/dist/llm/index.cjs +12 -12
- package/dist/llm/index.js +3 -3
- package/dist/llm/model/gateways/models-dev.d.ts.map +1 -1
- package/dist/loop/index.cjs +12 -12
- package/dist/loop/index.js +1 -1
- package/dist/loop/network/index.d.ts +6 -6
- package/dist/loop/network/index.d.ts.map +1 -1
- package/dist/loop/test-utils/options.d.ts.map +1 -1
- package/dist/loop/workflows/agentic-execution/index.d.ts +21 -21
- package/dist/loop/workflows/agentic-execution/llm-execution-step.d.ts +14 -14
- package/dist/loop/workflows/agentic-execution/llm-execution-step.d.ts.map +1 -1
- package/dist/loop/workflows/agentic-execution/llm-mapping-step.d.ts +7 -7
- package/dist/loop/workflows/agentic-execution/llm-mapping-step.d.ts.map +1 -1
- package/dist/loop/workflows/agentic-execution/tool-call-step.d.ts.map +1 -1
- package/dist/loop/workflows/agentic-loop/index.d.ts +21 -21
- package/dist/loop/workflows/agentic-loop/index.d.ts.map +1 -1
- package/dist/loop/workflows/schema.d.ts +30 -30
- package/dist/loop/workflows/stream.d.ts +0 -13
- package/dist/loop/workflows/stream.d.ts.map +1 -1
- package/dist/mastra/index.cjs +2 -2
- package/dist/mastra/index.js +1 -1
- package/dist/memory/index.cjs +14 -14
- package/dist/memory/index.js +1 -1
- package/dist/models-dev-6P4CM74H.js +3 -0
- package/dist/{models-dev-MDI5E2YA.js.map → models-dev-6P4CM74H.js.map} +1 -1
- package/dist/models-dev-CLLSNT5L.cjs +12 -0
- package/dist/{models-dev-BW2GAM3K.cjs.map → models-dev-CLLSNT5L.cjs.map} +1 -1
- package/dist/processor-provider/index.cjs +256 -0
- package/dist/processor-provider/index.cjs.map +1 -0
- package/dist/processor-provider/index.d.ts +5 -0
- package/dist/processor-provider/index.d.ts.map +1 -0
- package/dist/processor-provider/index.js +243 -0
- package/dist/processor-provider/index.js.map +1 -0
- package/dist/processor-provider/phase-filtered-processor.d.ts +22 -0
- package/dist/processor-provider/phase-filtered-processor.d.ts.map +1 -0
- package/dist/processor-provider/providers/index.d.ts +12 -0
- package/dist/processor-provider/providers/index.d.ts.map +1 -0
- package/dist/processor-provider/types.d.ts +65 -0
- package/dist/processor-provider/types.d.ts.map +1 -0
- package/dist/processors/index.cjs +41 -41
- package/dist/processors/index.js +1 -1
- package/dist/processors/memory/message-history.d.ts.map +1 -1
- package/dist/processors/step-schema.d.ts +14 -14
- package/dist/provider-registry-HMTFO5FV.cjs +40 -0
- package/dist/{provider-registry-4PH2JPIA.cjs.map → provider-registry-HMTFO5FV.cjs.map} +1 -1
- package/dist/provider-registry-TTZ2WN2P.js +3 -0
- package/dist/{provider-registry-VEJ3PN4S.js.map → provider-registry-TTZ2WN2P.js.map} +1 -1
- package/dist/relevance/index.cjs +3 -3
- package/dist/relevance/index.js +1 -1
- package/dist/storage/base.d.ts +2 -1
- package/dist/storage/base.d.ts.map +1 -1
- package/dist/storage/constants.cjs +68 -52
- package/dist/storage/constants.d.ts +6 -2
- package/dist/storage/constants.d.ts.map +1 -1
- package/dist/storage/constants.js +1 -1
- package/dist/storage/domains/index.d.ts +1 -0
- package/dist/storage/domains/index.d.ts.map +1 -1
- package/dist/storage/domains/inmemory-db.d.ts +4 -1
- package/dist/storage/domains/inmemory-db.d.ts.map +1 -1
- package/dist/storage/domains/mcp-servers/base.d.ts +47 -0
- package/dist/storage/domains/mcp-servers/base.d.ts.map +1 -0
- package/dist/storage/domains/mcp-servers/index.d.ts +3 -0
- package/dist/storage/domains/mcp-servers/index.d.ts.map +1 -0
- package/dist/storage/domains/mcp-servers/inmemory.d.ts +31 -0
- package/dist/storage/domains/mcp-servers/inmemory.d.ts.map +1 -0
- package/dist/storage/domains/memory/inmemory.d.ts.map +1 -1
- package/dist/storage/domains/observability/types.d.ts +44 -44
- package/dist/storage/domains/operations/inmemory.d.ts.map +1 -1
- package/dist/storage/index.cjs +178 -154
- package/dist/storage/index.js +2 -2
- package/dist/storage/mock.d.ts.map +1 -1
- package/dist/storage/types.d.ts +220 -6
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/stream/MastraAgentNetworkStream.d.ts +1 -1
- package/dist/stream/MastraWorkflowStream.d.ts +1 -1
- package/dist/stream/aisdk/v5/input.d.ts.map +1 -1
- package/dist/stream/base/input.d.ts +19 -0
- package/dist/stream/base/input.d.ts.map +1 -1
- package/dist/stream/base/output.d.ts.map +1 -1
- package/dist/stream/index.cjs +11 -11
- package/dist/stream/index.js +2 -2
- package/dist/tool-loop-agent/index.cjs +4 -4
- package/dist/tool-loop-agent/index.js +1 -1
- package/dist/vector/index.cjs +9 -9
- package/dist/vector/index.js +2 -2
- package/dist/workflows/evented/execution-engine.d.ts.map +1 -1
- package/dist/workflows/evented/index.cjs +10 -10
- package/dist/workflows/evented/index.js +1 -1
- package/dist/workflows/evented/step-executor.d.ts.map +1 -1
- package/dist/workflows/evented/workflow-event-processor/index.d.ts.map +1 -1
- package/dist/workflows/index.cjs +25 -25
- package/dist/workflows/index.js +1 -1
- package/dist/workflows/step.d.ts.map +1 -1
- package/dist/workspace/constants/index.d.ts +1 -0
- package/dist/workspace/constants/index.d.ts.map +1 -1
- package/dist/workspace/index.cjs +64 -64
- package/dist/workspace/index.js +1 -1
- package/dist/workspace/tools/ast-edit.d.ts +97 -0
- package/dist/workspace/tools/ast-edit.d.ts.map +1 -0
- package/dist/workspace/tools/search.d.ts +1 -1
- package/dist/workspace/tools/tools.d.ts.map +1 -1
- package/package.json +12 -11
- package/processor-provider.d.ts +1 -0
- package/dist/chunk-4D4KB75Y.cjs +0 -9
- package/dist/chunk-4D4KB75Y.cjs.map +0 -1
- package/dist/chunk-7S6LA43E.cjs.map +0 -1
- package/dist/chunk-A6EWCOGA.cjs.map +0 -1
- package/dist/chunk-BVUMKER5.js +0 -7
- package/dist/chunk-BVUMKER5.js.map +0 -1
- package/dist/chunk-CXVMDV2B.js.map +0 -1
- package/dist/chunk-D57U4II4.js.map +0 -1
- package/dist/chunk-FZ5DRHKE.js.map +0 -1
- package/dist/chunk-JZ6TH4HQ.cjs.map +0 -1
- package/dist/chunk-KNXZ7KYL.cjs.map +0 -1
- package/dist/chunk-MDC6VYA6.cjs.map +0 -1
- package/dist/chunk-MZIMV2BB.js.map +0 -1
- package/dist/chunk-NUV3BLRH.cjs.map +0 -1
- package/dist/chunk-OHLVZVIK.js.map +0 -1
- package/dist/chunk-OQ5LZ6OV.cjs.map +0 -1
- package/dist/chunk-S4VVZI4E.cjs.map +0 -1
- package/dist/chunk-TPDMP7OD.js.map +0 -1
- package/dist/chunk-UZFGMMKU.js.map +0 -1
- package/dist/chunk-YIN5F7VO.js.map +0 -1
- package/dist/chunk-YV2YGQRY.js.map +0 -1
- package/dist/chunk-YW54RH77.cjs.map +0 -1
- package/dist/models-dev-BW2GAM3K.cjs +0 -12
- package/dist/models-dev-MDI5E2YA.js +0 -3
- package/dist/provider-registry-4PH2JPIA.cjs +0 -40
- package/dist/provider-registry-VEJ3PN4S.js +0 -3
|
@@ -12,8 +12,10 @@ var crypto = require('crypto');
|
|
|
12
12
|
var matter = require('gray-matter');
|
|
13
13
|
var childProcess = require('child_process');
|
|
14
14
|
var os = require('os');
|
|
15
|
+
var module$1 = require('module');
|
|
15
16
|
var zod = require('zod');
|
|
16
17
|
|
|
18
|
+
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
17
19
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
18
20
|
|
|
19
21
|
function _interopNamespace(e) {
|
|
@@ -4774,7 +4776,8 @@ var WORKSPACE_TOOLS = {
|
|
|
4774
4776
|
DELETE: `${WORKSPACE_TOOLS_PREFIX}_delete`,
|
|
4775
4777
|
FILE_STAT: `${WORKSPACE_TOOLS_PREFIX}_file_stat`,
|
|
4776
4778
|
MKDIR: `${WORKSPACE_TOOLS_PREFIX}_mkdir`,
|
|
4777
|
-
GREP: `${WORKSPACE_TOOLS_PREFIX}_grep
|
|
4779
|
+
GREP: `${WORKSPACE_TOOLS_PREFIX}_grep`,
|
|
4780
|
+
AST_EDIT: `${WORKSPACE_TOOLS_PREFIX}_ast_edit`
|
|
4778
4781
|
},
|
|
4779
4782
|
SANDBOX: {
|
|
4780
4783
|
EXECUTE_COMMAND: `${WORKSPACE_TOOLS_PREFIX}_execute_command`
|
|
@@ -4816,7 +4819,318 @@ async function emitWorkspaceMetadata(context, toolName) {
|
|
|
4816
4819
|
});
|
|
4817
4820
|
}
|
|
4818
4821
|
|
|
4819
|
-
// src/workspace/tools/
|
|
4822
|
+
// src/workspace/tools/ast-edit.ts
|
|
4823
|
+
var astGrepModule;
|
|
4824
|
+
var loadingPromise;
|
|
4825
|
+
async function loadAstGrep() {
|
|
4826
|
+
if (astGrepModule !== void 0) {
|
|
4827
|
+
return astGrepModule;
|
|
4828
|
+
}
|
|
4829
|
+
if (!loadingPromise) {
|
|
4830
|
+
loadingPromise = (async () => {
|
|
4831
|
+
try {
|
|
4832
|
+
const moduleName = "@ast-grep/napi";
|
|
4833
|
+
const mod = await import(
|
|
4834
|
+
/* webpackIgnore: true */
|
|
4835
|
+
moduleName
|
|
4836
|
+
);
|
|
4837
|
+
astGrepModule = { parse: mod.parse, Lang: mod.Lang };
|
|
4838
|
+
return astGrepModule;
|
|
4839
|
+
} catch {
|
|
4840
|
+
astGrepModule = null;
|
|
4841
|
+
return null;
|
|
4842
|
+
}
|
|
4843
|
+
})();
|
|
4844
|
+
}
|
|
4845
|
+
return loadingPromise;
|
|
4846
|
+
}
|
|
4847
|
+
function isAstGrepAvailable() {
|
|
4848
|
+
if (astGrepModule !== void 0) {
|
|
4849
|
+
return astGrepModule !== null;
|
|
4850
|
+
}
|
|
4851
|
+
try {
|
|
4852
|
+
const req = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-AYHSPIT6.cjs', document.baseURI).href)));
|
|
4853
|
+
req.resolve("@ast-grep/napi");
|
|
4854
|
+
return true;
|
|
4855
|
+
} catch {
|
|
4856
|
+
return false;
|
|
4857
|
+
}
|
|
4858
|
+
}
|
|
4859
|
+
function getLanguageFromPath(filePath, Lang) {
|
|
4860
|
+
const ext = filePath.split(".").pop()?.toLowerCase();
|
|
4861
|
+
switch (ext) {
|
|
4862
|
+
case "ts":
|
|
4863
|
+
return Lang.TypeScript;
|
|
4864
|
+
case "tsx":
|
|
4865
|
+
case "jsx":
|
|
4866
|
+
return Lang.Tsx;
|
|
4867
|
+
case "js":
|
|
4868
|
+
return Lang.JavaScript;
|
|
4869
|
+
case "html":
|
|
4870
|
+
return Lang.Html;
|
|
4871
|
+
case "css":
|
|
4872
|
+
return Lang.Css;
|
|
4873
|
+
default:
|
|
4874
|
+
return null;
|
|
4875
|
+
}
|
|
4876
|
+
}
|
|
4877
|
+
function escapeRegex(str) {
|
|
4878
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
4879
|
+
}
|
|
4880
|
+
function renameIdentifiers(content, root, oldName, newName) {
|
|
4881
|
+
let modifiedContent = content;
|
|
4882
|
+
let count = 0;
|
|
4883
|
+
const identifiers = root.findAll({
|
|
4884
|
+
rule: {
|
|
4885
|
+
kind: "identifier",
|
|
4886
|
+
regex: `^${escapeRegex(oldName)}$`
|
|
4887
|
+
}
|
|
4888
|
+
});
|
|
4889
|
+
const replacements = [];
|
|
4890
|
+
const seen = /* @__PURE__ */ new Set();
|
|
4891
|
+
for (const id of identifiers) {
|
|
4892
|
+
const range = id.range();
|
|
4893
|
+
if (seen.has(range.start.index)) continue;
|
|
4894
|
+
seen.add(range.start.index);
|
|
4895
|
+
replacements.push({ start: range.start.index, end: range.end.index, text: newName });
|
|
4896
|
+
count++;
|
|
4897
|
+
}
|
|
4898
|
+
replacements.sort((a, b) => b.start - a.start);
|
|
4899
|
+
for (const { start, end, text } of replacements) {
|
|
4900
|
+
modifiedContent = modifiedContent.slice(0, start) + text + modifiedContent.slice(end);
|
|
4901
|
+
}
|
|
4902
|
+
return { content: modifiedContent, count };
|
|
4903
|
+
}
|
|
4904
|
+
function buildImportStatement(defaultName, namedImports, moduleStr) {
|
|
4905
|
+
if (defaultName && namedImports.length > 0) {
|
|
4906
|
+
return `import ${defaultName}, { ${namedImports.join(", ")} } from ${moduleStr};`;
|
|
4907
|
+
} else if (defaultName) {
|
|
4908
|
+
return `import ${defaultName} from ${moduleStr};`;
|
|
4909
|
+
} else {
|
|
4910
|
+
return `import { ${namedImports.join(", ")} } from ${moduleStr};`;
|
|
4911
|
+
}
|
|
4912
|
+
}
|
|
4913
|
+
function mergeIntoExistingImport(content, existingImport, names, isDefault) {
|
|
4914
|
+
const text = existingImport.text();
|
|
4915
|
+
if (/^import\s+\*\s+as\s+/.test(text)) return null;
|
|
4916
|
+
const defaultMatch = text.match(/^import\s+(?!type\s)(?!\{)(\w+)/);
|
|
4917
|
+
const namedMatch = text.match(/\{([^}]*)\}/);
|
|
4918
|
+
const moduleMatch = text.match(/(["'][^"']+["'])\s*;?\s*$/);
|
|
4919
|
+
if (!moduleMatch) return null;
|
|
4920
|
+
const moduleStr = moduleMatch[1] ?? "";
|
|
4921
|
+
let existingDefault = defaultMatch ? defaultMatch[1] ?? null : null;
|
|
4922
|
+
const existingNamed = namedMatch ? (namedMatch[1] ?? "").split(",").map((s) => s.trim()).filter(Boolean) : [];
|
|
4923
|
+
let newDefault = existingDefault;
|
|
4924
|
+
const newNamed = [...existingNamed];
|
|
4925
|
+
if (isDefault && names.length > 0) {
|
|
4926
|
+
if (!existingDefault) {
|
|
4927
|
+
newDefault = names[0] ?? null;
|
|
4928
|
+
}
|
|
4929
|
+
for (const name of names.slice(1)) {
|
|
4930
|
+
if (!newNamed.includes(name)) {
|
|
4931
|
+
newNamed.push(name);
|
|
4932
|
+
}
|
|
4933
|
+
}
|
|
4934
|
+
} else {
|
|
4935
|
+
for (const name of names) {
|
|
4936
|
+
if (!newNamed.includes(name)) {
|
|
4937
|
+
newNamed.push(name);
|
|
4938
|
+
}
|
|
4939
|
+
}
|
|
4940
|
+
}
|
|
4941
|
+
const defaultChanged = newDefault !== existingDefault;
|
|
4942
|
+
const namedChanged = newNamed.length !== existingNamed.length;
|
|
4943
|
+
if (!defaultChanged && !namedChanged) return null;
|
|
4944
|
+
const importStatement = buildImportStatement(newDefault, newNamed, moduleStr);
|
|
4945
|
+
const range = existingImport.range();
|
|
4946
|
+
return content.slice(0, range.start.index) + importStatement + content.slice(range.end.index);
|
|
4947
|
+
}
|
|
4948
|
+
function addImport(content, root, importSpec) {
|
|
4949
|
+
const { module, names, isDefault } = importSpec;
|
|
4950
|
+
const imports = root.findAll({ rule: { kind: "import_statement" } });
|
|
4951
|
+
const existingImport = imports.find((imp) => {
|
|
4952
|
+
const text = imp.text();
|
|
4953
|
+
if (/^import\s+type\s/.test(text)) return false;
|
|
4954
|
+
if (/^import\s+\*\s+as\s+/.test(text)) return false;
|
|
4955
|
+
return text.includes(`'${module}'`) || text.includes(`"${module}"`);
|
|
4956
|
+
});
|
|
4957
|
+
if (existingImport) {
|
|
4958
|
+
return mergeIntoExistingImport(content, existingImport, names, isDefault) ?? content;
|
|
4959
|
+
}
|
|
4960
|
+
const moduleStr = `'${module}'`;
|
|
4961
|
+
const importStatement = buildImportStatement(
|
|
4962
|
+
isDefault ? names[0] : null,
|
|
4963
|
+
isDefault ? names.slice(1) : names,
|
|
4964
|
+
moduleStr
|
|
4965
|
+
);
|
|
4966
|
+
const lastImport = imports.at(-1);
|
|
4967
|
+
if (lastImport) {
|
|
4968
|
+
const pos = lastImport.range().end.index;
|
|
4969
|
+
return content.slice(0, pos) + "\n" + importStatement + content.slice(pos);
|
|
4970
|
+
} else {
|
|
4971
|
+
return importStatement + "\n\n" + content;
|
|
4972
|
+
}
|
|
4973
|
+
}
|
|
4974
|
+
function removeImport(content, root, targetName) {
|
|
4975
|
+
const imports = root.findAll({ rule: { kind: "import_statement" } });
|
|
4976
|
+
for (const imp of imports) {
|
|
4977
|
+
const text = imp.text();
|
|
4978
|
+
if (text.includes(`'${targetName}'`) || text.includes(`"${targetName}"`)) {
|
|
4979
|
+
const range = imp.range();
|
|
4980
|
+
const start = range.start.index;
|
|
4981
|
+
let end = range.end.index;
|
|
4982
|
+
if (content[end] === "\n") end++;
|
|
4983
|
+
return content.slice(0, start) + content.slice(end);
|
|
4984
|
+
}
|
|
4985
|
+
}
|
|
4986
|
+
return content;
|
|
4987
|
+
}
|
|
4988
|
+
function patternReplace(content, root, pattern, replacement) {
|
|
4989
|
+
let modifiedContent = content;
|
|
4990
|
+
let count = 0;
|
|
4991
|
+
try {
|
|
4992
|
+
const matches = root.findAll({ rule: { pattern } });
|
|
4993
|
+
const replacements = [];
|
|
4994
|
+
const metaVars = [...pattern.matchAll(/\$(\w+)/g)].map((m) => m[1]).filter((v) => v !== void 0);
|
|
4995
|
+
for (const match of matches) {
|
|
4996
|
+
const range = match.range();
|
|
4997
|
+
let replacementText = replacement;
|
|
4998
|
+
for (const varName of metaVars) {
|
|
4999
|
+
const matchedNode = match.getMatch(varName);
|
|
5000
|
+
if (matchedNode) {
|
|
5001
|
+
replacementText = replacementText.replace(new RegExp(`\\$${varName}`, "g"), matchedNode.text());
|
|
5002
|
+
}
|
|
5003
|
+
}
|
|
5004
|
+
replacements.push({ start: range.start.index, end: range.end.index, text: replacementText });
|
|
5005
|
+
count++;
|
|
5006
|
+
}
|
|
5007
|
+
replacements.sort((a, b) => b.start - a.start);
|
|
5008
|
+
for (const { start, end, text } of replacements) {
|
|
5009
|
+
modifiedContent = modifiedContent.slice(0, start) + text + modifiedContent.slice(end);
|
|
5010
|
+
}
|
|
5011
|
+
} catch (err) {
|
|
5012
|
+
return {
|
|
5013
|
+
content: modifiedContent,
|
|
5014
|
+
count: 0,
|
|
5015
|
+
error: err instanceof Error ? err.message : "Pattern matching failed"
|
|
5016
|
+
};
|
|
5017
|
+
}
|
|
5018
|
+
return { content: modifiedContent, count };
|
|
5019
|
+
}
|
|
5020
|
+
var astEditTool = chunkEAZ6YDCQ_cjs.createTool({
|
|
5021
|
+
id: WORKSPACE_TOOLS.FILESYSTEM.AST_EDIT,
|
|
5022
|
+
description: `Edit code using AST-based analysis for intelligent transformations.
|
|
5023
|
+
|
|
5024
|
+
Use \`transform\` for structured operations (imports, renames). Use \`pattern\`/\`replacement\` only for general find-and-replace.
|
|
5025
|
+
|
|
5026
|
+
Transforms:
|
|
5027
|
+
- add-import: Add or merge imports. Skips duplicates. For default imports, put the default name first in \`names\`.
|
|
5028
|
+
{ transform: "add-import", importSpec: { module: "react", names: ["useState", "useEffect"] } }
|
|
5029
|
+
{ transform: "add-import", importSpec: { module: "express", names: ["express"], isDefault: true } }
|
|
5030
|
+
{ transform: "add-import", importSpec: { module: "express", names: ["express", "Router"], isDefault: true } } \u2192 import express, { Router } from 'express'
|
|
5031
|
+
- remove-import: Remove an import by module name.
|
|
5032
|
+
{ transform: "remove-import", targetName: "lodash" }
|
|
5033
|
+
- rename: Rename all occurrences of an identifier (not scope-aware).
|
|
5034
|
+
{ transform: "rename", targetName: "oldName", newName: "newName" }
|
|
5035
|
+
|
|
5036
|
+
Pattern replace (for everything else):
|
|
5037
|
+
{ pattern: "console.log($ARG)", replacement: "logger.debug($ARG)" }`,
|
|
5038
|
+
inputSchema: zod.z.object({
|
|
5039
|
+
path: zod.z.string().describe("The path to the file to edit"),
|
|
5040
|
+
pattern: zod.z.string().optional().describe('AST pattern to search for (supports $VARIABLE placeholders, e.g., "console.log($ARG)")'),
|
|
5041
|
+
replacement: zod.z.string().optional().describe('Replacement pattern (can use captured $VARIABLES, e.g., "logger.debug($ARG)")'),
|
|
5042
|
+
transform: zod.z.enum(["add-import", "remove-import", "rename"]).optional().describe("Structured transformation to apply"),
|
|
5043
|
+
targetName: zod.z.string().optional().describe("Required for remove-import and rename transforms. The current name to target."),
|
|
5044
|
+
newName: zod.z.string().optional().describe("Required for rename transform. The new name to replace targetName with."),
|
|
5045
|
+
importSpec: zod.z.object({
|
|
5046
|
+
module: zod.z.string().describe("Module to import from"),
|
|
5047
|
+
names: zod.z.array(zod.z.string()).min(1).describe("Names to import. For default imports, put the default name first."),
|
|
5048
|
+
isDefault: zod.z.boolean().optional().describe("Whether the first name is a default import")
|
|
5049
|
+
}).optional().describe("Required for add-import transform. Specifies the module and names to import.")
|
|
5050
|
+
}),
|
|
5051
|
+
execute: async ({ path: path4, pattern, replacement, transform, targetName, newName, importSpec }, context) => {
|
|
5052
|
+
const { filesystem } = requireFilesystem(context);
|
|
5053
|
+
await emitWorkspaceMetadata(context, WORKSPACE_TOOLS.FILESYSTEM.AST_EDIT);
|
|
5054
|
+
if (filesystem.readOnly) {
|
|
5055
|
+
throw new WorkspaceReadOnlyError("ast_edit");
|
|
5056
|
+
}
|
|
5057
|
+
const astGrep = await loadAstGrep();
|
|
5058
|
+
if (!astGrep) {
|
|
5059
|
+
return "@ast-grep/napi is not available. Install it to use AST editing.";
|
|
5060
|
+
}
|
|
5061
|
+
const { parse, Lang } = astGrep;
|
|
5062
|
+
let content;
|
|
5063
|
+
try {
|
|
5064
|
+
content = await filesystem.readFile(path4, { encoding: "utf-8" });
|
|
5065
|
+
} catch (error) {
|
|
5066
|
+
if (error instanceof FileNotFoundError) {
|
|
5067
|
+
return `File not found: ${path4}. Use ${WORKSPACE_TOOLS.FILESYSTEM.WRITE_FILE} to create it first.`;
|
|
5068
|
+
}
|
|
5069
|
+
throw error;
|
|
5070
|
+
}
|
|
5071
|
+
if (typeof content !== "string") {
|
|
5072
|
+
return `Cannot perform AST edits on binary files. Use ${WORKSPACE_TOOLS.FILESYSTEM.WRITE_FILE} instead.`;
|
|
5073
|
+
}
|
|
5074
|
+
const lang = getLanguageFromPath(path4, Lang);
|
|
5075
|
+
if (!lang) {
|
|
5076
|
+
return `Unsupported file type for AST editing: ${path4}`;
|
|
5077
|
+
}
|
|
5078
|
+
const ast = parse(lang, content);
|
|
5079
|
+
const root = ast.root();
|
|
5080
|
+
let modifiedContent = content;
|
|
5081
|
+
const changes = [];
|
|
5082
|
+
if (transform) {
|
|
5083
|
+
switch (transform) {
|
|
5084
|
+
case "add-import": {
|
|
5085
|
+
if (!importSpec) {
|
|
5086
|
+
return "Error: importSpec is required for add-import transform";
|
|
5087
|
+
}
|
|
5088
|
+
modifiedContent = addImport(content, root, importSpec);
|
|
5089
|
+
changes.push(`Added import from '${importSpec.module}'`);
|
|
5090
|
+
break;
|
|
5091
|
+
}
|
|
5092
|
+
case "remove-import": {
|
|
5093
|
+
if (!targetName) {
|
|
5094
|
+
return "Error: targetName is required for remove-import transform";
|
|
5095
|
+
}
|
|
5096
|
+
modifiedContent = removeImport(content, root, targetName);
|
|
5097
|
+
changes.push(`Removed import '${targetName}'`);
|
|
5098
|
+
break;
|
|
5099
|
+
}
|
|
5100
|
+
case "rename": {
|
|
5101
|
+
if (!targetName || !newName) {
|
|
5102
|
+
return "Error: targetName and newName are required for rename transform";
|
|
5103
|
+
}
|
|
5104
|
+
const renameResult = renameIdentifiers(content, root, targetName, newName);
|
|
5105
|
+
modifiedContent = renameResult.content;
|
|
5106
|
+
changes.push(`Renamed '${targetName}' to '${newName}' (${renameResult.count} occurrences)`);
|
|
5107
|
+
break;
|
|
5108
|
+
}
|
|
5109
|
+
}
|
|
5110
|
+
} else if (pattern && replacement !== void 0) {
|
|
5111
|
+
const result = patternReplace(content, root, pattern, replacement);
|
|
5112
|
+
if (result.error) {
|
|
5113
|
+
return `Error: AST pattern matching failed: ${result.error}`;
|
|
5114
|
+
}
|
|
5115
|
+
modifiedContent = result.content;
|
|
5116
|
+
changes.push(`Replaced ${result.count} occurrences of pattern`);
|
|
5117
|
+
} else if (pattern && replacement === void 0) {
|
|
5118
|
+
return "Error: replacement is required when pattern is provided";
|
|
5119
|
+
} else if (!pattern && replacement !== void 0) {
|
|
5120
|
+
return "Error: pattern is required when replacement is provided";
|
|
5121
|
+
} else {
|
|
5122
|
+
return "Error: Must provide either transform or pattern/replacement";
|
|
5123
|
+
}
|
|
5124
|
+
const wasModified = modifiedContent !== content;
|
|
5125
|
+
if (wasModified) {
|
|
5126
|
+
await filesystem.writeFile(path4, modifiedContent, { overwrite: true });
|
|
5127
|
+
}
|
|
5128
|
+
if (!wasModified) {
|
|
5129
|
+
return `No changes made to ${path4} (${changes.join("; ")})`;
|
|
5130
|
+
}
|
|
5131
|
+
return `${path4}: ${changes.join("; ")}`;
|
|
5132
|
+
}
|
|
5133
|
+
});
|
|
4820
5134
|
var deleteFileTool = chunkEAZ6YDCQ_cjs.createTool({
|
|
4821
5135
|
id: WORKSPACE_TOOLS.FILESYSTEM.DELETE,
|
|
4822
5136
|
description: "Delete a file or directory from the workspace filesystem",
|
|
@@ -5476,7 +5790,8 @@ function createWorkspaceTools(workspace) {
|
|
|
5476
5790
|
let readTracker;
|
|
5477
5791
|
const writeFileConfig = resolveToolConfig(toolsConfig, WORKSPACE_TOOLS.FILESYSTEM.WRITE_FILE);
|
|
5478
5792
|
const editFileConfig = resolveToolConfig(toolsConfig, WORKSPACE_TOOLS.FILESYSTEM.EDIT_FILE);
|
|
5479
|
-
|
|
5793
|
+
const astEditConfig = resolveToolConfig(toolsConfig, WORKSPACE_TOOLS.FILESYSTEM.AST_EDIT);
|
|
5794
|
+
if (writeFileConfig.requireReadBeforeWrite || editFileConfig.requireReadBeforeWrite || astEditConfig.requireReadBeforeWrite) {
|
|
5480
5795
|
readTracker = new InMemoryFileReadTracker();
|
|
5481
5796
|
}
|
|
5482
5797
|
const addTool = (name, tool, opts) => {
|
|
@@ -5504,6 +5819,12 @@ function createWorkspaceTools(workspace) {
|
|
|
5504
5819
|
addTool(WORKSPACE_TOOLS.FILESYSTEM.FILE_STAT, fileStatTool);
|
|
5505
5820
|
addTool(WORKSPACE_TOOLS.FILESYSTEM.MKDIR, mkdirTool, { requireWrite: true });
|
|
5506
5821
|
addTool(WORKSPACE_TOOLS.FILESYSTEM.GREP, grepTool);
|
|
5822
|
+
if (isAstGrepAvailable()) {
|
|
5823
|
+
addTool(WORKSPACE_TOOLS.FILESYSTEM.AST_EDIT, astEditTool, {
|
|
5824
|
+
requireWrite: true,
|
|
5825
|
+
readTrackerMode: "write"
|
|
5826
|
+
});
|
|
5827
|
+
}
|
|
5507
5828
|
}
|
|
5508
5829
|
if (workspace.canBM25 || workspace.canVector) {
|
|
5509
5830
|
addTool(WORKSPACE_TOOLS.SEARCH.SEARCH, searchTool);
|
|
@@ -5591,5 +5912,5 @@ exports.requireWorkspace = requireWorkspace;
|
|
|
5591
5912
|
exports.resolveToolConfig = resolveToolConfig;
|
|
5592
5913
|
exports.searchTool = searchTool;
|
|
5593
5914
|
exports.writeFileTool = writeFileTool;
|
|
5594
|
-
//# sourceMappingURL=chunk-
|
|
5595
|
-
//# sourceMappingURL=chunk-
|
|
5915
|
+
//# sourceMappingURL=chunk-AYHSPIT6.cjs.map
|
|
5916
|
+
//# sourceMappingURL=chunk-AYHSPIT6.cjs.map
|