@probelabs/visor 0.1.127 → 0.1.129

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 (255) hide show
  1. package/README.md +31 -1
  2. package/defaults/.visor.yaml +420 -0
  3. package/dist/ai-review-service.d.ts +1 -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/config.d.ts +4 -0
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/daemon.js +19 -0
  9. package/dist/defaults/.visor.yaml +420 -0
  10. package/dist/docs/commands.md +1 -1
  11. package/dist/docs/debugging.md +133 -0
  12. package/dist/docs/dev-playbook.md +10 -0
  13. package/dist/docs/index.md +1 -0
  14. package/dist/docs/scheduler.md +503 -0
  15. package/dist/docs/slack-integration.md +21 -0
  16. package/dist/docs/timeouts.md +1 -1
  17. package/dist/docs/workflow-creation-guide.md +39 -0
  18. package/dist/examples/README.md +30 -0
  19. package/dist/examples/calculator-config.yaml +4 -4
  20. package/dist/examples/sandbox-basic.yaml +18 -0
  21. package/dist/examples/sandbox-cache.yaml +32 -0
  22. package/dist/examples/sandbox-dockerfile-inline.yaml +22 -0
  23. package/dist/examples/sandbox-env-passthrough.yaml +26 -0
  24. package/dist/examples/sandbox-multi-env.yaml +27 -0
  25. package/dist/examples/sandbox-read-only.yaml +33 -0
  26. package/dist/examples/scheduler-example.yaml +118 -0
  27. package/dist/frontends/host.d.ts.map +1 -1
  28. package/dist/frontends/slack-frontend.d.ts.map +1 -1
  29. package/dist/generated/config-schema.d.ts +230 -9
  30. package/dist/generated/config-schema.d.ts.map +1 -1
  31. package/dist/index.js +13676 -1604
  32. package/dist/mcp-server.d.ts +8 -8
  33. package/dist/{traces/run-2026-02-01T09-59-08-165Z.ndjson → output/traces/run-2026-02-08T18-16-04-160Z.ndjson} +84 -84
  34. package/dist/{traces/run-2026-02-01T09-59-52-595Z.ndjson → output/traces/run-2026-02-08T18-16-51-253Z.ndjson} +1029 -1029
  35. package/dist/providers/ai-check-provider.d.ts +16 -0
  36. package/dist/providers/ai-check-provider.d.ts.map +1 -1
  37. package/dist/providers/check-provider.interface.d.ts +5 -0
  38. package/dist/providers/check-provider.interface.d.ts.map +1 -1
  39. package/dist/providers/command-check-provider.d.ts.map +1 -1
  40. package/dist/providers/log-check-provider.d.ts.map +1 -1
  41. package/dist/providers/mcp-check-provider.d.ts +3 -0
  42. package/dist/providers/mcp-check-provider.d.ts.map +1 -1
  43. package/dist/providers/mcp-custom-sse-server.d.ts +22 -2
  44. package/dist/providers/mcp-custom-sse-server.d.ts.map +1 -1
  45. package/dist/providers/workflow-check-provider.d.ts.map +1 -1
  46. package/dist/providers/workflow-tool-executor.d.ts +2 -0
  47. package/dist/providers/workflow-tool-executor.d.ts.map +1 -1
  48. package/dist/sandbox/cache-volume-manager.d.ts +48 -0
  49. package/dist/sandbox/cache-volume-manager.d.ts.map +1 -0
  50. package/dist/sandbox/check-runner.d.ts +25 -0
  51. package/dist/sandbox/check-runner.d.ts.map +1 -0
  52. package/dist/sandbox/docker-compose-sandbox.d.ts +25 -0
  53. package/dist/sandbox/docker-compose-sandbox.d.ts.map +1 -0
  54. package/dist/sandbox/docker-image-sandbox.d.ts +32 -0
  55. package/dist/sandbox/docker-image-sandbox.d.ts.map +1 -0
  56. package/dist/sandbox/env-filter.d.ts +19 -0
  57. package/dist/sandbox/env-filter.d.ts.map +1 -0
  58. package/dist/sandbox/index.d.ts +9 -0
  59. package/dist/sandbox/index.d.ts.map +1 -0
  60. package/dist/sandbox/sandbox-manager.d.ts +39 -0
  61. package/dist/sandbox/sandbox-manager.d.ts.map +1 -0
  62. package/dist/sandbox/sandbox-telemetry.d.ts +9 -0
  63. package/dist/sandbox/sandbox-telemetry.d.ts.map +1 -0
  64. package/dist/sandbox/trace-ingester.d.ts +19 -0
  65. package/dist/sandbox/trace-ingester.d.ts.map +1 -0
  66. package/dist/sandbox/types.d.ts +149 -0
  67. package/dist/sandbox/types.d.ts.map +1 -0
  68. package/dist/scheduler/cli-handler.d.ts +6 -0
  69. package/dist/scheduler/cli-handler.d.ts.map +1 -0
  70. package/dist/scheduler/index.d.ts +14 -0
  71. package/dist/scheduler/index.d.ts.map +1 -0
  72. package/dist/scheduler/schedule-parser.d.ts +34 -0
  73. package/dist/scheduler/schedule-parser.d.ts.map +1 -0
  74. package/dist/scheduler/schedule-store.d.ts +182 -0
  75. package/dist/scheduler/schedule-store.d.ts.map +1 -0
  76. package/dist/scheduler/schedule-tool.d.ts +137 -0
  77. package/dist/scheduler/schedule-tool.d.ts.map +1 -0
  78. package/dist/scheduler/scheduler.d.ts +195 -0
  79. package/dist/scheduler/scheduler.d.ts.map +1 -0
  80. package/dist/sdk/check-provider-registry-ACRGIYOB.mjs +28 -0
  81. package/dist/sdk/check-provider-registry-VYHKFHK2.mjs +28 -0
  82. package/dist/sdk/{chunk-CNX7V5JK.mjs → chunk-25IC7KXZ.mjs} +2 -2
  83. package/dist/sdk/{chunk-IHZOSIF4.mjs → chunk-2KB35MB7.mjs} +3 -3
  84. package/dist/sdk/{chunk-HQL734ZI.mjs → chunk-6W75IMDC.mjs} +3 -3
  85. package/dist/sdk/{chunk-XWJPT5KQ.mjs → chunk-7YSOINAQ.mjs} +392 -18
  86. package/dist/sdk/chunk-7YSOINAQ.mjs.map +1 -0
  87. package/dist/sdk/{chunk-3OMWVM6J.mjs → chunk-B7BVQM5K.mjs} +2 -2
  88. package/dist/sdk/chunk-BDGUM6BA.mjs +38825 -0
  89. package/dist/sdk/chunk-BDGUM6BA.mjs.map +1 -0
  90. package/dist/sdk/{chunk-VW2GBXQT.mjs → chunk-D5KI4YQ4.mjs} +3 -3
  91. package/dist/sdk/chunk-DGZPPGJJ.mjs +38825 -0
  92. package/dist/sdk/chunk-DGZPPGJJ.mjs.map +1 -0
  93. package/dist/sdk/chunk-H5BOW5CR.mjs +91 -0
  94. package/dist/sdk/chunk-H5BOW5CR.mjs.map +1 -0
  95. package/dist/sdk/{chunk-YSN4G6CI.mjs → chunk-HEX3RL32.mjs} +81 -3
  96. package/dist/sdk/{chunk-YSN4G6CI.mjs.map → chunk-HEX3RL32.mjs.map} +1 -1
  97. package/dist/sdk/{chunk-ZYAUYXSW.mjs → chunk-J5RGJQ53.mjs} +14 -3
  98. package/dist/sdk/{chunk-ZYAUYXSW.mjs.map → chunk-J5RGJQ53.mjs.map} +1 -1
  99. package/dist/sdk/{chunk-WMJKH4XE.mjs → chunk-J7LXIPZS.mjs} +16 -1
  100. package/dist/sdk/{chunk-EXFGO4FX.mjs → chunk-KFKHU6CM.mjs} +2 -2
  101. package/dist/sdk/{chunk-MPS4HVQI.mjs → chunk-N7HO6KKC.mjs} +8 -8
  102. package/dist/sdk/{chunk-O5EZDNYL.mjs → chunk-NCWIZVOT.mjs} +2 -2
  103. package/dist/sdk/{chunk-3NMLT3YS.mjs → chunk-PO7X5XI7.mjs} +3 -3
  104. package/dist/sdk/{chunk-BHOKBQPB.mjs → chunk-R5Z7YWPB.mjs} +5 -5
  105. package/dist/sdk/{chunk-EORMDOZU.mjs → chunk-SGS2VMEL.mjs} +7 -7
  106. package/dist/sdk/{chunk-BOVFH3LI.mjs → chunk-VF6XIUE4.mjs} +21 -10
  107. package/dist/sdk/chunk-VF6XIUE4.mjs.map +1 -0
  108. package/dist/sdk/{chunk-J2QWVDXK.mjs → chunk-XDLQ3UNF.mjs} +3 -3
  109. package/dist/sdk/{chunk-S2RUE2RG.mjs → chunk-XR7XXGL7.mjs} +3 -3
  110. package/dist/sdk/{chunk-NAW3DB3I.mjs → chunk-XXAEN5KU.mjs} +3 -3
  111. package/dist/sdk/command-executor-DVVXERLR.mjs +14 -0
  112. package/dist/sdk/config-7VTT64SQ.mjs +16 -0
  113. package/dist/sdk/config-merger-RKCZJQ44.mjs +10 -0
  114. package/dist/sdk/event-bus-5K3Y2FCS.mjs +43 -0
  115. package/dist/sdk/{event-bus-5BEVPQ6T.mjs.map → event-bus-5K3Y2FCS.mjs.map} +1 -1
  116. package/dist/sdk/failure-condition-evaluator-4WMDF4Q3.mjs +17 -0
  117. package/dist/sdk/git-repository-analyzer-QFMW6WIS.mjs +471 -0
  118. package/dist/sdk/git-repository-analyzer-QFMW6WIS.mjs.map +1 -0
  119. package/dist/sdk/{github-frontend-5PCKKHVC.mjs → github-frontend-3N2NLO66.mjs} +520 -588
  120. package/dist/sdk/github-frontend-3N2NLO66.mjs.map +1 -0
  121. package/dist/sdk/host-ONVMEHAA.mjs +63 -0
  122. package/dist/sdk/host-ONVMEHAA.mjs.map +1 -0
  123. package/dist/sdk/{liquid-extensions-I7O7KMHF.mjs → liquid-extensions-5IZLTFSZ.mjs} +8 -8
  124. package/dist/sdk/memory-store-3N4AZCYB.mjs +12 -0
  125. package/dist/sdk/{metrics-7PP3EJUH.mjs → metrics-GXQ2EDXA.mjs} +4 -4
  126. package/dist/sdk/ndjson-sink-FD2PSXGD.mjs +52 -0
  127. package/dist/sdk/{ndjson-sink-B4V4NTAQ.mjs.map → ndjson-sink-FD2PSXGD.mjs.map} +1 -1
  128. package/dist/sdk/{prompt-state-EZYOUG75.mjs → prompt-state-YHGXB2OA.mjs} +5 -5
  129. package/dist/sdk/{renderer-schema-CKFB5NDB.mjs → renderer-schema-CMXOLNIG.mjs} +4 -4
  130. package/dist/sdk/routing-S3Y7T2X3.mjs +24 -0
  131. package/dist/sdk/sdk.d.mts +212 -4
  132. package/dist/sdk/sdk.d.ts +212 -4
  133. package/dist/sdk/sdk.js +26927 -6264
  134. package/dist/sdk/sdk.js.map +1 -1
  135. package/dist/sdk/sdk.mjs +23 -1278
  136. package/dist/sdk/sdk.mjs.map +1 -1
  137. package/dist/sdk/session-registry-6PV6SGEJ.mjs +10 -0
  138. package/dist/sdk/slack-frontend-R3M2CACB.mjs +899 -0
  139. package/dist/sdk/slack-frontend-R3M2CACB.mjs.map +1 -0
  140. package/dist/sdk/{trace-helpers-VP6QYVBX.mjs → trace-helpers-YHNPC7MR.mjs} +4 -4
  141. package/dist/sdk/tracer-init-XPRWKMZT.mjs +10 -0
  142. package/dist/sdk/tui-frontend-S546M7A7.mjs +281 -0
  143. package/dist/sdk/tui-frontend-S546M7A7.mjs.map +1 -0
  144. package/dist/sdk/workflow-check-provider-4F3432ZP.mjs +28 -0
  145. package/dist/sdk/workflow-check-provider-A44PBPG2.mjs +28 -0
  146. package/dist/sdk/workflow-check-provider-A44PBPG2.mjs.map +1 -0
  147. package/dist/sdk/workflow-registry-ZAYYXLEP.mjs +12 -0
  148. package/dist/sdk/workflow-registry-ZAYYXLEP.mjs.map +1 -0
  149. package/dist/slack/client.d.ts +28 -0
  150. package/dist/slack/client.d.ts.map +1 -1
  151. package/dist/slack/schedule-tool-handler.d.ts +46 -0
  152. package/dist/slack/schedule-tool-handler.d.ts.map +1 -0
  153. package/dist/slack/slack-output-adapter.d.ts +44 -0
  154. package/dist/slack/slack-output-adapter.d.ts.map +1 -0
  155. package/dist/slack/socket-runner.d.ts +22 -0
  156. package/dist/slack/socket-runner.d.ts.map +1 -1
  157. package/dist/state-machine/dispatch/execution-invoker.d.ts.map +1 -1
  158. package/dist/state-machine/dispatch/foreach-processor.d.ts.map +1 -1
  159. package/dist/state-machine/dispatch/sandbox-routing.d.ts +21 -0
  160. package/dist/state-machine/dispatch/sandbox-routing.d.ts.map +1 -0
  161. package/dist/state-machine/states/level-dispatch.d.ts.map +1 -1
  162. package/dist/state-machine-execution-engine.d.ts.map +1 -1
  163. package/dist/test-runner/index.d.ts +5 -0
  164. package/dist/test-runner/index.d.ts.map +1 -1
  165. package/dist/{output/traces/run-2026-02-01T09-59-08-165Z.ndjson → traces/run-2026-02-08T18-16-04-160Z.ndjson} +84 -84
  166. package/dist/{output/traces/run-2026-02-01T09-59-52-595Z.ndjson → traces/run-2026-02-08T18-16-51-253Z.ndjson} +1029 -1029
  167. package/dist/tui/chat-runner.d.ts +39 -0
  168. package/dist/tui/chat-runner.d.ts.map +1 -0
  169. package/dist/tui/chat-state.d.ts +56 -0
  170. package/dist/tui/chat-state.d.ts.map +1 -0
  171. package/dist/tui/chat-tui.d.ts +69 -0
  172. package/dist/tui/chat-tui.d.ts.map +1 -0
  173. package/dist/tui/components/chat-box.d.ts +33 -0
  174. package/dist/tui/components/chat-box.d.ts.map +1 -0
  175. package/dist/tui/components/input-bar.d.ts +50 -0
  176. package/dist/tui/components/input-bar.d.ts.map +1 -0
  177. package/dist/tui/components/status-bar.d.ts +31 -0
  178. package/dist/tui/components/status-bar.d.ts.map +1 -0
  179. package/dist/tui/components/trace-viewer.d.ts +73 -0
  180. package/dist/tui/components/trace-viewer.d.ts.map +1 -0
  181. package/dist/tui/index.d.ts +14 -0
  182. package/dist/tui/index.d.ts.map +1 -0
  183. package/dist/tui/tui-frontend.d.ts +29 -0
  184. package/dist/tui/tui-frontend.d.ts.map +1 -0
  185. package/dist/types/bot.d.ts +35 -0
  186. package/dist/types/bot.d.ts.map +1 -1
  187. package/dist/types/config.d.ts +152 -3
  188. package/dist/types/config.d.ts.map +1 -1
  189. package/dist/types/engine.d.ts +3 -0
  190. package/dist/types/engine.d.ts.map +1 -1
  191. package/dist/utils/sandbox.d.ts.map +1 -1
  192. package/dist/utils/workspace-manager.d.ts +22 -2
  193. package/dist/utils/workspace-manager.d.ts.map +1 -1
  194. package/dist/utils/worktree-manager.d.ts +2 -1
  195. package/dist/utils/worktree-manager.d.ts.map +1 -1
  196. package/package.json +4 -2
  197. package/dist/docs/NPM_USAGE.md +0 -281
  198. package/dist/generated/config-schema.json +0 -2161
  199. package/dist/sdk/check-provider-registry-CVUONJ5A.mjs +0 -28
  200. package/dist/sdk/chunk-BOVFH3LI.mjs.map +0 -1
  201. package/dist/sdk/chunk-TS6BUNAI.mjs +0 -17722
  202. package/dist/sdk/chunk-TS6BUNAI.mjs.map +0 -1
  203. package/dist/sdk/chunk-XWJPT5KQ.mjs.map +0 -1
  204. package/dist/sdk/command-executor-Q7MHJKZJ.mjs +0 -14
  205. package/dist/sdk/config-DXX64GD3.mjs +0 -16
  206. package/dist/sdk/config-merger-PX3WIT57.mjs +0 -10
  207. package/dist/sdk/event-bus-5BEVPQ6T.mjs +0 -35
  208. package/dist/sdk/failure-condition-evaluator-G4HMJPXF.mjs +0 -17
  209. package/dist/sdk/git-repository-analyzer-HJC4MYW4.mjs +0 -458
  210. package/dist/sdk/git-repository-analyzer-HJC4MYW4.mjs.map +0 -1
  211. package/dist/sdk/github-frontend-5PCKKHVC.mjs.map +0 -1
  212. package/dist/sdk/host-H3AWNZ2F.mjs +0 -52
  213. package/dist/sdk/host-H3AWNZ2F.mjs.map +0 -1
  214. package/dist/sdk/memory-store-RW5N2NGJ.mjs +0 -12
  215. package/dist/sdk/ndjson-sink-B4V4NTAQ.mjs +0 -44
  216. package/dist/sdk/routing-QHTGDIXF.mjs +0 -24
  217. package/dist/sdk/session-registry-4E6YRQ77.mjs +0 -10
  218. package/dist/sdk/slack-frontend-JUT3TYVC.mjs +0 -821
  219. package/dist/sdk/slack-frontend-JUT3TYVC.mjs.map +0 -1
  220. package/dist/sdk/tracer-init-GSLPPLCD.mjs +0 -10
  221. package/dist/sdk/workflow-check-provider-3IWBAZP7.mjs +0 -28
  222. package/dist/sdk/workflow-registry-KFWSDSLM.mjs +0 -12
  223. package/dist/tui.d.ts +0 -51
  224. package/dist/tui.d.ts.map +0 -1
  225. /package/dist/sdk/{check-provider-registry-CVUONJ5A.mjs.map → check-provider-registry-ACRGIYOB.mjs.map} +0 -0
  226. /package/dist/sdk/{chunk-WMJKH4XE.mjs.map → check-provider-registry-VYHKFHK2.mjs.map} +0 -0
  227. /package/dist/sdk/{chunk-CNX7V5JK.mjs.map → chunk-25IC7KXZ.mjs.map} +0 -0
  228. /package/dist/sdk/{chunk-IHZOSIF4.mjs.map → chunk-2KB35MB7.mjs.map} +0 -0
  229. /package/dist/sdk/{chunk-HQL734ZI.mjs.map → chunk-6W75IMDC.mjs.map} +0 -0
  230. /package/dist/sdk/{chunk-3OMWVM6J.mjs.map → chunk-B7BVQM5K.mjs.map} +0 -0
  231. /package/dist/sdk/{chunk-VW2GBXQT.mjs.map → chunk-D5KI4YQ4.mjs.map} +0 -0
  232. /package/dist/sdk/{command-executor-Q7MHJKZJ.mjs.map → chunk-J7LXIPZS.mjs.map} +0 -0
  233. /package/dist/sdk/{chunk-EXFGO4FX.mjs.map → chunk-KFKHU6CM.mjs.map} +0 -0
  234. /package/dist/sdk/{chunk-MPS4HVQI.mjs.map → chunk-N7HO6KKC.mjs.map} +0 -0
  235. /package/dist/sdk/{chunk-O5EZDNYL.mjs.map → chunk-NCWIZVOT.mjs.map} +0 -0
  236. /package/dist/sdk/{chunk-3NMLT3YS.mjs.map → chunk-PO7X5XI7.mjs.map} +0 -0
  237. /package/dist/sdk/{chunk-BHOKBQPB.mjs.map → chunk-R5Z7YWPB.mjs.map} +0 -0
  238. /package/dist/sdk/{chunk-EORMDOZU.mjs.map → chunk-SGS2VMEL.mjs.map} +0 -0
  239. /package/dist/sdk/{chunk-J2QWVDXK.mjs.map → chunk-XDLQ3UNF.mjs.map} +0 -0
  240. /package/dist/sdk/{chunk-S2RUE2RG.mjs.map → chunk-XR7XXGL7.mjs.map} +0 -0
  241. /package/dist/sdk/{chunk-NAW3DB3I.mjs.map → chunk-XXAEN5KU.mjs.map} +0 -0
  242. /package/dist/sdk/{config-DXX64GD3.mjs.map → command-executor-DVVXERLR.mjs.map} +0 -0
  243. /package/dist/sdk/{config-merger-PX3WIT57.mjs.map → config-7VTT64SQ.mjs.map} +0 -0
  244. /package/dist/sdk/{failure-condition-evaluator-G4HMJPXF.mjs.map → config-merger-RKCZJQ44.mjs.map} +0 -0
  245. /package/dist/sdk/{liquid-extensions-I7O7KMHF.mjs.map → failure-condition-evaluator-4WMDF4Q3.mjs.map} +0 -0
  246. /package/dist/sdk/{memory-store-RW5N2NGJ.mjs.map → liquid-extensions-5IZLTFSZ.mjs.map} +0 -0
  247. /package/dist/sdk/{metrics-7PP3EJUH.mjs.map → memory-store-3N4AZCYB.mjs.map} +0 -0
  248. /package/dist/sdk/{prompt-state-EZYOUG75.mjs.map → metrics-GXQ2EDXA.mjs.map} +0 -0
  249. /package/dist/sdk/{routing-QHTGDIXF.mjs.map → prompt-state-YHGXB2OA.mjs.map} +0 -0
  250. /package/dist/sdk/{renderer-schema-CKFB5NDB.mjs.map → renderer-schema-CMXOLNIG.mjs.map} +0 -0
  251. /package/dist/sdk/{session-registry-4E6YRQ77.mjs.map → routing-S3Y7T2X3.mjs.map} +0 -0
  252. /package/dist/sdk/{trace-helpers-VP6QYVBX.mjs.map → session-registry-6PV6SGEJ.mjs.map} +0 -0
  253. /package/dist/sdk/{tracer-init-GSLPPLCD.mjs.map → trace-helpers-YHNPC7MR.mjs.map} +0 -0
  254. /package/dist/sdk/{workflow-check-provider-3IWBAZP7.mjs.map → tracer-init-XPRWKMZT.mjs.map} +0 -0
  255. /package/dist/sdk/{workflow-registry-KFWSDSLM.mjs.map → workflow-check-provider-4F3432ZP.mjs.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  __esm
3
- } from "./chunk-WMJKH4XE.mjs";
3
+ } from "./chunk-J7LXIPZS.mjs";
4
4
 
