@probelabs/visor 0.1.130-ee → 0.1.131-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 (108) hide show
  1. package/README.md +7 -0
  2. package/defaults/visor.yaml +5 -2
  3. package/dist/ai-review-service.d.ts +2 -0
  4. package/dist/ai-review-service.d.ts.map +1 -1
  5. package/dist/cli-main.d.ts.map +1 -1
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/config/cli-handler.d.ts +5 -0
  8. package/dist/config/cli-handler.d.ts.map +1 -0
  9. package/dist/config/config-reloader.d.ts +24 -0
  10. package/dist/config/config-reloader.d.ts.map +1 -0
  11. package/dist/config/config-snapshot-store.d.ts +21 -0
  12. package/dist/config/config-snapshot-store.d.ts.map +1 -0
  13. package/dist/config/config-watcher.d.ts +19 -0
  14. package/dist/config/config-watcher.d.ts.map +1 -0
  15. package/dist/config/types.d.ts +16 -0
  16. package/dist/config/types.d.ts.map +1 -0
  17. package/dist/defaults/visor.yaml +5 -2
  18. package/dist/docs/ai-configuration.md +139 -0
  19. package/dist/docs/ai-custom-tools.md +30 -0
  20. package/dist/docs/capacity-planning.md +359 -0
  21. package/dist/docs/commands.md +35 -0
  22. package/dist/docs/database-operations.md +487 -0
  23. package/dist/docs/index.md +6 -1
  24. package/dist/docs/licensing.md +372 -0
  25. package/dist/docs/production-deployment.md +583 -0
  26. package/dist/examples/ai-with-bash.yaml +17 -0
  27. package/dist/generated/config-schema.d.ts +4 -0
  28. package/dist/generated/config-schema.d.ts.map +1 -1
  29. package/dist/index.js +9945 -10907
  30. package/dist/liquid-extensions.d.ts +7 -0
  31. package/dist/liquid-extensions.d.ts.map +1 -1
  32. package/dist/providers/ai-check-provider.d.ts +5 -0
  33. package/dist/providers/ai-check-provider.d.ts.map +1 -1
  34. package/dist/providers/command-check-provider.d.ts.map +1 -1
  35. package/dist/providers/workflow-check-provider.d.ts.map +1 -1
  36. package/dist/scheduler/schedule-tool.d.ts.map +1 -1
  37. package/dist/sdk/{check-provider-registry-PANIXYRB.mjs → check-provider-registry-FMHECPI4.mjs} +8 -8
  38. package/dist/sdk/{check-provider-registry-S7DKTEM6.mjs → check-provider-registry-ZOLEYDKM.mjs} +8 -8
  39. package/dist/sdk/{chunk-VMLORODQ.mjs → chunk-2GCSK3PD.mjs} +4 -4
  40. package/dist/sdk/{chunk-HOKQOO3G.mjs → chunk-EBTD2D4L.mjs} +2 -2
  41. package/dist/sdk/{chunk-UCNT3PDT.mjs → chunk-LQ5B4T6L.mjs} +5 -1
  42. package/dist/sdk/chunk-LQ5B4T6L.mjs.map +1 -0
  43. package/dist/sdk/{chunk-S6CD7GFM.mjs → chunk-MQ57AB4U.mjs} +211 -35
  44. package/dist/sdk/chunk-MQ57AB4U.mjs.map +1 -0
  45. package/dist/sdk/chunk-N4I6ZDCJ.mjs +436 -0
  46. package/dist/sdk/chunk-N4I6ZDCJ.mjs.map +1 -0
  47. package/dist/sdk/{chunk-TQ4D3YOF.mjs → chunk-UXMMGCAS.mjs} +240 -48
  48. package/dist/sdk/chunk-UXMMGCAS.mjs.map +1 -0
  49. package/dist/sdk/{chunk-V2IV3ILA.mjs → chunk-XJQKTK6V.mjs} +31 -5
  50. package/dist/sdk/chunk-XJQKTK6V.mjs.map +1 -0
  51. package/dist/sdk/{config-OGOS4ZU4.mjs → config-4EG7IQIU.mjs} +2 -2
  52. package/dist/sdk/{failure-condition-evaluator-HC3M5377.mjs → failure-condition-evaluator-GLHZZF47.mjs} +3 -3
  53. package/dist/sdk/{github-frontend-E2KJSC3Y.mjs → github-frontend-F4TE2JY7.mjs} +3 -3
  54. package/dist/sdk/{host-EE6EJ2FM.mjs → host-GOOVFXW6.mjs} +2 -2
  55. package/dist/sdk/{host-OUSD2OIQ.mjs → host-VA3ET7N6.mjs} +2 -2
  56. package/dist/sdk/{liquid-extensions-E4EUOCES.mjs → liquid-extensions-YDIIH33Q.mjs} +2 -2
  57. package/dist/sdk/{routing-OZQWAGAI.mjs → routing-OXQKETSA.mjs} +5 -5
  58. package/dist/sdk/{schedule-tool-handler-B7TMSG6A.mjs → schedule-tool-handler-PJVKWSYX.mjs} +7 -7
  59. package/dist/sdk/{schedule-tool-handler-EBNKDUJC.mjs → schedule-tool-handler-YTBMLVEA.mjs} +7 -7
  60. package/dist/sdk/sdk.d.mts +15 -0
  61. package/dist/sdk/sdk.d.ts +15 -0
  62. package/dist/sdk/sdk.js +656 -218
  63. package/dist/sdk/sdk.js.map +1 -1
  64. package/dist/sdk/sdk.mjs +6 -6
  65. package/dist/sdk/{trace-helpers-PP3YHTAM.mjs → trace-helpers-R2ETIEC2.mjs} +4 -2
  66. package/dist/sdk/{workflow-check-provider-E7YPEZ45.mjs → workflow-check-provider-4SA32BO7.mjs} +7 -7
  67. package/dist/sdk/{workflow-check-provider-HB4XTD4Z.mjs → workflow-check-provider-57KAR4Y4.mjs} +7 -7
  68. package/dist/slack/socket-runner.d.ts.map +1 -1
  69. package/dist/state-machine/context/build-engine-context.d.ts.map +1 -1
  70. package/dist/state-machine/runner.d.ts.map +1 -1
  71. package/dist/state-machine/states/completed.d.ts.map +1 -1
  72. package/dist/telemetry/trace-helpers.d.ts +5 -0
  73. package/dist/telemetry/trace-helpers.d.ts.map +1 -1
  74. package/dist/test-runner/evaluators.d.ts.map +1 -1
  75. package/dist/test-runner/index.d.ts +7 -0
  76. package/dist/test-runner/index.d.ts.map +1 -1
  77. package/dist/test-runner/validator.d.ts.map +1 -1
  78. package/dist/tui/chat-runner.d.ts.map +1 -1
  79. package/dist/types/cli.d.ts +2 -0
  80. package/dist/types/cli.d.ts.map +1 -1
  81. package/dist/types/config.d.ts +15 -0
  82. package/dist/types/config.d.ts.map +1 -1
  83. package/dist/types/engine.d.ts +2 -0
  84. package/dist/types/engine.d.ts.map +1 -1
  85. package/package.json +3 -3
  86. package/defaults/.visor.yaml +0 -420
  87. package/dist/sdk/chunk-S6CD7GFM.mjs.map +0 -1
  88. package/dist/sdk/chunk-TQ4D3YOF.mjs.map +0 -1
  89. package/dist/sdk/chunk-UCNT3PDT.mjs.map +0 -1
  90. package/dist/sdk/chunk-V2IV3ILA.mjs.map +0 -1
  91. package/dist/sdk/chunk-YJRBN3XS.mjs +0 -217
  92. package/dist/sdk/chunk-YJRBN3XS.mjs.map +0 -1
  93. /package/dist/sdk/{check-provider-registry-PANIXYRB.mjs.map → check-provider-registry-FMHECPI4.mjs.map} +0 -0
  94. /package/dist/sdk/{check-provider-registry-S7DKTEM6.mjs.map → check-provider-registry-ZOLEYDKM.mjs.map} +0 -0
  95. /package/dist/sdk/{chunk-VMLORODQ.mjs.map → chunk-2GCSK3PD.mjs.map} +0 -0
  96. /package/dist/sdk/{chunk-HOKQOO3G.mjs.map → chunk-EBTD2D4L.mjs.map} +0 -0
  97. /package/dist/sdk/{config-OGOS4ZU4.mjs.map → config-4EG7IQIU.mjs.map} +0 -0
  98. /package/dist/sdk/{failure-condition-evaluator-HC3M5377.mjs.map → failure-condition-evaluator-GLHZZF47.mjs.map} +0 -0
  99. /package/dist/sdk/{github-frontend-E2KJSC3Y.mjs.map → github-frontend-F4TE2JY7.mjs.map} +0 -0
  100. /package/dist/sdk/{host-EE6EJ2FM.mjs.map → host-GOOVFXW6.mjs.map} +0 -0
  101. /package/dist/sdk/{host-OUSD2OIQ.mjs.map → host-VA3ET7N6.mjs.map} +0 -0
  102. /package/dist/sdk/{liquid-extensions-E4EUOCES.mjs.map → liquid-extensions-YDIIH33Q.mjs.map} +0 -0
  103. /package/dist/sdk/{routing-OZQWAGAI.mjs.map → routing-OXQKETSA.mjs.map} +0 -0
  104. /package/dist/sdk/{schedule-tool-handler-B7TMSG6A.mjs.map → schedule-tool-handler-PJVKWSYX.mjs.map} +0 -0
  105. /package/dist/sdk/{schedule-tool-handler-EBNKDUJC.mjs.map → schedule-tool-handler-YTBMLVEA.mjs.map} +0 -0
  106. /package/dist/sdk/{trace-helpers-PP3YHTAM.mjs.map → trace-helpers-R2ETIEC2.mjs.map} +0 -0
  107. /package/dist/sdk/{workflow-check-provider-E7YPEZ45.mjs.map → workflow-check-provider-4SA32BO7.mjs.map} +0 -0
  108. /package/dist/sdk/{workflow-check-provider-HB4XTD4Z.mjs.map → workflow-check-provider-57KAR4Y4.mjs.map} +0 -0
