@probelabs/visor 0.1.143 → 0.1.144

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 (65) hide show
  1. package/dist/index.js +189 -24
  2. package/dist/output/traces/{run-2026-02-25T06-11-39-869Z.ndjson → run-2026-02-25T17-29-59-894Z.ndjson} +84 -84
  3. package/dist/{traces/run-2026-02-25T06-12-27-651Z.ndjson → output/traces/run-2026-02-25T17-30-47-149Z.ndjson} +1092 -1092
  4. package/dist/sdk/{check-provider-registry-HDMOOQ3J.mjs → check-provider-registry-GKLK3I2X.mjs} +5 -5
  5. package/dist/sdk/{check-provider-registry-QCE7HDRY.mjs → check-provider-registry-VTNNTMWC.mjs} +5 -5
  6. package/dist/sdk/{check-provider-registry-3GYSI2H3.mjs → check-provider-registry-WBEOZCGW.mjs} +5 -5
  7. package/dist/sdk/{chunk-5X6TLBDA.mjs → chunk-CLQTOZKH.mjs} +3 -3
  8. package/dist/sdk/{chunk-6ZVR3WHW.mjs → chunk-D3UC5KUJ.mjs} +14 -14
  9. package/dist/sdk/{chunk-HBPGNGES.mjs → chunk-FG6THKK7.mjs} +3 -3
  10. package/dist/sdk/{chunk-HBPGNGES.mjs.map → chunk-FG6THKK7.mjs.map} +1 -1
  11. package/dist/sdk/{chunk-MIVULWHE.mjs → chunk-N7LW3Q5B.mjs} +14 -14
  12. package/dist/sdk/{chunk-RUQBSUTM.mjs → chunk-O7WE6HCA.mjs} +2 -2
  13. package/dist/sdk/{chunk-RUQBSUTM.mjs.map → chunk-O7WE6HCA.mjs.map} +1 -1
  14. package/dist/sdk/{chunk-XAOA6CQY.mjs → chunk-PES5G5RR.mjs} +3 -3
  15. package/dist/sdk/{chunk-TPJWUDMJ.mjs → chunk-PQWAAGUP.mjs} +2 -2
  16. package/dist/sdk/{chunk-HHQFJTPJ.mjs → chunk-PXWWPPNF.mjs} +14 -14
  17. package/dist/sdk/{chunk-TML27TJH.mjs → chunk-XHIXKNUF.mjs} +2 -2
  18. package/dist/sdk/{failure-condition-evaluator-TK26KQRA.mjs → failure-condition-evaluator-2BJHKTMX.mjs} +3 -3
  19. package/dist/sdk/{failure-condition-evaluator-G3YW5TG6.mjs → failure-condition-evaluator-LWH3NQ2S.mjs} +3 -3
  20. package/dist/sdk/{github-frontend-HOPD4TAR.mjs → github-frontend-ICKRZ4VV.mjs} +3 -3
  21. package/dist/sdk/{github-frontend-VFKREBO3.mjs → github-frontend-UUASYGNV.mjs} +3 -3
  22. package/dist/sdk/{host-AYYUK7CA.mjs → host-CVJ3VG5Y.mjs} +2 -2
  23. package/dist/sdk/{host-LCKHX2EN.mjs → host-LAF3NFPZ.mjs} +2 -2
  24. package/dist/sdk/{routing-GDVV3MT6.mjs → routing-3XDRYU3Z.mjs} +4 -4
  25. package/dist/sdk/{routing-ZNIYEVS3.mjs → routing-LEUV6A4K.mjs} +4 -4
  26. package/dist/sdk/{schedule-tool-handler-MIVCDCJO.mjs → schedule-tool-handler-7RGTKO24.mjs} +5 -5
  27. package/dist/sdk/{schedule-tool-handler-QC7CAK55.mjs → schedule-tool-handler-EYDCUGOB.mjs} +5 -5
  28. package/dist/sdk/{schedule-tool-handler-646OMXGP.mjs → schedule-tool-handler-W7IB4MK3.mjs} +5 -5
  29. package/dist/sdk/sdk.js +2 -2
  30. package/dist/sdk/sdk.js.map +1 -1
  31. package/dist/sdk/sdk.mjs +4 -4
  32. package/dist/sdk/{trace-helpers-HP3LKMTS.mjs → trace-helpers-NNBQNFWZ.mjs} +2 -2
  33. package/dist/sdk/{trace-helpers-PGKN5L72.mjs → trace-helpers-VUUP6ILH.mjs} +2 -2
  34. package/dist/sdk/{workflow-check-provider-HG5LNVBC.mjs → workflow-check-provider-2G2CEXFR.mjs} +5 -5
  35. package/dist/sdk/{workflow-check-provider-MLRZ5EHG.mjs → workflow-check-provider-FLBIJQ4Z.mjs} +5 -5
  36. package/dist/sdk/{workflow-check-provider-4CTBJWK5.mjs → workflow-check-provider-WW5U6R2P.mjs} +5 -5
  37. package/dist/traces/{run-2026-02-25T06-11-39-869Z.ndjson → run-2026-02-25T17-29-59-894Z.ndjson} +84 -84
  38. package/dist/{output/traces/run-2026-02-25T06-12-27-651Z.ndjson → traces/run-2026-02-25T17-30-47-149Z.ndjson} +1092 -1092
  39. package/package.json +2 -2
  40. /package/dist/sdk/{check-provider-registry-3GYSI2H3.mjs.map → check-provider-registry-GKLK3I2X.mjs.map} +0 -0
  41. /package/dist/sdk/{check-provider-registry-HDMOOQ3J.mjs.map → check-provider-registry-VTNNTMWC.mjs.map} +0 -0
  42. /package/dist/sdk/{check-provider-registry-QCE7HDRY.mjs.map → check-provider-registry-WBEOZCGW.mjs.map} +0 -0
  43. /package/dist/sdk/{chunk-5X6TLBDA.mjs.map → chunk-CLQTOZKH.mjs.map} +0 -0
  44. /package/dist/sdk/{chunk-6ZVR3WHW.mjs.map → chunk-D3UC5KUJ.mjs.map} +0 -0
  45. /package/dist/sdk/{chunk-MIVULWHE.mjs.map → chunk-N7LW3Q5B.mjs.map} +0 -0
  46. /package/dist/sdk/{chunk-XAOA6CQY.mjs.map → chunk-PES5G5RR.mjs.map} +0 -0
  47. /package/dist/sdk/{chunk-TML27TJH.mjs.map → chunk-PQWAAGUP.mjs.map} +0 -0
  48. /package/dist/sdk/{chunk-HHQFJTPJ.mjs.map → chunk-PXWWPPNF.mjs.map} +0 -0
  49. /package/dist/sdk/{chunk-TPJWUDMJ.mjs.map → chunk-XHIXKNUF.mjs.map} +0 -0
  50. /package/dist/sdk/{failure-condition-evaluator-G3YW5TG6.mjs.map → failure-condition-evaluator-2BJHKTMX.mjs.map} +0 -0
  51. /package/dist/sdk/{failure-condition-evaluator-TK26KQRA.mjs.map → failure-condition-evaluator-LWH3NQ2S.mjs.map} +0 -0
  52. /package/dist/sdk/{github-frontend-HOPD4TAR.mjs.map → github-frontend-ICKRZ4VV.mjs.map} +0 -0
  53. /package/dist/sdk/{github-frontend-VFKREBO3.mjs.map → github-frontend-UUASYGNV.mjs.map} +0 -0
  54. /package/dist/sdk/{host-AYYUK7CA.mjs.map → host-CVJ3VG5Y.mjs.map} +0 -0
  55. /package/dist/sdk/{host-LCKHX2EN.mjs.map → host-LAF3NFPZ.mjs.map} +0 -0
  56. /package/dist/sdk/{routing-GDVV3MT6.mjs.map → routing-3XDRYU3Z.mjs.map} +0 -0
  57. /package/dist/sdk/{routing-ZNIYEVS3.mjs.map → routing-LEUV6A4K.mjs.map} +0 -0
  58. /package/dist/sdk/{schedule-tool-handler-646OMXGP.mjs.map → schedule-tool-handler-7RGTKO24.mjs.map} +0 -0
  59. /package/dist/sdk/{schedule-tool-handler-MIVCDCJO.mjs.map → schedule-tool-handler-EYDCUGOB.mjs.map} +0 -0
  60. /package/dist/sdk/{schedule-tool-handler-QC7CAK55.mjs.map → schedule-tool-handler-W7IB4MK3.mjs.map} +0 -0
  61. /package/dist/sdk/{trace-helpers-HP3LKMTS.mjs.map → trace-helpers-NNBQNFWZ.mjs.map} +0 -0
  62. /package/dist/sdk/{trace-helpers-PGKN5L72.mjs.map → trace-helpers-VUUP6ILH.mjs.map} +0 -0
  63. /package/dist/sdk/{workflow-check-provider-4CTBJWK5.mjs.map → workflow-check-provider-2G2CEXFR.mjs.map} +0 -0
  64. /package/dist/sdk/{workflow-check-provider-HG5LNVBC.mjs.map → workflow-check-provider-FLBIJQ4Z.mjs.map} +0 -0
  65. /package/dist/sdk/{workflow-check-provider-MLRZ5EHG.mjs.map → workflow-check-provider-WW5U6R2P.mjs.map} +0 -0
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
- process.env.VISOR_VERSION = '0.1.143';
3
- process.env.PROBE_VERSION = '0.6.0-rc258';
4
- process.env.VISOR_COMMIT_SHA = '4d0e1eabc24bbbe4732548e61303df3ce5f1be74';
5
- process.env.VISOR_COMMIT_SHORT = '4d0e1ea';
2
+ process.env.VISOR_VERSION = '0.1.144';
3
+ process.env.PROBE_VERSION = '0.6.0-rc259';
4
+ process.env.VISOR_COMMIT_SHA = '0f8df6f53e18e9ad94507e1761debabaf533c0df';
5
+ process.env.VISOR_COMMIT_SHORT = '0f8df6f';
6
6
  /******/ (() => { // webpackBootstrap
7
7
  /******/ var __webpack_modules__ = ({
8
8
 
@@ -280396,7 +280396,7 @@ async function handleLineEdit({ resolvedPath: resolvedPath2, file_path, start_li
280396
280396
  return buildLineEditResponse(file_path, startLine, endLine, newLines.length, fileLines, startLine - 1, action, modifications);
280397
280397
  }
280398
280398
  }
280399
- var import_ai, import_fs4, import_path5, import_fs5, editTool, createTool, editSchema, createSchema, editDescription, createDescription, editToolDefinition, createToolDefinition;
280399
+ var import_ai, import_fs4, import_path5, import_fs5, editTool, createTool, multiEditTool, editSchema, createSchema, multiEditSchema, editDescription, createDescription, multiEditDescription, editToolDefinition, createToolDefinition, multiEditToolDefinition;
280400
280400
  var init_edit = __esm({
280401
280401
  "src/tools/edit.js"() {
280402
280402
  "use strict";
@@ -280470,7 +280470,7 @@ Parameters:
280470
280470
  },
280471
280471
  required: ["file_path", "new_string"]
280472
280472
  },
280473
- execute: async ({ file_path, old_string, new_string, replace_all = false, symbol: symbol15, position, start_line, end_line }) => {
280473
+ execute: async ({ file_path, old_string, new_string, replace_all = false, symbol: symbol15, position, start_line, end_line, workingDirectory }) => {
280474
280474
  try {
280475
280475
  if (!file_path || typeof file_path !== "string" || file_path.trim() === "") {
280476
280476
  return `Error editing file: Invalid file_path - must be a non-empty string. Provide an absolute path or a path relative to the working directory (e.g. "src/main.js").`;
@@ -280478,7 +280478,8 @@ Parameters:
280478
280478
  if (new_string === void 0 || new_string === null || typeof new_string !== "string") {
280479
280479
  return `Error editing file: Invalid new_string - must be a string. Provide the replacement content as a string value (empty string "" is valid for deletions).`;
280480
280480
  }
280481
- const resolvedPath2 = (0, import_path5.isAbsolute)(file_path) ? file_path : (0, import_path5.resolve)(cwd || process.cwd(), file_path);
280481
+ const effectiveCwd = workingDirectory || cwd || process.cwd();
280482
+ const resolvedPath2 = (0, import_path5.isAbsolute)(file_path) ? file_path : (0, import_path5.resolve)(effectiveCwd, file_path);
280482
280483
  if (debug) {
280483
280484
  console.error(`[Edit] Attempting to edit file: ${resolvedPath2}`);
280484
280485
  }
@@ -280585,7 +280586,7 @@ Important:
280585
280586
  },
280586
280587
  required: ["file_path", "content"]
280587
280588
  },
280588
- execute: async ({ file_path, content, overwrite = false }) => {
280589
+ execute: async ({ file_path, content, overwrite = false, workingDirectory }) => {
280589
280590
  try {
280590
280591
  if (!file_path || typeof file_path !== "string" || file_path.trim() === "") {
280591
280592
  return `Error creating file: Invalid file_path - must be a non-empty string. Provide an absolute path or a path relative to the working directory (e.g. "src/newFile.js").`;
@@ -280593,7 +280594,8 @@ Important:
280593
280594
  if (content === void 0 || content === null || typeof content !== "string") {
280594
280595
  return `Error creating file: Invalid content - must be a string. Provide the file content as a string value (empty string "" is valid for an empty file).`;
280595
280596
  }
280596
- const resolvedPath2 = (0, import_path5.isAbsolute)(file_path) ? file_path : (0, import_path5.resolve)(cwd || process.cwd(), file_path);
280597
+ const effectiveCwd = workingDirectory || cwd || process.cwd();
280598
+ const resolvedPath2 = (0, import_path5.isAbsolute)(file_path) ? file_path : (0, import_path5.resolve)(effectiveCwd, file_path);
280597
280599
  if (debug) {
280598
280600
  console.error(`[Create] Attempting to create file: ${resolvedPath2}`);
280599
280601
  }
@@ -280622,6 +280624,70 @@ Important:
280622
280624
  }
280623
280625
  });
280624
280626
  };
280627
+ multiEditTool = (options = {}) => {
280628
+ const editInstance = editTool(options);
280629
+ return (0, import_ai.tool)({
280630
+ name: "multi_edit",
280631
+ description: "Apply multiple file edits in a single tool call. Accepts a JSON array of edit operations.",
280632
+ inputSchema: {
280633
+ type: "object",
280634
+ properties: {
280635
+ edits: {
280636
+ type: "string",
280637
+ description: "JSON array of edit operations. Each object supports: file_path, old_string, new_string, replace_all, symbol, position, start_line, end_line."
280638
+ }
280639
+ },
280640
+ required: ["edits"]
280641
+ },
280642
+ execute: async ({ edits: rawEdits }) => {
280643
+ let edits;
280644
+ if (typeof rawEdits === "string") {
280645
+ try {
280646
+ edits = JSON.parse(rawEdits);
280647
+ } catch (e5) {
280648
+ return `Error: Invalid JSON in edits parameter - ${e5.message}. Provide a raw JSON array between <edits> tags.`;
280649
+ }
280650
+ } else if (Array.isArray(rawEdits)) {
280651
+ edits = rawEdits;
280652
+ } else {
280653
+ return "Error: edits must be a JSON array of edit operations.";
280654
+ }
280655
+ if (!Array.isArray(edits) || edits.length === 0) {
280656
+ return "Error: edits must be a non-empty JSON array.";
280657
+ }
280658
+ if (edits.length > 50) {
280659
+ return `Error: Too many edits (${edits.length}). Maximum 50 per batch.`;
280660
+ }
280661
+ const results = [];
280662
+ let successCount = 0;
280663
+ let failCount = 0;
280664
+ for (let i5 = 0; i5 < edits.length; i5++) {
280665
+ const editOp = edits[i5];
280666
+ if (!editOp || typeof editOp !== "object" || Array.isArray(editOp)) {
280667
+ results.push(`[${i5 + 1}] FAIL: Invalid edit operation - must be an object`);
280668
+ failCount++;
280669
+ continue;
280670
+ }
280671
+ try {
280672
+ const result = await editInstance.execute(editOp);
280673
+ const isError = typeof result === "string" && result.startsWith("Error");
280674
+ if (isError) {
280675
+ results.push(`[${i5 + 1}] FAIL: ${result}`);
280676
+ failCount++;
280677
+ } else {
280678
+ results.push(`[${i5 + 1}] OK: ${result}`);
280679
+ successCount++;
280680
+ }
280681
+ } catch (error2) {
280682
+ results.push(`[${i5 + 1}] FAIL: ${error2.message}`);
280683
+ failCount++;
280684
+ }
280685
+ }
280686
+ const summary = `Multi-edit: ${successCount}/${edits.length} succeeded` + (failCount > 0 ? `, ${failCount} failed` : "");
280687
+ return summary + "\n\n" + results.join("\n");
280688
+ }
280689
+ });
280690
+ };
280625
280691
  editSchema = {
280626
280692
  type: "object",
280627
280693
  properties: {
@@ -280679,8 +280745,19 @@ Important:
280679
280745
  },
280680
280746
  required: ["file_path", "content"]
280681
280747
  };
280748
+ multiEditSchema = {
280749
+ type: "object",
280750
+ properties: {
280751
+ edits: {
280752
+ type: "string",
280753
+ description: "JSON array of edit operations"
280754
+ }
280755
+ },
280756
+ required: ["edits"]
280757
+ };
280682
280758
  editDescription = "Edit files using text replacement, AST-aware symbol operations, or line-targeted editing. Supports fuzzy matching for text edits and optional hash-based integrity verification for line edits.";
280683
280759
  createDescription = "Create new files with specified content. Will create parent directories if needed.";
280760
+ multiEditDescription = "Apply multiple file edits in a single tool call. Accepts a JSON array of edit operations, each supporting the same modes as the edit tool.";
280684
280761
  editToolDefinition = `
280685
280762
  ## edit
280686
280763
  Description: ${editDescription}
@@ -280836,6 +280913,44 @@ Examples:
280836
280913
  This is a new project.</content>
280837
280914
  <overwrite>true</overwrite>
280838
280915
  </create>`;
280916
+ multiEditToolDefinition = `
280917
+ ## multi_edit
280918
+ Description: ${multiEditDescription}
280919
+
280920
+ Apply multiple edits in one call. Each operation in the array uses the same parameters as the edit tool:
280921
+ - file_path, old_string, new_string (text mode)
280922
+ - file_path, symbol, new_string (symbol replace)
280923
+ - file_path, symbol, new_string, position (symbol insert)
280924
+ - file_path, start_line, new_string (line-targeted)
280925
+
280926
+ Edits are applied sequentially. Failures do not stop remaining edits. Maximum 50 edits per call.
280927
+
280928
+ Parameters:
280929
+ - edits: (required) JSON array of edit objects. Place raw JSON between tags.
280930
+
280931
+ When to use multi_edit vs edit:
280932
+ - Use edit for a single change to one file
280933
+ - Use multi_edit when making 2+ related changes across files (e.g., rename a function and update all call sites)
280934
+ - Use multi_edit for coordinated multi-file refactoring where order matters
280935
+
280936
+ Examples:
280937
+
280938
+ Multiple text replacements across files:
280939
+ <multi_edit>
280940
+ <edits>[
280941
+ {"file_path": "src/main.js", "old_string": "return false;", "new_string": "return true;"},
280942
+ {"file_path": "src/config.js", "old_string": "debug: false", "new_string": "debug: true"}
280943
+ ]</edits>
280944
+ </multi_edit>
280945
+
280946
+ Mixed edit modes in one batch:
280947
+ <multi_edit>
280948
+ <edits>[
280949
+ {"file_path": "src/utils.js", "symbol": "oldHelper", "new_string": "function newHelper() { return 42; }"},
280950
+ {"file_path": "src/main.js", "old_string": "oldHelper()", "new_string": "newHelper()", "replace_all": true},
280951
+ {"file_path": "src/index.js", "start_line": "10", "end_line": "12", "new_string": "export { newHelper };"}
280952
+ ]</edits>
280953
+ </multi_edit>`;
280839
280954
  }
280840
280955
  });
280841
280956
 
@@ -281328,7 +281443,8 @@ function getValidParamsForTool(toolName) {
281328
281443
  task: taskSchema,
281329
281444
  attempt_completion: attemptCompletionSchema,
281330
281445
  edit: editSchema,
281331
- create: createSchema
281446
+ create: createSchema,
281447
+ multi_edit: multiEditSchema
281332
281448
  };
281333
281449
  const schema = schemaMap[toolName];
281334
281450
  if (!schema) {
@@ -281368,7 +281484,7 @@ function parseXmlToolCall(xmlString, validTools = DEFAULT_VALID_TOOLS) {
281368
281484
  const closeTag = `</${toolName}>`;
281369
281485
  const openIndex = earliestOpenIndex;
281370
281486
  let closeIndex;
281371
- if (toolName === "attempt_completion") {
281487
+ if (LAST_INDEX_TOOLS.has(toolName)) {
281372
281488
  closeIndex = xmlString.lastIndexOf(closeTag);
281373
281489
  if (closeIndex !== -1 && closeIndex <= openIndex + openTag.length) {
281374
281490
  closeIndex = -1;
@@ -281393,7 +281509,15 @@ function parseXmlToolCall(xmlString, validTools = DEFAULT_VALID_TOOLS) {
281393
281509
  if (paramOpenIndex === -1) {
281394
281510
  continue;
281395
281511
  }
281396
- let paramCloseIndex = innerContent.indexOf(paramCloseTag, paramOpenIndex + paramOpenTag.length);
281512
+ let paramCloseIndex;
281513
+ if (RAW_CONTENT_PARAMS.has(paramName)) {
281514
+ paramCloseIndex = innerContent.lastIndexOf(paramCloseTag);
281515
+ if (paramCloseIndex !== -1 && paramCloseIndex <= paramOpenIndex + paramOpenTag.length) {
281516
+ paramCloseIndex = -1;
281517
+ }
281518
+ } else {
281519
+ paramCloseIndex = innerContent.indexOf(paramCloseTag, paramOpenIndex + paramOpenTag.length);
281520
+ }
281397
281521
  if (paramCloseIndex === -1) {
281398
281522
  let nextTagIndex = innerContent.length;
281399
281523
  for (const nextParam of validParams) {
@@ -281405,18 +281529,26 @@ function parseXmlToolCall(xmlString, validTools = DEFAULT_VALID_TOOLS) {
281405
281529
  }
281406
281530
  paramCloseIndex = nextTagIndex;
281407
281531
  }
281408
- let paramValue = unescapeXmlEntities(innerContent.substring(
281532
+ const rawValue = innerContent.substring(
281409
281533
  paramOpenIndex + paramOpenTag.length,
281410
281534
  paramCloseIndex
281411
- ).trim());
281412
- if (paramValue.toLowerCase() === "true") {
281413
- paramValue = true;
281414
- } else if (paramValue.toLowerCase() === "false") {
281415
- paramValue = false;
281416
- } else if (!isNaN(paramValue) && paramValue.trim() !== "") {
281417
- const num = Number(paramValue);
281418
- if (Number.isFinite(num)) {
281419
- paramValue = num;
281535
+ );
281536
+ let paramValue;
281537
+ if (RAW_CONTENT_PARAMS.has(paramName)) {
281538
+ paramValue = unescapeXmlEntities(rawValue.replace(/^\n/, "").replace(/\n$/, ""));
281539
+ } else {
281540
+ paramValue = unescapeXmlEntities(rawValue.trim());
281541
+ }
281542
+ if (!RAW_CONTENT_PARAMS.has(paramName)) {
281543
+ if (paramValue.toLowerCase() === "true") {
281544
+ paramValue = true;
281545
+ } else if (paramValue.toLowerCase() === "false") {
281546
+ paramValue = false;
281547
+ } else if (!isNaN(paramValue) && paramValue.trim() !== "") {
281548
+ const num = Number(paramValue);
281549
+ if (Number.isFinite(num)) {
281550
+ paramValue = num;
281551
+ }
281420
281552
  }
281421
281553
  }
281422
281554
  params[paramName] = paramValue;
@@ -281459,6 +281591,7 @@ function detectUnrecognizedToolCall(xmlString, validTools) {
281459
281591
  "readImage",
281460
281592
  "edit",
281461
281593
  "create",
281594
+ "multi_edit",
281462
281595
  "delegate",
281463
281596
  "bash",
281464
281597
  "task",
@@ -281588,7 +281721,7 @@ function resolveTargetPath(target, cwd) {
281588
281721
  }
281589
281722
  return filePart + suffix;
281590
281723
  }
281591
- var import_path6, searchSchema, searchAllSchema, querySchema, extractSchema, delegateSchema, listSkillsSchema, useSkillSchema, bashSchema, analyzeAllSchema, executePlanSchema, cleanupExecutePlanSchema, attemptCompletionSchema, searchToolDefinition, queryToolDefinition, extractToolDefinition, delegateToolDefinition, attemptCompletionToolDefinition, analyzeAllToolDefinition, bashToolDefinition, googleSearchToolDefinition, urlContextToolDefinition, searchDescription, queryDescription, extractDescription, delegateDescription, bashDescription, analyzeAllDescription, DEFAULT_VALID_TOOLS;
281724
+ var import_path6, searchSchema, searchAllSchema, querySchema, extractSchema, delegateSchema, listSkillsSchema, useSkillSchema, bashSchema, analyzeAllSchema, executePlanSchema, cleanupExecutePlanSchema, attemptCompletionSchema, searchToolDefinition, queryToolDefinition, extractToolDefinition, delegateToolDefinition, attemptCompletionToolDefinition, analyzeAllToolDefinition, bashToolDefinition, googleSearchToolDefinition, urlContextToolDefinition, searchDescription, queryDescription, extractDescription, delegateDescription, bashDescription, analyzeAllDescription, DEFAULT_VALID_TOOLS, RAW_CONTENT_PARAMS, LAST_INDEX_TOOLS;
281592
281725
  var init_common2 = __esm({
281593
281726
  "src/tools/common.js"() {
281594
281727
  "use strict";
@@ -282008,6 +282141,8 @@ Capabilities:
282008
282141
  "task",
282009
282142
  "attempt_completion"
282010
282143
  ];
282144
+ RAW_CONTENT_PARAMS = /* @__PURE__ */ new Set(["content", "new_string", "old_string"]);
282145
+ LAST_INDEX_TOOLS = /* @__PURE__ */ new Set(["attempt_completion", "create", "edit"]);
282011
282146
  }
282012
282147
  });
282013
282148
 
@@ -282673,6 +282808,9 @@ function createTools(configOptions) {
282673
282808
  if (configOptions.allowEdit && isToolAllowed("create")) {
282674
282809
  tools2.createTool = createTool(configOptions);
282675
282810
  }
282811
+ if (configOptions.allowEdit && isToolAllowed("multi_edit")) {
282812
+ tools2.multiEditTool = multiEditTool(configOptions);
282813
+ }
282676
282814
  return tools2;
282677
282815
  }
282678
282816
  function parseXmlToolCallWithThinking(xmlString, validTools) {
@@ -290058,6 +290196,13 @@ function createWrappedTools(baseTools) {
290058
290196
  baseTools.createTool.execute
290059
290197
  );
290060
290198
  }
290199
+ if (baseTools.multiEditTool) {
290200
+ wrappedTools.multiEditToolInstance = wrapToolWithEmitter(
290201
+ baseTools.multiEditTool,
290202
+ "multi_edit",
290203
+ baseTools.multiEditTool.execute
290204
+ );
290205
+ }
290061
290206
  return wrappedTools;
290062
290207
  }
290063
290208
  var import_child_process6, import_util11, import_crypto4, import_events, import_fs7, import_fs8, import_path8, toolCallEmitter, activeToolExecutions, wrapToolWithEmitter, listFilesTool, searchFilesTool, listFilesToolInstance, searchFilesToolInstance;
@@ -353146,6 +353291,9 @@ var init_ProbeAgent = __esm({
353146
353291
  if (wrappedTools.createToolInstance && isToolAllowed("create")) {
353147
353292
  this.toolImplementations.create = wrappedTools.createToolInstance;
353148
353293
  }
353294
+ if (wrappedTools.multiEditToolInstance && isToolAllowed("multi_edit")) {
353295
+ this.toolImplementations.multi_edit = wrappedTools.multiEditToolInstance;
353296
+ }
353149
353297
  }
353150
353298
  this.wrappedTools = wrappedTools;
353151
353299
  if (this.debug) {
@@ -354435,6 +354583,10 @@ Workspace: ${this.allowedFolders.join(", ")}`;
354435
354583
  }
354436
354584
  if (this.allowEdit && isToolAllowed("create")) {
354437
354585
  toolDefinitions += `${createToolDefinition}
354586
+ `;
354587
+ }
354588
+ if (this.allowEdit && isToolAllowed("multi_edit")) {
354589
+ toolDefinitions += `${multiEditToolDefinition}
354438
354590
  `;
354439
354591
  }
354440
354592
  if (this.enableBash && isToolAllowed("bash")) {
@@ -354531,6 +354683,9 @@ The configuration is loaded from src/config.js lines 15-25 which contains the da
354531
354683
  if (this.allowEdit && isToolAllowed("create")) {
354532
354684
  availableToolsList += "- create: Create new files with specified content.\n";
354533
354685
  }
354686
+ if (this.allowEdit && isToolAllowed("multi_edit")) {
354687
+ availableToolsList += "- multi_edit: Apply multiple file edits in one call using a JSON array of operations.\n";
354688
+ }
354534
354689
  if (this.enableDelegate && isToolAllowed("delegate")) {
354535
354690
  availableToolsList += "- delegate: Delegate big distinct tasks to specialized probe subagents.\n";
354536
354691
  }
@@ -355125,6 +355280,9 @@ You are working with a workspace. Available paths: ${workspaceDesc}
355125
355280
  if (this.allowEdit && this.allowedTools.isEnabled("create")) {
355126
355281
  validTools.push("create");
355127
355282
  }
355283
+ if (this.allowEdit && this.allowedTools.isEnabled("multi_edit")) {
355284
+ validTools.push("multi_edit");
355285
+ }
355128
355286
  if (this.enableBash && this.allowedTools.isEnabled("bash")) {
355129
355287
  validTools.push("bash");
355130
355288
  }
@@ -358231,6 +358389,10 @@ __export(tools_exports, {
358231
358389
  extractTool: () => extractTool,
358232
358390
  getCleanupExecutePlanToolDefinition: () => getCleanupExecutePlanToolDefinition,
358233
358391
  getExecutePlanToolDefinition: () => getExecutePlanToolDefinition,
358392
+ multiEditDescription: () => multiEditDescription,
358393
+ multiEditSchema: () => multiEditSchema,
358394
+ multiEditTool: () => multiEditTool,
358395
+ multiEditToolDefinition: () => multiEditToolDefinition,
358234
358396
  parseAndResolvePaths: () => parseAndResolvePaths,
358235
358397
  querySchema: () => querySchema,
358236
358398
  queryTool: () => queryTool,
@@ -358882,6 +359044,9 @@ __export(index_exports, {
358882
359044
  initializeSimpleTelemetryFromOptions: () => initializeSimpleTelemetryFromOptions,
358883
359045
  listFilesByLevel: () => listFilesByLevel,
358884
359046
  listFilesToolInstance: () => listFilesToolInstance,
359047
+ multiEditSchema: () => multiEditSchema,
359048
+ multiEditTool: () => multiEditTool,
359049
+ multiEditToolDefinition: () => multiEditToolDefinition,
358885
359050
  parseXmlToolCall: () => parseXmlToolCall,
358886
359051
  query: () => query,
358887
359052
  querySchema: () => querySchema,
@@ -394190,7 +394355,7 @@ module.exports = /*#__PURE__*/JSON.parse('{"100":"Continue","101":"Switching Pro
394190
394355
  /***/ ((module) => {
394191
394356
 
394192
394357
  "use strict";
394193
- module.exports = /*#__PURE__*/JSON.parse('{"name":"@probelabs/visor","version":"0.1.143","main":"dist/index.js","bin":{"visor":"./dist/index.js"},"exports":{".":{"require":"./dist/index.js","import":"./dist/index.js"},"./sdk":{"types":"./dist/sdk/sdk.d.ts","import":"./dist/sdk/sdk.mjs","require":"./dist/sdk/sdk.js"},"./cli":{"require":"./dist/index.js"}},"files":["dist/","defaults/","action.yml","README.md","LICENSE"],"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"scripts":{"build:cli":"ncc build src/index.ts -o dist && cp -r defaults dist/ && cp -r output dist/ && cp -r docs dist/ && cp -r examples dist/ && cp -r src/debug-visualizer/ui dist/debug-visualizer/ && node scripts/inject-version.js && echo \'#!/usr/bin/env node\' | cat - dist/index.js > temp && mv temp dist/index.js && chmod +x dist/index.js","build:sdk":"tsup src/sdk.ts --dts --sourcemap --format esm,cjs --out-dir dist/sdk","build":"./scripts/build-oss.sh","build:ee":"npm run build:cli && npm run build:sdk","test":"jest && npm run test:yaml","test:unit":"jest","prepublishOnly":"npm run build","test:watch":"jest --watch","test:coverage":"jest --coverage","test:ee":"jest --testPathPatterns=\'tests/ee\' --testPathIgnorePatterns=\'/node_modules/\' --no-coverage","test:manual:bash":"RUN_MANUAL_TESTS=true jest tests/manual/bash-config-manual.test.ts","lint":"eslint src tests --ext .ts","lint:fix":"eslint src tests --ext .ts --fix","format":"prettier --write src tests","format:check":"prettier --check src tests","clean":"","clean:traces":"node scripts/clean-traces.js","prebuild":"npm run clean && node scripts/generate-config-schema.js","pretest":"npm run clean:traces && node scripts/generate-config-schema.js && npm run build:cli","pretest:unit":"npm run clean:traces && node scripts/generate-config-schema.js && npm run build:cli","test:with-build":"npm run build:cli && jest","test:yaml":"node dist/index.js test --progress compact","test:yaml:parallel":"node dist/index.js test --progress compact --max-parallel 4","prepare":"husky","pre-commit":"lint-staged","deploy:site":"cd site && npx wrangler pages deploy . --project-name=visor-site --commit-dirty=true","deploy:worker":"npx wrangler deploy","deploy":"npm run deploy:site && npm run deploy:worker","publish:ee":"./scripts/publish-ee.sh","release":"./scripts/release.sh","release:patch":"./scripts/release.sh patch","release:minor":"./scripts/release.sh minor","release:major":"./scripts/release.sh major","release:prerelease":"./scripts/release.sh prerelease","docs:validate":"node scripts/validate-readme-links.js","workshop:setup":"npm install -D reveal-md@6.1.2","workshop:serve":"cd workshop && reveal-md slides.md -w","workshop:export":"reveal-md workshop/slides.md --static workshop/build","workshop:pdf":"reveal-md workshop/slides.md --print workshop/Visor-Workshop.pdf --print-size letter","workshop:pdf:ci":"reveal-md workshop/slides.md --print workshop/Visor-Workshop.pdf --print-size letter --puppeteer-launch-args=\\"--no-sandbox --disable-dev-shm-usage\\"","workshop:pdf:a4":"reveal-md workshop/slides.md --print workshop/Visor-Workshop-A4.pdf --print-size A4","workshop:build":"npm run workshop:export && npm run workshop:pdf","simulate:issue":"TS_NODE_TRANSPILE_ONLY=1 ts-node scripts/simulate-gh-run.ts --event issues --action opened --debug","simulate:comment":"TS_NODE_TRANSPILE_ONLY=1 ts-node scripts/simulate-gh-run.ts --event issue_comment --action created --debug"},"keywords":["code-review","ai","github-action","cli","pr-review","visor"],"author":"Probe Labs","license":"MIT","description":"AI workflow engine for code review, assistants, and automation — orchestrate checks, MCP tools, and AI providers with YAML-driven pipelines","repository":{"type":"git","url":"git+https://github.com/probelabs/visor.git"},"bugs":{"url":"https://github.com/probelabs/visor/issues"},"homepage":"https://github.com/probelabs/visor#readme","dependencies":{"@actions/core":"^1.11.1","@apidevtools/swagger-parser":"^12.1.0","@modelcontextprotocol/sdk":"^1.25.3","@nyariv/sandboxjs":"github:probelabs/SandboxJS#f1c13b8eee98734a8ea024061eada4aa9a9ff2e9","@octokit/action":"^8.0.2","@octokit/auth-app":"^8.1.0","@octokit/core":"^7.0.3","@octokit/rest":"^22.0.0","@opentelemetry/api":"^1.9.0","@opentelemetry/core":"^1.30.1","@opentelemetry/exporter-trace-otlp-grpc":"^0.203.0","@opentelemetry/exporter-trace-otlp-http":"^0.203.0","@opentelemetry/instrumentation":"^0.203.0","@opentelemetry/resources":"^1.30.1","@opentelemetry/sdk-metrics":"^1.30.1","@opentelemetry/sdk-node":"^0.203.0","@opentelemetry/sdk-trace-base":"^1.30.1","@opentelemetry/semantic-conventions":"^1.30.1","@probelabs/probe":"^0.6.0-rc258","@types/commander":"^2.12.0","@types/uuid":"^10.0.0","acorn":"^8.16.0","acorn-walk":"^8.3.5","ajv":"^8.17.1","ajv-formats":"^3.0.1","better-sqlite3":"^11.0.0","blessed":"^0.1.81","cli-table3":"^0.6.5","commander":"^14.0.0","deepmerge":"^4.3.1","dotenv":"^17.2.3","ignore":"^7.0.5","js-yaml":"^4.1.0","jsonpath-plus":"^10.4.0","liquidjs":"^10.21.1","minimatch":"^10.2.2","node-cron":"^3.0.3","open":"^9.1.0","simple-git":"^3.28.0","uuid":"^11.1.0","ws":"^8.18.3"},"optionalDependencies":{"@anthropic/claude-code-sdk":"npm:null@*","@open-policy-agent/opa-wasm":"^1.10.0","knex":"^3.1.0","mysql2":"^3.11.0","pg":"^8.13.0","tedious":"^19.0.0"},"devDependencies":{"@eslint/js":"^9.34.0","@kie/act-js":"^2.6.2","@kie/mock-github":"^2.0.1","@swc/core":"^1.13.2","@swc/jest":"^0.2.37","@types/better-sqlite3":"^7.6.0","@types/blessed":"^0.1.27","@types/jest":"^30.0.0","@types/js-yaml":"^4.0.9","@types/node":"^24.3.0","@types/node-cron":"^3.0.11","@types/ws":"^8.18.1","@typescript-eslint/eslint-plugin":"^8.42.0","@typescript-eslint/parser":"^8.42.0","@vercel/ncc":"^0.38.4","eslint":"^9.34.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","husky":"^9.1.7","jest":"^30.1.3","lint-staged":"^16.1.6","prettier":"^3.6.2","reveal-md":"^6.1.2","ts-json-schema-generator":"^1.5.1","ts-node":"^10.9.2","tsup":"^8.5.0","typescript":"^5.9.2","wrangler":"^3.0.0"},"peerDependenciesMeta":{"@anthropic/claude-code-sdk":{"optional":true}},"directories":{"test":"tests"},"lint-staged":{"src/**/*.{ts,js}":["eslint --fix","prettier --write"],"tests/**/*.{ts,js}":["eslint --fix","prettier --write"],"*.{json,md,yml,yaml}":["prettier --write"]}}');
394358
+ module.exports = /*#__PURE__*/JSON.parse('{"name":"@probelabs/visor","version":"0.1.144","main":"dist/index.js","bin":{"visor":"./dist/index.js"},"exports":{".":{"require":"./dist/index.js","import":"./dist/index.js"},"./sdk":{"types":"./dist/sdk/sdk.d.ts","import":"./dist/sdk/sdk.mjs","require":"./dist/sdk/sdk.js"},"./cli":{"require":"./dist/index.js"}},"files":["dist/","defaults/","action.yml","README.md","LICENSE"],"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"scripts":{"build:cli":"ncc build src/index.ts -o dist && cp -r defaults dist/ && cp -r output dist/ && cp -r docs dist/ && cp -r examples dist/ && cp -r src/debug-visualizer/ui dist/debug-visualizer/ && node scripts/inject-version.js && echo \'#!/usr/bin/env node\' | cat - dist/index.js > temp && mv temp dist/index.js && chmod +x dist/index.js","build:sdk":"tsup src/sdk.ts --dts --sourcemap --format esm,cjs --out-dir dist/sdk","build":"./scripts/build-oss.sh","build:ee":"npm run build:cli && npm run build:sdk","test":"jest && npm run test:yaml","test:unit":"jest","prepublishOnly":"npm run build","test:watch":"jest --watch","test:coverage":"jest --coverage","test:ee":"jest --testPathPatterns=\'tests/ee\' --testPathIgnorePatterns=\'/node_modules/\' --no-coverage","test:manual:bash":"RUN_MANUAL_TESTS=true jest tests/manual/bash-config-manual.test.ts","lint":"eslint src tests --ext .ts","lint:fix":"eslint src tests --ext .ts --fix","format":"prettier --write src tests","format:check":"prettier --check src tests","clean":"","clean:traces":"node scripts/clean-traces.js","prebuild":"npm run clean && node scripts/generate-config-schema.js","pretest":"npm run clean:traces && node scripts/generate-config-schema.js && npm run build:cli","pretest:unit":"npm run clean:traces && node scripts/generate-config-schema.js && npm run build:cli","test:with-build":"npm run build:cli && jest","test:yaml":"node dist/index.js test --progress compact","test:yaml:parallel":"node dist/index.js test --progress compact --max-parallel 4","prepare":"husky","pre-commit":"lint-staged","deploy:site":"cd site && npx wrangler pages deploy . --project-name=visor-site --commit-dirty=true","deploy:worker":"npx wrangler deploy","deploy":"npm run deploy:site && npm run deploy:worker","publish:ee":"./scripts/publish-ee.sh","release":"./scripts/release.sh","release:patch":"./scripts/release.sh patch","release:minor":"./scripts/release.sh minor","release:major":"./scripts/release.sh major","release:prerelease":"./scripts/release.sh prerelease","docs:validate":"node scripts/validate-readme-links.js","workshop:setup":"npm install -D reveal-md@6.1.2","workshop:serve":"cd workshop && reveal-md slides.md -w","workshop:export":"reveal-md workshop/slides.md --static workshop/build","workshop:pdf":"reveal-md workshop/slides.md --print workshop/Visor-Workshop.pdf --print-size letter","workshop:pdf:ci":"reveal-md workshop/slides.md --print workshop/Visor-Workshop.pdf --print-size letter --puppeteer-launch-args=\\"--no-sandbox --disable-dev-shm-usage\\"","workshop:pdf:a4":"reveal-md workshop/slides.md --print workshop/Visor-Workshop-A4.pdf --print-size A4","workshop:build":"npm run workshop:export && npm run workshop:pdf","simulate:issue":"TS_NODE_TRANSPILE_ONLY=1 ts-node scripts/simulate-gh-run.ts --event issues --action opened --debug","simulate:comment":"TS_NODE_TRANSPILE_ONLY=1 ts-node scripts/simulate-gh-run.ts --event issue_comment --action created --debug"},"keywords":["code-review","ai","github-action","cli","pr-review","visor"],"author":"Probe Labs","license":"MIT","description":"AI workflow engine for code review, assistants, and automation — orchestrate checks, MCP tools, and AI providers with YAML-driven pipelines","repository":{"type":"git","url":"git+https://github.com/probelabs/visor.git"},"bugs":{"url":"https://github.com/probelabs/visor/issues"},"homepage":"https://github.com/probelabs/visor#readme","dependencies":{"@actions/core":"^1.11.1","@apidevtools/swagger-parser":"^12.1.0","@modelcontextprotocol/sdk":"^1.25.3","@nyariv/sandboxjs":"github:probelabs/SandboxJS#f1c13b8eee98734a8ea024061eada4aa9a9ff2e9","@octokit/action":"^8.0.2","@octokit/auth-app":"^8.1.0","@octokit/core":"^7.0.3","@octokit/rest":"^22.0.0","@opentelemetry/api":"^1.9.0","@opentelemetry/core":"^1.30.1","@opentelemetry/exporter-trace-otlp-grpc":"^0.203.0","@opentelemetry/exporter-trace-otlp-http":"^0.203.0","@opentelemetry/instrumentation":"^0.203.0","@opentelemetry/resources":"^1.30.1","@opentelemetry/sdk-metrics":"^1.30.1","@opentelemetry/sdk-node":"^0.203.0","@opentelemetry/sdk-trace-base":"^1.30.1","@opentelemetry/semantic-conventions":"^1.30.1","@probelabs/probe":"^0.6.0-rc259","@types/commander":"^2.12.0","@types/uuid":"^10.0.0","acorn":"^8.16.0","acorn-walk":"^8.3.5","ajv":"^8.17.1","ajv-formats":"^3.0.1","better-sqlite3":"^11.0.0","blessed":"^0.1.81","cli-table3":"^0.6.5","commander":"^14.0.0","deepmerge":"^4.3.1","dotenv":"^17.2.3","ignore":"^7.0.5","js-yaml":"^4.1.0","jsonpath-plus":"^10.4.0","liquidjs":"^10.21.1","minimatch":"^10.2.2","node-cron":"^3.0.3","open":"^9.1.0","simple-git":"^3.28.0","uuid":"^11.1.0","ws":"^8.18.3"},"optionalDependencies":{"@anthropic/claude-code-sdk":"npm:null@*","@open-policy-agent/opa-wasm":"^1.10.0","knex":"^3.1.0","mysql2":"^3.11.0","pg":"^8.13.0","tedious":"^19.0.0"},"devDependencies":{"@eslint/js":"^9.34.0","@kie/act-js":"^2.6.2","@kie/mock-github":"^2.0.1","@swc/core":"^1.13.2","@swc/jest":"^0.2.37","@types/better-sqlite3":"^7.6.0","@types/blessed":"^0.1.27","@types/jest":"^30.0.0","@types/js-yaml":"^4.0.9","@types/node":"^24.3.0","@types/node-cron":"^3.0.11","@types/ws":"^8.18.1","@typescript-eslint/eslint-plugin":"^8.42.0","@typescript-eslint/parser":"^8.42.0","@vercel/ncc":"^0.38.4","eslint":"^9.34.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","husky":"^9.1.7","jest":"^30.1.3","lint-staged":"^16.1.6","prettier":"^3.6.2","reveal-md":"^6.1.2","ts-json-schema-generator":"^1.5.1","ts-node":"^10.9.2","tsup":"^8.5.0","typescript":"^5.9.2","wrangler":"^3.0.0"},"peerDependenciesMeta":{"@anthropic/claude-code-sdk":{"optional":true}},"directories":{"test":"tests"},"lint-staged":{"src/**/*.{ts,js}":["eslint --fix","prettier --write"],"tests/**/*.{ts,js}":["eslint --fix","prettier --write"],"*.{json,md,yml,yaml}":["prettier --write"]}}');
394194
394359
 
394195
394360
  /***/ })
394196
394361