5
5
  // src/utils/author-permissions.ts
6
6
  function getPermissionLevel(association) {
@@ -86,4 +86,4 @@ export {
86
86
  resolveAssociationFromEvent,
87
87
  init_author_permissions
88
88
  };
89
- //# sourceMappingURL=chunk-CNX7V5JK.mjs.map
89
+ //# sourceMappingURL=chunk-25IC7KXZ.mjs.map
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  init_logger,
3
3
  logger
4
- } from "./chunk-3NMLT3YS.mjs";
4
+ } from "./chunk-PO7X5XI7.mjs";
5
5
  import {
6
6
  __esm,
7
7
  __export
8
- } from "./chunk-WMJKH4XE.mjs";
8
+ } from "./chunk-J7LXIPZS.mjs";
9
9
 
10
10
  // src/memory-store.ts
11
11
  var memory_store_exports = {};
@@ -479,4 +479,4 @@ export {
479
479
  memory_store_exports,
480
480
  init_memory_store
481
481
  };
482
- //# sourceMappingURL=chunk-IHZOSIF4.mjs.map
482
+ //# sourceMappingURL=chunk-2KB35MB7.mjs.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  init_logger,
3
3
  logger
4
- } from "./chunk-3NMLT3YS.mjs";
4
+ } from "./chunk-PO7X5XI7.mjs";
5
5
  import {
6
6
  __esm
7
- } from "./chunk-WMJKH4XE.mjs";
7
+ } from "./chunk-J7LXIPZS.mjs";
8
8
 