package/README.md CHANGED
@@ -118,6 +118,13 @@ visor --check security --output json --output-file visor-results.json
118
118
  # Visual debugger with web UI
119
119
  visor --debug-server --debug-port 3456
120
120
 
121
+ # Config snapshots — list, diff, or restore saved configurations
122
+ visor config snapshots
123
+ visor config diff 1 2
124
+
125
+ # Live config reload in long-running modes (e.g. Slack)
126
+ visor --slack --config .visor.yaml --watch
127
+
121
128
  # Discover options
122
129
  visor --help
123
130
  ```
@@ -8,8 +8,11 @@ include: "./code-review.yaml"
8
8
  # Global AI provider settings - users should configure their preferred provider
9
9
  # For CI testing, use --provider mock CLI flag instead
10
10
 
11
- # Run up to 4 steps in parallel for faster execution
12
- max_parallelism: 4
11
+ # Default parallelism for running checks concurrently
12
+ max_parallelism: 3
13
+
14
+ # Limit concurrent AI API calls across all checks
15
+ max_ai_concurrency: 3
13
16
 
14
17
  # Global fail condition - fail if critical or error severity issues are found
15
18
  fail_if: "output.issues && output.issues.some(i => i.severity === 'critical' || i.severity === 'error')"
@@ -36,6 +36,8 @@ export interface AIReviewConfig {
36
36
  path?: string;
37
37
  allowedFolders?: string[];
38
38
  completionPrompt?: string;
39
+ /** Shared concurrency limiter for global AI call gating */
40
+ concurrencyLimiter?: any;
39
41
  }
40
42
  export interface AIDebugInfo {
41
43
  /** The prompt sent to the AI */
@@ -1 +1 @@
1
- {"version":3,"file":"","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/ai-review-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/ai-review-service.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/cli-main.ts"],"names":[],"mappings":"AAyxBA;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAu1C1C"}
1
+ {"version":3,"file":"","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/cli-main.ts"],"names":[],"mappings":"AAmyBA;;GAEG;AACH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAo5C1C"}
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/cli.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAA2B,MAAM,aAAa,CAAC;AAQlE;;GAEG;AACH,qBAAa,GAAG;IACd,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,YAAY,CAA0D;IAG9E,OAAO,CAAC,WAAW,CAGR;;IAOX;;OAEG;IACH,OAAO,CAAC,YAAY;IAsEpB;;OAEG;IACH,OAAO,CAAC,aAAa,CAEnB;IAEF;;OAEG;IACI,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU;IAgL5C;;OAEG;IACH,OAAO,CAAC,eAAe;IAyCvB;;OAEG;IACI,WAAW,IAAI,MAAM;IAkE5B;;OAEG;IACI,UAAU,IAAI,MAAM;IAoC3B;;OAEG;IACI,eAAe,IAAI,MAAM;IAkBhC;;OAEG;IACI,QAAQ,IAAI,IAAI;IAIvB;;OAEG;IACI,WAAW,IAAI,IAAI;CAG3B"}
1
+ {"version":3,"file":"","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/cli.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAA2B,MAAM,aAAa,CAAC;AAQlE;;GAEG;AACH,qBAAa,GAAG;IACd,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,YAAY,CAA0D;IAG9E,OAAO,CAAC,WAAW,CAGR;;IAOX;;OAEG;IACH,OAAO,CAAC,YAAY;IA0EpB;;OAEG;IACH,OAAO,CAAC,aAAa,CAEnB;IAEF;;OAEG;IACI,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU;IAqL5C;;OAEG;IACH,OAAO,CAAC,eAAe;IAyCvB;;OAEG;IACI,WAAW,IAAI,MAAM;IAkE5B;;OAEG;IACI,UAAU,IAAI,MAAM;IAoC3B;;OAEG;IACI,eAAe,IAAI,MAAM;IAkBhC;;OAEG;IACI,QAAQ,IAAI,IAAI;IAIvB;;OAEG;IACI,WAAW,IAAI,IAAI;CAG3B"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Handle the config subcommand
3
+ */
4
+ export declare function handleConfigCommand(argv: string[]): Promise<void>;
5
+ //# sourceMappingURL=cli-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-handler.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/config/cli-handler.ts"],"names":[],"mappings":"AA+CA;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BvE"}
@@ -0,0 +1,24 @@
1
+ import { ConfigManager } from '../config';
2
+ import type { VisorConfig } from '../types/config';
3
+ import { ConfigSnapshotStore } from './config-snapshot-store';
4
+ export interface ConfigReloaderOptions {
5
+ configPath: string;
6
+ configManager: ConfigManager;
7
+ snapshotStore: ConfigSnapshotStore;
8
+ onSwap: (newConfig: VisorConfig) => void;
9
+ onError?: (err: Error) => void;
10
+ }
11
+ export declare class ConfigReloader {
12
+ private configPath;
13
+ private configManager;
14
+ private snapshotStore;
15
+ private onSwap;
16
+ private onError?;
17
+ constructor(options: ConfigReloaderOptions);
18
+ /**
19
+ * Attempt to reload the config file.
20
+ * Returns true if the config was successfully reloaded and swapped.
21
+ */
22
+ reload(): Promise<boolean>;
23
+ }
24
+ //# sourceMappingURL=config-reloader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-reloader.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/config/config-reloader.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAA4B,MAAM,yBAAyB,CAAC;AAExF,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,aAAa,CAAC;IAC7B,aAAa,EAAE,mBAAmB,CAAC;IACnC,MAAM,EAAE,CAAC,SAAS,EAAE,WAAW,KAAK,IAAI,CAAC;IACzC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CAChC;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,OAAO,CAAC,CAAuB;gBAE3B,OAAO,EAAE,qBAAqB;IAQ1C;;;OAGG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;CA4BjC"}
@@ -0,0 +1,21 @@
1
+ import type { ConfigSnapshot, ConfigSnapshotSummary } from './types';
2
+ import type { VisorConfig } from '../types/config';
3
+ export declare class ConfigSnapshotStore {
4
+ private db;
5
+ private dbPath;
6
+ constructor(filename?: string);
7
+ initialize(): Promise<void>;
8
+ shutdown(): Promise<void>;
9
+ private migrateSchema;
10
+ private getDb;
11
+ save(snapshot: Omit<ConfigSnapshot, 'id'>, maxCount?: number): Promise<ConfigSnapshot>;
12
+ private getLastInsertId;
13
+ list(): Promise<ConfigSnapshotSummary[]>;
14
+ get(id: number): Promise<ConfigSnapshot | undefined>;
15
+ prune(maxCount?: number): Promise<number>;
16
+ }
17
+ /**
18
+ * Create a snapshot record from a resolved VisorConfig.
19
+ */
20
+ export declare function createSnapshotFromConfig(config: VisorConfig, trigger: 'startup' | 'reload', sourcePath: string | null): Omit<ConfigSnapshot, 'id'>;
21
+ //# sourceMappingURL=config-snapshot-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-snapshot-store.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/config/config-snapshot-store.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAkBnD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,EAAE,CAAqC;IAC/C,OAAO,CAAC,MAAM,CAAS;gBAEX,QAAQ,CAAC,EAAE,MAAM;IAIvB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA4C3B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAO/B,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,KAAK;IAOP,IAAI,CACR,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,EACpC,QAAQ,GAAE,MAA8B,GACvC,OAAO,CAAC,cAAc,CAAC;IAqB1B,OAAO,CAAC,eAAe;IAKjB,IAAI,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAUxC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAQpD,KAAK,CAAC,QAAQ,GAAE,MAA8B,GAAG,OAAO,CAAC,MAAM,CAAC;CAevE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,SAAS,GAAG,QAAQ,EAC7B,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAY5B"}
@@ -0,0 +1,19 @@
1
+ import { ConfigReloader } from './config-reloader';
2
+ export declare class ConfigWatcher {
3
+ private configPath;
4
+ private reloader;
5
+ private debounceMs;
6
+ private watcher;
7
+ private debounceTimer;
8
+ private signalHandler;
9
+ constructor(configPath: string, reloader: ConfigReloader, debounceMs?: number);
10
+ start(): void;
11
+ stop(): void;
12
+ private debouncedReload;
13
+ /**
14
+ * Fire-and-forget reload with full error handling.
15
+ * Ensures unhandled promise rejections never escape.
16
+ */
17
+ private safeReload;
18
+ }
19
+ //# sourceMappingURL=config-watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-watcher.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/config/config-watcher.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAInD,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,aAAa,CAA6B;gBAEtC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,MAAM;IAM7E,KAAK,IAAI,IAAI;IA8Bb,IAAI,IAAI,IAAI;IAqBZ,OAAO,CAAC,eAAe;IAWvB;;;OAGG;IACH,OAAO,CAAC,UAAU;CAKnB"}
@@ -0,0 +1,16 @@
1
+ export interface ConfigSnapshot {
2
+ id: number;
3
+ created_at: string;
4
+ trigger: 'startup' | 'reload';
5
+ config_hash: string;
6
+ config_yaml: string;
7
+ source_path: string | null;
8
+ }
9
+ export interface ConfigSnapshotSummary {
10
+ id: number;
11
+ created_at: string;
12
+ trigger: string;
13
+ config_hash: string;
14
+ source_path: string | null;
15
+ }
16
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/config/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B"}
@@ -8,8 +8,11 @@ include: "./code-review.yaml"
8
8
  # Global AI provider settings - users should configure their preferred provider
9
9
  # For CI testing, use --provider mock CLI flag instead
10
10
 
11
- # Run up to 4 steps in parallel for faster execution
12
- max_parallelism: 4
11
+ # Default parallelism for running checks concurrently
12
+ max_parallelism: 3
13
+
14
+ # Limit concurrent AI API calls across all checks
15
+ max_ai_concurrency: 3
13
16
 
14
17
  # Global fail condition - fail if critical or error severity issues are found
15
18
  fail_if: "output.issues && output.issues.some(i => i.severity === 'critical' || i.severity === 'error')"
@@ -551,6 +551,44 @@ steps:
551
551
 
552
552
  **Security Note:** Bash command execution respects existing security boundaries and permissions. Commands run with the same privileges as the Visor process. Always review and test bash configurations before deploying to production environments.
553
553
 
554
+ #### Dynamic Bash Configuration (`ai_bash_config_js`)
555
+
556
+ Use `ai_bash_config_js` to dynamically compute bash command permissions at runtime based on dependency outputs. This mirrors the `ai_mcp_servers_js` pattern and is useful for skill-based systems where different active skills need different bash command access.
557
+
558
+ ```yaml
559
+ checks:
560
+ build-config:
561
+ type: script
562
+ content: |
563
+ // Collect allowed commands from active skills
564
+ return {
565
+ bash_config: {
566
+ allow: ['git:log:*', 'git:diff:*'],
567
+ deny: ['git:push:--force']
568
+ }
569
+ };
570
+
571
+ generate-response:
572
+ type: ai
573
+ depends_on: [build-config]
574
+ prompt: "Help the user with their request"
575
+ ai:
576
+ allowBash: true
577
+ bashConfig:
578
+ allow: ['gh:*'] # Static baseline
579
+ ai_bash_config_js: |
580
+ return outputs['build-config']?.bash_config ?? {};
581
+ ```
582
+
583
+ The expression has access to the same context as other `_js` fields: `outputs`, `inputs`, `pr`, `files`, `env`, `memory`. It must return an object with optional `allow` and `deny` string arrays.
584
+
585
+ **Merge behavior:** Dynamic arrays are appended to static `bashConfig` arrays. This means:
586
+ - Static `bashConfig` sets the baseline permissions
587
+ - `ai_bash_config_js` extends with additional patterns from active skills
588
+ - The AI agent's internal precedence (deny > allow) handles conflicts
589
+
590
+ If `ai_bash_config_js` returns allow or deny patterns, `allowBash` is automatically set to `true`.
591
+
554
592
  #### Retry Configuration (`retry`)
555
593
 
556
594
  Configure automatic retries for AI provider calls when transient errors occur:
@@ -644,3 +682,104 @@ If no key is configured, Visor falls back to fast, heuristic checks (simple patt
644
682
 
645
683
  ### MCP (Tools) Support
646
684
  See [mcp.md](./mcp.md) for adding MCP servers (Probe, Jira, Filesystem, etc.).
685
+
686
+ ### Dynamic JavaScript Expressions (`_js` fields)
687
+
688
+ Several configuration fields support dynamic JavaScript expressions that are evaluated at runtime. These are useful in multi-step workflows where earlier steps produce configuration that later steps consume.
689
+
690
+ All `_js` expression fields share the same execution context:
691
+ - **`outputs`** — results from dependency steps (via `depends_on`)
692
+ - **`inputs`** — workflow inputs
693
+ - **`pr`** — PR metadata (`number`, `title`, `author`, `branch`, `base`)
694
+ - **`files`** — changed files (`filename`, `status`, `additions`, `deletions`)
695
+ - **`env`** — safe subset of environment variables (secrets are excluded)
696
+ - **`memory`** — memory accessor (if configured)
697
+
698
+ Expressions are wrapped in a function body — use `return` to return the result. The `log()` function is available for debugging.
699
+
700
+ #### `ai_mcp_servers_js`
701
+
702
+ Dynamically compute which MCP servers to connect to. Must return an object mapping server names to server configurations.
703
+
704
+ ```yaml
705
+ checks:
706
+ build-config:
707
+ type: script
708
+ content: |
709
+ return {
710
+ mcp_servers: {
711
+ jira: { command: 'uvx', args: ['mcp-atlassian'] },
712
+ github: { command: 'npx', args: ['-y', '@modelcontextprotocol/server-github'] }
713
+ }
714
+ };
715
+
716
+ assistant:
717
+ type: ai
718
+ depends_on: [build-config]
719
+ prompt: "Help the user"
720
+ ai_mcp_servers_js: |
721
+ return outputs['build-config']?.mcp_servers ?? {};
722
+ ```
723
+
724
+ Each server config can be:
725
+ - **Stdio MCP server**: `{ command, args, env }`
726
+ - **SSE/HTTP MCP server**: `{ url, transport }`
727
+ - **Workflow tool**: `{ workflow, inputs }`
728
+ - **Built-in tool**: `{ tool: 'schedule' }`
729
+
730
+ Dynamic servers are merged with any static `ai_mcp_servers` configuration.
731
+
732
+ #### `ai_custom_tools_js`
733
+
734
+ Dynamically compute which custom tools to expose. Must return an array of tool names (strings) or workflow tool references.
735
+
736
+ ```yaml
737
+ checks:
738
+ route:
739
+ type: script
740
+ content: |
741
+ return { intent: 'engineer' };
742
+
743
+ assistant:
744
+ type: ai
745
+ depends_on: [route]
746
+ prompt: "Help the user"
747
+ ai_custom_tools_js: |
748
+ const tools = [];
749
+ if (outputs['route'].intent === 'engineer') {
750
+ tools.push({ workflow: 'engineer', args: { projects: ['my-repo'] } });
751
+ }
752
+ return tools;
753
+ ```
754
+
755
+ Dynamic tools are merged with any static `ai_custom_tools` configuration (duplicates by name are skipped).
756
+
757
+ #### `ai_bash_config_js`
758
+
759
+ Dynamically compute bash command permissions. Must return an object with optional `allow` and `deny` string arrays.
760
+
761
+ ```yaml
762
+ checks:
763
+ build-config:
764
+ type: script
765
+ content: |
766
+ return {
767
+ bash_config: {
768
+ allow: ['git:log:*', 'npm:test'],
769
+ deny: ['git:push:--force']
770
+ }
771
+ };
772
+
773
+ assistant:
774
+ type: ai
775
+ depends_on: [build-config]
776
+ prompt: "Help the user"
777
+ ai:
778
+ allowBash: true
779
+ bashConfig:
780
+ allow: ['gh:*'] # Static baseline
781
+ ai_bash_config_js: |
782
+ return outputs['build-config']?.bash_config ?? {};
783
+ ```
784
+
785
+ Dynamic arrays are appended to static `bashConfig`. If dynamic config provides any allow/deny patterns, `allowBash` is automatically enabled.
@@ -182,6 +182,36 @@ steps:
182
182
  debug: true
183
183
  ```
