@probelabs/visor 0.1.144 → 0.1.145

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 (97) hide show
  1. package/dist/config.d.ts.map +1 -1
  2. package/dist/docs/architecture.md +28 -0
  3. package/dist/docs/configuration.md +2 -0
  4. package/dist/docs/sandbox-engines.md +357 -0
  5. package/dist/docs/security.md +40 -0
  6. package/dist/generated/config-schema.d.ts +5 -0
  7. package/dist/generated/config-schema.d.ts.map +1 -1
  8. package/dist/generated/config-schema.json +9 -0
  9. package/dist/index.js +670 -162
  10. package/dist/output/traces/{run-2026-02-25T17-29-59-894Z.ndjson → run-2026-02-26T07-47-34-788Z.ndjson} +84 -84
  11. package/dist/{traces/run-2026-02-25T17-30-47-149Z.ndjson → output/traces/run-2026-02-26T07-48-25-935Z.ndjson} +1118 -1118
  12. package/dist/providers/mcp-check-provider.d.ts.map +1 -1
  13. package/dist/sandbox/bubblewrap-sandbox.d.ts +30 -0
  14. package/dist/sandbox/bubblewrap-sandbox.d.ts.map +1 -0
  15. package/dist/sandbox/index.d.ts +3 -1
  16. package/dist/sandbox/index.d.ts.map +1 -1
  17. package/dist/sandbox/sandbox-manager.d.ts +3 -2
  18. package/dist/sandbox/sandbox-manager.d.ts.map +1 -1
  19. package/dist/sandbox/seatbelt-sandbox.d.ts +36 -0
  20. package/dist/sandbox/seatbelt-sandbox.d.ts.map +1 -0
  21. package/dist/sandbox/types.d.ts +3 -1
  22. package/dist/sandbox/types.d.ts.map +1 -1
  23. package/dist/sdk/{check-provider-registry-VTNNTMWC.mjs → check-provider-registry-HFPKHYTG.mjs} +3 -3
  24. package/dist/sdk/{check-provider-registry-WBEOZCGW.mjs → check-provider-registry-HK6M4PDQ.mjs} +6 -6
  25. package/dist/sdk/{check-provider-registry-GKLK3I2X.mjs → check-provider-registry-TG5G2TF3.mjs} +6 -6
  26. package/dist/sdk/{chunk-D3UC5KUJ.mjs → chunk-5FXGIBJQ.mjs} +467 -100
  27. package/dist/sdk/chunk-5FXGIBJQ.mjs.map +1 -0
  28. package/dist/sdk/{chunk-FG6THKK7.mjs → chunk-6XPTQBXL.mjs} +3 -3
  29. package/dist/sdk/{chunk-FG6THKK7.mjs.map → chunk-6XPTQBXL.mjs.map} +1 -1
  30. package/dist/sdk/{chunk-N7LW3Q5B.mjs → chunk-E6SMU2Z4.mjs} +467 -100
  31. package/dist/sdk/chunk-E6SMU2Z4.mjs.map +1 -0
  32. package/dist/sdk/{chunk-PXWWPPNF.mjs → chunk-GZMQPC6D.mjs} +459 -92
  33. package/dist/sdk/chunk-GZMQPC6D.mjs.map +1 -0
  34. package/dist/sdk/{chunk-CLQTOZKH.mjs → chunk-I42ZCVA5.mjs} +3 -3
  35. package/dist/sdk/chunk-K3M5YVEU.mjs +1502 -0
  36. package/dist/sdk/chunk-K3M5YVEU.mjs.map +1 -0
  37. package/dist/sdk/{chunk-PQWAAGUP.mjs → chunk-L3XPYQ6I.mjs} +2 -2
  38. package/dist/sdk/chunk-L6ABOJVL.mjs +739 -0
  39. package/dist/sdk/chunk-L6ABOJVL.mjs.map +1 -0
  40. package/dist/sdk/chunk-OM3WYVFI.mjs +443 -0
  41. package/dist/sdk/chunk-OM3WYVFI.mjs.map +1 -0
  42. package/dist/sdk/{chunk-AKCHIYWU.mjs → chunk-YOKAA4IU.mjs} +96 -63
  43. package/dist/sdk/chunk-YOKAA4IU.mjs.map +1 -0
  44. package/dist/sdk/{config-KOKJ3PYE.mjs → config-AAB2FL22.mjs} +2 -2
  45. package/dist/sdk/{failure-condition-evaluator-LWH3NQ2S.mjs → failure-condition-evaluator-O464EJMD.mjs} +3 -3
  46. package/dist/sdk/failure-condition-evaluator-V3EJGD55.mjs +17 -0
  47. package/dist/sdk/{github-frontend-UUASYGNV.mjs → github-frontend-MSX6Q2WL.mjs} +3 -3
  48. package/dist/sdk/github-frontend-PSGUGYHT.mjs +1356 -0
  49. package/dist/sdk/github-frontend-PSGUGYHT.mjs.map +1 -0
  50. package/dist/sdk/{host-LAF3NFPZ.mjs → host-5BJ25CUZ.mjs} +2 -2
  51. package/dist/sdk/host-BYIV4QJ3.mjs +63 -0
  52. package/dist/sdk/host-BYIV4QJ3.mjs.map +1 -0
  53. package/dist/sdk/{routing-LEUV6A4K.mjs → routing-AJNUTCH7.mjs} +4 -4
  54. package/dist/sdk/routing-RIHVCEIU.mjs +25 -0
  55. package/dist/sdk/{schedule-tool-handler-EYDCUGOB.mjs → schedule-tool-handler-4O2VKNG2.mjs} +6 -6
  56. package/dist/sdk/{schedule-tool-handler-W7IB4MK3.mjs → schedule-tool-handler-BTLEDYAI.mjs} +3 -3
  57. package/dist/sdk/{schedule-tool-handler-7RGTKO24.mjs → schedule-tool-handler-R7PNPWWK.mjs} +6 -6
  58. package/dist/sdk/sdk.d.mts +3 -1
  59. package/dist/sdk/sdk.d.ts +3 -1
  60. package/dist/sdk/sdk.js +568 -168
  61. package/dist/sdk/sdk.js.map +1 -1
  62. package/dist/sdk/sdk.mjs +5 -5
  63. package/dist/sdk/{trace-helpers-NNBQNFWZ.mjs → trace-helpers-OZTZBK6T.mjs} +2 -2
  64. package/dist/sdk/trace-helpers-QQSTZGDT.mjs +25 -0
  65. package/dist/sdk/{workflow-check-provider-WW5U6R2P.mjs → workflow-check-provider-3IIKJFM4.mjs} +3 -3
  66. package/dist/sdk/workflow-check-provider-3IIKJFM4.mjs.map +1 -0
  67. package/dist/sdk/{workflow-check-provider-FLBIJQ4Z.mjs → workflow-check-provider-OM62QYHF.mjs} +6 -6
  68. package/dist/sdk/workflow-check-provider-OM62QYHF.mjs.map +1 -0
  69. package/dist/sdk/{workflow-check-provider-2G2CEXFR.mjs → workflow-check-provider-RARO4N5E.mjs} +6 -6
  70. package/dist/sdk/workflow-check-provider-RARO4N5E.mjs.map +1 -0
  71. package/dist/slack/socket-runner.d.ts.map +1 -1
  72. package/dist/traces/{run-2026-02-25T17-29-59-894Z.ndjson → run-2026-02-26T07-47-34-788Z.ndjson} +84 -84
  73. package/dist/{output/traces/run-2026-02-25T17-30-47-149Z.ndjson → traces/run-2026-02-26T07-48-25-935Z.ndjson} +1118 -1118
  74. package/dist/utils/workspace-manager.d.ts +9 -0
  75. package/dist/utils/workspace-manager.d.ts.map +1 -1
  76. package/package.json +2 -2
  77. package/dist/sdk/chunk-AKCHIYWU.mjs.map +0 -1
  78. package/dist/sdk/chunk-D3UC5KUJ.mjs.map +0 -1
  79. package/dist/sdk/chunk-N7LW3Q5B.mjs.map +0 -1
  80. package/dist/sdk/chunk-PXWWPPNF.mjs.map +0 -1
  81. /package/dist/sdk/{check-provider-registry-GKLK3I2X.mjs.map → check-provider-registry-HFPKHYTG.mjs.map} +0 -0
  82. /package/dist/sdk/{check-provider-registry-VTNNTMWC.mjs.map → check-provider-registry-HK6M4PDQ.mjs.map} +0 -0
  83. /package/dist/sdk/{check-provider-registry-WBEOZCGW.mjs.map → check-provider-registry-TG5G2TF3.mjs.map} +0 -0
  84. /package/dist/sdk/{chunk-CLQTOZKH.mjs.map → chunk-I42ZCVA5.mjs.map} +0 -0
  85. /package/dist/sdk/{chunk-PQWAAGUP.mjs.map → chunk-L3XPYQ6I.mjs.map} +0 -0
  86. /package/dist/sdk/{config-KOKJ3PYE.mjs.map → config-AAB2FL22.mjs.map} +0 -0
  87. /package/dist/sdk/{failure-condition-evaluator-LWH3NQ2S.mjs.map → failure-condition-evaluator-O464EJMD.mjs.map} +0 -0
  88. /package/dist/sdk/{routing-LEUV6A4K.mjs.map → failure-condition-evaluator-V3EJGD55.mjs.map} +0 -0
  89. /package/dist/sdk/{github-frontend-UUASYGNV.mjs.map → github-frontend-MSX6Q2WL.mjs.map} +0 -0
  90. /package/dist/sdk/{host-LAF3NFPZ.mjs.map → host-5BJ25CUZ.mjs.map} +0 -0
  91. /package/dist/sdk/{schedule-tool-handler-7RGTKO24.mjs.map → routing-AJNUTCH7.mjs.map} +0 -0
  92. /package/dist/sdk/{schedule-tool-handler-EYDCUGOB.mjs.map → routing-RIHVCEIU.mjs.map} +0 -0
  93. /package/dist/sdk/{schedule-tool-handler-W7IB4MK3.mjs.map → schedule-tool-handler-4O2VKNG2.mjs.map} +0 -0
  94. /package/dist/sdk/{trace-helpers-NNBQNFWZ.mjs.map → schedule-tool-handler-BTLEDYAI.mjs.map} +0 -0
  95. /package/dist/sdk/{workflow-check-provider-2G2CEXFR.mjs.map → schedule-tool-handler-R7PNPWWK.mjs.map} +0 -0
  96. /package/dist/sdk/{workflow-check-provider-FLBIJQ4Z.mjs.map → trace-helpers-OZTZBK6T.mjs.map} +0 -0
  97. /package/dist/sdk/{workflow-check-provider-WW5U6R2P.mjs.map → trace-helpers-QQSTZGDT.mjs.map} +0 -0
