@probelabs/visor 0.1.162-ee → 0.1.163-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 (46) hide show
  1. package/dist/index.js +31 -20
  2. package/dist/providers/git-checkout-provider.d.ts.map +1 -1
  3. package/dist/sdk/{check-provider-registry-EFBU3XPX.mjs → check-provider-registry-2A5MSNM3.mjs} +5 -5
  4. package/dist/sdk/{check-provider-registry-ZNIJMJWI.mjs → check-provider-registry-BDPHCHX3.mjs} +5 -5
  5. package/dist/sdk/{chunk-2EZB4TRC.mjs → chunk-53RHNNWQ.mjs} +28 -20
  6. package/dist/sdk/{chunk-FHWFG5AS.mjs.map → chunk-53RHNNWQ.mjs.map} +1 -1
  7. package/dist/sdk/{chunk-FHWFG5AS.mjs → chunk-6CRSLQK6.mjs} +28 -20
  8. package/dist/sdk/{chunk-2EZB4TRC.mjs.map → chunk-6CRSLQK6.mjs.map} +1 -1
  9. package/dist/sdk/{chunk-HT3EFZ75.mjs → chunk-I7J2BNOK.mjs} +2 -2
  10. package/dist/sdk/{chunk-2LL6GIEU.mjs → chunk-R5PIUZSD.mjs} +3 -3
  11. package/dist/sdk/{chunk-CYIKOFJZ.mjs → chunk-ZH6K5NSC.mjs} +2 -2
  12. package/dist/sdk/{chunk-CYIKOFJZ.mjs.map → chunk-ZH6K5NSC.mjs.map} +1 -1
  13. package/dist/sdk/{failure-condition-evaluator-3Q45T5EW.mjs → failure-condition-evaluator-NBRX4N23.mjs} +3 -3
  14. package/dist/sdk/{github-frontend-SZBGCH43.mjs → github-frontend-UKDXNGOG.mjs} +3 -3
  15. package/dist/sdk/{host-FB2HG74L.mjs → host-DEXET5UZ.mjs} +2 -2
  16. package/dist/sdk/{host-Z6OFA24O.mjs → host-Q4N357JE.mjs} +2 -2
  17. package/dist/sdk/{routing-GGZBWOLZ.mjs → routing-7CQ7QWYE.mjs} +4 -4
  18. package/dist/sdk/{schedule-tool-6VZPH74P.mjs → schedule-tool-EZCW6M3Z.mjs} +5 -5
  19. package/dist/sdk/{schedule-tool-DWHKTTEY.mjs → schedule-tool-FYV3JUF7.mjs} +5 -5
  20. package/dist/sdk/{schedule-tool-handler-BUP7XMCC.mjs → schedule-tool-handler-A5PN6FU3.mjs} +5 -5
  21. package/dist/sdk/{schedule-tool-handler-IZPIN2GK.mjs → schedule-tool-handler-LUL42U37.mjs} +5 -5
  22. package/dist/sdk/sdk.js +14 -6
  23. package/dist/sdk/sdk.js.map +1 -1
  24. package/dist/sdk/sdk.mjs +4 -4
  25. package/dist/sdk/{trace-helpers-AXJZLLWE.mjs → trace-helpers-VDR4RKGC.mjs} +2 -2
  26. package/dist/sdk/{workflow-check-provider-XGW3WVPS.mjs → workflow-check-provider-46DGVZBU.mjs} +5 -5
  27. package/dist/sdk/{workflow-check-provider-ZZDIPHGY.mjs → workflow-check-provider-B2FOW6P2.mjs} +5 -5
  28. package/dist/utils/worktree-manager.d.ts +9 -2
  29. package/dist/utils/worktree-manager.d.ts.map +1 -1
  30. package/package.json +2 -2
  31. /package/dist/sdk/{check-provider-registry-EFBU3XPX.mjs.map → check-provider-registry-2A5MSNM3.mjs.map} +0 -0
  32. /package/dist/sdk/{check-provider-registry-ZNIJMJWI.mjs.map → check-provider-registry-BDPHCHX3.mjs.map} +0 -0
  33. /package/dist/sdk/{chunk-HT3EFZ75.mjs.map → chunk-I7J2BNOK.mjs.map} +0 -0
  34. /package/dist/sdk/{chunk-2LL6GIEU.mjs.map → chunk-R5PIUZSD.mjs.map} +0 -0
  35. /package/dist/sdk/{failure-condition-evaluator-3Q45T5EW.mjs.map → failure-condition-evaluator-NBRX4N23.mjs.map} +0 -0
  36. /package/dist/sdk/{github-frontend-SZBGCH43.mjs.map → github-frontend-UKDXNGOG.mjs.map} +0 -0
  37. /package/dist/sdk/{host-FB2HG74L.mjs.map → host-DEXET5UZ.mjs.map} +0 -0
  38. /package/dist/sdk/{host-Z6OFA24O.mjs.map → host-Q4N357JE.mjs.map} +0 -0
  39. /package/dist/sdk/{routing-GGZBWOLZ.mjs.map → routing-7CQ7QWYE.mjs.map} +0 -0
  40. /package/dist/sdk/{schedule-tool-6VZPH74P.mjs.map → schedule-tool-EZCW6M3Z.mjs.map} +0 -0
  41. /package/dist/sdk/{schedule-tool-DWHKTTEY.mjs.map → schedule-tool-FYV3JUF7.mjs.map} +0 -0
  42. /package/dist/sdk/{schedule-tool-handler-BUP7XMCC.mjs.map → schedule-tool-handler-A5PN6FU3.mjs.map} +0 -0
  43. /package/dist/sdk/{schedule-tool-handler-IZPIN2GK.mjs.map → schedule-tool-handler-LUL42U37.mjs.map} +0 -0
  44. /package/dist/sdk/{trace-helpers-AXJZLLWE.mjs.map → trace-helpers-VDR4RKGC.mjs.map} +0 -0
  45. /package/dist/sdk/{workflow-check-provider-XGW3WVPS.mjs.map → workflow-check-provider-46DGVZBU.mjs.map} +0 -0
  46. /package/dist/sdk/{workflow-check-provider-ZZDIPHGY.mjs.map → workflow-check-provider-B2FOW6P2.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.42';
3
- process.env.PROBE_VERSION = '0.6.0-rc275';
4
- process.env.VISOR_COMMIT_SHA = '4649f36ce59ad08fdca94bfd258a48e0d211c506';
5
- process.env.VISOR_COMMIT_SHORT = '4649f36';
2
+ process.env.VISOR_VERSION = '0.1.163';
3
+ process.env.PROBE_VERSION = '0.6.0-rc276';
4
+ process.env.VISOR_COMMIT_SHA = '13be3922b96d47f2a37e9367d34de75d5aa5f71d';
5
+ process.env.VISOR_COMMIT_SHORT = '13be392';
6
6
  /******/ (() => { // webpackBootstrap
7
7
  /******/ var __webpack_modules__ = ({
8
8
 
@@ -186406,6 +186406,7 @@ class GitCheckoutProvider extends check_provider_interface_1.CheckProvider {
186406
186406
  workingDirectory: resolvedWorkingDirectory,
186407
186407
  clean: checkoutConfig.clean !== false, // Default: true
186408
186408
  workflowId: context?.workflowId,
186409
+ sessionId: context?.sessionId || context?._parentContext?.sessionId,
186409
186410
  fetchDepth: checkoutConfig.fetch_depth,
186410
186411
  cloneTimeoutMs: checkoutConfig.clone_timeout_ms,
186411
186412
  });
@@ -225267,19 +225268,20 @@ class WorktreeManager {
225267
225268
  return path.join(this.config.base_path, 'worktrees');
225268
225269
  }
225269
225270
  /**
225270
- * Generate a deterministic worktree ID based on repository and ref.
225271
- * This allows worktrees to be reused when the same repo+ref is requested again.
225271
+ * Generate a worktree ID based on repository, ref, and session.
225272
+ *
225273
+ * When a sessionId is provided, the ID is scoped to that session so each
225274
+ * agent run gets its own isolated worktree. Steps within the same session
225275
+ * that checkout the same repo+ref will reuse the worktree (efficient).
225276
+ *
225277
+ * Without sessionId, falls back to deterministic repo+ref hashing
225278
+ * (legacy behavior).
225272
225279
  */
225273
- generateWorktreeId(repository, ref) {
225280
+ generateWorktreeId(repository, ref, sessionId) {
225274
225281
  const sanitizedRepo = repository.replace(/[^a-zA-Z0-9-]/g, '-');
225275
225282
  const sanitizedRef = ref.replace(/[^a-zA-Z0-9-]/g, '-');
225276
- // Use deterministic hash (no Date.now()) so same repo+ref produces same ID
225277
- // This enables worktree reuse across multiple calls
225278
- const hash = crypto
225279
- .createHash('md5')
225280
- .update(`${repository}:${ref}`)
225281
- .digest('hex')
225282
- .substring(0, 8);
225283
+ const hashInput = sessionId ? `${repository}:${ref}:${sessionId}` : `${repository}:${ref}`;
225284
+ const hash = crypto.createHash('md5').update(hashInput).digest('hex').substring(0, 8);
225283
225285
  return `${sanitizedRepo}-${sanitizedRef}-${hash}`;
225284
225286
  }
225285
225287
  /**
@@ -225466,8 +225468,8 @@ class WorktreeManager {
225466
225468
  this.validateRef(ref);
225467
225469
  // Get or create bare repository
225468
225470
  const bareRepoPath = await this.getOrCreateBareRepo(repository, repoUrl, options.token, options.fetchDepth, options.cloneTimeoutMs);
225469
- // Generate worktree ID and path
225470
- const worktreeId = this.generateWorktreeId(repository, ref);
225471
+ // Generate worktree ID and path — scoped by sessionId for cross-run isolation
225472
+ const worktreeId = this.generateWorktreeId(repository, ref, options.sessionId);
225471
225473
  let worktreePath = options.workingDirectory || path.join(this.getWorktreesDir(), worktreeId);
225472
225474
  // Validate path if user-provided
225473
225475
  if (options.workingDirectory) {
@@ -280612,6 +280614,14 @@ var init_TaskManager = __esm({
280612
280614
  * @returns {Task[]} Created tasks
280613
280615
  */
280614
280616
  createTasks(tasksData) {
280617
+ const hasDependencies = tasksData.some((t5) => t5.dependencies && t5.dependencies.length > 0);
280618
+ if (hasDependencies) {
280619
+ for (let i5 = 0; i5 < tasksData.length; i5++) {
280620
+ if (!tasksData[i5].id) {
280621
+ throw new Error(`Task at index ${i5} is missing required "id" field. When using dependencies, every task in the batch must have an "id" so other tasks can reference it.`);
280622
+ }
280623
+ }
280624
+ }
280615
280625
  const idMap = /* @__PURE__ */ new Map();
280616
280626
  const batchAutoIds = /* @__PURE__ */ new Set();
280617
280627
  let nextCounter = this.taskCounter;
@@ -280630,7 +280640,8 @@ var init_TaskManager = __esm({
280630
280640
  resolved.dependencies = resolved.dependencies.map((depId) => {
280631
280641
  if (idMap.has(depId)) return idMap.get(depId);
280632
280642
  if (this.tasks.has(depId) || batchAutoIds.has(depId)) return depId;
280633
- throw new Error(`Dependency "${depId}" does not exist. Available tasks: ${this._getAvailableTaskIds()}${idMap.size > 0 ? `, batch IDs: ${Array.from(idMap.keys()).join(", ")}` : ""}`);
280643
+ const batchIds = idMap.size > 0 ? Array.from(idMap.keys()).join(", ") : "(none provided)";
280644
+ throw new Error(`Dependency "${depId}" does not exist. Each task in the batch must have an "id" field, and dependencies must reference those IDs. Current batch IDs: ${batchIds}. Existing tasks: ${this._getAvailableTaskIds()}`);
280634
280645
  });
280635
280646
  }
280636
280647
  if (resolved.after) {
@@ -285349,12 +285360,12 @@ var init_taskTool = __esm({
285349
285360
  "use strict";
285350
285361
  init_zod();
285351
285362
  taskItemSchema = external_exports.object({
285352
- id: external_exports.string().optional(),
285363
+ id: external_exports.string().describe('Unique task identifier. Use short descriptive slugs (e.g. "auth", "setup-db"). Dependencies reference these IDs.'),
285353
285364
  title: external_exports.string().optional(),
285354
285365
  description: external_exports.string().optional(),
285355
285366
  status: external_exports.enum(["pending", "in_progress", "completed", "cancelled"]).optional(),
285356
285367
  priority: external_exports.enum(["low", "medium", "high", "critical"]).optional(),
285357
- dependencies: external_exports.array(external_exports.string()).optional(),
285368
+ dependencies: external_exports.array(external_exports.string()).optional().describe("Array of task IDs (from this batch or previously created) that must complete before this task can start."),
285358
285369
  after: external_exports.string().optional()
285359
285370
  });
285360
285371
  taskSchema = external_exports.object({
@@ -397482,7 +397493,7 @@ module.exports = /*#__PURE__*/JSON.parse('{"100":"Continue","101":"Switching Pro
397482
397493
  /***/ ((module) => {
397483
397494
 
397484
397495
  "use strict";
397485
- 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","@modelcontextprotocol/sdk":"^1.25.3","@nyariv/sandboxjs":"github:probelabs/SandboxJS#f1c13b8eee98734a8ea024061eada4aa9a9ff2e9","@octokit/action":"^8.0.2","@octokit/auth-app":"^8.1.0","@octokit/core":"^7.0.3","@octokit/rest":"^22.0.0","@opentelemetry/api":"^1.9.0","@opentelemetry/core":"^1.30.1","@opentelemetry/exporter-trace-otlp-grpc":"^0.203.0","@opentelemetry/exporter-trace-otlp-http":"^0.203.0","@opentelemetry/instrumentation":"^0.203.0","@opentelemetry/resources":"^1.30.1","@opentelemetry/sdk-metrics":"^1.30.1","@opentelemetry/sdk-node":"^0.203.0","@opentelemetry/sdk-trace-base":"^1.30.1","@opentelemetry/semantic-conventions":"^1.30.1","@probelabs/probe":"^0.6.0-rc275","@types/commander":"^2.12.0","@types/uuid":"^10.0.0","acorn":"^8.16.0","acorn-walk":"^8.3.5","ajv":"^8.17.1","ajv-formats":"^3.0.1","better-sqlite3":"^11.0.0","blessed":"^0.1.81","cli-table3":"^0.6.5","commander":"^14.0.0","deepmerge":"^4.3.1","dotenv":"^17.2.3","ignore":"^7.0.5","js-yaml":"^4.1.0","jsonpath-plus":"^10.4.0","liquidjs":"^10.21.1","minimatch":"^10.2.2","node-cron":"^3.0.3","open":"^9.1.0","simple-git":"^3.28.0","uuid":"^11.1.0","ws":"^8.18.3"},"optionalDependencies":{"@anthropic/claude-code-sdk":"npm:null@*","@open-policy-agent/opa-wasm":"^1.10.0","knex":"^3.1.0","mysql2":"^3.11.0","pg":"^8.13.0","tedious":"^19.0.0"},"devDependencies":{"@eslint/js":"^9.34.0","@kie/act-js":"^2.6.2","@kie/mock-github":"^2.0.1","@swc/core":"^1.13.2","@swc/jest":"^0.2.37","@types/better-sqlite3":"^7.6.0","@types/blessed":"^0.1.27","@types/jest":"^30.0.0","@types/js-yaml":"^4.0.9","@types/node":"^24.3.0","@types/node-cron":"^3.0.11","@types/ws":"^8.18.1","@typescript-eslint/eslint-plugin":"^8.42.0","@typescript-eslint/parser":"^8.42.0","@vercel/ncc":"^0.38.4","eslint":"^9.34.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","husky":"^9.1.7","jest":"^30.1.3","lint-staged":"^16.1.6","prettier":"^3.6.2","reveal-md":"^6.1.2","ts-json-schema-generator":"^1.5.1","ts-node":"^10.9.2","tsup":"^8.5.0","typescript":"^5.9.2","wrangler":"^3.0.0"},"peerDependenciesMeta":{"@anthropic/claude-code-sdk":{"optional":true}},"directories":{"test":"tests"},"lint-staged":{"src/**/*.{ts,js}":["eslint --fix","prettier --write"],"tests/**/*.{ts,js}":["eslint --fix","prettier --write"],"*.{json,md,yml,yaml}":["prettier --write"]}}');
397496
+ 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","@modelcontextprotocol/sdk":"^1.25.3","@nyariv/sandboxjs":"github:probelabs/SandboxJS#f1c13b8eee98734a8ea024061eada4aa9a9ff2e9","@octokit/action":"^8.0.2","@octokit/auth-app":"^8.1.0","@octokit/core":"^7.0.3","@octokit/rest":"^22.0.0","@opentelemetry/api":"^1.9.0","@opentelemetry/core":"^1.30.1","@opentelemetry/exporter-trace-otlp-grpc":"^0.203.0","@opentelemetry/exporter-trace-otlp-http":"^0.203.0","@opentelemetry/instrumentation":"^0.203.0","@opentelemetry/resources":"^1.30.1","@opentelemetry/sdk-metrics":"^1.30.1","@opentelemetry/sdk-node":"^0.203.0","@opentelemetry/sdk-trace-base":"^1.30.1","@opentelemetry/semantic-conventions":"^1.30.1","@probelabs/probe":"^0.6.0-rc276","@types/commander":"^2.12.0","@types/uuid":"^10.0.0","acorn":"^8.16.0","acorn-walk":"^8.3.5","ajv":"^8.17.1","ajv-formats":"^3.0.1","better-sqlite3":"^11.0.0","blessed":"^0.1.81","cli-table3":"^0.6.5","commander":"^14.0.0","deepmerge":"^4.3.1","dotenv":"^17.2.3","ignore":"^7.0.5","js-yaml":"^4.1.0","jsonpath-plus":"^10.4.0","liquidjs":"^10.21.1","minimatch":"^10.2.2","node-cron":"^3.0.3","open":"^9.1.0","simple-git":"^3.28.0","uuid":"^11.1.0","ws":"^8.18.3"},"optionalDependencies":{"@anthropic/claude-code-sdk":"npm:null@*","@open-policy-agent/opa-wasm":"^1.10.0","knex":"^3.1.0","mysql2":"^3.11.0","pg":"^8.13.0","tedious":"^19.0.0"},"devDependencies":{"@eslint/js":"^9.34.0","@kie/act-js":"^2.6.2","@kie/mock-github":"^2.0.1","@swc/core":"^1.13.2","@swc/jest":"^0.2.37","@types/better-sqlite3":"^7.6.0","@types/blessed":"^0.1.27","@types/jest":"^30.0.0","@types/js-yaml":"^4.0.9","@types/node":"^24.3.0","@types/node-cron":"^3.0.11","@types/ws":"^8.18.1","@typescript-eslint/eslint-plugin":"^8.42.0","@typescript-eslint/parser":"^8.42.0","@vercel/ncc":"^0.38.4","eslint":"^9.34.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.4","husky":"^9.1.7","jest":"^30.1.3","lint-staged":"^16.1.6","prettier":"^3.6.2","reveal-md":"^6.1.2","ts-json-schema-generator":"^1.5.1","ts-node":"^10.9.2","tsup":"^8.5.0","typescript":"^5.9.2","wrangler":"^3.0.0"},"peerDependenciesMeta":{"@anthropic/claude-code-sdk":{"optional":true}},"directories":{"test":"tests"},"lint-staged":{"src/**/*.{ts,js}":["eslint --fix","prettier --write"],"tests/**/*.{ts,js}":["eslint --fix","prettier --write"],"*.{json,md,yml,yaml}":["prettier --write"]}}');
397486
397497
 
397487
397498
  /***/ })
397488
397499
 
@@ -1 +1 @@
1
- {"version":3,"file":"git-checkout-provider.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/providers/git-checkout-provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAK3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAGxF,qBAAa,mBAAoB,SAAQ,aAAa;IACpD,OAAO,CAAC,MAAM,CAA0B;IAExC,OAAO,IAAI,MAAM;IAIjB,cAAc,IAAI,MAAM;IAIlB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAwDjD,OAAO,CACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,mBAAmB,EAC3B,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAC9C,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,aAAa,CAAC;IAmLzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA+C5B,sBAAsB,IAAI,MAAM,EAAE;IA2B5B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAWrC,eAAe,IAAI,MAAM,EAAE;CAG5B"}
1
+ {"version":3,"file":"git-checkout-provider.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/providers/git-checkout-provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAK3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAGxF,qBAAa,mBAAoB,SAAQ,aAAa;IACpD,OAAO,CAAC,MAAM,CAA0B;IAExC,OAAO,IAAI,MAAM;IAIjB,cAAc,IAAI,MAAM;IAIlB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAwDjD,OAAO,CACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,mBAAmB,EAC3B,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAC9C,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,aAAa,CAAC;IAoLzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA+C5B,sBAAsB,IAAI,MAAM,EAAE;IA2B5B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAWrC,eAAe,IAAI,MAAM,EAAE;CAG5B"}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  CheckProviderRegistry,
3
3
  init_check_provider_registry
4
- } from "./chunk-FHWFG5AS.mjs";
4
+ } from "./chunk-6CRSLQK6.mjs";
5
5
  import "./chunk-KFKHU6CM.mjs";
6
6
  import "./chunk-AVMMKGLQ.mjs";
7
7
  import "./chunk-LG4AUKHB.mjs";
@@ -11,9 +11,9 @@ import "./chunk-GEW6LS32.mjs";
11
11
  import "./chunk-NZADFXHE.mjs";
12
12
  import "./chunk-AS6LIEO4.mjs";
13
13
  import "./chunk-NCWIZVOT.mjs";
14
- import "./chunk-2LL6GIEU.mjs";
15
- import "./chunk-HT3EFZ75.mjs";
16
- import "./chunk-CYIKOFJZ.mjs";
14
+ import "./chunk-R5PIUZSD.mjs";
15
+ import "./chunk-I7J2BNOK.mjs";
16
+ import "./chunk-ZH6K5NSC.mjs";
17
17
  import "./chunk-JL7JXCET.mjs";
18
18
  import "./chunk-ZUEQNCKB.mjs";
19
19
  import "./chunk-25IC7KXZ.mjs";
@@ -26,4 +26,4 @@ init_check_provider_registry();
26
26
  export {
27
27
  CheckProviderRegistry
28
28
  };
29
- //# sourceMappingURL=check-provider-registry-EFBU3XPX.mjs.map
29
+ //# sourceMappingURL=check-provider-registry-2A5MSNM3.mjs.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  CheckProviderRegistry,
3
3
  init_check_provider_registry
4
- } from "./chunk-2EZB4TRC.mjs";
4
+ } from "./chunk-53RHNNWQ.mjs";
5
5
  import "./chunk-KFKHU6CM.mjs";
6
6
  import "./chunk-AVMMKGLQ.mjs";
7
7
  import "./chunk-LG4AUKHB.mjs";
@@ -11,9 +11,9 @@ import "./chunk-GEW6LS32.mjs";
11
11
  import "./chunk-NZADFXHE.mjs";
12
12
  import "./chunk-AS6LIEO4.mjs";
13
13
  import "./chunk-NCWIZVOT.mjs";
14
- import "./chunk-2LL6GIEU.mjs";
15
- import "./chunk-HT3EFZ75.mjs";
16
- import "./chunk-CYIKOFJZ.mjs";
14
+ import "./chunk-R5PIUZSD.mjs";
15
+ import "./chunk-I7J2BNOK.mjs";
16
+ import "./chunk-ZH6K5NSC.mjs";
17
17
  import "./chunk-JL7JXCET.mjs";
18
18
  import "./chunk-ZUEQNCKB.mjs";
19
19
  import "./chunk-25IC7KXZ.mjs";
@@ -26,4 +26,4 @@ init_check_provider_registry();
26
26
  export {
27
27
  CheckProviderRegistry
28
28
  };
29
- //# sourceMappingURL=check-provider-registry-ZNIJMJWI.mjs.map
29
+ //# sourceMappingURL=check-provider-registry-BDPHCHX3.mjs.map
@@ -42,11 +42,11 @@ import {
42
42
  init_routing,
43
43
  init_snapshot_store,
44
44
  snapshot_store_exports
45
- } from "./chunk-2LL6GIEU.mjs";
45
+ } from "./chunk-R5PIUZSD.mjs";
46
46
  import {
47
47
  FailureConditionEvaluator,
48
48
  init_failure_condition_evaluator
49
- } from "./chunk-HT3EFZ75.mjs";
49
+ } from "./chunk-I7J2BNOK.mjs";
50
50
  import {
51
51
  addEvent,
52
52
  emitNdjsonFallback,
@@ -57,7 +57,7 @@ import {
57
57
  setSpanAttributes,
58
58
  trace_helpers_exports,
59
59
  withActiveSpan
60
- } from "./chunk-CYIKOFJZ.mjs";
60
+ } from "./chunk-ZH6K5NSC.mjs";
61
61
  import {
62
62
  addDiagramBlock,
63
63
  init_metrics
@@ -3959,7 +3959,7 @@ async function executeWorkflowAsTool(workflowId, args, context2, argsOverrides)
3959
3959
  ...args,
3960
3960
  ...argsOverrides
3961
3961
  };
3962
- const { WorkflowCheckProvider: WorkflowCheckProvider2 } = await import("./workflow-check-provider-ZZDIPHGY.mjs");
3962
+ const { WorkflowCheckProvider: WorkflowCheckProvider2 } = await import("./workflow-check-provider-B2FOW6P2.mjs");
3963
3963
  const provider = new WorkflowCheckProvider2();
3964
3964
  const checkConfig = {
3965
3965
  type: "workflow",
@@ -9255,7 +9255,7 @@ async function executeCheckWithForEachItems2(checkId, forEachParent, forEachItem
9255
9255
  }
9256
9256
  }
9257
9257
  try {
9258
- const { evaluateTransitions } = await import("./routing-GGZBWOLZ.mjs");
9258
+ const { evaluateTransitions } = await import("./routing-7CQ7QWYE.mjs");
9259
9259
  const transTarget = await evaluateTransitions(
9260
9260
  onFinish.transitions,
9261
9261
  forEachParent,
@@ -9315,7 +9315,7 @@ async function executeCheckWithForEachItems2(checkId, forEachParent, forEachItem
9315
9315
  `[LevelDispatch] Error evaluating on_finish transitions for ${forEachParent}: ${e instanceof Error ? e.message : String(e)}`
9316
9316
  );
9317
9317
  }
9318
- const { evaluateGoto: evaluateGoto2 } = await import("./routing-GGZBWOLZ.mjs");
9318
+ const { evaluateGoto: evaluateGoto2 } = await import("./routing-7CQ7QWYE.mjs");
9319
9319
  if (context2.debug) {
9320
9320
  logger.info(
9321
9321
  `[LevelDispatch] Evaluating on_finish.goto_js for forEach parent: ${forEachParent}`
@@ -13027,7 +13027,7 @@ var init_state_machine_execution_engine = __esm({
13027
13027
  try {
13028
13028
  const map = options?.webhookContext?.webhookData;
13029
13029
  if (map) {
13030
- const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-ZNIJMJWI.mjs");
13030
+ const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-BDPHCHX3.mjs");
13031
13031
  const reg = CheckProviderRegistry2.getInstance();
13032
13032
  const p = reg.getProvider("http_input");
13033
13033
  if (p && typeof p.setWebhookContext === "function") p.setWebhookContext(map);
@@ -13150,7 +13150,7 @@ var init_state_machine_execution_engine = __esm({
13150
13150
  tag_filter: tagFilter
13151
13151
  } : config;
13152
13152
  try {
13153
- const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-ZNIJMJWI.mjs");
13153
+ const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-BDPHCHX3.mjs");
13154
13154
  const registry = CheckProviderRegistry2.getInstance();
13155
13155
  registry.setCustomTools(configWithTagFilter.tools || {});
13156
13156
  } catch (error) {
@@ -13214,7 +13214,7 @@ var init_state_machine_execution_engine = __esm({
13214
13214
  try {
13215
13215
  const webhookData = this.executionContext?.webhookContext?.webhookData;
13216
13216
  if (webhookData instanceof Map) {
13217
- const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-BUP7XMCC.mjs");
13217
+ const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-A5PN6FU3.mjs");
13218
13218
  const slackCtx = extractSlackContext2(webhookData);
13219
13219
  if (slackCtx) {
13220
13220
  const payload = Array.from(webhookData.values())[0];
@@ -13243,7 +13243,7 @@ var init_state_machine_execution_engine = __esm({
13243
13243
  if (Array.isArray(configWithTagFilter.frontends) && configWithTagFilter.frontends.length > 0) {
13244
13244
  try {
13245
13245
  const { EventBus } = await import("./event-bus-5K3Y2FCS.mjs");
13246
- const { FrontendsHost } = await import("./host-FB2HG74L.mjs");
13246
+ const { FrontendsHost } = await import("./host-Q4N357JE.mjs");
13247
13247
  const bus = new EventBus();
13248
13248
  context2.eventBus = bus;
13249
13249
  frontendsHost = new FrontendsHost(bus, logger);
@@ -13593,9 +13593,9 @@ var init_state_machine_execution_engine = __esm({
13593
13593
  * @returns Array of failure condition evaluation results
13594
13594
  */
13595
13595
  async evaluateFailureConditions(checkName, reviewSummary, config, previousOutputs, authorAssociation) {
13596
- const { FailureConditionEvaluator: FailureConditionEvaluator2 } = await import("./failure-condition-evaluator-3Q45T5EW.mjs");
13596
+ const { FailureConditionEvaluator: FailureConditionEvaluator2 } = await import("./failure-condition-evaluator-NBRX4N23.mjs");
13597
13597
  const evaluator = new FailureConditionEvaluator2();
13598
- const { addEvent: addEvent3 } = await import("./trace-helpers-AXJZLLWE.mjs");
13598
+ const { addEvent: addEvent3 } = await import("./trace-helpers-VDR4RKGC.mjs");
13599
13599
  const { addFailIfTriggered } = await import("./metrics-I6A7IHG4.mjs");
13600
13600
  const checkConfig = config.checks?.[checkName];
13601
13601
  if (!checkConfig) {
@@ -40728,8 +40728,8 @@ function buildBuiltinGlobals(opts) {
40728
40728
  const asyncFunctionNames = /* @__PURE__ */ new Set();
40729
40729
  const scheduleFn = async (args = {}) => {
40730
40730
  try {
40731
- const { handleScheduleAction: handleScheduleAction2, buildScheduleToolContext: buildScheduleToolContext2 } = await import("./schedule-tool-6VZPH74P.mjs");
40732
- const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-BUP7XMCC.mjs");
40731
+ const { handleScheduleAction: handleScheduleAction2, buildScheduleToolContext: buildScheduleToolContext2 } = await import("./schedule-tool-FYV3JUF7.mjs");
40732
+ const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-A5PN6FU3.mjs");
40733
40733
  const parentCtx = opts.sessionInfo?._parentContext;
40734
40734
  const webhookData = parentCtx?.prInfo?.eventContext?.webhookData;
40735
40735
  const visorCfg = parentCtx?.config;
@@ -41388,13 +41388,20 @@ var init_worktree_manager = __esm({
41388
41388
  return path13.join(this.config.base_path, "worktrees");
41389
41389
  }
41390
41390
  /**
41391
- * Generate a deterministic worktree ID based on repository and ref.
41392
- * This allows worktrees to be reused when the same repo+ref is requested again.
41391
+ * Generate a worktree ID based on repository, ref, and session.
41392
+ *
41393
+ * When a sessionId is provided, the ID is scoped to that session so each
41394
+ * agent run gets its own isolated worktree. Steps within the same session
41395
+ * that checkout the same repo+ref will reuse the worktree (efficient).
41396
+ *
41397
+ * Without sessionId, falls back to deterministic repo+ref hashing
41398
+ * (legacy behavior).
41393
41399
  */
41394
- generateWorktreeId(repository, ref) {
41400
+ generateWorktreeId(repository, ref, sessionId) {
41395
41401
  const sanitizedRepo = repository.replace(/[^a-zA-Z0-9-]/g, "-");
41396
41402
  const sanitizedRef = ref.replace(/[^a-zA-Z0-9-]/g, "-");
41397
- const hash = crypto.createHash("md5").update(`${repository}:${ref}`).digest("hex").substring(0, 8);
41403
+ const hashInput = sessionId ? `${repository}:${ref}:${sessionId}` : `${repository}:${ref}`;
41404
+ const hash = crypto.createHash("md5").update(hashInput).digest("hex").substring(0, 8);
41398
41405
  return `${sanitizedRepo}-${sanitizedRef}-${hash}`;
41399
41406
  }
41400
41407
  /**
@@ -41550,7 +41557,7 @@ var init_worktree_manager = __esm({
41550
41557
  options.fetchDepth,
41551
41558
  options.cloneTimeoutMs
41552
41559
  );
41553
- const worktreeId = this.generateWorktreeId(repository, ref);
41560
+ const worktreeId = this.generateWorktreeId(repository, ref, options.sessionId);
41554
41561
  let worktreePath = options.workingDirectory || path13.join(this.getWorktreesDir(), worktreeId);
41555
41562
  if (options.workingDirectory) {
41556
41563
  worktreePath = this.validatePath(options.workingDirectory);
@@ -42240,6 +42247,7 @@ var init_git_checkout_provider = __esm({
42240
42247
  clean: checkoutConfig.clean !== false,
42241
42248
  // Default: true
42242
42249
  workflowId: context2?.workflowId,
42250
+ sessionId: context2?.sessionId || context2?._parentContext?.sessionId,
42243
42251
  fetchDepth: checkoutConfig.fetch_depth,
42244
42252
  cloneTimeoutMs: checkoutConfig.clone_timeout_ms
42245
42253
  }
@@ -43866,4 +43874,4 @@ undici/lib/fetch/body.js:
43866
43874
  undici/lib/websocket/frame.js:
43867
43875
  (*! ws. MIT License. Einar Otto Stangvik <einaros@gmail.com> *)
43868
43876
  */
43869
- //# sourceMappingURL=chunk-2EZB4TRC.mjs.map
43877
+ //# sourceMappingURL=chunk-53RHNNWQ.mjs.map