9
9
  // src/slack/prompt-state.ts
10
10
  function getPromptStateManager(ttlMs) {
@@ -154,4 +154,4 @@ export {
154
154
  resetPromptStateManager,
155
155
  init_prompt_state
156
156
  };
157
- //# sourceMappingURL=chunk-HQL734ZI.mjs.map
157
+ //# sourceMappingURL=chunk-6W75IMDC.mjs.map
@@ -2,21 +2,21 @@ import {
2
2
  ConfigMerger,
3
3
  config_merger_exports,
4
4
  init_config_merger
5
- } from "./chunk-O5EZDNYL.mjs";
5
+ } from "./chunk-NCWIZVOT.mjs";
6
6
  import {
7
7
  init_sandbox,
8
8
  validateJsSyntax
9
- } from "./chunk-BOVFH3LI.mjs";
9
+ } from "./chunk-VF6XIUE4.mjs";
10
10
  import {
11
11
  init_logger,
12
12
  logger
13
- } from "./chunk-3NMLT3YS.mjs";
13
+ } from "./chunk-PO7X5XI7.mjs";
14
14
  import {
15
15
  __esm,
16
16
  __export,
17
17
  __require,
18
18
  __toCommonJS
19
- } from "./chunk-WMJKH4XE.mjs";
19
+ } from "./chunk-J7LXIPZS.mjs";
20
20
 
