@probelabs/visor 0.1.153 → 0.1.154

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 (87) hide show
  1. package/dist/index.js +185 -67
  2. package/dist/output/traces/{run-2026-03-04T13-24-27-240Z.ndjson → run-2026-03-04T15-57-32-312Z.ndjson} +84 -84
  3. package/dist/{traces/run-2026-03-04T13-25-12-321Z.ndjson → output/traces/run-2026-03-04T15-58-17-868Z.ndjson} +1774 -1774
  4. package/dist/providers/mcp-custom-sse-server.d.ts.map +1 -1
  5. package/dist/scheduler/schedule-tool.d.ts.map +1 -1
  6. package/dist/sdk/{check-provider-registry-OEPUY5P6.mjs → check-provider-registry-2HT3USLQ.mjs} +7 -7
  7. package/dist/sdk/{check-provider-registry-ZOGNKTC3.mjs → check-provider-registry-CQTR5OVS.mjs} +7 -7
  8. package/dist/sdk/{check-provider-registry-CSIZGIKC.mjs → check-provider-registry-PK3OTEX6.mjs} +7 -7
  9. package/dist/sdk/{chunk-CPYQDJ27.mjs → chunk-AS6LIEO4.mjs} +3 -3
  10. package/dist/sdk/{chunk-KBX4OIXL.mjs → chunk-AU6RDTY4.mjs} +2 -2
  11. package/dist/sdk/{chunk-Y3XWPKFP.mjs → chunk-GQ7H7E4Y.mjs} +2 -2
  12. package/dist/sdk/{chunk-Y3XWPKFP.mjs.map → chunk-GQ7H7E4Y.mjs.map} +1 -1
  13. package/dist/sdk/{chunk-WG7P66MJ.mjs → chunk-ILIWDV37.mjs} +2 -2
  14. package/dist/sdk/{chunk-DNDS7R3N.mjs → chunk-NZADFXHE.mjs} +7 -1
  15. package/dist/sdk/chunk-NZADFXHE.mjs.map +1 -0
  16. package/dist/sdk/{chunk-U7KB66AN.mjs → chunk-PW3RK2IS.mjs} +55 -35
  17. package/dist/sdk/chunk-PW3RK2IS.mjs.map +1 -0
  18. package/dist/sdk/{chunk-NYK7WDGH.mjs → chunk-RH7C77KY.mjs} +55 -35
  19. package/dist/sdk/chunk-RH7C77KY.mjs.map +1 -0
  20. package/dist/sdk/{chunk-SMR5N5MG.mjs → chunk-S6MIZBKN.mjs} +3 -3
  21. package/dist/sdk/{chunk-SMR5N5MG.mjs.map → chunk-S6MIZBKN.mjs.map} +1 -1
  22. package/dist/sdk/{chunk-ZCUGMT7X.mjs → chunk-SPCGI24K.mjs} +3 -3
  23. package/dist/sdk/{chunk-EYQWEVZF.mjs → chunk-WPF7PJ64.mjs} +55 -35
  24. package/dist/sdk/chunk-WPF7PJ64.mjs.map +1 -0
  25. package/dist/sdk/{chunk-VBN45DBR.mjs → chunk-ZPRIWRM2.mjs} +3 -3
  26. package/dist/sdk/{config-SW3VO4DQ.mjs → config-CWHZO5AL.mjs} +2 -2
  27. package/dist/sdk/{failure-condition-evaluator-R3UE4PE7.mjs → failure-condition-evaluator-LYFZMQ6Y.mjs} +3 -3
  28. package/dist/sdk/{failure-condition-evaluator-Y32S6DB2.mjs → failure-condition-evaluator-TCB66TZU.mjs} +3 -3
  29. package/dist/sdk/{github-frontend-6KZSVSPC.mjs → github-frontend-6C7WVBEL.mjs} +3 -3
  30. package/dist/sdk/{github-frontend-6SIR7QWX.mjs → github-frontend-XKPAYXOT.mjs} +3 -3
  31. package/dist/sdk/{host-A5HS6F6G.mjs → host-6DJCOUJE.mjs} +2 -2
  32. package/dist/sdk/{host-YBJOWFT4.mjs → host-LKPQXXCY.mjs} +2 -2
  33. package/dist/sdk/{routing-MMEOAH34.mjs → routing-5U4Z5KI2.mjs} +4 -4
  34. package/dist/sdk/{routing-U63OJMZQ.mjs → routing-L224WQSY.mjs} +4 -4
  35. package/dist/sdk/{schedule-tool-NMCFABHK.mjs → schedule-tool-7VHYOB5O.mjs} +7 -7
  36. package/dist/sdk/{schedule-tool-NYRLSV4F.mjs → schedule-tool-HRFONU5J.mjs} +7 -7
  37. package/dist/sdk/{schedule-tool-74VMD77T.mjs → schedule-tool-MVXQWDE2.mjs} +7 -7
  38. package/dist/sdk/{schedule-tool-handler-2TFSBZ2O.mjs → schedule-tool-handler-KXZC4ZOR.mjs} +7 -7
  39. package/dist/sdk/{schedule-tool-handler-DRVRLVGD.mjs → schedule-tool-handler-NY67TD3Y.mjs} +7 -7
  40. package/dist/sdk/{schedule-tool-handler-EOQBRZSD.mjs → schedule-tool-handler-VYXBBOB6.mjs} +7 -7
  41. package/dist/sdk/sdk.js +45 -19
  42. package/dist/sdk/sdk.js.map +1 -1
  43. package/dist/sdk/sdk.mjs +6 -6
  44. package/dist/sdk/{trace-helpers-JJLVZ2RJ.mjs → trace-helpers-AWTAWKRA.mjs} +2 -2
  45. package/dist/sdk/{trace-helpers-2BIVADUK.mjs → trace-helpers-GI65SVE2.mjs} +2 -2
  46. package/dist/sdk/{workflow-check-provider-GIW4WECT.mjs → workflow-check-provider-6QS4QI55.mjs} +7 -7
  47. package/dist/sdk/{workflow-check-provider-UQMMFLSK.mjs → workflow-check-provider-HGFTX64I.mjs} +7 -7
  48. package/dist/sdk/{workflow-check-provider-4NHVFLMQ.mjs → workflow-check-provider-PJSFGBCM.mjs} +7 -7
  49. package/dist/sdk/{workflow-registry-MHUSKSD6.mjs → workflow-registry-NGV3SESX.mjs} +2 -2
  50. package/dist/slack/schedule-tool-handler.d.ts.map +1 -1
  51. package/dist/traces/{run-2026-03-04T13-24-27-240Z.ndjson → run-2026-03-04T15-57-32-312Z.ndjson} +84 -84
  52. package/dist/{output/traces/run-2026-03-04T13-25-12-321Z.ndjson → traces/run-2026-03-04T15-58-17-868Z.ndjson} +1774 -1774
  53. package/dist/workflow-registry.d.ts.map +1 -1
  54. package/package.json +2 -2
  55. package/dist/sdk/chunk-DNDS7R3N.mjs.map +0 -1
  56. package/dist/sdk/chunk-EYQWEVZF.mjs.map +0 -1
  57. package/dist/sdk/chunk-NYK7WDGH.mjs.map +0 -1
  58. package/dist/sdk/chunk-U7KB66AN.mjs.map +0 -1
  59. /package/dist/sdk/{check-provider-registry-CSIZGIKC.mjs.map → check-provider-registry-2HT3USLQ.mjs.map} +0 -0
  60. /package/dist/sdk/{check-provider-registry-OEPUY5P6.mjs.map → check-provider-registry-CQTR5OVS.mjs.map} +0 -0
  61. /package/dist/sdk/{check-provider-registry-ZOGNKTC3.mjs.map → check-provider-registry-PK3OTEX6.mjs.map} +0 -0
  62. /package/dist/sdk/{chunk-CPYQDJ27.mjs.map → chunk-AS6LIEO4.mjs.map} +0 -0
  63. /package/dist/sdk/{chunk-KBX4OIXL.mjs.map → chunk-AU6RDTY4.mjs.map} +0 -0
  64. /package/dist/sdk/{chunk-WG7P66MJ.mjs.map → chunk-ILIWDV37.mjs.map} +0 -0
  65. /package/dist/sdk/{chunk-VBN45DBR.mjs.map → chunk-SPCGI24K.mjs.map} +0 -0
  66. /package/dist/sdk/{chunk-ZCUGMT7X.mjs.map → chunk-ZPRIWRM2.mjs.map} +0 -0
  67. /package/dist/sdk/{config-SW3VO4DQ.mjs.map → config-CWHZO5AL.mjs.map} +0 -0
  68. /package/dist/sdk/{failure-condition-evaluator-R3UE4PE7.mjs.map → failure-condition-evaluator-LYFZMQ6Y.mjs.map} +0 -0
  69. /package/dist/sdk/{failure-condition-evaluator-Y32S6DB2.mjs.map → failure-condition-evaluator-TCB66TZU.mjs.map} +0 -0
  70. /package/dist/sdk/{github-frontend-6KZSVSPC.mjs.map → github-frontend-6C7WVBEL.mjs.map} +0 -0
  71. /package/dist/sdk/{github-frontend-6SIR7QWX.mjs.map → github-frontend-XKPAYXOT.mjs.map} +0 -0
  72. /package/dist/sdk/{host-A5HS6F6G.mjs.map → host-6DJCOUJE.mjs.map} +0 -0
  73. /package/dist/sdk/{host-YBJOWFT4.mjs.map → host-LKPQXXCY.mjs.map} +0 -0
  74. /package/dist/sdk/{routing-MMEOAH34.mjs.map → routing-5U4Z5KI2.mjs.map} +0 -0
  75. /package/dist/sdk/{routing-U63OJMZQ.mjs.map → routing-L224WQSY.mjs.map} +0 -0
  76. /package/dist/sdk/{schedule-tool-74VMD77T.mjs.map → schedule-tool-7VHYOB5O.mjs.map} +0 -0
  77. /package/dist/sdk/{schedule-tool-NMCFABHK.mjs.map → schedule-tool-HRFONU5J.mjs.map} +0 -0
  78. /package/dist/sdk/{schedule-tool-NYRLSV4F.mjs.map → schedule-tool-MVXQWDE2.mjs.map} +0 -0
  79. /package/dist/sdk/{schedule-tool-handler-2TFSBZ2O.mjs.map → schedule-tool-handler-KXZC4ZOR.mjs.map} +0 -0
  80. /package/dist/sdk/{schedule-tool-handler-DRVRLVGD.mjs.map → schedule-tool-handler-NY67TD3Y.mjs.map} +0 -0
  81. /package/dist/sdk/{schedule-tool-handler-EOQBRZSD.mjs.map → schedule-tool-handler-VYXBBOB6.mjs.map} +0 -0
  82. /package/dist/sdk/{trace-helpers-2BIVADUK.mjs.map → trace-helpers-AWTAWKRA.mjs.map} +0 -0
  83. /package/dist/sdk/{trace-helpers-JJLVZ2RJ.mjs.map → trace-helpers-GI65SVE2.mjs.map} +0 -0
  84. /package/dist/sdk/{workflow-check-provider-4NHVFLMQ.mjs.map → workflow-check-provider-6QS4QI55.mjs.map} +0 -0
  85. /package/dist/sdk/{workflow-check-provider-GIW4WECT.mjs.map → workflow-check-provider-HGFTX64I.mjs.map} +0 -0
  86. /package/dist/sdk/{workflow-check-provider-UQMMFLSK.mjs.map → workflow-check-provider-PJSFGBCM.mjs.map} +0 -0
  87. /package/dist/sdk/{workflow-registry-MHUSKSD6.mjs.map → workflow-registry-NGV3SESX.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.153';
3
- process.env.PROBE_VERSION = '0.6.0-rc269';
4
- process.env.VISOR_COMMIT_SHA = '812209528637eae4c9bc2358354377275099850f';
5
- process.env.VISOR_COMMIT_SHORT = '81220952';
2
+ process.env.VISOR_VERSION = '0.1.154';
3
+ process.env.PROBE_VERSION = '0.6.0-rc271';
4
+ process.env.VISOR_COMMIT_SHA = '1ceb9f8073c3ec36e82c277d3e4bfcbf3320ba3b';
5
+ process.env.VISOR_COMMIT_SHORT = '1ceb9f80';
6
6
  /******/ (() => { // webpackBootstrap
7
7
  /******/ var __webpack_modules__ = ({
8
8
 
@@ -188256,6 +188256,15 @@ class CustomToolsSSEServer {
188256
188256
  original_expression: args.original_expression,
188257
188257
  // For cancel/pause/resume
188258
188258
  schedule_id: args.schedule_id,
188259
+ // For trigger actions
188260
+ trigger_channels: args.trigger_channels,
188261
+ trigger_from: args.trigger_from,
188262
+ trigger_from_bots: args.trigger_from_bots,
188263
+ trigger_contains: args.trigger_contains,
188264
+ trigger_match: args.trigger_match,
188265
+ trigger_threads: args.trigger_threads,
188266
+ trigger_description: args.trigger_description,
188267
+ trigger_id: args.trigger_id,
188259
188268
  };
188260
188269
  const scheduleResult = await (0, schedule_tool_1.handleScheduleAction)(scheduleArgs, scheduleContext);
188261
188270
  result = scheduleResult.success
@@ -194160,19 +194169,13 @@ function formatTrigger(trigger) {
194160
194169
  * Handle create_trigger action
194161
194170
  */
194162
194171
  async function handleCreateTrigger(args, context, store) {
194163
- // Validate workflow
194164
- if (!args.workflow) {
194165
- return {
194166
- success: false,
194167
- message: 'Missing workflow',
194168
- error: 'Please specify the workflow to run when the trigger fires.',
194169
- };
194170
- }
194172
+ // Default workflow to "default" if not specified
194173
+ const workflow = args.workflow || 'default';
194171
194174
  // Validate workflow exists if we have available workflows
194172
- if (context.availableWorkflows && !context.availableWorkflows.includes(args.workflow)) {
194175
+ if (context.availableWorkflows && !context.availableWorkflows.includes(workflow)) {
194173
194176
  return {
194174
194177
  success: false,
194175
- message: `Workflow "${args.workflow}" not found`,
194178
+ message: `Workflow "${workflow}" not found`,
194176
194179
  error: `Available workflows: ${context.availableWorkflows.slice(0, 5).join(', ')}${context.availableWorkflows.length > 5 ? '...' : ''}`,
194177
194180
  };
194178
194181
  }
@@ -194188,7 +194191,7 @@ async function handleCreateTrigger(args, context, store) {
194188
194191
  };
194189
194192
  }
194190
194193
  // Check permissions for the workflow
194191
- const permissionCheck = checkSchedulePermissions(context, args.workflow);
194194
+ const permissionCheck = checkSchedulePermissions(context, workflow);
194192
194195
  if (!permissionCheck.allowed) {
194193
194196
  return {
194194
194197
  success: false,
@@ -194208,12 +194211,12 @@ async function handleCreateTrigger(args, context, store) {
194208
194211
  contains: args.trigger_contains,
194209
194212
  matchPattern: args.trigger_match,
194210
194213
  threads: args.trigger_threads ?? 'any',
194211
- workflow: args.workflow,
194214
+ workflow: workflow,
194212
194215
  inputs: args.workflow_inputs,
194213
194216
  status: 'active',
194214
194217
  enabled: true,
194215
194218
  });
194216
- logger_1.logger.info(`[ScheduleTool] Created message trigger ${trigger.id} for user ${context.userId}: workflow="${args.workflow}"`);
194219
+ logger_1.logger.info(`[ScheduleTool] Created message trigger ${trigger.id} for user ${context.userId}: workflow="${workflow}"`);
194217
194220
  return {
194218
194221
  success: true,
194219
194222
  message: `**Message trigger created!**
@@ -194346,12 +194349,17 @@ function getScheduleToolDefinition() {
194346
194349
 
194347
194350
  YOU (the AI) must extract and structure all scheduling parameters. Do NOT pass natural language time expressions - convert them to cron or ISO timestamps.
194348
194351
 
194349
- CRITICAL WORKFLOW RULE:
194352
+ CRITICAL WORKFLOW RULE (for 'create' action only):
194350
194353
  - To schedule a WORKFLOW, the user MUST use a '%' prefix (e.g., "schedule %my-workflow daily").
194351
194354
  - If the '%' prefix is present, extract the word following it as the 'workflow' parameter (without the '%').
194352
194355
  - If the '%' prefix is NOT present, the request is a simple text reminder. The ENTIRE user request (excluding the schedule expression) MUST be placed in the 'reminder_text' parameter.
194353
194356
  - DO NOT guess or infer a workflow name from a user's request without the '%' prefix.
194354
194357
 
194358
+ WORKFLOW RULE FOR TRIGGERS (create_trigger action):
194359
+ - Triggers ALWAYS require a workflow. The '%' prefix rule does NOT apply to triggers.
194360
+ - If the user specifies a workflow name (with or without '%'), use it directly.
194361
+ - If the user does NOT specify a workflow name, use "default" as the workflow name.
194362
+
194355
194363
  ACTIONS:
194356
194364
  - create: Schedule a new reminder or workflow
194357
194365
  - list: Show user's active schedules
@@ -194364,7 +194372,7 @@ Slack messages in specific channels. Use the create_trigger, list_triggers, dele
194364
194372
  actions for this. Message triggers fire workflows based on message content, channel, sender, and thread scope.
194365
194373
 
194366
194374
  TRIGGER ACTIONS:
194367
- - create_trigger: Create a new message trigger (requires workflow + at least one filter). Supports filtering by user IDs (trigger_from), channels, keywords, regex, and thread scope.
194375
+ - create_trigger: Create a new message trigger (requires at least one filter; workflow defaults to "default" if not specified). Supports filtering by user IDs (trigger_from), channels, keywords, regex, and thread scope.
194368
194376
  - list_triggers: Show user's message triggers
194369
194377
  - delete_trigger: Remove a trigger by ID
194370
194378
  - update_trigger: Enable/disable a trigger by ID
@@ -194464,6 +194472,9 @@ User: "watch #cicd for messages containing 'failed' and run %handle-cicd"
194464
194472
  User: "trigger on each of my messages in this channel and run %auto-reply" (user ID is U3P2L4XNE)
194465
194473
  → { "action": "create_trigger", "trigger_channels": ["C09V810NY6R"], "trigger_from": ["U3P2L4XNE"], "workflow": "auto-reply" }
194466
194474
 
194475
+ User: "trigger on each message in this channel" (no workflow specified — use "default")
194476
+ → { "action": "create_trigger", "trigger_channels": ["C09V810NY6R"], "workflow": "default" }
194477
+
194467
194478
  User: "list my message triggers"
194468
194479
  → { "action": "list_triggers" }
194469
194480
 
@@ -194497,7 +194508,7 @@ User: "disable trigger abc123"
194497
194508
  },
194498
194509
  workflow: {
194499
194510
  type: 'string',
194500
- description: 'For create: workflow ID to run. ONLY populate this if the user used the % prefix (e.g., "%my-workflow"). Extract the name without the % symbol. If no % prefix, use reminder_text instead.',
194511
+ description: 'For create: workflow ID to run. ONLY populate this if the user used the % prefix (e.g., "%my-workflow"). Extract the name without the % symbol. If no % prefix, use reminder_text instead. For create_trigger: workflow is REQUIRED — use the workflow name the user specified (% prefix optional), or "default" if not specified.',
194501
194512
  },
194502
194513
  workflow_inputs: {
194503
194514
  type: 'object',
@@ -198079,6 +198090,15 @@ async function executeScheduleTool(args, slackContext, slackClient, availableWor
198079
198090
  original_expression: args.original_expression,
198080
198091
  // For cancel/pause/resume
198081
198092
  schedule_id: args.schedule_id,
198093
+ // For trigger actions
198094
+ trigger_channels: args.trigger_channels,
198095
+ trigger_from: args.trigger_from,
198096
+ trigger_from_bots: args.trigger_from_bots,
198097
+ trigger_contains: args.trigger_contains,
198098
+ trigger_match: args.trigger_match,
198099
+ trigger_threads: args.trigger_threads,
198100
+ trigger_description: args.trigger_description,
198101
+ trigger_id: args.trigger_id,
198082
198102
  };
198083
198103
  // If AI didn't provide target, default to current Slack context
198084
198104
  if (!toolArgs.target_type && slackContext.channel) {
@@ -224465,6 +224485,12 @@ class WorkflowRegistry {
224465
224485
  message: 'Input parameter schema is recommended',
224466
224486
  });
224467
224487
  }
224488
+ if (input.schema?.type === 'array' && !input.schema.items) {
224489
+ warnings.push({
224490
+ path: `inputs[${i}].schema`,
224491
+ message: 'Array schema should define "items" (e.g. items: { type: string }). Some LLM providers (Gemini) reject array schemas without items.',
224492
+ });
224493
+ }
224468
224494
  }
224469
224495
  }
224470
224496
  // Validate output parameters
@@ -355804,9 +355830,10 @@ You are working with a workspace. Available paths: ${workspaceDesc}
355804
355830
  }
355805
355831
  if (completionAttempted && this.completionPrompt && !options._completionPromptProcessed) {
355806
355832
  if (this.debug) {
355807
- console.log("[DEBUG] Running completion prompt for post-completion validation/review...");
355833
+ console.log("[DEBUG] Running completion prompt as continuation of current session...");
355808
355834
  }
355809
355835
  try {
355836
+ const originalResult = finalResult;
355810
355837
  if (this.tracer) {
355811
355838
  this.tracer.recordEvent("completion_prompt.started", {
355812
355839
  "completion_prompt.original_result_length": finalResult?.length || 0
@@ -355819,24 +355846,66 @@ Here is the result to review:
355819
355846
  ${finalResult}
355820
355847
  </result>
355821
355848
 
355822
- After reviewing, provide your final answer using attempt_completion.`;
355823
- const savedOutputItems = this._outputBuffer ? [...this._outputBuffer.items] : [];
355824
- const savedExtractedBlocks = this._extractedRawBlocks ? [...this._extractedRawBlocks] : [];
355825
- const completionResult2 = await this.answer(completionPromptMessage, [], {
355826
- ...options,
355827
- _completionPromptProcessed: true
355828
- });
355829
- if (this._outputBuffer) {
355830
- this._outputBuffer.items = savedOutputItems;
355849
+ Double-check your response based on the criteria above. If everything looks good, respond with your previous answer exactly as-is using attempt_completion. If something needs to be fixed or is missing, do it now, then respond with the COMPLETE updated answer (everything you did in total, not just the fix) using attempt_completion.`;
355850
+ currentMessages.push({ role: "user", content: completionPromptMessage });
355851
+ completionResult = null;
355852
+ completionAttempted = false;
355853
+ const completionMaxIterations = 5;
355854
+ const completionStreamOptions = {
355855
+ model: this.provider ? this.provider(this.model) : this.model,
355856
+ messages: this.prepareMessagesWithImages(currentMessages),
355857
+ tools: tools2,
355858
+ stopWhen: (0, import_ai4.stepCountIs)(completionMaxIterations),
355859
+ maxTokens: maxResponseTokens,
355860
+ temperature: 0.3,
355861
+ onStepFinish: ({ toolResults, text, finishReason, usage }) => {
355862
+ if (usage) {
355863
+ this.tokenCounter.recordUsage(usage);
355864
+ }
355865
+ if (options.onStream && text) {
355866
+ options.onStream(text);
355867
+ }
355868
+ if (this.debug) {
355869
+ console.log(`[DEBUG] Completion prompt step finished (reason: ${finishReason}, tools: ${toolResults?.length || 0})`);
355870
+ }
355871
+ }
355872
+ };
355873
+ const providerOpts = this._buildThinkingProviderOptions(maxResponseTokens);
355874
+ if (providerOpts) {
355875
+ completionStreamOptions.providerOptions = providerOpts;
355876
+ }
355877
+ const cpResult = await this.streamTextWithRetryAndFallback(completionStreamOptions);
355878
+ const cpFinalText = await cpResult.text;
355879
+ const cpUsage = await cpResult.usage;
355880
+ if (cpUsage) {
355881
+ this.tokenCounter.recordUsage(cpUsage, cpResult.experimental_providerMetadata);
355882
+ }
355883
+ const cpMessages = await cpResult.response?.messages;
355884
+ if (cpMessages) {
355885
+ for (const msg of cpMessages) {
355886
+ currentMessages.push(msg);
355887
+ }
355888
+ }
355889
+ if (completionResult) {
355890
+ finalResult = completionResult;
355891
+ completionAttempted = true;
355892
+ } else if (cpFinalText && cpFinalText.trim().length > 0) {
355893
+ finalResult = cpFinalText;
355894
+ completionAttempted = true;
355895
+ } else {
355896
+ finalResult = originalResult;
355897
+ completionAttempted = true;
355898
+ if (this.debug) {
355899
+ console.log("[DEBUG] Completion prompt returned empty result, keeping original.");
355900
+ }
355831
355901
  }
355832
- this._extractedRawBlocks = savedExtractedBlocks;
355833
- finalResult = completionResult2;
355834
355902
  if (this.debug) {
355835
- console.log(`[DEBUG] Completion prompt finished. New result length: ${finalResult?.length || 0}`);
355903
+ console.log(`[DEBUG] Completion prompt finished. Final result length: ${finalResult?.length || 0}`);
355836
355904
  }
355837
355905
  if (this.tracer) {
355838
355906
  this.tracer.recordEvent("completion_prompt.completed", {
355839
- "completion_prompt.final_result_length": finalResult?.length || 0
355907
+ "completion_prompt.final_result_length": finalResult?.length || 0,
355908
+ "completion_prompt.used_original": finalResult === originalResult
355840
355909
  });
355841
355910
  }
355842
355911
  } catch (error2) {
@@ -357594,6 +357663,17 @@ function parseDelegatedTargets(rawResponse) {
357594
357663
  }
357595
357664
  return normalizeTargets(fallbackTargetsFromText(trimmed));
357596
357665
  }
357666
+ function splitTargetSuffix(target) {
357667
+ const searchStart = target.length > 2 && target[1] === ":" && /[a-zA-Z]/.test(target[0]) ? 2 : 0;
357668
+ const colonIdx = target.indexOf(":", searchStart);
357669
+ const hashIdx = target.indexOf("#");
357670
+ if (colonIdx !== -1 && (hashIdx === -1 || colonIdx < hashIdx)) {
357671
+ return { filePart: target.substring(0, colonIdx), suffix: target.substring(colonIdx) };
357672
+ } else if (hashIdx !== -1) {
357673
+ return { filePart: target.substring(0, hashIdx), suffix: target.substring(hashIdx) };
357674
+ }
357675
+ return { filePart: target, suffix: "" };
357676
+ }
357597
357677
  function buildSearchDelegateTask({ searchQuery, searchPath, exact, language, allowTests }) {
357598
357678
  return [
357599
357679
  "You are a code-search subagent. Your job is to find ALL relevant code locations for the given query.",
@@ -357622,7 +357702,7 @@ function buildSearchDelegateTask({ searchQuery, searchPath, exact, language, all
357622
357702
  "Deduplicate targets. Do NOT explain or answer - ONLY return the JSON targets."
357623
357703
  ].join("\n");
357624
357704
  }
357625
- var import_ai5, CODE_SEARCH_SCHEMA, searchTool, queryTool, extractTool, delegateTool, analyzeAllTool;
357705
+ var import_ai5, import_fs11, CODE_SEARCH_SCHEMA, searchTool, queryTool, extractTool, delegateTool, analyzeAllTool;
357626
357706
  var init_vercel = __esm({
357627
357707
  "src/tools/vercel.js"() {
357628
357708
  "use strict";
@@ -357633,6 +357713,7 @@ var init_vercel = __esm({
357633
357713
  init_delegate();
357634
357714
  init_analyzeAll();
357635
357715
  init_common2();
357716
+ import_fs11 = __nccwpck_require__(79896);
357636
357717
  init_error_types();
357637
357718
  init_hashline();
357638
357719
  CODE_SEARCH_SCHEMA = {
@@ -357758,10 +357839,47 @@ var init_vercel = __esm({
357758
357839
  }
357759
357840
  return fallbackResult;
357760
357841
  }
357842
+ const delegateBase = options.allowedFolders?.[0] || options.cwd || ".";
357761
357843
  const resolutionBase = searchPaths[0] || options.cwd || ".";
357762
- const resolvedTargets = targets.map((target) => resolveTargetPath(target, resolutionBase));
357844
+ const resolvedTargets = targets.map((target) => resolveTargetPath(target, delegateBase));
357845
+ const validatedTargets = [];
357846
+ for (const target of resolvedTargets) {
357847
+ const { filePart, suffix } = splitTargetSuffix(target);
357848
+ if ((0, import_fs11.existsSync)(filePart)) {
357849
+ validatedTargets.push(target);
357850
+ continue;
357851
+ }
357852
+ let fixed = false;
357853
+ const parts = filePart.split("/").filter(Boolean);
357854
+ for (let i5 = 0; i5 < parts.length - 1; i5++) {
357855
+ if (parts[i5] === parts[i5 + 1]) {
357856
+ const candidate = "/" + [...parts.slice(0, i5), ...parts.slice(i5 + 1)].join("/");
357857
+ if ((0, import_fs11.existsSync)(candidate)) {
357858
+ validatedTargets.push(candidate + suffix);
357859
+ if (debug) console.error(`[search-delegate] Fixed doubled path segment: ${filePart} \u2192 ${candidate}`);
357860
+ fixed = true;
357861
+ break;
357862
+ }
357863
+ }
357864
+ }
357865
+ if (fixed) continue;
357866
+ for (const altBase of [resolutionBase, options.cwd].filter(Boolean)) {
357867
+ if (altBase === delegateBase) continue;
357868
+ const altResolved = resolveTargetPath(target, altBase);
357869
+ const { filePart: altFile } = splitTargetSuffix(altResolved);
357870
+ if ((0, import_fs11.existsSync)(altFile)) {
357871
+ validatedTargets.push(altResolved);
357872
+ if (debug) console.error(`[search-delegate] Resolved with alt base: ${filePart} \u2192 ${altFile}`);
357873
+ fixed = true;
357874
+ break;
357875
+ }
357876
+ }
357877
+ if (fixed) continue;
357878
+ if (debug) console.error(`[search-delegate] Warning: target may not exist: ${filePart}`);
357879
+ validatedTargets.push(target);
357880
+ }
357763
357881
  const extractOptions = {
357764
- files: resolvedTargets,
357882
+ files: validatedTargets,
357765
357883
  cwd: resolutionBase,
357766
357884
  allowTests: allow_tests ?? true
357767
357885
  };
@@ -358314,7 +358432,7 @@ Example: <edit><file_path>${file_path}</file_path><symbol>${allMatches[0].qualif
358314
358432
  Example: <extract><targets>${file_path}#${symbol15}</targets></extract>`;
358315
358433
  }
358316
358434
  }
358317
- const content = await import_fs11.promises.readFile(resolvedPath2, "utf-8");
358435
+ const content = await import_fs12.promises.readFile(resolvedPath2, "utf-8");
358318
358436
  const lines = content.split("\n");
358319
358437
  if (position) {
358320
358438
  const refIndent = detectBaseIndent(symbolInfo.code);
@@ -358325,7 +358443,7 @@ Example: <extract><targets>${file_path}#${symbol15}</targets></extract>`;
358325
358443
  } else {
358326
358444
  lines.splice(symbolInfo.startLine - 1, 0, ...newLines, "");
358327
358445
  }
358328
- await import_fs11.promises.writeFile(resolvedPath2, lines.join("\n"), "utf-8");
358446
+ await import_fs12.promises.writeFile(resolvedPath2, lines.join("\n"), "utf-8");
358329
358447
  if (fileTracker) {
358330
358448
  const updated = await findSymbol(resolvedPath2, symbol15, cwd || process.cwd());
358331
358449
  if (updated) {
@@ -358343,7 +358461,7 @@ Example: <extract><targets>${file_path}#${symbol15}</targets></extract>`;
358343
358461
  const reindented = reindent(new_string, originalIndent);
358344
358462
  const newLines = reindented.split("\n");
358345
358463
  lines.splice(symbolInfo.startLine - 1, symbolInfo.endLine - symbolInfo.startLine + 1, ...newLines);
358346
- await import_fs11.promises.writeFile(resolvedPath2, lines.join("\n"), "utf-8");
358464
+ await import_fs12.promises.writeFile(resolvedPath2, lines.join("\n"), "utf-8");
358347
358465
  if (fileTracker) {
358348
358466
  const updated = await findSymbol(resolvedPath2, symbol15, cwd || process.cwd());
358349
358467
  if (updated) {
@@ -358398,7 +358516,7 @@ async function handleLineEdit({ resolvedPath: resolvedPath2, file_path, start_li
358398
358516
  if (position !== void 0 && position !== null && position !== "before" && position !== "after") {
358399
358517
  return 'Error editing file: Invalid position - must be "before" or "after". Use position="before" to insert before the line, or position="after" to insert after it.';
358400
358518
  }
358401
- const content = await import_fs11.promises.readFile(resolvedPath2, "utf-8");
358519
+ const content = await import_fs12.promises.readFile(resolvedPath2, "utf-8");
358402
358520
  const fileLines = content.split("\n");
358403
358521
  if (startLine > fileLines.length) {
358404
358522
  return `Error editing file: Line ${startLine} is beyond file length (${fileLines.length} lines). Use 'extract' to read the current file content.`;
@@ -358427,20 +358545,20 @@ async function handleLineEdit({ resolvedPath: resolvedPath2, file_path, start_li
358427
358545
  const newLines = cleaned === "" ? [] : cleaned.split("\n");
358428
358546
  if (position === "after") {
358429
358547
  fileLines.splice(startLine, 0, ...newLines);
358430
- await import_fs11.promises.writeFile(resolvedPath2, fileLines.join("\n"), "utf-8");
358548
+ await import_fs12.promises.writeFile(resolvedPath2, fileLines.join("\n"), "utf-8");
358431
358549
  if (fileTracker) await fileTracker.trackFileAfterWrite(resolvedPath2);
358432
358550
  const action = `${newLines.length} line${newLines.length !== 1 ? "s" : ""} inserted after line ${startLine}`;
358433
358551
  return buildLineEditResponse(file_path, startLine, startLine, newLines.length, fileLines, startLine, action, modifications);
358434
358552
  } else if (position === "before") {
358435
358553
  fileLines.splice(startLine - 1, 0, ...newLines);
358436
- await import_fs11.promises.writeFile(resolvedPath2, fileLines.join("\n"), "utf-8");
358554
+ await import_fs12.promises.writeFile(resolvedPath2, fileLines.join("\n"), "utf-8");
358437
358555
  if (fileTracker) await fileTracker.trackFileAfterWrite(resolvedPath2);
358438
358556
  const action = `${newLines.length} line${newLines.length !== 1 ? "s" : ""} inserted before line ${startLine}`;
358439
358557
  return buildLineEditResponse(file_path, startLine, startLine, newLines.length, fileLines, startLine - 1, action, modifications);
358440
358558
  } else {
358441
358559
  const replacedCount = endLine - startLine + 1;
358442
358560
  fileLines.splice(startLine - 1, replacedCount, ...newLines);
358443
- await import_fs11.promises.writeFile(resolvedPath2, fileLines.join("\n"), "utf-8");
358561
+ await import_fs12.promises.writeFile(resolvedPath2, fileLines.join("\n"), "utf-8");
358444
358562
  if (fileTracker) await fileTracker.trackFileAfterWrite(resolvedPath2);
358445
358563
  let action;
358446
358564
  if (newLines.length === 0) {
@@ -358453,14 +358571,14 @@ async function handleLineEdit({ resolvedPath: resolvedPath2, file_path, start_li
358453
358571
  return buildLineEditResponse(file_path, startLine, endLine, newLines.length, fileLines, startLine - 1, action, modifications);
358454
358572
  }
358455
358573
  }
358456
- var import_ai6, import_fs11, import_path16, import_fs12, editTool, createTool, multiEditTool, editSchema, createSchema, multiEditSchema, editDescription, createDescription, multiEditDescription, editToolDefinition, createToolDefinition, multiEditToolDefinition;
358574
+ var import_ai6, import_fs12, import_path16, import_fs13, editTool, createTool, multiEditTool, editSchema, createSchema, multiEditSchema, editDescription, createDescription, multiEditDescription, editToolDefinition, createToolDefinition, multiEditToolDefinition;
358457
358575
  var init_edit = __esm({
358458
358576
  "src/tools/edit.js"() {
358459
358577
  "use strict";
358460
358578
  import_ai6 = __nccwpck_require__(86619);
358461
- import_fs11 = __nccwpck_require__(79896);
358462
- import_path16 = __nccwpck_require__(16928);
358463
358579
  import_fs12 = __nccwpck_require__(79896);
358580
+ import_path16 = __nccwpck_require__(16928);
358581
+ import_fs13 = __nccwpck_require__(79896);
358464
358582
  init_path_validation();
358465
358583
  init_fuzzyMatch();
358466
358584
  init_symbolEdit();
@@ -358544,7 +358662,7 @@ Parameters:
358544
358662
  const relativePath = toRelativePath(resolvedPath2, workspaceRoot);
358545
358663
  return `Error editing file: Permission denied - ${relativePath} is outside allowed directories. Use a file path within the project workspace.`;
358546
358664
  }
358547
- if (!(0, import_fs12.existsSync)(resolvedPath2)) {
358665
+ if (!(0, import_fs13.existsSync)(resolvedPath2)) {
358548
358666
  return `Error editing file: File not found - ${file_path}. Verify the path is correct and the file exists. Use 'search' to find files by name, or 'create' to make a new file.`;
358549
358667
  }
358550
358668
  if (options.fileTracker && !options.fileTracker.isFileSeen(resolvedPath2)) {
@@ -358574,7 +358692,7 @@ Example: <extract><targets>${displayPath}</targets></extract>`;
358574
358692
  Example: <extract><targets>${displayPath}</targets></extract>`;
358575
358693
  }
358576
358694
  }
358577
- const content = await import_fs11.promises.readFile(resolvedPath2, "utf-8");
358695
+ const content = await import_fs12.promises.readFile(resolvedPath2, "utf-8");
358578
358696
  let matchTarget = old_string;
358579
358697
  let matchStrategy = "exact";
358580
358698
  if (!content.includes(old_string)) {
@@ -358606,7 +358724,7 @@ Example: <extract><targets>${displayPath}</targets></extract>`;
358606
358724
  if (newContent === content) {
358607
358725
  return `Error editing file: No changes made - the replacement result is identical to the original. Verify that old_string and new_string are actually different. If fuzzy matching was used, the matched text may already equal new_string.`;
358608
358726
  }
358609
- await import_fs11.promises.writeFile(resolvedPath2, newContent, "utf-8");
358727
+ await import_fs12.promises.writeFile(resolvedPath2, newContent, "utf-8");
358610
358728
  if (options.fileTracker) {
358611
358729
  await options.fileTracker.trackFileAfterWrite(resolvedPath2);
358612
358730
  options.fileTracker.recordTextEdit(resolvedPath2);
@@ -358677,13 +358795,13 @@ Important:
358677
358795
  const relativePath = toRelativePath(resolvedPath2, workspaceRoot);
358678
358796
  return `Error creating file: Permission denied - ${relativePath} is outside allowed directories. Use a file path within the project workspace.`;
358679
358797
  }
358680
- if ((0, import_fs12.existsSync)(resolvedPath2) && !overwrite) {
358798
+ if ((0, import_fs13.existsSync)(resolvedPath2) && !overwrite) {
358681
358799
  return `Error creating file: File already exists - ${file_path}. Use overwrite: true to replace it.`;
358682
358800
  }
358683
- const existed = (0, import_fs12.existsSync)(resolvedPath2);
358801
+ const existed = (0, import_fs13.existsSync)(resolvedPath2);
358684
358802
  const dir = (0, import_path16.dirname)(resolvedPath2);
358685
- await import_fs11.promises.mkdir(dir, { recursive: true });
358686
- await import_fs11.promises.writeFile(resolvedPath2, content, "utf-8");
358803
+ await import_fs12.promises.mkdir(dir, { recursive: true });
358804
+ await import_fs12.promises.writeFile(resolvedPath2, content, "utf-8");
358687
358805
  if (options.fileTracker) await options.fileTracker.trackFileAfterWrite(resolvedPath2);
358688
358806
  const action = existed && overwrite ? "overwrote" : "created";
358689
358807
  const bytes = Buffer.byteLength(content, "utf-8");
@@ -359325,10 +359443,10 @@ async function listFilesByLevel(options) {
359325
359443
  maxFiles = 100,
359326
359444
  respectGitignore = true
359327
359445
  } = options;
359328
- if (!import_fs13.default.existsSync(directory)) {
359446
+ if (!import_fs14.default.existsSync(directory)) {
359329
359447
  throw new Error(`Directory does not exist: ${directory}`);
359330
359448
  }
359331
- const gitDirExists = import_fs13.default.existsSync(import_path17.default.join(directory, ".git"));
359449
+ const gitDirExists = import_fs14.default.existsSync(import_path17.default.join(directory, ".git"));
359332
359450
  if (gitDirExists && respectGitignore) {
359333
359451
  try {
359334
359452
  return await listFilesUsingGit(directory, maxFiles);
@@ -359359,7 +359477,7 @@ async function listFilesByLevelManually(directory, maxFiles, respectGitignore) {
359359
359477
  while (queue.length > 0 && result.length < maxFiles) {
359360
359478
  const { dir, level } = queue.shift();
359361
359479
  try {
359362
- const entries = import_fs13.default.readdirSync(dir, { withFileTypes: true });
359480
+ const entries = import_fs14.default.readdirSync(dir, { withFileTypes: true });
359363
359481
  const files = entries.filter((entry) => {
359364
359482
  const fullPath = import_path17.default.join(dir, entry.name);
359365
359483
  return getEntryTypeSync(entry, fullPath).isFile;
@@ -359390,11 +359508,11 @@ async function listFilesByLevelManually(directory, maxFiles, respectGitignore) {
359390
359508
  }
359391
359509
  function loadGitignorePatterns(directory) {
359392
359510
  const gitignorePath = import_path17.default.join(directory, ".gitignore");
359393
- if (!import_fs13.default.existsSync(gitignorePath)) {
359511
+ if (!import_fs14.default.existsSync(gitignorePath)) {
359394
359512
  return [];
359395
359513
  }
359396
359514
  try {
359397
- const content = import_fs13.default.readFileSync(gitignorePath, "utf8");
359515
+ const content = import_fs14.default.readFileSync(gitignorePath, "utf8");
359398
359516
  return content.split("\n").map((line) => line.trim()).filter((line) => line && !line.startsWith("#"));
359399
359517
  } catch (error2) {
359400
359518
  console.error(`Warning: Could not read .gitignore: ${error2.message}`);
@@ -359412,11 +359530,11 @@ function shouldIgnore(filePath, ignorePatterns) {
359412
359530
  }
359413
359531
  return false;
359414
359532
  }
359415
- var import_fs13, import_path17, import_util12, import_child_process10, execAsync3;
359533
+ var import_fs14, import_path17, import_util12, import_child_process10, execAsync3;
359416
359534
  var init_file_lister = __esm({
359417
359535
  "src/utils/file-lister.js"() {
359418
359536
  "use strict";
359419
- import_fs13 = __toESM(__nccwpck_require__(79896), 1);
359537
+ import_fs14 = __toESM(__nccwpck_require__(79896), 1);
359420
359538
  import_path17 = __toESM(__nccwpck_require__(16928), 1);
359421
359539
  import_util12 = __nccwpck_require__(39023);
359422
359540
  import_child_process10 = __nccwpck_require__(35317);
@@ -359435,11 +359553,11 @@ function initializeSimpleTelemetryFromOptions(options) {
359435
359553
  });
359436
359554
  return telemetry;
359437
359555
  }
359438
- var import_fs14, import_path18, SimpleTelemetry, SimpleAppTracer;
359556
+ var import_fs15, import_path18, SimpleTelemetry, SimpleAppTracer;
359439
359557
  var init_simpleTelemetry = __esm({
359440
359558
  "src/agent/simpleTelemetry.js"() {
359441
359559
  "use strict";
359442
- import_fs14 = __nccwpck_require__(79896);
359560
+ import_fs15 = __nccwpck_require__(79896);
359443
359561
  import_path18 = __nccwpck_require__(16928);
359444
359562
  SimpleTelemetry = class {
359445
359563
  constructor(options = {}) {
@@ -359455,10 +359573,10 @@ var init_simpleTelemetry = __esm({
359455
359573
  initializeFileExporter() {
359456
359574
  try {
359457
359575
  const dir = (0, import_path18.dirname)(this.filePath);
359458
- if (!(0, import_fs14.existsSync)(dir)) {
359459
- (0, import_fs14.mkdirSync)(dir, { recursive: true });
359576
+ if (!(0, import_fs15.existsSync)(dir)) {
359577
+ (0, import_fs15.mkdirSync)(dir, { recursive: true });
359460
359578
  }
359461
- this.stream = (0, import_fs14.createWriteStream)(this.filePath, { flags: "a" });
359579
+ this.stream = (0, import_fs15.createWriteStream)(this.filePath, { flags: "a" });
359462
359580
  this.stream.on("error", (error2) => {
359463
359581
  console.error(`[SimpleTelemetry] Stream error: ${error2.message}`);
359464
359582
  });
@@ -395235,7 +395353,7 @@ module.exports = /*#__PURE__*/JSON.parse('{"100":"Continue","101":"Switching Pro
395235
395353
  /***/ ((module) => {
395236
395354
 
395237
395355
  "use strict";
395238
- module.exports = /*#__PURE__*/JSON.parse('{"name":"@probelabs/visor","version":"0.1.153","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-rc269","@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"]}}');
395356
+ module.exports = /*#__PURE__*/JSON.parse('{"name":"@probelabs/visor","version":"0.1.154","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-rc271","@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"]}}');
395239
395357
 
395240
395358
  /***/ })
395241
395359