@probelabs/visor 0.1.126 → 0.1.127

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 (84) hide show
  1. package/dist/ai-review-service.d.ts +1 -0
  2. package/dist/ai-review-service.d.ts.map +1 -1
  3. package/dist/docs/ai-configuration.md +23 -0
  4. package/dist/docs/workflows.md +30 -1
  5. package/dist/failure-condition-evaluator.d.ts.map +1 -1
  6. package/dist/generated/config-schema.d.ts +14 -6
  7. package/dist/generated/config-schema.d.ts.map +1 -1
  8. package/dist/generated/config-schema.json +14 -6
  9. package/dist/index.js +240 -261
  10. package/dist/liquid-extensions.d.ts.map +1 -1
  11. package/dist/output/traces/{run-2026-01-31T16-37-22-321Z.ndjson → run-2026-02-01T09-59-08-165Z.ndjson} +84 -84
  12. package/dist/output/traces/{run-2026-01-31T16-38-06-031Z.ndjson → run-2026-02-01T09-59-52-595Z.ndjson} +1015 -1015
  13. package/dist/providers/ai-check-provider.d.ts.map +1 -1
  14. package/dist/providers/command-check-provider.d.ts.map +1 -1
  15. package/dist/providers/custom-tool-executor.d.ts.map +1 -1
  16. package/dist/providers/http-client-provider.d.ts.map +1 -1
  17. package/dist/providers/mcp-check-provider.d.ts.map +1 -1
  18. package/dist/providers/memory-check-provider.d.ts.map +1 -1
  19. package/dist/providers/workflow-check-provider.d.ts.map +1 -1
  20. package/dist/sdk/{check-provider-registry-IYILYY35.mjs → check-provider-registry-CVUONJ5A.mjs} +7 -7
  21. package/dist/sdk/{chunk-7GUAFV6L.mjs → chunk-BHOKBQPB.mjs} +15 -10
  22. package/dist/sdk/chunk-BHOKBQPB.mjs.map +1 -0
  23. package/dist/sdk/{chunk-2CPMMNIX.mjs → chunk-EORMDOZU.mjs} +17 -61
  24. package/dist/sdk/{chunk-2CPMMNIX.mjs.map → chunk-EORMDOZU.mjs.map} +1 -1
  25. package/dist/sdk/{chunk-SWEEZ5D5.mjs → chunk-MPS4HVQI.mjs} +11 -77
  26. package/dist/sdk/chunk-MPS4HVQI.mjs.map +1 -0
  27. package/dist/sdk/{chunk-PJ7K5UFC.mjs → chunk-TS6BUNAI.mjs} +37 -47
  28. package/dist/sdk/chunk-TS6BUNAI.mjs.map +1 -0
  29. package/dist/sdk/{chunk-5LI6T4O3.mjs → chunk-XWJPT5KQ.mjs} +15 -7
  30. package/dist/sdk/chunk-XWJPT5KQ.mjs.map +1 -0
  31. package/dist/sdk/{config-5AUYQFHE.mjs → config-DXX64GD3.mjs} +2 -2
  32. package/dist/sdk/{failure-condition-evaluator-HB35XRLZ.mjs → failure-condition-evaluator-G4HMJPXF.mjs} +3 -3
  33. package/dist/sdk/{github-frontend-BZ4N3BFZ.mjs → github-frontend-5PCKKHVC.mjs} +3 -3
  34. package/dist/sdk/{host-4MT3EW2I.mjs → host-H3AWNZ2F.mjs} +2 -2
  35. package/dist/sdk/{liquid-extensions-DFDEBMUI.mjs → liquid-extensions-I7O7KMHF.mjs} +3 -2
  36. package/dist/sdk/{routing-7FXPULTO.mjs → routing-QHTGDIXF.mjs} +4 -4
  37. package/dist/sdk/sdk.d.mts +4 -0
  38. package/dist/sdk/sdk.d.ts +4 -0
  39. package/dist/sdk/sdk.js +62 -172
  40. package/dist/sdk/sdk.js.map +1 -1
  41. package/dist/sdk/sdk.mjs +10 -10
  42. package/dist/sdk/{workflow-check-provider-H3CUOLUD.mjs → workflow-check-provider-3IWBAZP7.mjs} +7 -7
  43. package/dist/state-machine/states/routing.d.ts.map +1 -1
  44. package/dist/test-runner/index.d.ts.map +1 -1
  45. package/dist/test-runner/validator.d.ts.map +1 -1
  46. package/dist/traces/{run-2026-01-31T16-37-22-321Z.ndjson → run-2026-02-01T09-59-08-165Z.ndjson} +84 -84
  47. package/dist/traces/{run-2026-01-31T16-38-06-031Z.ndjson → run-2026-02-01T09-59-52-595Z.ndjson} +1015 -1015
  48. package/dist/types/config.d.ts +4 -0
  49. package/dist/types/config.d.ts.map +1 -1
  50. package/package.json +5 -6
  51. package/dist/sdk/check-provider-registry-3KI5RKXT.mjs +0 -28
  52. package/dist/sdk/chunk-5LI6T4O3.mjs.map +0 -1
  53. package/dist/sdk/chunk-7GUAFV6L.mjs.map +0 -1
  54. package/dist/sdk/chunk-A4PGHURG.mjs +0 -17667
  55. package/dist/sdk/chunk-A4PGHURG.mjs.map +0 -1
  56. package/dist/sdk/chunk-J6EVEXC2.mjs +0 -558
  57. package/dist/sdk/chunk-J6EVEXC2.mjs.map +0 -1
  58. package/dist/sdk/chunk-PJ7K5UFC.mjs.map +0 -1
  59. package/dist/sdk/chunk-PXFIALUH.mjs +0 -1458
  60. package/dist/sdk/chunk-PXFIALUH.mjs.map +0 -1
  61. package/dist/sdk/chunk-RTKJXNZS.mjs +0 -3591
  62. package/dist/sdk/chunk-RTKJXNZS.mjs.map +0 -1
  63. package/dist/sdk/chunk-SWEEZ5D5.mjs.map +0 -1
  64. package/dist/sdk/config-6CUVEH7H.mjs +0 -16
  65. package/dist/sdk/host-NYWXLIFC.mjs +0 -52
  66. package/dist/sdk/host-NYWXLIFC.mjs.map +0 -1
  67. package/dist/sdk/routing-6R42GXUO.mjs +0 -24
  68. package/dist/sdk/routing-6R42GXUO.mjs.map +0 -1
  69. package/dist/sdk/routing-7FXPULTO.mjs.map +0 -1
  70. package/dist/sdk/slack-frontend-J442FJWZ.mjs +0 -793
  71. package/dist/sdk/slack-frontend-J442FJWZ.mjs.map +0 -1
  72. package/dist/sdk/workflow-check-provider-H3CUOLUD.mjs.map +0 -1
  73. package/dist/sdk/workflow-check-provider-YUNNF4KC.mjs +0 -28
  74. package/dist/sdk/workflow-check-provider-YUNNF4KC.mjs.map +0 -1
  75. package/dist/sdk/workflow-registry-6LZKCWHP.mjs +0 -12
  76. package/dist/sdk/workflow-registry-6LZKCWHP.mjs.map +0 -1
  77. /package/dist/sdk/{check-provider-registry-3KI5RKXT.mjs.map → check-provider-registry-CVUONJ5A.mjs.map} +0 -0
  78. /package/dist/sdk/{check-provider-registry-IYILYY35.mjs.map → config-DXX64GD3.mjs.map} +0 -0
  79. /package/dist/sdk/{config-5AUYQFHE.mjs.map → failure-condition-evaluator-G4HMJPXF.mjs.map} +0 -0
  80. /package/dist/sdk/{github-frontend-BZ4N3BFZ.mjs.map → github-frontend-5PCKKHVC.mjs.map} +0 -0
  81. /package/dist/sdk/{host-4MT3EW2I.mjs.map → host-H3AWNZ2F.mjs.map} +0 -0
  82. /package/dist/sdk/{config-6CUVEH7H.mjs.map → liquid-extensions-I7O7KMHF.mjs.map} +0 -0
  83. /package/dist/sdk/{failure-condition-evaluator-HB35XRLZ.mjs.map → routing-QHTGDIXF.mjs.map} +0 -0
  84. /package/dist/sdk/{liquid-extensions-DFDEBMUI.mjs.map → workflow-check-provider-3IWBAZP7.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.126';
3
- process.env.PROBE_VERSION = '0.6.0-rc206';
4
- process.env.VISOR_COMMIT_SHA = '2fa286a2cde69f39831427c8caebc20d3ddc5151';
5
- process.env.VISOR_COMMIT_SHORT = '2fa286a';
2
+ process.env.VISOR_VERSION = '0.1.127';
3
+ process.env.PROBE_VERSION = '0.6.0-rc207';
4
+ process.env.VISOR_COMMIT_SHA = 'd4f4b043f6ede6c1a0aabfc6baeb93e2cac5a406';
5
+ process.env.VISOR_COMMIT_SHORT = 'd4f4b04';
6
6
  /******/ (() => { // webpackBootstrap
7
7
  /******/ var __webpack_modules__ = ({
8
8
 
@@ -26213,6 +26213,7 @@ var SandboxExec = __nccwpck_require__(32126);
26213
26213
  function createEvalContext() {
26214
26214
  return {
26215
26215
  sandboxFunction,
26216
+ sandboxAsyncFunction,
26216
26217
  sandboxedEval,
26217
26218
  sandboxedSetTimeout,
26218
26219
  sandboxedSetInterval,
@@ -26231,6 +26232,18 @@ function sandboxFunction(context, ticks) {
26231
26232
  }, undefined, 'anonymous');
26232
26233
  }
26233
26234
  }
26235
+ function sandboxAsyncFunction(context, ticks) {
26236
+ return SandboxAsyncFunction;
26237
+ function SandboxAsyncFunction(...params) {
26238
+ const code = params.pop() || '';
26239
+ const parsed = parser.default(code);
26240
+ return executor.createFunctionAsync(params, parsed.tree, ticks || executor.currentTicks.current, {
26241
+ ...context,
26242
+ constants: parsed.constants,
26243
+ tree: parsed.tree,
26244
+ }, undefined, 'anonymous');
26245
+ }
26246
+ }
26234
26247
  function sandboxedEval(func) {
26235
26248
  return sandboxEval;
26236
26249
  function sandboxEval(code) {
@@ -26730,7 +26743,7 @@ addOps(1 /* LispType.Prop */, (exec, done, ticks, a, b, obj, context, scope) =>
26730
26743
  }
26731
26744
  if (prototypeAccess) {
26732
26745
  if (isFunction) {
26733
- if (!['name', 'length', 'constructor'].includes(b) && (a.hasOwnProperty(b) || b === '__proto__')) {
26746
+ if (!['name', 'length', 'constructor'].includes(b) && a.hasOwnProperty(b)) {
26734
26747
  const whitelist = context.ctx.prototypeWhitelist.get(a.prototype);
26735
26748
  const replace = context.ctx.options.prototypeReplacements.get(a);
26736
26749
  if (replace) {
@@ -26742,7 +26755,7 @@ addOps(1 /* LispType.Prop */, (exec, done, ticks, a, b, obj, context, scope) =>
26742
26755
  }
26743
26756
  }
26744
26757
  }
26745
- else if (b !== 'constructor') {
26758
+ if (b !== 'constructor') {
26746
26759
  let prot = a;
26747
26760
  while ((prot = Object.getPrototypeOf(prot))) {
26748
26761
  if (prot.hasOwnProperty(b)) {
@@ -26924,7 +26937,7 @@ addOps(35 /* LispType.GlobalSymbol */, (exec, done, ticks, a, b) => {
26924
26937
  addOps(7 /* LispType.Number */, (exec, done, ticks, a, b) => done(undefined, Number(b)));
26925
26938
  addOps(83 /* LispType.BigInt */, (exec, done, ticks, a, b) => done(undefined, BigInt(b)));
26926
26939
  addOps(2 /* LispType.StringIndex */, (exec, done, ticks, a, b, obj, context) => done(undefined, context.constants.strings[parseInt(b)]));
26927
- addOps(85 /* LispType.RegexIndex */, (exec, done, ticks, a, b, obj, context) => {
26940
+ addOps(86 /* LispType.RegexIndex */, (exec, done, ticks, a, b, obj, context) => {
26928
26941
  const reg = context.constants.regexes[parseInt(b)];
26929
26942
  if (!context.ctx.globalsWhitelist.has(RegExp)) {
26930
26943
  throw new utils.SandboxError('Regex not permitted');
@@ -27049,6 +27062,7 @@ addOps(53 /* LispType.NotEqual */, (exec, done, ticks, a, b) => done(undefined,
27049
27062
  addOps(31 /* LispType.StrictNotEqual */, (exec, done, ticks, a, b) => done(undefined, a !== b));
27050
27063
  addOps(29 /* LispType.And */, (exec, done, ticks, a, b) => done(undefined, a && b));
27051
27064
  addOps(30 /* LispType.Or */, (exec, done, ticks, a, b) => done(undefined, a || b));
27065
+ addOps(85 /* LispType.NullishCoalescing */, (exec, done, ticks, a, b) => done(undefined, a ?? b));
27052
27066
  addOps(77 /* LispType.BitAnd */, (exec, done, ticks, a, b) => done(undefined, a & b));
27053
27067
  addOps(78 /* LispType.BitOr */, (exec, done, ticks, a, b) => done(undefined, a | b));
27054
27068
  addOps(33 /* LispType.Plus */, (exec, done, ticks, a, b) => done(undefined, a + b));
@@ -27120,7 +27134,7 @@ addOps(37 /* LispType.Function */, (exec, done, ticks, a, b, obj, context, scope
27120
27134
  const isAsync = a.shift();
27121
27135
  const name = a.shift();
27122
27136
  let func;
27123
- if (isAsync === 88 /* LispType.True */) {
27137
+ if (isAsync === 89 /* LispType.True */) {
27124
27138
  func = createFunctionAsync(a, b, ticks, context, scope, name);
27125
27139
  }
27126
27140
  else {
@@ -27146,7 +27160,7 @@ addOps(10 /* LispType.InlineFunction */, (exec, done, ticks, a, b, obj, context,
27146
27160
  scope = new utils.Scope(scope, {});
27147
27161
  }
27148
27162
  let func;
27149
- if (isAsync === 88 /* LispType.True */) {
27163
+ if (isAsync === 89 /* LispType.True */) {
27150
27164
  func = createFunctionAsync(a, b, ticks, context, scope, name);
27151
27165
  }
27152
27166
  else {
@@ -27225,7 +27239,7 @@ addOps(38 /* LispType.Loop */, (exec, done, ticks, a, b, obj, context, scope) =>
27225
27239
  done();
27226
27240
  }
27227
27241
  });
27228
- addOps(86 /* LispType.LoopAction */, (exec, done, ticks, a, b, obj, context, scope, bobj, inLoopOrSwitch) => {
27242
+ addOps(87 /* LispType.LoopAction */, (exec, done, ticks, a, b, obj, context, scope, bobj, inLoopOrSwitch) => {
27229
27243
  if ((inLoopOrSwitch === 'switch' && a === 'continue') || !inLoopOrSwitch) {
27230
27244
  throw new utils.SandboxError('Illegal ' + a + ' statement');
27231
27245
  }
@@ -27321,7 +27335,7 @@ addOps(39 /* LispType.Try */, (exec, done, ticks, a, b, obj, context, scope, bob
27321
27335
  }, ticks, context, finallyBody, [new utils.Scope(scope, {})]);
27322
27336
  }, ticks, context, a, [new utils.Scope(scope)], inLoopOrSwitch);
27323
27337
  });
27324
- addOps(87 /* LispType.Void */, (exec, done) => {
27338
+ addOps(88 /* LispType.Void */, (exec, done) => {
27325
27339
  done();
27326
27340
  });
27327
27341
  addOps(45 /* LispType.New */, (exec, done, ticks, a, b, obj, context) => {
@@ -27996,14 +28010,14 @@ const expectTypes = {
27996
28010
  opHigh: /^(\/|\*\*|\*(?!\*)|%)(?!=)/,
27997
28011
  op: /^(\+(?!(\+))|-(?!(-)))(?!=)/,
27998
28012
  comparitor: /^(<=|>=|<(?!<)|>(?!>)|!==|!=(?!=)|===|==)/,
27999
- boolOp: /^(&&|\|\||instanceof(?![\w$])|in(?![\w$]))/,
28013
+ boolOp: /^(&&|\|\||\?\?|instanceof(?![\w$])|in(?![\w$]))/,
28000
28014
  bitwise: /^(&(?!&)|\|(?!\|)|\^|<<|>>(?!>)|>>>)(?!=)/,
28001
28015
  },
28002
28016
  next: ['modifier', 'value', 'prop', 'incrementerBefore'],
28003
28017
  },
28004
28018
  inlineIf: {
28005
28019
  types: {
28006
- inlineIf: /^\?(?!\.(?!\d))/,
28020
+ inlineIf: /^\?(?!\?|\.(?!\d))/,
28007
28021
  },
28008
28022
  next: ['expEnd'],
28009
28023
  },
@@ -28429,6 +28443,7 @@ setLispType(['incrementerAfter'], (constants, type, part, res, expect, ctx) => {
28429
28443
  const adderTypes = {
28430
28444
  '&&': 29 /* LispType.And */,
28431
28445
  '||': 30 /* LispType.Or */,
28446
+ '??': 85 /* LispType.NullishCoalescing */,
28432
28447
  instanceof: 62 /* LispType.Instanceof */,
28433
28448
  in: 63 /* LispType.In */,
28434
28449
  '=': 9 /* LispType.Assign */,
@@ -28703,7 +28718,7 @@ setLispType(['string', 'literal', 'regex'], (constants, type, part, res, expect,
28703
28718
  ? 2 /* LispType.StringIndex */
28704
28719
  : type === 'literal'
28705
28720
  ? 84 /* LispType.LiteralIndex */
28706
- : 85 /* LispType.RegexIndex */,
28721
+ : 86 /* LispType.RegexIndex */,
28707
28722
  a: 0 /* LispType.None */,
28708
28723
  b: res[1],
28709
28724
  }));
@@ -28729,7 +28744,7 @@ setLispType(['function', 'inlineFunction', 'arrowFunction', 'arrowFunctionSingle
28729
28744
  const isArrow = type !== 'function' && type !== 'inlineFunction';
28730
28745
  const isReturn = isArrow && !res[res.length - 1];
28731
28746
  const argPos = isArrow ? 2 : 3;
28732
- const isAsync = res[1] ? 88 /* LispType.True */ : 0 /* LispType.None */;
28747
+ const isAsync = res[1] ? 89 /* LispType.True */ : 0 /* LispType.None */;
28733
28748
  const args = res[argPos] ? res[argPos].replace(/\s+/g, '').split(/,/g) : [];
28734
28749
  if (!isArrow) {
28735
28750
  args.unshift((res[2] || '').trimStart());
@@ -28756,13 +28771,13 @@ setLispType(['function', 'inlineFunction', 'arrowFunction', 'arrowFunctionSingle
28756
28771
  const iteratorRegex = /^((let|var|const)\s+)?\s*([a-zA-Z$_][a-zA-Z\d$_]*)\s+(in|of)(?![\w$])/;
28757
28772
  setLispType(['for', 'do', 'while'], (constants, type, part, res, expect, ctx) => {
28758
28773
  let i = 0;
28759
- let startStep = 88 /* LispType.True */;
28774
+ let startStep = 89 /* LispType.True */;
28760
28775
  let startInternal = [];
28761
28776
  let getIterator = 0 /* LispType.None */;
28762
28777
  let beforeStep = 0 /* LispType.None */;
28763
- let checkFirst = 88 /* LispType.True */;
28778
+ let checkFirst = 89 /* LispType.True */;
28764
28779
  let condition;
28765
- let step = 88 /* LispType.True */;
28780
+ let step = 89 /* LispType.True */;
28766
28781
  let body;
28767
28782
  switch (type) {
28768
28783
  case 'while': {
@@ -28847,7 +28862,7 @@ setLispType(['block'], (constants, type, part, res, expect, ctx) => {
28847
28862
  });
28848
28863
  setLispType(['loopAction'], (constants, type, part, res, expect, ctx) => {
28849
28864
  ctx.lispTree = createLisp({
28850
- op: 86 /* LispType.LoopAction */,
28865
+ op: 87 /* LispType.LoopAction */,
28851
28866
  a: res[1],
28852
28867
  b: 0 /* LispType.None */,
28853
28868
  });
@@ -28887,7 +28902,7 @@ setLispType(['try'], (constants, type, part, res, expect, ctx) => {
28887
28902
  setLispType(['void', 'await'], (constants, type, part, res, expect, ctx) => {
28888
28903
  const extract = restOfExp(constants, part.substring(res[0].length), [/^([^\s.?\w$]|\?[^.])/]);
28889
28904
  ctx.lispTree = lispify(constants, part.substring(res[0].length + extract.length), expectTypes[expect].next, createLisp({
28890
- op: type === 'void' ? 87 /* LispType.Void */ : 44 /* LispType.Await */,
28905
+ op: type === 'void' ? 88 /* LispType.Void */ : 44 /* LispType.Await */,
28891
28906
  a: lispify(constants, extract),
28892
28907
  b: 0 /* LispType.None */,
28893
28908
  }));
@@ -29337,6 +29352,10 @@ exports.testMultiple = testMultiple;
29337
29352
  "use strict";
29338
29353
 
29339
29354
 
29355
+ // Reusable AsyncFunction constructor reference
29356
+ const AsyncFunction = Object.getPrototypeOf(async function () { }).constructor;
29357
+ const GeneratorFunction = Object.getPrototypeOf(function* () { }).constructor;
29358
+ const AsyncGeneratorFunction = Object.getPrototypeOf(async function* () { }).constructor;
29340
29359
  const SandboxGlobal = function SandboxGlobal(globals) {
29341
29360
  if (globals === globalThis)
29342
29361
  return globalThis;
@@ -29378,7 +29397,11 @@ function createExecContext(sandbox, executionTree, evalContext) {
29378
29397
  const execContext = new ExecContext(sandbox.context, executionTree.constants, executionTree.tree, new Set(), new WeakMap(), new WeakMap(), sandbox.setSubscriptions, sandbox.changeSubscriptions, evals, (fn) => sandbox.sandboxFunctions.set(fn, execContext), !!evalContext, evalContext);
29379
29398
  if (evalContext) {
29380
29399
  const func = evalContext.sandboxFunction(execContext);
29400
+ const asyncFunc = evalContext.sandboxAsyncFunction(execContext);
29381
29401
  evals.set(Function, func);
29402
+ evals.set(AsyncFunction, asyncFunc);
29403
+ evals.set(GeneratorFunction, func);
29404
+ evals.set(AsyncGeneratorFunction, asyncFunc);
29382
29405
  evals.set(eval, evalContext.sandboxedEval(func));
29383
29406
  evals.set(setTimeout, evalContext.sandboxedSetTimeout(func));
29384
29407
  evals.set(setInterval, evalContext.sandboxedSetInterval(func));
@@ -29593,7 +29616,7 @@ function isLisp(item) {
29593
29616
  return (Array.isArray(item) &&
29594
29617
  typeof item[0] === 'number' &&
29595
29618
  item[0] !== 0 /* LispType.None */ &&
29596
- item[0] !== 88 /* LispType.True */);
29619
+ item[0] !== 89 /* LispType.True */);
29597
29620
  }
29598
29621
  class Prop {
29599
29622
  constructor(context, prop, isConst = false, isGlobal = false, isVariable = false) {
@@ -29614,9 +29637,12 @@ class Prop {
29614
29637
  }
29615
29638
  }
29616
29639
 
29640
+ exports.AsyncFunction = AsyncFunction;
29641
+ exports.AsyncGeneratorFunction = AsyncGeneratorFunction;
29617
29642
  exports.CodeString = CodeString;
29618
29643
  exports.ExecContext = ExecContext;
29619
29644
  exports.FunctionScope = FunctionScope;
29645
+ exports.GeneratorFunction = GeneratorFunction;
29620
29646
  exports.LocalScope = LocalScope;
29621
29647
  exports.Prop = Prop;
29622
29648
  exports.SandboxError = SandboxError;
@@ -146412,6 +146438,9 @@ ${'='.repeat(60)}
146412
146438
  // Use systemPrompt (native in rc168+) with fallback to customPrompt for backward compat
146413
146439
  systemPrompt: systemPrompt || this.config.systemPrompt || this.config.customPrompt,
146414
146440
  };
146441
+ if (this.config.maxIterations !== undefined) {
146442
+ options.maxIterations = this.config.maxIterations;
146443
+ }
146415
146444
  // Enable tracing in debug mode for better diagnostics
146416
146445
  // This uses SimpleTelemetry for lightweight tracing
146417
146446
  let traceFilePath = '';
@@ -146955,12 +146984,15 @@ ${'='.repeat(60)}
146955
146984
  catch (parseErr) {
146956
146985
  const errMsg = parseErr instanceof Error ? parseErr.message : String(parseErr);
146957
146986
  log(`🔍 Direct JSON parsing failed: ${errMsg}`);
146958
- // If the response starts with "I cannot" or similar, it's likely a refusal
146987
+ // If the response indicates refusal, return it as plain text output
146959
146988
  if (response.toLowerCase().includes('i cannot') ||
146960
146989
  response.toLowerCase().includes('unable to')) {
146961
- console.error('🚫 AI refused to analyze - returning empty result');
146990
+ console.error('🚫 AI refused to analyze - returning refusal as output');
146991
+ const trimmed = response.trim();
146962
146992
  return {
146963
146993
  issues: [],
146994
+ output: trimmed ? { text: trimmed } : {},
146995
+ debug: debugInfo,
146964
146996
  };
146965
146997
  }
146966
146998
  // Not valid JSON - treat entire response as text output
@@ -152070,87 +152102,15 @@ class FailureConditionEvaluator {
152070
152102
  if (!this.sandbox) {
152071
152103
  this.sandbox = this.createSecureSandbox();
152072
152104
  }
152073
- let result;
152074
- // Primary path: SandboxJS
152105
+ let exec;
152075
152106
  try {
152076
- let exec;
152077
- try {
152078
- exec = this.sandbox.compile(`return (${raw});`);
152079
- }
152080
- catch {
152081
- const normalizedExpr = normalize(condition);
152082
- exec = this.sandbox.compile(`return (${normalizedExpr});`);
152083
- }
152084
- result = exec(scope).run();
152107
+ exec = this.sandbox.compile(`return (${raw});`);
152085
152108
  }
152086
- catch (_primaryErr) {
152087
- // Fallback path: Node VM for modern syntax (optional chaining, nullish coalescing)
152088
- // Build a minimal, safe context with only whitelisted symbols
152089
- try {
152090
- const vm = __nccwpck_require__(30714);
152091
- const ctx = {
152092
- // Scope vars
152093
- output,
152094
- outputs,
152095
- debug: debugData,
152096
- memory: memoryAccessor,
152097
- issues,
152098
- metadata,
152099
- criticalIssues,
152100
- errorIssues,
152101
- totalIssues,
152102
- warningIssues,
152103
- infoIssues,
152104
- checkName,
152105
- schema,
152106
- group,
152107
- branch,
152108
- baseBranch,
152109
- filesChanged,
152110
- filesCount,
152111
- event,
152112
- env,
152113
- inputs,
152114
- // Helpers
152115
- contains,
152116
- startsWith,
152117
- endsWith,
152118
- length,
152119
- always,
152120
- success,
152121
- failure,
152122
- log,
152123
- hasIssue,
152124
- countIssues,
152125
- hasFileMatching,
152126
- hasIssueWith,
152127
- hasFileWith,
152128
- hasMinPermission,
152129
- isOwner,
152130
- isMember,
152131
- isCollaborator,
152132
- isContributor,
152133
- isFirstTimer,
152134
- Math,
152135
- JSON,
152136
- };
152137
- const context = vm.createContext(ctx);
152138
- // Try raw first; if it throws due to semicolons/newlines, normalize
152139
- let code = `(${raw})`;
152140
- try {
152141
- result = new vm.Script(code).runInContext(context, { timeout: 50 });
152142
- }
152143
- catch {
152144
- const normalizedExpr = normalize(condition);
152145
- code = `(${normalizedExpr})`;
152146
- result = new vm.Script(code).runInContext(context, { timeout: 50 });
152147
- }
152148
- }
152149
- catch (vmErr) {
152150
- console.error('❌ Failed to evaluate expression:', condition, vmErr);
152151
- throw vmErr;
152152
- }
152109
+ catch {
152110
+ const normalizedExpr = normalize(condition);
152111
+ exec = this.sandbox.compile(`return (${normalizedExpr});`);
152153
152112
  }
152113
+ const result = exec(scope).run();
152154
152114
  try {
152155
152115
  (__nccwpck_require__(86999).logger).debug(` fail_if: result=${Boolean(result)}`);
152156
152116
  }
@@ -154120,6 +154080,10 @@ exports.configSchema = {
154120
154080
  type: 'string',
154121
154081
  description: 'Probe promptType for this check (underscore style)',
154122
154082
  },
154083
+ ai_max_iterations: {
154084
+ type: 'number',
154085
+ description: 'Maximum tool iterations for ProbeAgent (underscore style)',
154086
+ },
154123
154087
  ai_system_prompt: {
154124
154088
  type: 'string',
154125
154089
  description: 'System prompt for this check (underscore style)',
@@ -154403,7 +154367,7 @@ exports.configSchema = {
154403
154367
  description: 'Arguments/inputs for the workflow',
154404
154368
  },
154405
154369
  overrides: {
154406
- $ref: '#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-11359-23582-src_types_config.ts-0-41281%3E%3E',
154370
+ $ref: '#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-11434-23754-src_types_config.ts-0-41453%3E%3E',
154407
154371
  description: 'Override specific step configurations in the workflow',
154408
154372
  },
154409
154373
  output_mapping: {
@@ -154419,7 +154383,7 @@ exports.configSchema = {
154419
154383
  description: 'Config file path - alternative to workflow ID (loads a Visor config file as workflow)',
154420
154384
  },
154421
154385
  workflow_overrides: {
154422
- $ref: '#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-11359-23582-src_types_config.ts-0-41281%3E%3E',
154386
+ $ref: '#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-11434-23754-src_types_config.ts-0-41453%3E%3E',
154423
154387
  description: 'Alias for overrides - workflow step overrides (backward compatibility)',
154424
154388
  },
154425
154389
  ref: {
@@ -154551,6 +154515,10 @@ exports.configSchema = {
154551
154515
  type: 'number',
154552
154516
  description: 'Request timeout in milliseconds',
154553
154517
  },
154518
+ max_iterations: {
154519
+ type: 'number',
154520
+ description: 'Maximum tool iterations for ProbeAgent',
154521
+ },
154554
154522
  debug: {
154555
154523
  type: 'boolean',
154556
154524
  description: 'Enable debug mode',
@@ -155049,7 +155017,7 @@ exports.configSchema = {
155049
155017
  description: 'Custom output name (defaults to workflow name)',
155050
155018
  },
155051
155019
  overrides: {
155052
- $ref: '#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-11359-23582-src_types_config.ts-0-41281%3E%3E',
155020
+ $ref: '#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-11434-23754-src_types_config.ts-0-41453%3E%3E',
155053
155021
  description: 'Step overrides',
155054
155022
  },
155055
155023
  output_mapping: {
@@ -155064,13 +155032,13 @@ exports.configSchema = {
155064
155032
  '^x-': {},
155065
155033
  },
155066
155034
  },
155067
- 'Record<string,Partial<interface-src_types_config.ts-11359-23582-src_types_config.ts-0-41281>>': {
155035
+ 'Record<string,Partial<interface-src_types_config.ts-11434-23754-src_types_config.ts-0-41453>>': {
155068
155036
  type: 'object',
155069
155037
  additionalProperties: {
155070
- $ref: '#/definitions/Partial%3Cinterface-src_types_config.ts-11359-23582-src_types_config.ts-0-41281%3E',
155038
+ $ref: '#/definitions/Partial%3Cinterface-src_types_config.ts-11434-23754-src_types_config.ts-0-41453%3E',
155071
155039
  },
155072
155040
  },
155073
- 'Partial<interface-src_types_config.ts-11359-23582-src_types_config.ts-0-41281>': {
155041
+ 'Partial<interface-src_types_config.ts-11434-23754-src_types_config.ts-0-41453>': {
155074
155042
  type: 'object',
155075
155043
  additionalProperties: false,
155076
155044
  },
@@ -158679,6 +158647,7 @@ const promises_1 = __importDefault(__nccwpck_require__(91943));
158679
158647
  const path_1 = __importDefault(__nccwpck_require__(16928));
158680
158648
  const author_permissions_1 = __nccwpck_require__(53859);
158681
158649
  const memory_store_1 = __nccwpck_require__(18216);
158650
+ const sandbox_1 = __nccwpck_require__(12630);
158682
158651
  /**
158683
158652
  * Sanitize label strings to only allow [A-Za-z0-9:/\- ] characters (including spaces and hyphens)
158684
158653
  * @param value - Label value to sanitize
@@ -158956,20 +158925,24 @@ function configureLiquidWithExtensions(liquid) {
158956
158925
  const name = typeof varName === 'string' && varName.trim() ? varName.trim() : 'i';
158957
158926
  const body = String(expr || '');
158958
158927
  try {
158959
- // Build a tiny predicate; expose only item, idx, arr
158960
- const fn = new Function(name, 'idx', 'arr', `try { return (${body}); } catch { return false; }`);
158928
+ // Use sandbox for secure evaluation
158929
+ const sandbox = (0, sandbox_1.createSecureSandbox)();
158961
158930
  const out = [];
158962
158931
  for (let idx = 0; idx < arr.length; idx++) {
158963
- const i = arr[idx];
158932
+ const item = arr[idx];
158964
158933
  let ok = false;
158965
158934
  try {
158966
- ok = !!fn(i, idx, arr);
158935
+ const scope = { [name]: item, idx, arr };
158936
+ ok = !!(0, sandbox_1.compileAndRun)(sandbox, body, scope, {
158937
+ injectLog: false,
158938
+ wrapFunction: true,
158939
+ });
158967
158940
  }
158968
158941
  catch {
158969
158942
  ok = false;
158970
158943
  }
158971
158944
  if (ok)
158972
- out.push(i);
158945
+ out.push(item);
158973
158946
  }
158974
158947
  return out;
158975
158948
  }
@@ -162099,6 +162072,10 @@ class AICheckProvider extends check_provider_interface_1.CheckProvider {
162099
162072
  if (aiAny.timeout !== undefined) {
162100
162073
  aiConfig.timeout = aiAny.timeout;
162101
162074
  }
162075
+ if (aiAny.max_iterations !== undefined || aiAny.maxIterations !== undefined) {
162076
+ const raw = aiAny.max_iterations ?? aiAny.maxIterations;
162077
+ aiConfig.maxIterations = Number(raw);
162078
+ }
162102
162079
  if (aiAny.provider !== undefined) {
162103
162080
  aiConfig.provider = aiAny.provider;
162104
162081
  }
@@ -162260,6 +162237,9 @@ class AICheckProvider extends check_provider_interface_1.CheckProvider {
162260
162237
  if (config.ai_provider !== undefined) {
162261
162238
  aiConfig.provider = config.ai_provider;
162262
162239
  }
162240
+ if (config.ai_max_iterations !== undefined && aiConfig.maxIterations === undefined) {
162241
+ aiConfig.maxIterations = config.ai_max_iterations;
162242
+ }
162263
162243
  // Get custom prompt from config - REQUIRED, no fallbacks
162264
162244
  const customPrompt = config.prompt;
162265
162245
  if (!customPrompt) {
@@ -162671,6 +162651,7 @@ class AICheckProvider extends check_provider_interface_1.CheckProvider {
162671
162651
  'ai.model',
162672
162652
  'ai.apiKey',
162673
162653
  'ai.timeout',
162654
+ 'ai.max_iterations',
162674
162655
  'ai.mcpServers',
162675
162656
  'ai.enableDelegate',
162676
162657
  // legacy persona/prompt keys supported in config
@@ -162678,6 +162659,7 @@ class AICheckProvider extends check_provider_interface_1.CheckProvider {
162678
162659
  'ai_prompt_type',
162679
162660
  'ai_custom_prompt',
162680
162661
  'ai_system_prompt',
162662
+ 'ai_max_iterations',
162681
162663
  // new provider resilience and tools toggles
162682
162664
  'ai.retry',
162683
162665
  'ai.fallback',
@@ -163532,43 +163514,10 @@ async function safeImport(moduleName) {
163532
163514
  /***/ }),
163533
163515
 
163534
163516
  /***/ 11878:
163535
- /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
163517
+ /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
163536
163518
 
163537
163519
  "use strict";
163538
163520
 
163539
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
163540
- if (k2 === undefined) k2 = k;
163541
- var desc = Object.getOwnPropertyDescriptor(m, k);
163542
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
163543
- desc = { enumerable: true, get: function() { return m[k]; } };
163544
- }
163545
- Object.defineProperty(o, k2, desc);
163546
- }) : (function(o, m, k, k2) {
163547
- if (k2 === undefined) k2 = k;
163548
- o[k2] = m[k];
163549
- }));
163550
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
163551
- Object.defineProperty(o, "default", { enumerable: true, value: v });
163552
- }) : function(o, v) {
163553
- o["default"] = v;
163554
- });
163555
- var __importStar = (this && this.__importStar) || (function () {
163556
- var ownKeys = function(o) {
163557
- ownKeys = Object.getOwnPropertyNames || function (o) {
163558
- var ar = [];
163559
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
163560
- return ar;
163561
- };
163562
- return ownKeys(o);
163563
- };
163564
- return function (mod) {
163565
- if (mod && mod.__esModule) return mod;
163566
- var result = {};
163567
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
163568
- __setModuleDefault(result, mod);
163569
- return result;
163570
- };
163571
- })();
163572
163521
  Object.defineProperty(exports, "__esModule", ({ value: true }));
163573
163522
  exports.CommandCheckProvider = void 0;
163574
163523
  const check_provider_interface_1 = __nccwpck_require__(14131);
@@ -164050,29 +163999,6 @@ ${bodyWithReturn}
164050
163999
  else {
164051
164000
  finalOutput = (0, sandbox_1.compileAndRun)(this.sandbox, code, { scope: jsContext }, { injectLog: false, wrapFunction: false });
164052
164001
  }
164053
- // Fallback: if sandbox could not preserve primitives (e.g., booleans lost),
164054
- // attempt to re-evaluate the transform in a locked Node VM context to get plain JS values.
164055
- try {
164056
- if (finalOutput &&
164057
- typeof finalOutput === 'object' &&
164058
- !Array.isArray(finalOutput) &&
164059
- (finalOutput.error === undefined ||
164060
- finalOutput.issues === undefined)) {
164061
- const vm = await Promise.resolve().then(() => __importStar(__nccwpck_require__(30714)));
164062
- const vmContext = vm.createContext({ scope: jsContext });
164063
- const vmCode = `
164064
- (function(){
164065
- const output = scope.output; const pr = scope.pr; const files = scope.files; const outputs = scope.outputs; const env = scope.env; const log = ()=>{};
164066
- ${bodyWithReturn}
164067
- })()
164068
- `;
164069
- const vmResult = vm.runInContext(vmCode, vmContext, { timeout: 1000 });
164070
- if (vmResult && typeof vmResult === 'object') {
164071
- finalOutput = vmResult;
164072
- }
164073
- }
164074
- }
164075
- catch { }
164076
164002
  // Create a plain JSON snapshot of the transform result to avoid proxy/getter surprises
164077
164003
  // Prefer JSON stringify inside the sandbox realm (so it knows how to serialize its own objects),
164078
164004
  // then fall back to host-side JSON clone and finally to a shallow copy of own enumerable properties.
@@ -165386,9 +165312,7 @@ class CustomToolExecutor {
165386
165312
  * Apply JavaScript transform to output
165387
165313
  */
165388
165314
  async applyJavaScriptTransform(transformJs, output, context) {
165389
- if (!this.sandbox) {
165390
- this.sandbox = (0, sandbox_1.createSecureSandbox)();
165391
- }
165315
+ this.sandbox = (0, sandbox_1.createSecureSandbox)();
165392
165316
  const code = `
165393
165317
  const output = ${JSON.stringify(output)};
165394
165318
  const context = ${JSON.stringify(context)};
@@ -166683,9 +166607,7 @@ class HttpClientProvider extends check_provider_interface_1.CheckProvider {
166683
166607
  // Apply JavaScript transformation if specified
166684
166608
  if (transformJs) {
166685
166609
  try {
166686
- if (!this.sandbox) {
166687
- this.sandbox = this.createSecureSandbox();
166688
- }
166610
+ this.sandbox = this.createSecureSandbox();
166689
166611
  // Create scope for JavaScript transform (scope, not context)
166690
166612
  const jsScope = {
166691
166613
  output: data,
@@ -168115,9 +168037,7 @@ class McpCheckProvider extends check_provider_interface_1.CheckProvider {
168115
168037
  // Apply JavaScript transform using secure sandbox
168116
168038
  if (cfg.transform_js) {
168117
168039
  try {
168118
- if (!this.sandbox) {
168119
- this.sandbox = this.createSecureSandbox();
168120
- }
168040
+ this.sandbox = this.createSecureSandbox();
168121
168041
  // Build scope with all context variables
168122
168042
  const scope = {
168123
168043
  output: finalOutput,
@@ -169234,9 +169154,7 @@ class MemoryCheckProvider extends check_provider_interface_1.CheckProvider {
169234
169154
  * Evaluate JavaScript expression in context using SandboxJS for secure execution
169235
169155
  */
169236
169156
  evaluateJavaScript(expression, context) {
169237
- if (!this.sandbox) {
169238
- this.sandbox = this.createSecureSandbox();
169239
- }
169157
+ this.sandbox = this.createSecureSandbox();
169240
169158
  try {
169241
169159
  const scope = { ...context };
169242
169160
  return (0, sandbox_1.compileAndRun)(this.sandbox, `return (${expression});`, scope, {
@@ -170046,7 +169964,6 @@ class WorkflowCheckProvider extends check_provider_interface_1.CheckProvider {
170046
169964
  if (!workflow.outputs) {
170047
169965
  return outputs;
170048
169966
  }
170049
- const sandbox = (0, sandbox_1.createSecureSandbox)();
170050
169967
  // Flatten GroupedCheckResults (group -> CheckResult[]) to a simple map
170051
169968
  // of checkName -> { output, issues } so workflow-level value_js can
170052
169969
  // reference outputs["security"].issues, etc.
@@ -170070,6 +169987,7 @@ class WorkflowCheckProvider extends check_provider_interface_1.CheckProvider {
170070
169987
  for (const output of workflow.outputs) {
170071
169988
  if (output.value_js) {
170072
169989
  // JavaScript expression
169990
+ const sandbox = (0, sandbox_1.createSecureSandbox)();
170073
169991
  outputs[output.name] = (0, sandbox_1.compileAndRun)(sandbox, output.value_js, {
170074
169992
  inputs,
170075
169993
  outputs: outputsMap,
@@ -181395,18 +181313,10 @@ async function evaluateRunJs(runJs, checkId, checkConfig, result, context, _stat
181395
181313
  const evalResult = (0, sandbox_1.compileAndRun)(sandbox, code, { scope: scopeObj }, { injectLog: false, wrapFunction: false });
181396
181314
  return Array.isArray(evalResult) ? evalResult.filter(Boolean) : [];
181397
181315
  }
181398
- catch (_e) {
181399
- // Fallback to VM for modern syntax used inside run_js
181400
- try {
181401
- const vm = __nccwpck_require__(30714);
181402
- const context = vm.createContext({ scope: scopeObj, console: { log: () => { } } });
181403
- const src = `(() => { ${runJs}\n })()`;
181404
- const val = new vm.Script(src).runInContext(context, { timeout: 100 });
181405
- return Array.isArray(val) ? val.filter((x) => typeof x === 'string' && x) : [];
181406
- }
181407
- catch (_vmErr) {
181408
- return [];
181409
- }
181316
+ catch (error) {
181317
+ const msg = error instanceof Error ? error.message : String(error);
181318
+ logger_1.logger.error(`[Routing] Error in run_js sandbox evaluation: ${msg}`);
181319
+ return [];
181410
181320
  }
181411
181321
  }
181412
181322
  catch (error) {
@@ -181525,28 +181435,10 @@ async function evaluateGoto(gotoJs, gotoStatic, checkId, checkConfig, result, co
181525
181435
  return evalResult;
181526
181436
  }
181527
181437
  }
181528
- catch (_e) {
181529
- // Fallback to VM for modern syntax in goto_js
181530
- try {
181531
- const vm = __nccwpck_require__(30714);
181532
- const contextObj = {
181533
- step: scopeObj.step,
181534
- outputs: scopeObj.outputs,
181535
- outputs_history: scopeObj.outputs_history,
181536
- output: scopeObj.output,
181537
- memory: scopeObj.memory,
181538
- event: scopeObj.event,
181539
- forEach: scopeObj.forEach,
181540
- };
181541
- const vmctx = vm.createContext(contextObj);
181542
- const src = `(() => { ${gotoJs}\n })()`;
181543
- const res = new vm.Script(src).runInContext(vmctx, { timeout: 100 });
181544
- if (typeof res === 'string' && res)
181545
- return res;
181546
- }
181547
- catch (_vmErr) {
181548
- // ignore; fall through to static goto
181549
- }
181438
+ catch (error) {
181439
+ const msg = error instanceof Error ? error.message : String(error);
181440
+ logger_1.logger.error(`[Routing] Error in goto_js sandbox evaluation: ${msg}`);
181441
+ // Fall through to static goto
181550
181442
  }
181551
181443
  }
181552
181444
  catch (error) {
@@ -181635,31 +181527,10 @@ async function evaluateTransitions(transitions, checkId, checkConfig, result, co
181635
181527
  try {
181636
181528
  matched = (0, sandbox_1.compileAndRun)(sandbox, code, { scope: scopeObj }, { injectLog: false, wrapFunction: false });
181637
181529
  }
181638
- catch (_e) {
181639
- // Fallback: Node VM for modern syntax like optional chaining and ??
181640
- try {
181641
- const vm = __nccwpck_require__(30714);
181642
- const helpersFns = {
181643
- any: (arr, pred) => Array.isArray(arr) && arr.some(pred),
181644
- all: (arr, pred) => Array.isArray(arr) && arr.every(pred),
181645
- none: (arr, pred) => Array.isArray(arr) && !arr.some(pred),
181646
- count: (arr, pred) => Array.isArray(arr) ? arr.filter(pred).length : 0,
181647
- };
181648
- const context = vm.createContext({
181649
- step: scopeObj.step,
181650
- outputs: scopeObj.outputs,
181651
- outputs_history: scopeObj.outputs_history,
181652
- output: scopeObj.output,
181653
- memory: scopeObj.memory,
181654
- event: scopeObj.event,
181655
- ...helpersFns,
181656
- });
181657
- const res = new vm.Script(`(${rule.when})`).runInContext(context, { timeout: 50 });
181658
- matched = !!res;
181659
- }
181660
- catch (_vmErr) {
181661
- matched = false;
181662
- }
181530
+ catch (error) {
181531
+ const msg = error instanceof Error ? error.message : String(error);
181532
+ logger_1.logger.warn(`[Routing] Error evaluating transition 'when' clause: ${msg}`);
181533
+ matched = false;
181663
181534
  }
181664
181535
  if (matched) {
181665
181536
  if (rule.to === null)
@@ -185508,6 +185379,7 @@ const environment_1 = __nccwpck_require__(13228);
185508
185379
  const mocks_1 = __nccwpck_require__(20490);
185509
185380
  const fixture_1 = __nccwpck_require__(29716);
185510
185381
  const validator_1 = __nccwpck_require__(8075);
185382
+ const sandbox_1 = __nccwpck_require__(12630);
185511
185383
  function ensureTestEnvDefaults() {
185512
185384
  if (!process.env.VISOR_TEST_MODE)
185513
185385
  process.env.VISOR_TEST_MODE = 'true';
@@ -185937,15 +185809,13 @@ class VisorTestRunner {
185937
185809
  continue;
185938
185810
  try {
185939
185811
  if (outputDef.value_js) {
185940
- // Evaluate JavaScript expression
185941
- const fn = new Function('steps', 'outputs', 'results', `
185942
- try {
185943
- ${outputDef.value_js}
185944
- } catch (e) {
185945
- return undefined;
185946
- }
185947
- `);
185948
- computed[outputDef.name] = fn(steps, outputs, results);
185812
+ // Evaluate JavaScript expression using sandbox
185813
+ const sandbox = (0, sandbox_1.createSecureSandbox)();
185814
+ const scope = { steps, outputs, results };
185815
+ computed[outputDef.name] = (0, sandbox_1.compileAndRun)(sandbox, outputDef.value_js, scope, {
185816
+ injectLog: false,
185817
+ wrapFunction: true,
185818
+ });
185949
185819
  }
185950
185820
  else if (outputDef.value) {
185951
185821
  // Evaluate Liquid template with extended filters and tags
@@ -187165,6 +187035,9 @@ const schema = {
187165
187035
  include: {
187166
187036
  oneOf: [{ type: 'string' }, { type: 'array', items: { type: 'string' } }],
187167
187037
  },
187038
+ imports: {
187039
+ oneOf: [{ type: 'string' }, { type: 'array', items: { type: 'string' } }],
187040
+ },
187168
187041
  // Optional: co-located config (ignored by tests DSL validator)
187169
187042
  steps: { type: 'object' },
187170
187043
  checks: { type: 'object' },
@@ -193702,14 +193575,6 @@ module.exports = require("node:util");
193702
193575
 
193703
193576
  /***/ }),
193704
193577
 
193705
- /***/ 30714:
193706
- /***/ ((module) => {
193707
-
193708
- "use strict";
193709
- module.exports = require("node:vm");
193710
-
193711
- /***/ }),
193712
-
193713
193578
  /***/ 70857:
193714
193579
  /***/ ((module) => {
193715
193580
 
@@ -248694,6 +248559,22 @@ function detectUnrecognizedToolCall(xmlString, validTools) {
248694
248559
  return toolName;
248695
248560
  }
248696
248561
  }
248562
+ const allToolNames = [.../* @__PURE__ */ new Set([...knownToolNames, ...validTools])];
248563
+ for (const toolName of allToolNames) {
248564
+ const escapedToolName = toolName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
248565
+ const wrapperPatterns = [
248566
+ new RegExp(`<tool_name>\\s*${escapedToolName}\\s*</tool_name>`, "i"),
248567
+ new RegExp(`<function>\\s*${escapedToolName}\\s*</function>`, "i"),
248568
+ new RegExp(`<name>\\s*${escapedToolName}\\s*</name>`, "i"),
248569
+ // Also check for tool name immediately after api_call or call opening tag
248570
+ new RegExp(`<(?:api_call|call)[^>]*>[\\s\\S]*?<tool_name>\\s*${escapedToolName}`, "i")
248571
+ ];
248572
+ for (const pattern of wrapperPatterns) {
248573
+ if (pattern.test(xmlString)) {
248574
+ return `wrapped_tool:${toolName}`;
248575
+ }
248576
+ }
248577
+ }
248697
248578
  return null;
248698
248579
  }
248699
248580
  function parseTargets(targets) {
@@ -305968,6 +305849,27 @@ var ProbeAgent_exports = {};
305968
305849
  __export(ProbeAgent_exports, {
305969
305850
  ProbeAgent: () => ProbeAgent
305970
305851
  });
305852
+ function extractWrappedToolName(wrappedToolError) {
305853
+ if (!wrappedToolError || typeof wrappedToolError !== "string") {
305854
+ return "unknown";
305855
+ }
305856
+ const colonIndex = wrappedToolError.indexOf(":");
305857
+ return colonIndex !== -1 ? wrappedToolError.slice(colonIndex + 1) : "unknown";
305858
+ }
305859
+ function isWrappedToolError(error2) {
305860
+ return error2 && typeof error2 === "string" && error2.startsWith("wrapped_tool:");
305861
+ }
305862
+ function createWrappedToolErrorMessage(wrappedToolName) {
305863
+ return `Your response contained an incorrectly formatted tool call (${wrappedToolName} wrapped in XML tags). This cannot be used.
305864
+
305865
+ Please use the CORRECT format:
305866
+
305867
+ <${wrappedToolName}>
305868
+ Your content here
305869
+ </${wrappedToolName}>
305870
+
305871
+ Do NOT wrap in other tags like <api_call>, <tool_name>, <function>, etc.`;
305872
+ }
305971
305873
  var import_dotenv, import_anthropic2, import_openai2, import_google2, import_ai3, import_crypto8, import_events4, import_fs11, import_promises6, import_path13, MAX_TOOL_ITERATIONS, MAX_HISTORY_MESSAGES, MAX_IMAGE_FILE_SIZE, ProbeAgent;
305972
305874
  var init_ProbeAgent = __esm({
305973
305875
  "src/agent/ProbeAgent.js"() {
@@ -307978,6 +307880,9 @@ You are working with a repository located at: ${searchDirectory}
307978
307880
  console.log(`[DEBUG] Schema provided, using extended iteration limit: ${maxIterations} (base: ${baseMaxIterations})`);
307979
307881
  }
307980
307882
  }
307883
+ let lastFormatErrorType = null;
307884
+ let sameFormatErrorCount = 0;
307885
+ const MAX_REPEATED_FORMAT_ERRORS = 3;
307981
307886
  while (currentIteration < maxIterations && !completionAttempted) {
307982
307887
  currentIteration++;
307983
307888
  if (this.cancelled) throw new Error("Request was cancelled by the user");
@@ -308176,7 +308081,22 @@ You are working with a repository located at: ${searchDirectory}
308176
308081
  (msg) => msg.role === "assistant" && msg.content && !(this.mcpBridge ? parseHybridXmlToolCall(msg.content, validTools, this.mcpBridge) : parseXmlToolCallWithThinking(msg.content, validTools))
308177
308082
  );
308178
308083
  if (lastAssistantMessage) {
308179
- finalResult = lastAssistantMessage.content;
308084
+ const prevContent = lastAssistantMessage.content;
308085
+ const wrappedToolError = detectUnrecognizedToolCall(prevContent, validTools);
308086
+ if (isWrappedToolError(wrappedToolError)) {
308087
+ const wrappedToolName = extractWrappedToolName(wrappedToolError);
308088
+ if (this.debug) {
308089
+ console.log(`[DEBUG] Previous response contains wrapped tool '${wrappedToolName}' - rejecting for __PREVIOUS_RESPONSE__`);
308090
+ }
308091
+ currentMessages.push({ role: "assistant", content: assistantResponseContent });
308092
+ currentMessages.push({
308093
+ role: "user",
308094
+ content: createWrappedToolErrorMessage(wrappedToolName)
308095
+ });
308096
+ completionAttempted = false;
308097
+ continue;
308098
+ }
308099
+ finalResult = prevContent;
308180
308100
  if (this.debug) console.log(`[DEBUG] Using previous response as completion: ${finalResult.substring(0, 100)}...`);
308181
308101
  } else {
308182
308102
  finalResult = "Error: No previous response found to use as completion.";
@@ -308447,7 +308367,33 @@ ${errorXml}
308447
308367
  currentMessages.push({ role: "assistant", content: assistantResponseContent });
308448
308368
  const unrecognizedTool = detectUnrecognizedToolCall(assistantResponseContent, validTools);
308449
308369
  let reminderContent;
308450
- if (unrecognizedTool) {
308370
+ if (isWrappedToolError(unrecognizedTool)) {
308371
+ const wrappedToolName = extractWrappedToolName(unrecognizedTool);
308372
+ if (this.debug) {
308373
+ console.log(`[DEBUG] Detected wrapped tool '${wrappedToolName}' in assistant response - wrong XML format.`);
308374
+ }
308375
+ const toolError = new ParameterError(
308376
+ `Tool '${wrappedToolName}' found but in WRONG FORMAT - do not wrap tools in other XML tags.`,
308377
+ {
308378
+ suggestion: `Use the tool tag DIRECTLY without any wrapper:
308379
+
308380
+ CORRECT FORMAT:
308381
+ <${wrappedToolName}>
308382
+ <param>value</param>
308383
+ </${wrappedToolName}>
308384
+
308385
+ WRONG (what you did - do not wrap in other tags):
308386
+ <api_call><tool_name>${wrappedToolName}</tool_name>...</api_call>
308387
+ <function>${wrappedToolName}</function>
308388
+ <call name="${wrappedToolName}">...</call>
308389
+
308390
+ Remove ALL wrapper tags and use <${wrappedToolName}> directly as the outermost tag.`
308391
+ }
308392
+ );
308393
+ reminderContent = `<tool_result>
308394
+ ${formatErrorForAI(toolError)}
308395
+ </tool_result>`;
308396
+ } else if (unrecognizedTool) {
308451
308397
  if (this.debug) {
308452
308398
  console.log(`[DEBUG] Detected unrecognized tool '${unrecognizedTool}' in assistant response.`);
308453
308399
  }
@@ -308458,6 +308404,20 @@ ${errorXml}
308458
308404
  ${formatErrorForAI(toolError)}
308459
308405
  </tool_result>`;
308460
308406
  } else {
308407
+ if (currentIteration >= maxIterations) {
308408
+ let cleanedResponse = assistantResponseContent;
308409
+ cleanedResponse = cleanedResponse.replace(/<thinking>[\s\S]*?<\/thinking>/gi, "").trim();
308410
+ cleanedResponse = cleanedResponse.replace(/<thinking>[\s\S]*$/gi, "").trim();
308411
+ const hasSubstantialContent = cleanedResponse.length > 50 && !cleanedResponse.includes("<api_call>") && !cleanedResponse.includes("<tool_name>") && !cleanedResponse.includes("<function>");
308412
+ if (hasSubstantialContent) {
308413
+ if (this.debug) {
308414
+ console.log(`[DEBUG] Max iterations reached - accepting AI response as final answer (${cleanedResponse.length} chars)`);
308415
+ }
308416
+ finalResult = cleanedResponse;
308417
+ completionAttempted = true;
308418
+ break;
308419
+ }
308420
+ }
308461
308421
  reminderContent = `Please use one of the available tools to help answer the question, or use attempt_completion if you have enough information to provide a final answer.
308462
308422
 
308463
308423
  Remember: Use proper XML format with BOTH opening and closing tags:
@@ -308487,6 +308447,25 @@ Note: <attempt_complete></attempt_complete> reuses your PREVIOUS assistant messa
308487
308447
  console.log(`[DEBUG] No tool call detected in assistant response. Prompting for tool use.`);
308488
308448
  }
308489
308449
  }
308450
+ if (unrecognizedTool) {
308451
+ const isWrapped = isWrappedToolError(unrecognizedTool);
308452
+ const errorCategory = isWrapped ? "wrapped_tool" : unrecognizedTool;
308453
+ if (errorCategory === lastFormatErrorType) {
308454
+ sameFormatErrorCount++;
308455
+ if (sameFormatErrorCount >= MAX_REPEATED_FORMAT_ERRORS) {
308456
+ const errorDesc = isWrapped ? "wrapped tool format" : unrecognizedTool;
308457
+ console.error(`[ERROR] Format error category '${errorCategory}' repeated ${sameFormatErrorCount} times. Breaking loop early to prevent infinite iteration.`);
308458
+ finalResult = `Error: Unable to complete request. The AI model repeatedly used incorrect tool call format (${errorDesc}). Please try rephrasing your question or using a different model.`;
308459
+ break;
308460
+ }
308461
+ } else {
308462
+ lastFormatErrorType = errorCategory;
308463
+ sameFormatErrorCount = 1;
308464
+ }
308465
+ } else {
308466
+ lastFormatErrorType = null;
308467
+ sameFormatErrorCount = 0;
308468
+ }
308490
308469
  }
308491
308470
  if (currentMessages.length > MAX_HISTORY_MESSAGES) {
308492
308471
  const messagesBefore = currentMessages.length;
@@ -345065,7 +345044,7 @@ module.exports = /*#__PURE__*/JSON.parse('{"100":"Continue","101":"Switching Pro
345065
345044
  /***/ ((module) => {
345066
345045
 
345067
345046
  "use strict";
345068
- module.exports = /*#__PURE__*/JSON.parse('{"name":"@probelabs/visor","version":"0.1.126","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":"npm run build:cli && npm run build:sdk","test":"jest && npm run test:yaml","prepublishOnly":"npm run build","test:watch":"jest --watch","test:coverage":"jest --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":"","prebuild":"npm run clean && patch-package && node scripts/generate-config-schema.js","pretest":"patch-package && 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","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-powered code review tool for GitHub Pull Requests - CLI and GitHub Action","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","@modelcontextprotocol/sdk":"^1.25.3","@nyariv/sandboxjs":"^0.8.25","@octokit/action":"^8.0.2","@octokit/auth-app":"^8.1.0","@octokit/core":"^7.0.3","@octokit/rest":"^22.0.0","@probelabs/probe":"^0.6.0-rc206","@types/commander":"^2.12.0","@types/uuid":"^10.0.0","ajv":"^8.17.1","ajv-formats":"^3.0.1","blessed":"^0.1.81","cli-table3":"^0.6.5","commander":"^14.0.0","dotenv":"^17.2.3","ignore":"^7.0.5","js-yaml":"^4.1.0","liquidjs":"^10.21.1","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@*","@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"},"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/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","patch-package":"^8.0.0","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"]}}');
345047
+ module.exports = /*#__PURE__*/JSON.parse('{"name":"@probelabs/visor","version":"0.1.127","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":"npm run build:cli && npm run build:sdk","test":"jest && npm run test:yaml","prepublishOnly":"npm run build","test:watch":"jest --watch","test:coverage":"jest --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":"","prebuild":"npm run clean && node scripts/generate-config-schema.js","pretest":"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","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-powered code review tool for GitHub Pull Requests - CLI and GitHub Action","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","@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","@probelabs/probe":"^0.6.0-rc207","@types/commander":"^2.12.0","@types/uuid":"^10.0.0","ajv":"^8.17.1","ajv-formats":"^3.0.1","blessed":"^0.1.81","cli-table3":"^0.6.5","commander":"^14.0.0","dotenv":"^17.2.3","ignore":"^7.0.5","js-yaml":"^4.1.0","liquidjs":"^10.21.1","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@*","@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"},"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/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"]}}');
345069
345048
 
345070
345049
  /***/ })
345071
345050