21
21
  // src/utils/config-loader.ts
22
22
  import * as fs from "fs";
@@ -279,7 +279,7 @@ var init_config_loader = __esm({
279
279
  const parentConfig = await this.fetchConfig(source, this.loadedConfigs.size);
280
280
  parentConfigs.push(parentConfig);
281
281
  }
282
- const { ConfigMerger: ConfigMerger2 } = await import("./config-merger-PX3WIT57.mjs");
282
+ const { ConfigMerger: ConfigMerger2 } = await import("./config-merger-RKCZJQ44.mjs");
283
283
  const merger = new ConfigMerger2();
284
284
  let mergedParents = {};
285
285
  for (const parentConfig of parentConfigs) {
@@ -564,6 +564,10 @@ var init_config_schema = __esm({
564
564
  slack: {
565
565
  $ref: "#/definitions/SlackConfig",
566
566
  description: "Slack configuration"
567
+ },
568
+ scheduler: {
569
+ $ref: "#/definitions/SchedulerConfig",
570
+ description: "Scheduler configuration for scheduled workflow execution"
567
571
  }
568
572
  },
569
573
  required: ["version"],
@@ -849,6 +853,10 @@ var init_config_schema = __esm({
849
853
  $ref: "#/definitions/Record%3Cstring%2CMcpServerConfig%3E",
850
854
  description: "MCP servers for this AI check - overrides global setting"
851
855
  },
856
+ ai_mcp_servers_js: {
857
+ type: "string",
858
+ description: 'JavaScript expression to dynamically compute MCP servers for this AI check. Expression has access to: outputs, inputs, pr, files, env, memory Must return an object mapping server names to McpServerConfig objects.\n\nExample: ``` const servers = {}; const tags = outputs[\'route-intent\']?.tags || []; if (tags.includes(\'jira\')) { servers.jira = { command: "npx", args: ["-y", "@aashari/mcp-server-atlassian-jira"], env: { ATLASSIAN_SITE_NAME: "mysite" } }; } return servers; ```'
859
+ },
852
860
  ai_custom_tools: {
853
861
  type: "array",
854
862
  items: {
@@ -856,6 +864,10 @@ var init_config_schema = __esm({
856
864
  },
857
865
  description: "List of custom tool names to expose to this AI check via ephemeral SSE MCP server"
858
866
  },
867
+ ai_custom_tools_js: {
868
+ type: "string",
869
+ description: "JavaScript expression to dynamically compute custom tools for this AI check. Expression has access to: outputs, inputs, pr, files, env, memory Must return an array of tool names (strings) or WorkflowToolReference objects ({ workflow: string, args?: Record<string, unknown> })\n\nExample: ``` const tools = []; if (outputs['route-intent'].intent === 'engineer') { tools.push({ workflow: 'engineer', args: { projects: ['tyk'] } }); } return tools; ```"
870
+ },
859
871
  claude_code: {
860
872
  $ref: "#/definitions/ClaudeCodeConfig",
861
873
  description: "Claude Code configuration (for claude-code type checks)"
@@ -1120,7 +1132,7 @@ var init_config_schema = __esm({
1120
1132
  description: "Arguments/inputs for the workflow"
1121
1133
  },
1122
1134
  overrides: {
1123
- $ref: "#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-11434-23754-src_types_config.ts-0-41453%3E%3E",
1135
+ $ref: "#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-12605-26099-src_types_config.ts-0-46407%3E%3E",
1124
1136
  description: "Override specific step configurations in the workflow"
1125
1137
  },
1126
1138
  output_mapping: {
@@ -1136,7 +1148,7 @@ var init_config_schema = __esm({
1136
1148
  description: "Config file path - alternative to workflow ID (loads a Visor config file as workflow)"
1137
1149
  },
1138
1150
  workflow_overrides: {
1139
- $ref: "#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-11434-23754-src_types_config.ts-0-41453%3E%3E",
1151
+ $ref: "#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-12605-26099-src_types_config.ts-0-46407%3E%3E",
1140
1152
  description: "Alias for overrides - workflow step overrides (backward compatibility)"
1141
1153
  },
1142
1154
  ref: {
@@ -1308,6 +1320,10 @@ var init_config_schema = __esm({
1308
1320
  type: "boolean",
1309
1321
  description: "Enable the delegate tool for task distribution to subagents"
1310
1322
  },
1323
+ enableTasks: {
1324
+ type: "boolean",
1325
+ description: "Enable task management for tracking multi-goal requests"
1326
+ },
1311
1327
  retry: {
1312
1328
  $ref: "#/definitions/AIRetryConfig",
1313
1329
  description: "Retry configuration for this provider"
@@ -1361,7 +1377,7 @@ var init_config_schema = __esm({
1361
1377
  properties: {
1362
1378
  command: {
1363
1379
  type: "string",
1364
- description: "Command to execute for the MCP server"
1380
+ description: "Command to execute (presence indicates stdio server)"
1365
1381
  },
1366
1382
  args: {
1367
1383
  type: "array",
@@ -1373,11 +1389,45 @@ var init_config_schema = __esm({
1373
1389
  env: {
1374
1390
  $ref: "#/definitions/Record%3Cstring%2Cstring%3E",
1375
1391
  description: "Environment variables for the MCP server"
1392
+ },
1393
+ url: {
1394
+ type: "string",
1395
+ description: "URL endpoint (presence indicates external server)"
1396
+ },
1397
+ transport: {
1398
+ type: "string",
1399
+ enum: ["stdio", "sse", "http"],
1400
+ description: "Transport type"
1401
+ },
1402
+ workflow: {
1403
+ type: "string",
1404
+ description: "Workflow ID or path (presence indicates workflow tool)"
1405
+ },
1406
+ inputs: {
1407
+ $ref: "#/definitions/Record%3Cstring%2Cunknown%3E",
1408
+ description: "Inputs to pass to workflow"
1409
+ },
1410
+ description: {
1411
+ type: "string",
1412
+ description: "Tool description for AI"
1413
+ },
1414
+ allowedMethods: {
1415
+ type: "array",
1416
+ items: {
1417
+ type: "string"
1418
+ },
1419
+ description: 'Whitelist specific methods from this MCP server (supports wildcards like "search_*")'
1420
+ },
1421
+ blockedMethods: {
1422
+ type: "array",
1423
+ items: {
1424
+ type: "string"
1425
+ },
1426
+ description: 'Block specific methods from this MCP server (supports wildcards like "*_delete")'
1376
1427
  }
1377
1428
  },
1378
- required: ["command"],
1379
1429
  additionalProperties: false,
1380
- description: "MCP Server configuration",
1430
+ description: "Unified MCP server/tool entry - type detected by which properties are present\n\nDetection logic (priority order): 1. Has `command` \u2192 stdio MCP server (external process) 2. Has `url` \u2192 SSE/HTTP MCP server (external endpoint) 3. Has `workflow` \u2192 workflow tool reference 4. Empty `{}` or just key \u2192 auto-detect from `tools:` section",
1381
1431
  patternProperties: {
1382
1432
  "^x-": {}
1383
1433
  }
@@ -1770,7 +1820,7 @@ var init_config_schema = __esm({
1770
1820
  description: "Custom output name (defaults to workflow name)"
1771
1821
  },
1772
1822
  overrides: {
1773
- $ref: "#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-11434-23754-src_types_config.ts-0-41453%3E%3E",
1823
+ $ref: "#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-12605-26099-src_types_config.ts-0-46407%3E%3E",
1774
1824
  description: "Step overrides"
1775
1825
  },
1776
1826
  output_mapping: {
@@ -1785,13 +1835,13 @@ var init_config_schema = __esm({
1785
1835
  "^x-": {}
1786
1836
  }
1787
1837
  },
1788
- "Record<string,Partial<interface-src_types_config.ts-11434-23754-src_types_config.ts-0-41453>>": {
1838
+ "Record<string,Partial<interface-src_types_config.ts-12605-26099-src_types_config.ts-0-46407>>": {
1789
1839
  type: "object",
1790
1840
  additionalProperties: {
1791
- $ref: "#/definitions/Partial%3Cinterface-src_types_config.ts-11434-23754-src_types_config.ts-0-41453%3E"
1841
+ $ref: "#/definitions/Partial%3Cinterface-src_types_config.ts-12605-26099-src_types_config.ts-0-46407%3E"
1792
1842
  }
1793
1843
  },
1794
- "Partial<interface-src_types_config.ts-11434-23754-src_types_config.ts-0-41453>": {
1844
+ "Partial<interface-src_types_config.ts-12605-26099-src_types_config.ts-0-46407>": {
1795
1845
  type: "object",
1796
1846
  additionalProperties: false
1797
1847
  },
@@ -2431,6 +2481,177 @@ var init_config_schema = __esm({
2431
2481
  patternProperties: {
2432
2482
  "^x-": {}
2433
2483
  }
2484
+ },
2485
+ SchedulerConfig: {
2486
+ type: "object",
2487
+ properties: {
2488
+ enabled: {
2489
+ type: "boolean",
2490
+ description: "Enable/disable the scheduler (default: true)"
2491
+ },
2492
+ storage: {
2493
+ type: "object",
2494
+ properties: {
2495
+ path: {
2496
+ type: "string",
2497
+ description: "Path to schedules JSON file (default: .visor/schedules.json)"
2498
+ }
2499
+ },
2500
+ additionalProperties: false,
2501
+ description: "Storage configuration",
2502
+ patternProperties: {
2503
+ "^x-": {}
2504
+ }
2505
+ },
2506
+ limits: {
2507
+ $ref: "#/definitions/SchedulerLimitsConfig",
2508
+ description: "Limits for dynamic schedules"
2509
+ },
2510
+ default_timezone: {
2511
+ type: "string",
2512
+ description: 'Default timezone (IANA format, e.g., "America/New_York")'
2513
+ },
2514
+ check_interval_ms: {
2515
+ type: "number",
2516
+ description: "Check interval in milliseconds (default: 60000)"
2517
+ },
2518
+ permissions: {
2519
+ $ref: "#/definitions/SchedulerPermissionsConfig",
2520
+ description: "Permissions for dynamic schedule creation (via AI tool)"
2521
+ },
2522
+ cron: {
2523
+ $ref: "#/definitions/Record%3Cstring%2CStaticCronJob%3E",
2524
+ description: "Static cron jobs defined in configuration (always executed)"
2525
+ }
2526
+ },
2527
+ additionalProperties: false,
2528
+ description: "Scheduler configuration for workflow scheduling",
2529
+ patternProperties: {
2530
+ "^x-": {}
2531
+ }
2532
+ },
2533
+ SchedulerLimitsConfig: {
2534
+ type: "object",
2535
+ properties: {
2536
+ max_per_user: {
2537
+ type: "number",
2538
+ description: "Maximum schedules per user (default: 25)"
2539
+ },
2540
+ max_recurring_per_user: {
2541
+ type: "number",
2542
+ description: "Maximum recurring schedules per user (default: 10)"
2543
+ },
2544
+ max_global: {
2545
+ type: "number",
2546
+ description: "Maximum total schedules (default: 1000)"
2547
+ }
2548
+ },
2549
+ additionalProperties: false,
2550
+ description: "Scheduler limits configuration",
2551
+ patternProperties: {
2552
+ "^x-": {}
2553
+ }
2554
+ },
2555
+ SchedulerPermissionsConfig: {
2556
+ type: "object",
2557
+ properties: {
2558
+ allow_personal: {
2559
+ type: "boolean",
2560
+ description: "Allow personal schedules (via DM or CLI)"
2561
+ },
2562
+ allow_channel: {
2563
+ type: "boolean",
2564
+ description: "Allow channel schedules (in Slack channels)"
2565
+ },
2566
+ allow_dm: {
2567
+ type: "boolean",
2568
+ description: "Allow DM schedules (to specific users)"
2569
+ },
2570
+ allowed_workflows: {
2571
+ type: "array",
2572
+ items: {
2573
+ type: "string"
2574
+ },
2575
+ description: 'List of allowed workflow patterns (glob-style, e.g., "report-*")'
2576
+ },
2577
+ denied_workflows: {
2578
+ type: "array",
2579
+ items: {
2580
+ type: "string"
2581
+ },
2582
+ description: "List of denied workflow patterns"
2583
+ }
2584
+ },
2585
+ additionalProperties: false,
2586
+ description: "Scheduler permissions for dynamic schedule creation",
2587
+ patternProperties: {
2588
+ "^x-": {}
2589
+ }
2590
+ },
2591
+ "Record<string,StaticCronJob>": {
2592
+ type: "object",
2593
+ additionalProperties: {
2594
+ $ref: "#/definitions/StaticCronJob"
2595
+ }
2596
+ },
2597
+ StaticCronJob: {
2598
+ type: "object",
2599
+ properties: {
2600
+ schedule: {
2601
+ type: "string",
2602
+ description: 'Cron expression (e.g., "0 9 * * 1" for every Monday at 9am)'
2603
+ },
2604
+ workflow: {
2605
+ type: "string",
2606
+ description: "Workflow/check ID to run"
2607
+ },
2608
+ inputs: {
2609
+ $ref: "#/definitions/Record%3Cstring%2Cunknown%3E",
2610
+ description: "Optional workflow inputs"
2611
+ },
2612
+ output: {
2613
+ type: "object",
2614
+ properties: {
2615
+ type: {
2616
+ type: "string",
2617
+ enum: ["slack", "github", "webhook", "none"],
2618
+ description: "Output type: slack, github, webhook, or none"
2619
+ },
2620
+ target: {
2621
+ type: "string",
2622
+ description: "Target (channel name, repo, URL)"
2623
+ },
2624
+ thread_id: {
2625
+ type: "string",
2626
+ description: "Thread ID for threaded outputs"
2627
+ }
2628
+ },
2629
+ required: ["type"],
2630
+ additionalProperties: false,
2631
+ description: "Output destination configuration",
2632
+ patternProperties: {
2633
+ "^x-": {}
2634
+ }
2635
+ },
2636
+ description: {
2637
+ type: "string",
2638
+ description: "Description for logging/display"
2639
+ },
2640
+ enabled: {
2641
+ type: "boolean",
2642
+ description: "Enable/disable this job (default: true)"
2643
+ },
2644
+ timezone: {
2645
+ type: "string",
2646
+ description: "Timezone for schedule (default: UTC or scheduler default)"
2647
+ }
2648
+ },
2649
+ required: ["schedule", "workflow"],
2650
+ additionalProperties: false,
2651
+ description: "Static cron job defined in YAML configuration These are always executed by the scheduler daemon",
2652
+ patternProperties: {
2653
+ "^x-": {}
2654
+ }
2434
2655
  }
2435
2656
  }
2436
2657
  };
@@ -2781,7 +3002,7 @@ var init_config = __esm({
2781
3002
  * When a workflow YAML is run standalone, register the workflow and use its tests as checks
2782
3003
  */
2783
3004
  async convertWorkflowToConfig(workflowData, basePath) {
2784
- const { WorkflowRegistry } = await import("./workflow-registry-KFWSDSLM.mjs");
3005
+ const { WorkflowRegistry } = await import("./workflow-registry-ZAYYXLEP.mjs");
2785
3006
  const registry = WorkflowRegistry.getInstance();
2786
3007
  const workflowId = workflowData.id;
2787
3008
  logger.info(`Detected standalone workflow file: ${workflowId}`);
@@ -2846,7 +3067,7 @@ ${errors}`);
2846
3067
  if (!config.imports || config.imports.length === 0) {
2847
3068
  return;
2848
3069
  }
2849
- const { WorkflowRegistry } = await import("./workflow-registry-KFWSDSLM.mjs");
3070
+ const { WorkflowRegistry } = await import("./workflow-registry-ZAYYXLEP.mjs");
2850
3071
  const registry = WorkflowRegistry.getInstance();
2851
3072
  for (const source of config.imports) {
2852
3073
  const results = await registry.import(source, { basePath, validate: true });
@@ -3017,6 +3238,49 @@ ${errors}`);
3017
3238
  }
3018
3239
  }
3019
3240
  }
3241
+ if (config.sandboxes) {
3242
+ const sandboxNames = Object.keys(config.sandboxes);
3243
+ for (const [sandboxName, sandboxConfig] of Object.entries(config.sandboxes)) {
3244
+ this.validateSandboxConfig(sandboxName, sandboxConfig, errors);
3245
+ }
3246
+ if (config.sandbox && !sandboxNames.includes(config.sandbox)) {
3247
+ errors.push({
3248
+ field: "sandbox",
3249
+ message: `Top-level sandbox '${config.sandbox}' not found in sandboxes definitions. Available: ${sandboxNames.join(", ")}`,
3250
+ value: config.sandbox
3251
+ });
3252
+ }
3253
+ if (checksToValidate) {
3254
+ for (const [checkName, checkConfig] of Object.entries(checksToValidate)) {
3255
+ if (checkConfig.sandbox && !sandboxNames.includes(checkConfig.sandbox)) {
3256
+ errors.push({
3257
+ field: `checks.${checkName}.sandbox`,
3258
+ message: `Check '${checkName}' references sandbox '${checkConfig.sandbox}' which is not defined. Available: ${sandboxNames.join(", ")}`,
3259
+ value: checkConfig.sandbox
3260
+ });
3261
+ }
3262
+ }
3263
+ }
3264
+ } else {
3265
+ if (config.sandbox) {
3266
+ errors.push({
3267
+ field: "sandbox",
3268
+ message: `Top-level sandbox '${config.sandbox}' is set but no sandboxes are defined`,
3269
+ value: config.sandbox
3270
+ });
3271
+ }
3272
+ if (checksToValidate) {
3273
+ for (const [checkName, checkConfig] of Object.entries(checksToValidate)) {
3274
+ if (checkConfig.sandbox) {
3275
+ errors.push({
3276
+ field: `checks.${checkName}.sandbox`,
3277
+ message: `Check '${checkName}' references sandbox '${checkConfig.sandbox}' but no sandboxes are defined`,
3278
+ value: checkConfig.sandbox
3279
+ });
3280
+ }
3281
+ }
3282
+ }
3283
+ }
3020
3284
  if (config.ai_mcp_servers) {
3021
3285
  this.validateMcpServersObject(config.ai_mcp_servers, "ai_mcp_servers", errors, warnings);
3022
3286
  }
@@ -3053,6 +3317,106 @@ ${errors}`);
3053
3317
  }
3054
3318
  }
3055
3319
  }
3320
+ /**
3321
+ * Validate sandbox configuration
3322
+ */
3323
+ validateSandboxConfig(name, config, errors) {
3324
+ if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]*$/.test(name)) {
3325
+ errors.push({
3326
+ field: `sandboxes.${name}`,
3327
+ message: `Sandbox name '${name}' contains invalid characters. Only letters, numbers, dots, hyphens, underscores allowed.`
3328
+ });
3329
+ }
3330
+ const modes = [
3331
+ config.image ? "image" : null,
3332
+ config.dockerfile || config.dockerfile_inline ? "dockerfile" : null,
3333
+ config.compose ? "compose" : null
3334
+ ].filter(Boolean);
3335
+ if (modes.length === 0) {
3336
+ errors.push({
3337
+ field: `sandboxes.${name}`,
3338
+ message: `Sandbox '${name}' must specify one of: image, dockerfile, dockerfile_inline, or compose`
3339
+ });
3340
+ } else if (modes.length > 1) {
3341
+ errors.push({
3342
+ field: `sandboxes.${name}`,
3343
+ message: `Sandbox '${name}' has multiple modes (${modes.join(", ")}). Specify exactly one.`
3344
+ });
3345
+ }
3346
+ if (config.compose && !config.service) {
3347
+ errors.push({
3348
+ field: `sandboxes.${name}.service`,
3349
+ message: `Sandbox '${name}' uses compose mode but is missing required 'service' field`
3350
+ });
3351
+ }
3352
+ if (config.dockerfile && /\.\./.test(config.dockerfile)) {
3353
+ errors.push({
3354
+ field: `sandboxes.${name}.dockerfile`,
3355
+ message: `Dockerfile path '${config.dockerfile}' in sandbox '${name}' must not contain '..' path traversal`
3356
+ });
3357
+ }
3358
+ if (config.compose && /\.\./.test(config.compose)) {
3359
+ errors.push({
3360
+ field: `sandboxes.${name}.compose`,
3361
+ message: `Compose file path '${config.compose}' in sandbox '${name}' must not contain '..' path traversal`
3362
+ });
3363
+ }
3364
+ if (config.workdir) {
3365
+ if (!config.workdir.startsWith("/")) {
3366
+ errors.push({
3367
+ field: `sandboxes.${name}.workdir`,
3368
+ message: `Workdir '${config.workdir}' in sandbox '${name}' must be an absolute path (start with /)`
3369
+ });
3370
+ }
3371
+ if (/\.\./.test(config.workdir)) {
3372
+ errors.push({
3373
+ field: `sandboxes.${name}.workdir`,
3374
+ message: `Workdir '${config.workdir}' in sandbox '${name}' must not contain '..' path traversal`
3375
+ });
3376
+ }
3377
+ }
3378
+ if (config.visor_path) {
3379
+ if (!config.visor_path.startsWith("/")) {
3380
+ errors.push({
3381
+ field: `sandboxes.${name}.visor_path`,
3382
+ message: `visor_path '${config.visor_path}' in sandbox '${name}' must be an absolute path (start with /)`
3383
+ });
3384
+ }
3385
+ if (/\.\./.test(config.visor_path)) {
3386
+ errors.push({
3387
+ field: `sandboxes.${name}.visor_path`,
3388
+ message: `visor_path '${config.visor_path}' in sandbox '${name}' must not contain '..' path traversal`
3389
+ });
3390
+ }
3391
+ }
3392
+ if (config.cache?.paths) {
3393
+ for (const p of config.cache.paths) {
3394
+ if (!p.startsWith("/")) {
3395
+ errors.push({
3396
+ field: `sandboxes.${name}.cache.paths`,
3397
+ message: `Cache path '${p}' in sandbox '${name}' must be absolute (start with /)`,
3398
+ value: p
3399
+ });
3400
+ }
3401
+ if (/\.\./.test(p)) {
3402
+ errors.push({
3403
+ field: `sandboxes.${name}.cache.paths`,
3404
+ message: `Cache path '${p}' in sandbox '${name}' must not contain '..' path traversal`,
3405
+ value: p
3406
+ });
3407
+ }
3408
+ }
3409
+ }
3410
+ if (config.resources?.cpu !== void 0) {
3411
+ if (typeof config.resources.cpu !== "number" || config.resources.cpu <= 0) {
3412
+ errors.push({
3413
+ field: `sandboxes.${name}.resources.cpu`,
3414
+ message: `CPU limit in sandbox '${name}' must be a positive number`,
3415
+ value: config.resources.cpu
3416
+ });
3417
+ }
3418
+ }
3419
+ }
3056
3420
  /**
3057
3421
  * Validate individual check configuration
3058
3422
  */
@@ -3400,7 +3764,17 @@ ${errors}`);
3400
3764
  const addl = e.params && e.params.additionalProperty || "unknown";
3401
3765
  const fullField = pathStr ? `${pathStr}.${addl}` : addl;
3402
3766
  const topLevel = !pathStr;
3403
- if (topLevel && (addl === "tests" || addl === "slack")) {
3767
+ const allowedTopLevelKeys = /* @__PURE__ */ new Set([
3768
+ "tests",
3769
+ "slack",
3770
+ "sandboxes",
3771
+ "sandbox",
3772
+ "sandbox_defaults"
3773
+ ]);
3774
+ if (topLevel && allowedTopLevelKeys.has(addl)) {
3775
+ continue;
3776
+ }
3777
+ if (!topLevel && addl === "sandbox" && pathStr.match(/^(checks|steps)\.[^.]+$/)) {
3404
3778
  continue;
3405
3779
  }
3406
3780
  warnings.push({
@@ -3605,4 +3979,4 @@ export {
3605
3979
  config_exports,
3606
3980
  init_config
3607
3981
  };
3608
- //# sourceMappingURL=chunk-XWJPT5KQ.mjs.map
3982
+ //# sourceMappingURL=chunk-7YSOINAQ.mjs.map