@probelabs/visor 0.1.178-ee → 0.1.179-ee

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 (63) hide show
  1. package/defaults/assistant.yaml +38 -16
  2. package/defaults/skills/code-explorer.yaml +8 -8
  3. package/dist/agent-protocol/tasks-cli-handler.d.ts.map +1 -1
  4. package/dist/agent-protocol/track-execution.d.ts.map +1 -1
  5. package/dist/defaults/assistant.yaml +38 -16
  6. package/dist/defaults/skills/code-explorer.yaml +8 -8
  7. package/dist/frontends/slack-frontend.d.ts +6 -0
  8. package/dist/frontends/slack-frontend.d.ts.map +1 -1
  9. package/dist/index.js +305 -87
  10. package/dist/providers/ai-check-provider.d.ts.map +1 -1
  11. package/dist/sdk/{a2a-frontend-U3PTNCLR.mjs → a2a-frontend-KJFLIZJT.mjs} +2 -2
  12. package/dist/sdk/{check-provider-registry-ZX76MY2L.mjs → check-provider-registry-J27YX4IT.mjs} +5 -5
  13. package/dist/sdk/{check-provider-registry-SRASECAR.mjs → check-provider-registry-SYAHJMWJ.mjs} +5 -5
  14. package/dist/sdk/{chunk-6YGCACBF.mjs → chunk-CHARL3TY.mjs} +2 -2
  15. package/dist/sdk/{chunk-6YGCACBF.mjs.map → chunk-CHARL3TY.mjs.map} +1 -1
  16. package/dist/sdk/{chunk-B7XHSG3L.mjs → chunk-FTPLYUQ3.mjs} +163 -124
  17. package/dist/sdk/chunk-FTPLYUQ3.mjs.map +1 -0
  18. package/dist/sdk/{chunk-MGY5JAN2.mjs → chunk-KWHLB5E3.mjs} +163 -124
  19. package/dist/sdk/chunk-KWHLB5E3.mjs.map +1 -0
  20. package/dist/sdk/{chunk-4ECMTCOM.mjs → chunk-OYHDBTKY.mjs} +2 -2
  21. package/dist/sdk/{chunk-ENSZDV3O.mjs → chunk-ZJYQMNPA.mjs} +3 -3
  22. package/dist/sdk/{failure-condition-evaluator-P3MS5DRL.mjs → failure-condition-evaluator-V2YGFRKO.mjs} +3 -3
  23. package/dist/sdk/{github-frontend-QTKOYB56.mjs → github-frontend-4LM4NAZK.mjs} +3 -3
  24. package/dist/sdk/{host-I2TBBKD5.mjs → host-GBXJKNHL.mjs} +4 -4
  25. package/dist/sdk/{host-THORKOEL.mjs → host-XXPPPC76.mjs} +4 -4
  26. package/dist/sdk/{routing-2X6QF5IW.mjs → routing-YAYBIVPL.mjs} +4 -4
  27. package/dist/sdk/{schedule-tool-M6Y4YTXR.mjs → schedule-tool-OIVJDIDK.mjs} +5 -5
  28. package/dist/sdk/{schedule-tool-R6JJIDZ6.mjs → schedule-tool-WACIV77L.mjs} +5 -5
  29. package/dist/sdk/{schedule-tool-handler-AOMZV3Q3.mjs → schedule-tool-handler-ODKY57FO.mjs} +5 -5
  30. package/dist/sdk/{schedule-tool-handler-JYCVH377.mjs → schedule-tool-handler-SJF4ZKSB.mjs} +5 -5
  31. package/dist/sdk/sdk.js +213 -137
  32. package/dist/sdk/sdk.js.map +1 -1
  33. package/dist/sdk/sdk.mjs +4 -4
  34. package/dist/sdk/{slack-frontend-XKSIOUXB.mjs → slack-frontend-OWD7BSWF.mjs} +22 -3
  35. package/dist/sdk/slack-frontend-OWD7BSWF.mjs.map +1 -0
  36. package/dist/sdk/{trace-helpers-K47ZVJSU.mjs → trace-helpers-QL2B75AK.mjs} +2 -2
  37. package/dist/sdk/{track-execution-XTCZBUWX.mjs → track-execution-2Q66SXBZ.mjs} +20 -2
  38. package/dist/sdk/{track-execution-XTCZBUWX.mjs.map → track-execution-2Q66SXBZ.mjs.map} +1 -1
  39. package/dist/sdk/{workflow-check-provider-A3YH2UZJ.mjs → workflow-check-provider-IXW6BMQA.mjs} +5 -5
  40. package/dist/sdk/{workflow-check-provider-EMFC7A5K.mjs → workflow-check-provider-UZQZYPOE.mjs} +5 -5
  41. package/dist/utils/workspace-manager.d.ts +2 -0
  42. package/dist/utils/workspace-manager.d.ts.map +1 -1
  43. package/package.json +2 -2
  44. package/dist/sdk/chunk-B7XHSG3L.mjs.map +0 -1
  45. package/dist/sdk/chunk-MGY5JAN2.mjs.map +0 -1
  46. package/dist/sdk/slack-frontend-XKSIOUXB.mjs.map +0 -1
  47. /package/dist/sdk/{a2a-frontend-U3PTNCLR.mjs.map → a2a-frontend-KJFLIZJT.mjs.map} +0 -0
  48. /package/dist/sdk/{check-provider-registry-SRASECAR.mjs.map → check-provider-registry-J27YX4IT.mjs.map} +0 -0
  49. /package/dist/sdk/{check-provider-registry-ZX76MY2L.mjs.map → check-provider-registry-SYAHJMWJ.mjs.map} +0 -0
  50. /package/dist/sdk/{chunk-4ECMTCOM.mjs.map → chunk-OYHDBTKY.mjs.map} +0 -0
  51. /package/dist/sdk/{chunk-ENSZDV3O.mjs.map → chunk-ZJYQMNPA.mjs.map} +0 -0
  52. /package/dist/sdk/{failure-condition-evaluator-P3MS5DRL.mjs.map → failure-condition-evaluator-V2YGFRKO.mjs.map} +0 -0
  53. /package/dist/sdk/{github-frontend-QTKOYB56.mjs.map → github-frontend-4LM4NAZK.mjs.map} +0 -0
  54. /package/dist/sdk/{host-I2TBBKD5.mjs.map → host-GBXJKNHL.mjs.map} +0 -0
  55. /package/dist/sdk/{host-THORKOEL.mjs.map → host-XXPPPC76.mjs.map} +0 -0
  56. /package/dist/sdk/{routing-2X6QF5IW.mjs.map → routing-YAYBIVPL.mjs.map} +0 -0
  57. /package/dist/sdk/{schedule-tool-M6Y4YTXR.mjs.map → schedule-tool-OIVJDIDK.mjs.map} +0 -0
  58. /package/dist/sdk/{schedule-tool-R6JJIDZ6.mjs.map → schedule-tool-WACIV77L.mjs.map} +0 -0
  59. /package/dist/sdk/{schedule-tool-handler-AOMZV3Q3.mjs.map → schedule-tool-handler-ODKY57FO.mjs.map} +0 -0
  60. /package/dist/sdk/{schedule-tool-handler-JYCVH377.mjs.map → schedule-tool-handler-SJF4ZKSB.mjs.map} +0 -0
  61. /package/dist/sdk/{trace-helpers-K47ZVJSU.mjs.map → trace-helpers-QL2B75AK.mjs.map} +0 -0
  62. /package/dist/sdk/{workflow-check-provider-A3YH2UZJ.mjs.map → workflow-check-provider-IXW6BMQA.mjs.map} +0 -0
  63. /package/dist/sdk/{workflow-check-provider-EMFC7A5K.mjs.map → workflow-check-provider-UZQZYPOE.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.178';
3
- process.env.PROBE_VERSION = '0.6.0-rc293';
4
- process.env.VISOR_COMMIT_SHA = '79fcc6344e1ab954501ff6a7f9614a0372019b2b';
5
- process.env.VISOR_COMMIT_SHORT = '79fcc63';
2
+ process.env.VISOR_VERSION = '0.1.179';
3
+ process.env.PROBE_VERSION = '0.6.0-rc294';
4
+ process.env.VISOR_COMMIT_SHA = 'c2ec610fc6c00b8e34666b8dad089ca3cf06bbf5';
5
+ process.env.VISOR_COMMIT_SHORT = 'c2ec610';
6
6
  /******/ (() => { // webpackBootstrap
7
7
  /******/ var __webpack_modules__ = ({
8
8
 
@@ -299882,6 +299882,19 @@ async function handleShow(positional, flags) {
299882
299882
  if (match.run_id)
299883
299883
  detailTable.push({ 'Run ID': match.run_id });
299884
299884
  detailTable.push({ Input: match.request_message });
299885
+ // Show AI response from status_message (recorded on completion/failure)
299886
+ const fullTask = store.getTask(match.id);
299887
+ if (fullTask?.status?.message) {
299888
+ const parts = fullTask.status.message.parts ?? [];
299889
+ const textPart = parts.find((p) => typeof p.text === 'string');
299890
+ if (textPart) {
299891
+ const responseText = textPart.text;
299892
+ // Truncate long responses for display
299893
+ const maxLen = 500;
299894
+ const display = responseText.length > maxLen ? responseText.slice(0, maxLen) + '...' : responseText;
299895
+ detailTable.push({ Response: display });
299896
+ }
299897
+ }
299885
299898
  // Show metadata
299886
299899
  const meta = match.metadata;
299887
299900
  const metaKeys = Object.keys(meta).filter(k => k !== 'source');
@@ -300057,10 +300070,35 @@ async function trackExecution(opts, executor) {
300057
300070
  logger_1.logger.info(`[TaskTracking] Task ${task.id} started (source=${source}, workflow=${workflowId || '-'}, instance=${instanceId})`);
300058
300071
  try {
300059
300072
  const result = await executor();
300073
+ // Extract AI response text from the result using the same pattern as Slack frontend:
300074
+ // result.reviewSummary.history has check outputs, look for output.text in any check
300075
+ let responseText = 'Execution completed';
300076
+ try {
300077
+ const history = result?.reviewSummary?.history;
300078
+ if (history) {
300079
+ // Look through check outputs for a text response (e.g., generate-response)
300080
+ for (const outputs of Object.values(history)) {
300081
+ if (!Array.isArray(outputs))
300082
+ continue;
300083
+ for (const out of outputs) {
300084
+ const text = out?.text;
300085
+ if (typeof text === 'string' && text.trim().length > 0) {
300086
+ responseText = text.trim();
300087
+ break;
300088
+ }
300089
+ }
300090
+ if (responseText !== 'Execution completed')
300091
+ break;
300092
+ }
300093
+ }
300094
+ }
300095
+ catch {
300096
+ // ignore extraction errors
300097
+ }
300060
300098
  const completedMsg = {
300061
300099
  message_id: crypto_1.default.randomUUID(),
300062
300100
  role: 'agent',
300063
- parts: [{ text: 'Execution completed' }],
300101
+ parts: [{ text: responseText }],
300064
300102
  };
300065
300103
  taskStore.updateTaskState(task.id, 'completed', completedMsg);
300066
300104
  logger_1.logger.info(`[TaskTracking] Task ${task.id} completed`);
@@ -314776,17 +314814,28 @@ class SlackFrontend {
314776
314814
  const message = ev?.error?.message || 'Execution error';
314777
314815
  await this.maybePostError(ctx, 'Check failed', message, ev?.checkId).catch(() => { });
314778
314816
  }));
314779
- // On terminal state, replace 👀 with 👍 if we acked an inbound Slack message
314817
+ // On terminal state, replace 👀 with 👍 if we acked an inbound Slack message.
314818
+ // For error states, always post an error notice (bypass errorNotified flag)
314819
+ // so the user is never left without feedback when a run fails.
314780
314820
  this.subs.push(bus.on('StateTransition', async (env) => {
314781
314821
  const ev = (env && env.payload) || env;
314782
- if (ev && (ev.to === 'Completed' || ev.to === 'Error')) {
314822
+ if (ev && ev.to === 'Completed') {
314823
+ await this.finalizeReactions(ctx).catch(() => { });
314824
+ }
314825
+ else if (ev && ev.to === 'Error') {
314826
+ if (!this.errorNotified) {
314827
+ await this.maybePostError(ctx, 'Run failed', 'Workflow finished with errors').catch(() => { });
314828
+ }
314783
314829
  await this.finalizeReactions(ctx).catch(() => { });
314784
314830
  }
314785
314831
  }));
314786
314832
  this.subs.push(bus.on('Shutdown', async (env) => {
314787
314833
  const ev = (env && env.payload) || env;
314788
314834
  const message = ev?.error?.message || 'Fatal error';
314789
- await this.maybePostError(ctx, 'Run failed', message).catch(() => { });
314835
+ // Always post shutdown errors bypass errorNotified since a fatal
314836
+ // shutdown is critical and must reach the user even if a previous
314837
+ // (possibly unrelated) check already posted a non-fatal error.
314838
+ await this.forcePostError(ctx, 'Run failed', message).catch(() => { });
314790
314839
  }));
314791
314840
  // Add 👀 acknowledgement as soon as first check is scheduled for Slack-driven runs
314792
314841
  this.subs.push(bus.on('CheckScheduled', async () => {
@@ -314915,6 +314964,16 @@ class SlackFrontend {
314915
314964
  async maybePostError(ctx, title, message, checkId) {
314916
314965
  if (this.errorNotified)
314917
314966
  return;
314967
+ return this.postErrorToSlack(ctx, title, message, checkId);
314968
+ }
314969
+ /**
314970
+ * Post error to Slack regardless of errorNotified flag.
314971
+ * Used for fatal/shutdown errors that must always reach the user.
314972
+ */
314973
+ async forcePostError(ctx, title, message, checkId) {
314974
+ return this.postErrorToSlack(ctx, title, message, checkId);
314975
+ }
314976
+ async postErrorToSlack(ctx, title, message, checkId) {
314918
314977
  const slack = this.getSlack(ctx);
314919
314978
  if (!slack)
314920
314979
  return;
@@ -327374,46 +327433,51 @@ class AICheckProvider extends check_provider_interface_1.CheckProvider {
327374
327433
  // Check-level AI configuration (ai object)
327375
327434
  if (config.ai) {
327376
327435
  const aiAny = config.ai;
327436
+ // Helper to resolve Liquid templates in ai config values (e.g., "{{ inputs.max_iterations }}")
327437
+ const resolveLiquid = async (val) => {
327438
+ if (typeof val !== 'string' || !val.includes('{{'))
327439
+ return undefined;
327440
+ try {
327441
+ return (await this.liquidEngine.parseAndRender(val, {
327442
+ inputs: config.workflowInputs || {},
327443
+ env: process.env,
327444
+ })).trim();
327445
+ }
327446
+ catch {
327447
+ return undefined;
327448
+ }
327449
+ };
327450
+ // Helper to resolve a boolean that may be a Liquid template string
327451
+ const resolveBool = async (val) => {
327452
+ const resolved = (await resolveLiquid(val)) ?? val;
327453
+ if (typeof resolved === 'boolean')
327454
+ return resolved;
327455
+ if (typeof resolved === 'string')
327456
+ return resolved === 'true';
327457
+ return !!resolved;
327458
+ };
327377
327459
  const skipTransport = aiAny.skip_transport_context === true;
327378
327460
  // Only set properties that are actually defined to avoid overriding env vars
327379
327461
  if (aiAny.apiKey !== undefined) {
327380
327462
  aiConfig.apiKey = aiAny.apiKey;
327381
327463
  }
327382
327464
  if (aiAny.model !== undefined) {
327383
- let modelVal = String(aiAny.model);
327384
- if (modelVal.includes('{{')) {
327385
- try {
327386
- const rendered = await this.liquidEngine.parseAndRender(modelVal, {
327387
- inputs: config.workflowInputs || {},
327388
- env: process.env,
327389
- });
327390
- modelVal = rendered.trim();
327391
- }
327392
- catch { }
327393
- }
327465
+ const modelVal = (await resolveLiquid(aiAny.model)) ?? String(aiAny.model);
327394
327466
  if (modelVal) {
327395
327467
  aiConfig.model = modelVal;
327396
327468
  }
327397
327469
  }
327398
327470
  if (aiAny.timeout !== undefined) {
327399
- aiConfig.timeout = aiAny.timeout;
327471
+ const resolvedTimeout = (await resolveLiquid(aiAny.timeout)) ?? aiAny.timeout;
327472
+ aiConfig.timeout = Number(resolvedTimeout);
327400
327473
  }
327401
327474
  if (aiAny.max_iterations !== undefined || aiAny.maxIterations !== undefined) {
327402
327475
  const raw = aiAny.max_iterations ?? aiAny.maxIterations;
327403
- aiConfig.maxIterations = Number(raw);
327476
+ const resolved = (await resolveLiquid(raw)) ?? raw;
327477
+ aiConfig.maxIterations = Number(resolved);
327404
327478
  }
327405
327479
  if (aiAny.provider !== undefined) {
327406
- let providerVal = String(aiAny.provider);
327407
- if (providerVal.includes('{{')) {
327408
- try {
327409
- const rendered = await this.liquidEngine.parseAndRender(providerVal, {
327410
- inputs: config.workflowInputs || {},
327411
- env: process.env,
327412
- });
327413
- providerVal = rendered.trim();
327414
- }
327415
- catch { }
327416
- }
327480
+ const providerVal = (await resolveLiquid(aiAny.provider)) ?? String(aiAny.provider);
327417
327481
  if (providerVal) {
327418
327482
  aiConfig.provider = providerVal;
327419
327483
  }
@@ -327422,36 +327486,40 @@ class AICheckProvider extends check_provider_interface_1.CheckProvider {
327422
327486
  aiConfig.debug = aiAny.debug;
327423
327487
  }
327424
327488
  if (aiAny.enableDelegate !== undefined) {
327425
- aiConfig.enableDelegate = aiAny.enableDelegate;
327489
+ aiConfig.enableDelegate = await resolveBool(aiAny.enableDelegate);
327426
327490
  }
327427
327491
  if (aiAny.enableTasks !== undefined) {
327428
- aiConfig.enableTasks = aiAny.enableTasks;
327492
+ aiConfig.enableTasks = await resolveBool(aiAny.enableTasks);
327429
327493
  }
327430
327494
  if (aiAny.enableExecutePlan !== undefined) {
327431
- aiConfig.enableExecutePlan = aiAny.enableExecutePlan;
327495
+ aiConfig.enableExecutePlan = await resolveBool(aiAny.enableExecutePlan);
327432
327496
  }
327433
327497
  if (aiAny.allowEdit !== undefined) {
327434
- aiConfig.allowEdit = aiAny.allowEdit;
327498
+ aiConfig.allowEdit = await resolveBool(aiAny.allowEdit);
327435
327499
  }
327436
327500
  if (aiAny.allowedTools !== undefined) {
327437
327501
  aiConfig.allowedTools = aiAny.allowedTools;
327438
327502
  this.logDebug(`[AI Provider] Read allowedTools from YAML: ${JSON.stringify(aiAny.allowedTools)}`);
327439
327503
  }
327440
327504
  if (aiAny.disableTools !== undefined) {
327441
- aiConfig.disableTools = aiAny.disableTools;
327505
+ aiConfig.disableTools = await resolveBool(aiAny.disableTools);
327442
327506
  this.logDebug(`[AI Provider] Read disableTools from YAML: ${aiAny.disableTools}`);
327443
327507
  }
327444
327508
  if (aiAny.allowBash !== undefined) {
327445
- aiConfig.allowBash = aiAny.allowBash;
327509
+ aiConfig.allowBash = await resolveBool(aiAny.allowBash);
327446
327510
  }
327447
327511
  if (aiAny.bashConfig !== undefined) {
327448
327512
  aiConfig.bashConfig = aiAny.bashConfig;
327449
327513
  }
327450
327514
  if (aiAny.search_delegate_provider !== undefined) {
327451
- aiConfig.search_delegate_provider = aiAny.search_delegate_provider;
327515
+ aiConfig.search_delegate_provider =
327516
+ (await resolveLiquid(aiAny.search_delegate_provider)) ??
327517
+ aiAny.search_delegate_provider;
327452
327518
  }
327453
327519
  if (aiAny.search_delegate_model !== undefined) {
327454
- aiConfig.search_delegate_model = aiAny.search_delegate_model;
327520
+ aiConfig.search_delegate_model =
327521
+ (await resolveLiquid(aiAny.search_delegate_model)) ??
327522
+ aiAny.search_delegate_model;
327455
327523
  }
327456
327524
  if (aiAny.completion_prompt !== undefined) {
327457
327525
  aiConfig.completionPrompt = aiAny.completion_prompt;
@@ -327591,6 +327659,11 @@ class AICheckProvider extends check_provider_interface_1.CheckProvider {
327591
327659
  if (config.ai_max_iterations !== undefined && aiConfig.maxIterations === undefined) {
327592
327660
  aiConfig.maxIterations = config.ai_max_iterations;
327593
327661
  }
327662
+ // Default to 100 iterations if not configured (ProbeAgent's own default is 30)
327663
+ // Guard against NaN from template rendering (e.g., Number("{{ ... }}") = NaN)
327664
+ if (aiConfig.maxIterations === undefined || Number.isNaN(aiConfig.maxIterations)) {
327665
+ aiConfig.maxIterations = 100;
327666
+ }
327594
327667
  // Pass shared concurrency limiter for global AI call gating
327595
327668
  const sharedLimiter = sessionInfo?._parentContext?.sharedConcurrencyLimiter;
327596
327669
  if (sharedLimiter) {
@@ -374473,9 +374546,39 @@ class WorkspaceManager {
374473
374546
  const mainProjectName = sanitizePathComponent(configuredMainProjectName || this.extractProjectName(this.originalPath));
374474
374547
  this.usedNames.add(mainProjectName);
374475
374548
  // Create worktree for main project
374476
- const mainProjectPath = path.join(this.workspacePath, mainProjectName);
374549
+ let mainProjectPath = path.join(this.workspacePath, mainProjectName);
374477
374550
  // Check if original path is a git repository
374478
374551
  const isGitRepo = await this.isGitRepository(this.originalPath);
374552
+ // Prune stale worktree references (from previous runs that were cleaned up).
374553
+ // Without this, the worktree list grows unboundedly and can slow git operations.
374554
+ if (isGitRepo) {
374555
+ try {
374556
+ await command_executor_1.commandExecutor.execute(`git -C ${shellEscape(this.originalPath)} worktree prune`, {
374557
+ timeout: 15000,
374558
+ });
374559
+ }
374560
+ catch {
374561
+ // Best-effort — don't fail workspace init if prune fails
374562
+ }
374563
+ }
374564
+ // Detect if originalPath is a subdirectory of a git repo.
374565
+ // `git worktree add` always checks out the full repo, so if the user runs
374566
+ // visor from a subdirectory (e.g. /repo/subdir), the worktree will contain
374567
+ // the entire repo and we need to adjust mainProjectPath to point to the
374568
+ // corresponding subdirectory inside the worktree.
374569
+ let subdirOffset = '';
374570
+ if (isGitRepo) {
374571
+ const gitRootResult = await command_executor_1.commandExecutor.execute(`git -C ${shellEscape(this.originalPath)} rev-parse --show-toplevel`, { timeout: 5000 });
374572
+ if (gitRootResult.exitCode === 0) {
374573
+ const gitRoot = gitRootResult.stdout.trim();
374574
+ const normalizedOriginal = path.resolve(this.originalPath);
374575
+ const normalizedRoot = path.resolve(gitRoot);
374576
+ if (normalizedOriginal !== normalizedRoot) {
374577
+ subdirOffset = path.relative(normalizedRoot, normalizedOriginal);
374578
+ logger_1.logger.info(`[Workspace] Original path is a subdirectory of git repo: ${subdirOffset}`);
374579
+ }
374580
+ }
374581
+ }
374479
374582
  if (isGitRepo) {
374480
374583
  // Check if main project worktree already exists (reused workspace, e.g. Slack thread)
374481
374584
  const exists = await this.pathExists(mainProjectPath);
@@ -374513,6 +374616,23 @@ class WorkspaceManager {
374513
374616
  }
374514
374617
  }
374515
374618
  }
374619
+ // Remember the worktree root before any subdirectory adjustment.
374620
+ // Cleanup needs the actual worktree path (not the subdirectory inside it).
374621
+ const worktreeRootPath = mainProjectPath;
374622
+ // If the original path was a subdirectory, adjust mainProjectPath to
374623
+ // point to the corresponding subdirectory inside the worktree.
374624
+ // e.g. worktree at /tmp/ws/Oel contains full repo; if originalPath was
374625
+ // /repo/Oel, then mainProjectPath becomes /tmp/ws/Oel/Oel
374626
+ if (subdirOffset) {
374627
+ mainProjectPath = path.join(mainProjectPath, subdirOffset);
374628
+ logger_1.logger.info(`[Workspace] Adjusted main project path to subdirectory: ${mainProjectPath}`);
374629
+ // Ensure the subdirectory exists in the worktree
374630
+ const subdirExists = await this.pathExists(mainProjectPath);
374631
+ if (!subdirExists) {
374632
+ logger_1.logger.warn(`[Workspace] Subdirectory '${subdirOffset}' not found in worktree — falling back to worktree root`);
374633
+ mainProjectPath = path.join(this.workspacePath, mainProjectName);
374634
+ }
374635
+ }
374516
374636
  // Scan existing entries in the workspace directory to populate usedNames.
374517
374637
  // This handles reused workspaces (e.g. Slack threads) where a previous run
374518
374638
  // left symlinks on disk but the in-memory state was cleared by cleanup().
@@ -374535,6 +374655,7 @@ class WorkspaceManager {
374535
374655
  mainProjectPath,
374536
374656
  mainProjectName,
374537
374657
  originalPath: this.originalPath,
374658
+ worktreeRootPath,
374538
374659
  };
374539
374660
  this.initialized = true;
374540
374661
  logger_1.logger.info(`Workspace initialized: ${this.workspacePath}`);
@@ -374643,14 +374764,16 @@ class WorkspaceManager {
374643
374764
  ]);
374644
374765
  }
374645
374766
  try {
374646
- // Remove main project worktree if it exists
374767
+ // Remove main project worktree if it exists.
374768
+ // Use worktreeRootPath (the actual git worktree) rather than mainProjectPath
374769
+ // which may include a subdirectory offset (e.g. Oel/Oel instead of Oel).
374647
374770
  if (this.mainProjectInfo) {
374648
- const mainProjectPath = this.mainProjectInfo.mainProjectPath;
374771
+ const worktreePath = this.mainProjectInfo.worktreeRootPath || this.mainProjectInfo.mainProjectPath;
374649
374772
  // Check if path exists and if it's a worktree (not a symlink)
374650
374773
  try {
374651
- const stats = await fsp.lstat(mainProjectPath);
374774
+ const stats = await fsp.lstat(worktreePath);
374652
374775
  if (!stats.isSymbolicLink()) {
374653
- await this.removeMainProjectWorktree(mainProjectPath);
374776
+ await this.removeMainProjectWorktree(worktreePath);
374654
374777
  }
374655
374778
  }
374656
374779
  catch {
@@ -547710,9 +547833,13 @@ var init_ProbeAgent = __esm({
547710
547833
  }
547711
547834
  return await this.fallbackManager.executeWithFallback(
547712
547835
  async (provider, model, config2) => {
547836
+ let fallbackModel = provider(model);
547837
+ if (this.concurrencyLimiter) {
547838
+ fallbackModel = _ProbeAgent._wrapModelWithLimiter(fallbackModel, this.concurrencyLimiter, this.debug);
547839
+ }
547713
547840
  const fallbackOptions = {
547714
547841
  ...options,
547715
- model: provider(model),
547842
+ model: fallbackModel,
547716
547843
  abortSignal: controller.signal
547717
547844
  };
547718
547845
  if (config2.provider !== "google" && fallbackOptions.tools) {
@@ -547740,6 +547867,132 @@ var init_ProbeAgent = __esm({
547740
547867
  }
547741
547868
  );
547742
547869
  }
547870
+ /**
547871
+ * Wrap a LanguageModelV1 model so each doStream/doGenerate call acquires and
547872
+ * releases a concurrency limiter slot. This gates individual LLM API calls
547873
+ * (seconds each) instead of entire multi-step agent sessions (minutes).
547874
+ *
547875
+ * @param {Object} model - LanguageModelV1 model instance
547876
+ * @param {Object} limiter - Concurrency limiter with acquire/release/getStats
547877
+ * @param {boolean} debug - Enable debug logging
547878
+ * @returns {Object} Wrapped model with per-call concurrency gating
547879
+ * @private
547880
+ */
547881
+ static _wrapModelWithLimiter(model, limiter, debug) {
547882
+ return new Proxy(model, {
547883
+ get(target, prop) {
547884
+ if (prop === "doStream") {
547885
+ return async function(...args) {
547886
+ await limiter.acquire(null);
547887
+ if (debug) {
547888
+ const stats = limiter.getStats();
547889
+ console.log(`[DEBUG] Acquired AI slot for LLM call (${stats.globalActive}/${stats.maxConcurrent}, queue: ${stats.queueSize})`);
547890
+ }
547891
+ try {
547892
+ const result = await target.doStream(...args);
547893
+ const originalStream = result.stream;
547894
+ const originalReader = originalStream.getReader();
547895
+ let released = false;
547896
+ const releaseOnce = () => {
547897
+ if (released) return;
547898
+ released = true;
547899
+ limiter.release(null);
547900
+ };
547901
+ const wrappedStream = new ReadableStream({
547902
+ async pull(controller) {
547903
+ try {
547904
+ const { done, value: value2 } = await originalReader.read();
547905
+ if (done) {
547906
+ controller.close();
547907
+ releaseOnce();
547908
+ if (debug) {
547909
+ const stats = limiter.getStats();
547910
+ console.log(`[DEBUG] Released AI slot after LLM stream complete (${stats.globalActive}/${stats.maxConcurrent})`);
547911
+ }
547912
+ } else {
547913
+ controller.enqueue(value2);
547914
+ }
547915
+ } catch (err) {
547916
+ releaseOnce();
547917
+ if (debug) {
547918
+ console.log(`[DEBUG] Released AI slot on LLM stream error`);
547919
+ }
547920
+ controller.error(err);
547921
+ }
547922
+ },
547923
+ cancel() {
547924
+ releaseOnce();
547925
+ if (debug) {
547926
+ console.log(`[DEBUG] Released AI slot on LLM stream cancel`);
547927
+ }
547928
+ originalReader.cancel();
547929
+ }
547930
+ });
547931
+ return { ...result, stream: wrappedStream };
547932
+ } catch (err) {
547933
+ limiter.release(null);
547934
+ if (debug) {
547935
+ console.log(`[DEBUG] Released AI slot on doStream error`);
547936
+ }
547937
+ throw err;
547938
+ }
547939
+ };
547940
+ }
547941
+ if (prop === "doGenerate") {
547942
+ return async function(...args) {
547943
+ await limiter.acquire(null);
547944
+ if (debug) {
547945
+ const stats = limiter.getStats();
547946
+ console.log(`[DEBUG] Acquired AI slot for LLM generate (${stats.globalActive}/${stats.maxConcurrent})`);
547947
+ }
547948
+ try {
547949
+ const result = await target.doGenerate(...args);
547950
+ return result;
547951
+ } finally {
547952
+ limiter.release(null);
547953
+ if (debug) {
547954
+ const stats = limiter.getStats();
547955
+ console.log(`[DEBUG] Released AI slot after LLM generate (${stats.globalActive}/${stats.maxConcurrent})`);
547956
+ }
547957
+ }
547958
+ };
547959
+ }
547960
+ const value = target[prop];
547961
+ return typeof value === "function" ? value.bind(target) : value;
547962
+ }
547963
+ });
547964
+ }
547965
+ /**
547966
+ * Wrap an engine stream result so its textStream async generator acquires
547967
+ * and releases a concurrency limiter slot. Acquire happens when iteration
547968
+ * begins; release happens in finally (completion, error, or break).
547969
+ *
547970
+ * @param {Object} result - Engine result with { textStream, usage, ... }
547971
+ * @param {Object} limiter - Concurrency limiter with acquire/release/getStats
547972
+ * @param {boolean} debug - Enable debug logging
547973
+ * @returns {Object} Result with wrapped textStream
547974
+ * @private
547975
+ */
547976
+ static _wrapEngineStreamWithLimiter(result, limiter, debug) {
547977
+ const originalStream = result.textStream;
547978
+ async function* gatedStream() {
547979
+ await limiter.acquire(null);
547980
+ if (debug) {
547981
+ const stats = limiter.getStats();
547982
+ console.log(`[DEBUG] Acquired AI slot for engine stream (${stats.globalActive}/${stats.maxConcurrent}, queue: ${stats.queueSize})`);
547983
+ }
547984
+ try {
547985
+ yield* originalStream;
547986
+ } finally {
547987
+ limiter.release(null);
547988
+ if (debug) {
547989
+ const stats = limiter.getStats();
547990
+ console.log(`[DEBUG] Released AI slot after engine stream (${stats.globalActive}/${stats.maxConcurrent})`);
547991
+ }
547992
+ }
547993
+ }
547994
+ return { ...result, textStream: gatedStream() };
547995
+ }
547743
547996
  /**
547744
547997
  * Execute streamText with retry and fallback support
547745
547998
  * @param {Object} options - streamText options
@@ -547748,12 +548001,8 @@ var init_ProbeAgent = __esm({
547748
548001
  */
547749
548002
  async streamTextWithRetryAndFallback(options) {
547750
548003
  const limiter = this.concurrencyLimiter;
547751
- if (limiter) {
547752
- await limiter.acquire(null);
547753
- if (this.debug) {
547754
- const stats = limiter.getStats();
547755
- console.log(`[DEBUG] Acquired global AI concurrency slot (${stats.globalActive}/${stats.maxConcurrent}, queue: ${stats.queueSize})`);
547756
- }
548004
+ if (limiter && options.model) {
548005
+ options = { ...options, model: _ProbeAgent._wrapModelWithLimiter(options.model, limiter, this.debug) };
547757
548006
  }
547758
548007
  const controller = new AbortController();
547759
548008
  const timeoutState = { timeoutId: null };
@@ -547781,6 +548030,9 @@ var init_ProbeAgent = __esm({
547781
548030
  if (useClaudeCode || useCodex) {
547782
548031
  try {
547783
548032
  result = await this._tryEngineStreamPath(options, controller, timeoutState);
548033
+ if (result && limiter) {
548034
+ result = _ProbeAgent._wrapEngineStreamWithLimiter(result, limiter, this.debug);
548035
+ }
547784
548036
  } catch (error40) {
547785
548037
  if (this.debug) {
547786
548038
  const engineType = useClaudeCode ? "Claude Code" : "Codex";
@@ -547791,41 +548043,7 @@ var init_ProbeAgent = __esm({
547791
548043
  if (!result) {
547792
548044
  result = await this._executeWithVercelProvider(options, controller);
547793
548045
  }
547794
- if (limiter && result.textStream) {
547795
- const originalStream = result.textStream;
547796
- const debug = this.debug;
547797
- const wrappedStream = (async function* () {
547798
- try {
547799
- for await (const chunk of originalStream) {
547800
- yield chunk;
547801
- }
547802
- } finally {
547803
- limiter.release(null);
547804
- if (debug) {
547805
- const stats = limiter.getStats();
547806
- console.log(`[DEBUG] Released global AI concurrency slot (${stats.globalActive}/${stats.maxConcurrent}, queue: ${stats.queueSize})`);
547807
- }
547808
- }
547809
- })();
547810
- return new Proxy(result, {
547811
- get(target, prop) {
547812
- if (prop === "textStream") return wrappedStream;
547813
- const value = target[prop];
547814
- return typeof value === "function" ? value.bind(target) : value;
547815
- }
547816
- });
547817
- } else if (limiter) {
547818
- limiter.release(null);
547819
- }
547820
548046
  return result;
547821
- } catch (error40) {
547822
- if (limiter) {
547823
- limiter.release(null);
547824
- if (this.debug) {
547825
- console.log(`[DEBUG] Released global AI concurrency slot on error`);
547826
- }
547827
- }
547828
- throw error40;
547829
548047
  } finally {
547830
548048
  if (timeoutState.timeoutId) {
547831
548049
  clearTimeout(timeoutState.timeoutId);
@@ -610994,7 +611212,7 @@ module.exports = /*#__PURE__*/JSON.parse('["aaa","aarp","abb","abbott","abbvie",
610994
611212
  /***/ ((module) => {
610995
611213
 
610996
611214
  "use strict";
610997
- module.exports = /*#__PURE__*/JSON.parse('{"name":"@probelabs/visor","version":"0.1.42","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","@grammyjs/runner":"^2.0.3","@modelcontextprotocol/sdk":"^1.25.3","@nyariv/sandboxjs":"github:probelabs/SandboxJS#23c4bb611f7d05f3cb8c523917b5f57103e48108","@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/api-logs":"^0.203.0","@opentelemetry/core":"^1.30.1","@opentelemetry/exporter-logs-otlp-http":"^0.203.0","@opentelemetry/exporter-metrics-otlp-http":"^0.203.0","@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-logs":"^0.203.0","@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-rc293","@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","botbuilder":"^4.23.3","botframework-connector":"^4.23.3","cli-table3":"^0.6.5","commander":"^14.0.0","deepmerge":"^4.3.1","dotenv":"^17.2.3","grammy":"^1.41.1","ignore":"^7.0.5","imapflow":"^1.2.12","js-yaml":"^4.1.0","jsonpath-plus":"^10.4.0","liquidjs":"^10.21.1","mailparser":"^3.9.3","minimatch":"^10.2.2","node-cron":"^3.0.3","nodemailer":"^8.0.1","open":"^9.1.0","resend":"^6.9.3","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/mailparser":"^3.4.6","@types/node":"^24.3.0","@types/node-cron":"^3.0.11","@types/nodemailer":"^7.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"]}}');
611215
+ module.exports = /*#__PURE__*/JSON.parse('{"name":"@probelabs/visor","version":"0.1.42","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","@grammyjs/runner":"^2.0.3","@modelcontextprotocol/sdk":"^1.25.3","@nyariv/sandboxjs":"github:probelabs/SandboxJS#23c4bb611f7d05f3cb8c523917b5f57103e48108","@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/api-logs":"^0.203.0","@opentelemetry/core":"^1.30.1","@opentelemetry/exporter-logs-otlp-http":"^0.203.0","@opentelemetry/exporter-metrics-otlp-http":"^0.203.0","@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-logs":"^0.203.0","@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-rc294","@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","botbuilder":"^4.23.3","botframework-connector":"^4.23.3","cli-table3":"^0.6.5","commander":"^14.0.0","deepmerge":"^4.3.1","dotenv":"^17.2.3","grammy":"^1.41.1","ignore":"^7.0.5","imapflow":"^1.2.12","js-yaml":"^4.1.0","jsonpath-plus":"^10.4.0","liquidjs":"^10.21.1","mailparser":"^3.9.3","minimatch":"^10.2.2","node-cron":"^3.0.3","nodemailer":"^8.0.1","open":"^9.1.0","resend":"^6.9.3","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/mailparser":"^3.4.6","@types/node":"^24.3.0","@types/node-cron":"^3.0.11","@types/nodemailer":"^7.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"]}}');
610998
611216
 
610999
611217
  /***/ })
611000
611218
 
@@ -1 +1 @@
1
- {"version":3,"file":"ai-check-provider.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/providers/ai-check-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA6B5C;;GAEG;AACH,qBAAa,eAAgB,SAAQ,aAAa;IAChD,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,YAAY,CAA0C;IAC9D,OAAO,CAAC,OAAO,CAAwB;;IAQvC,OAAO,IAAI,MAAM;IAIjB,cAAc,IAAI,MAAM;IAIxB,8DAA8D;IAC9D,OAAO,CAAC,QAAQ;IAWhB,uFAAuF;IACvF,OAAO,CAAC,sBAAsB;IAsCxB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAkDvD;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAiB7B;;OAEG;YACW,aAAa;IA8B3B;;OAEG;YACW,UAAU;IAsExB;;OAEG;YACW,kBAAkB;IA0ChC;;OAEG;YACW,oBAAoB;IA6QlC;;;OAGG;YACW,YAAY;IA6IpB,OAAO,CACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,mBAAmB,EAC3B,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAC/C,WAAW,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GACjE,OAAO,CAAC,aAAa,CAAC;YAiBX,iBAAiB;IAkoC/B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IA0B3B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAsE7B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA2G5B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA8F5B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAmE9B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAuBpB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAUvB;;;;;OAKG;IACH,MAAM,CAAC,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAWhG,sBAAsB,IAAI,MAAM,EAAE;IA4C5B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAYrC,eAAe,IAAI,MAAM,EAAE;CAQ5B"}
1
+ {"version":3,"file":"ai-check-provider.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/providers/ai-check-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA6B5C;;GAEG;AACH,qBAAa,eAAgB,SAAQ,aAAa;IAChD,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,YAAY,CAA0C;IAC9D,OAAO,CAAC,OAAO,CAAwB;;IAQvC,OAAO,IAAI,MAAM;IAIjB,cAAc,IAAI,MAAM;IAIxB,8DAA8D;IAC9D,OAAO,CAAC,QAAQ;IAWhB,uFAAuF;IACvF,OAAO,CAAC,sBAAsB;IAsCxB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAkDvD;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAiB7B;;OAEG;YACW,aAAa;IA8B3B;;OAEG;YACW,UAAU;IAsExB;;OAEG;YACW,kBAAkB;IA0ChC;;OAEG;YACW,oBAAoB;IA6QlC;;;OAGG;YACW,YAAY;IA6IpB,OAAO,CACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,mBAAmB,EAC3B,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAC/C,WAAW,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GACjE,OAAO,CAAC,aAAa,CAAC;YAiBX,iBAAiB;IAgpC/B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IA0B3B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAsE7B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA2G5B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA8F5B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAmE9B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAuBpB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAUvB;;;;;OAKG;IACH,MAAM,CAAC,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAWhG,sBAAsB,IAAI,MAAM,EAAE;IA4C5B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAYrC,eAAe,IAAI,MAAM,EAAE;CAQ5B"}
@@ -12,7 +12,7 @@ import {
12
12
  import {
13
13
  init_trace_helpers,
14
14
  withActiveSpan
15
- } from "./chunk-6YGCACBF.mjs";
15
+ } from "./chunk-CHARL3TY.mjs";
16
16
  import "./chunk-6VVXKXTI.mjs";
17
17
  import "./chunk-34QX63WK.mjs";
18
18
  import {
@@ -1655,4 +1655,4 @@ export {
1655
1655
  messageToWorkflowInput,
1656
1656
  resultToArtifacts
1657
1657
  };
1658
- //# sourceMappingURL=a2a-frontend-U3PTNCLR.mjs.map
1658
+ //# sourceMappingURL=a2a-frontend-KJFLIZJT.mjs.map