@@ -2728,6 +2728,11 @@ var init_config_schema = __esm({
2728
2728
  SandboxConfig: {
2729
2729
  type: "object",
2730
2730
  properties: {
2731
+ engine: {
2732
+ type: "string",
2733
+ enum: ["docker", "bubblewrap", "seatbelt"],
2734
+ description: "Sandbox engine type: 'docker' (default), 'bubblewrap' (Linux namespaces), or 'seatbelt' (macOS sandbox-exec)"
2735
+ },
2731
2736
  image: {
2732
2737
  type: "string",
2733
2738
  description: 'Docker image to use (e.g., "node:20-alpine")'
@@ -4104,92 +4109,120 @@ ${errors}`);
4104
4109
  message: `Sandbox name '${name}' contains invalid characters. Only letters, numbers, dots, hyphens, underscores allowed.`
4105
4110
  });
4106
4111
  }
4107
- const modes = [
4108
- config.image ? "image" : null,
4109
- config.dockerfile || config.dockerfile_inline ? "dockerfile" : null,
4110
- config.compose ? "compose" : null
4111
- ].filter(Boolean);
4112
- if (modes.length === 0) {
4113
- errors.push({
4114
- field: `sandboxes.${name}`,
4115
- message: `Sandbox '${name}' must specify one of: image, dockerfile, dockerfile_inline, or compose`
4116
- });
4117
- } else if (modes.length > 1) {
4118
- errors.push({
4119
- field: `sandboxes.${name}`,
4120
- message: `Sandbox '${name}' has multiple modes (${modes.join(", ")}). Specify exactly one.`
4121
- });
4122
- }
4123
- if (config.compose && !config.service) {
4112
+ if (config.engine && !["docker", "bubblewrap", "seatbelt"].includes(config.engine)) {
4124
4113
  errors.push({
4125
- field: `sandboxes.${name}.service`,
4126
- message: `Sandbox '${name}' uses compose mode but is missing required 'service' field`
4114
+ field: `sandboxes.${name}.engine`,
4115
+ message: `Sandbox '${name}' has invalid engine '${config.engine}'. Must be 'docker', 'bubblewrap', or 'seatbelt'.`
4127
4116
  });
4128
4117
  }
4129
- if (config.dockerfile && /\.\./.test(config.dockerfile)) {
4130
- errors.push({
4131
- field: `sandboxes.${name}.dockerfile`,
4132
- message: `Dockerfile path '${config.dockerfile}' in sandbox '${name}' must not contain '..' path traversal`
4133
- });
4134
- }
4135
- if (config.compose && /\.\./.test(config.compose)) {
4136
- errors.push({
4137
- field: `sandboxes.${name}.compose`,
4138
- message: `Compose file path '${config.compose}' in sandbox '${name}' must not contain '..' path traversal`
4139
- });
4140
- }
4141
- if (config.workdir) {
4142
- if (!config.workdir.startsWith("/")) {
4118
+ const isNativeEngine = config.engine === "bubblewrap" || config.engine === "seatbelt";
4119
+ if (isNativeEngine) {
4120
+ const dockerOnlyFields = [
4121
+ ["image", config.image],
4122
+ ["dockerfile", config.dockerfile],
4123
+ ["dockerfile_inline", config.dockerfile_inline],
4124
+ ["compose", config.compose],
4125
+ ["service", config.service],
4126
+ ["cache", config.cache],
4127
+ ["visor_path", config.visor_path],
4128
+ ["resources", config.resources]
4129
+ ];
4130
+ for (const [field, value] of dockerOnlyFields) {
4131
+ if (value !== void 0) {
4132
+ errors.push({
4133
+ field: `sandboxes.${name}.${field}`,
4134
+ message: `Sandbox '${name}' uses ${config.engine} engine but has Docker-only field '${field}'. Remove it or switch to engine: docker.`
4135
+ });
4136
+ }
4137
+ }
4138
+ } else {
4139
+ const modes = [
4140
+ config.image ? "image" : null,
4141
+ config.dockerfile || config.dockerfile_inline ? "dockerfile" : null,
4142
+ config.compose ? "compose" : null
4143
+ ].filter(Boolean);
4144
+ if (modes.length === 0) {
4143
4145
  errors.push({
4144
- field: `sandboxes.${name}.workdir`,
4145
- message: `Workdir '${config.workdir}' in sandbox '${name}' must be an absolute path (start with /)`
4146
+ field: `sandboxes.${name}`,
4147
+ message: `Sandbox '${name}' must specify one of: image, dockerfile, dockerfile_inline, or compose`
4148
+ });
4149
+ } else if (modes.length > 1) {
4150
+ errors.push({
4151
+ field: `sandboxes.${name}`,
4152
+ message: `Sandbox '${name}' has multiple modes (${modes.join(", ")}). Specify exactly one.`
4146
4153
  });
4147
4154
  }
4148
- if (/\.\./.test(config.workdir)) {
4155
+ if (config.compose && !config.service) {
4149
4156
  errors.push({
4150
- field: `sandboxes.${name}.workdir`,
4151
- message: `Workdir '${config.workdir}' in sandbox '${name}' must not contain '..' path traversal`
4157
+ field: `sandboxes.${name}.service`,
4158
+ message: `Sandbox '${name}' uses compose mode but is missing required 'service' field`
4152
4159
  });
4153
4160
  }
4154
- }
4155
- if (config.visor_path) {
4156
- if (!config.visor_path.startsWith("/")) {
4161
+ if (config.dockerfile && /\.\./.test(config.dockerfile)) {
4157
4162
  errors.push({
4158
- field: `sandboxes.${name}.visor_path`,
4159
- message: `visor_path '${config.visor_path}' in sandbox '${name}' must be an absolute path (start with /)`
4163
+ field: `sandboxes.${name}.dockerfile`,
4164
+ message: `Dockerfile path '${config.dockerfile}' in sandbox '${name}' must not contain '..' path traversal`
4160
4165
  });
4161
4166
  }
4162
- if (/\.\./.test(config.visor_path)) {
4167
+ if (config.compose && /\.\./.test(config.compose)) {
4163
4168
  errors.push({
4164
- field: `sandboxes.${name}.visor_path`,
4165
- message: `visor_path '${config.visor_path}' in sandbox '${name}' must not contain '..' path traversal`
4169
+ field: `sandboxes.${name}.compose`,
4170
+ message: `Compose file path '${config.compose}' in sandbox '${name}' must not contain '..' path traversal`
4166
4171
  });
4167
4172
  }
4168
- }
4169
- if (config.cache?.paths) {
4170
- for (const p of config.cache.paths) {
4171
- if (!p.startsWith("/")) {
4173
+ if (config.visor_path) {
4174
+ if (!config.visor_path.startsWith("/")) {
4172
4175
  errors.push({
4173
- field: `sandboxes.${name}.cache.paths`,
4174
- message: `Cache path '${p}' in sandbox '${name}' must be absolute (start with /)`,
4175
- value: p
4176
+ field: `sandboxes.${name}.visor_path`,
4177
+ message: `visor_path '${config.visor_path}' in sandbox '${name}' must be an absolute path (start with /)`
4176
4178
  });
4177
4179
  }
4178
- if (/\.\./.test(p)) {
4180
+ if (/\.\./.test(config.visor_path)) {
4179
4181
  errors.push({
4180
- field: `sandboxes.${name}.cache.paths`,
4181
- message: `Cache path '${p}' in sandbox '${name}' must not contain '..' path traversal`,
4182
- value: p
4182
+ field: `sandboxes.${name}.visor_path`,
4183
+ message: `visor_path '${config.visor_path}' in sandbox '${name}' must not contain '..' path traversal`
4184
+ });
4185
+ }
4186
+ }
4187
+ if (config.cache?.paths) {
4188
+ for (const p of config.cache.paths) {
4189
+ if (!p.startsWith("/")) {
4190
+ errors.push({
4191
+ field: `sandboxes.${name}.cache.paths`,
4192
+ message: `Cache path '${p}' in sandbox '${name}' must be absolute (start with /)`,
4193
+ value: p
4194
+ });
4195
+ }
4196
+ if (/\.\./.test(p)) {
4197
+ errors.push({
4198
+ field: `sandboxes.${name}.cache.paths`,
4199
+ message: `Cache path '${p}' in sandbox '${name}' must not contain '..' path traversal`,
4200
+ value: p
4201
+ });
4202
+ }
4203
+ }
4204
+ }
4205
+ if (config.resources?.cpu !== void 0) {
4206
+ if (typeof config.resources.cpu !== "number" || config.resources.cpu <= 0) {
4207
+ errors.push({
4208
+ field: `sandboxes.${name}.resources.cpu`,
4209
+ message: `CPU limit in sandbox '${name}' must be a positive number`,
4210
+ value: config.resources.cpu
4183
4211
  });
4184
4212
  }
4185
4213
  }
4186
4214
  }
4187
- if (config.resources?.cpu !== void 0) {
4188
- if (typeof config.resources.cpu !== "number" || config.resources.cpu <= 0) {
4215
+ if (config.workdir) {
4216
+ if (!config.workdir.startsWith("/")) {
4189
4217
  errors.push({
4190
- field: `sandboxes.${name}.resources.cpu`,
4191
- message: `CPU limit in sandbox '${name}' must be a positive number`,
4192
- value: config.resources.cpu
4218
+ field: `sandboxes.${name}.workdir`,
4219
+ message: `Workdir '${config.workdir}' in sandbox '${name}' must be an absolute path (start with /)`
4220
+ });
4221
+ }
4222
+ if (/\.\./.test(config.workdir)) {
4223
+ errors.push({
4224
+ field: `sandboxes.${name}.workdir`,
4225
+ message: `Workdir '${config.workdir}' in sandbox '${name}' must not contain '..' path traversal`
4193
4226
  });
4194
4227
  }
4195
4228
  }
@@ -4933,4 +4966,4 @@ export {
4933
4966
  config_exports,
4934
4967
  init_config
4935
4968
  };
4936
- //# sourceMappingURL=chunk-AKCHIYWU.mjs.map
4969
+ //# sourceMappingURL=chunk-YOKAA4IU.mjs.map