184
184
 
185
+ ### Method 3: Using `ai_custom_tools_js` (Dynamic)
186
+
187
+ For multi-step workflows, use `ai_custom_tools_js` to dynamically select tools based on dependency outputs:
188
+
189
+ ```yaml
190
+ checks:
191
+ route:
192
+ type: script
193
+ content: |
194
+ return { intent: 'engineer', tools: ['code-explorer'] };
195
+
196
+ assistant:
197
+ type: ai
198
+ depends_on: [route]
199
+ prompt: "Help the user with their request"
200
+ ai_custom_tools_js: |
201
+ // Dynamically select tools based on routing
202
+ const tools = outputs['route']?.tools ?? [];
203
+ if (outputs['route'].intent === 'engineer') {
204
+ tools.push({ workflow: 'engineer', args: { projects: ['my-repo'] } });
205
+ }
206
+ return tools;
207
+ ai:
208
+ provider: anthropic
209
+ ```
210
+
211
+ The expression has access to `outputs`, `inputs`, `pr`, `files`, `env`, and `memory`. It must return an array of tool names (strings) or workflow tool references (`{ workflow, args }`). Dynamic tools are merged with static `ai_custom_tools` (duplicates by name are skipped).
212
+
213
+ Similarly, `ai_mcp_servers_js` dynamically computes MCP servers, and `ai_bash_config_js` dynamically computes bash command permissions. See [AI Configuration](./ai-configuration.md) for full documentation of all `_js` fields.
214
+
185
215
  ### Combining with External MCP Servers
186
216
 
187
217
  You can combine custom tools with external MCP servers: