@probelabs/visor 0.1.178 → 0.1.179

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 (94) hide show
  1. package/defaults/assistant.yaml +38 -16
  2. package/defaults/skills/code-explorer.yaml +8 -8
  3. package/dist/agent-protocol/tasks-cli-handler.d.ts.map +1 -1
  4. package/dist/agent-protocol/track-execution.d.ts.map +1 -1
  5. package/dist/defaults/assistant.yaml +38 -16
  6. package/dist/defaults/skills/code-explorer.yaml +8 -8
  7. package/dist/frontends/slack-frontend.d.ts +6 -0
  8. package/dist/frontends/slack-frontend.d.ts.map +1 -1
  9. package/dist/index.js +305 -87
  10. package/dist/output/traces/{run-2026-03-11T06-33-05-398Z.ndjson → run-2026-03-11T13-57-13-250Z.ndjson} +96 -96
  11. package/dist/output/traces/{run-2026-03-11T06-33-47-884Z.ndjson → run-2026-03-11T13-57-55-455Z.ndjson} +1932 -1932
  12. package/dist/providers/ai-check-provider.d.ts.map +1 -1
  13. package/dist/sdk/{a2a-frontend-WYBMBBYG.mjs → a2a-frontend-HKPCABGG.mjs} +2 -2
  14. package/dist/sdk/{a2a-frontend-U3PTNCLR.mjs → a2a-frontend-KJFLIZJT.mjs} +2 -2
  15. package/dist/sdk/{check-provider-registry-3DZOXYIA.mjs → check-provider-registry-EXP6DYGL.mjs} +5 -5
  16. package/dist/sdk/{check-provider-registry-T5J3H2N7.mjs → check-provider-registry-SYAHJMWJ.mjs} +5 -5
  17. package/dist/sdk/{check-provider-registry-ZX76MY2L.mjs → check-provider-registry-WKVXEZXA.mjs} +5 -5
  18. package/dist/sdk/{chunk-AK64Y6Y2.mjs → chunk-BFQUKQQI.mjs} +163 -124
  19. package/dist/sdk/chunk-BFQUKQQI.mjs.map +1 -0
  20. package/dist/sdk/{chunk-6YGCACBF.mjs → chunk-CHARL3TY.mjs} +2 -2
  21. package/dist/sdk/{chunk-6YGCACBF.mjs.map → chunk-CHARL3TY.mjs.map} +1 -1
  22. package/dist/sdk/{chunk-4ECMTCOM.mjs → chunk-DMUBFE4V.mjs} +2 -2
  23. package/dist/sdk/{chunk-B7XHSG3L.mjs → chunk-FTPLYUQ3.mjs} +163 -124
  24. package/dist/sdk/chunk-FTPLYUQ3.mjs.map +1 -0
  25. package/dist/sdk/{chunk-ANEKFNAS.mjs → chunk-JTRN5AR7.mjs} +163 -124
  26. package/dist/sdk/chunk-JTRN5AR7.mjs.map +1 -0
  27. package/dist/sdk/{chunk-ENSZDV3O.mjs → chunk-NNL5M6QR.mjs} +3 -3
  28. package/dist/sdk/{chunk-CDRKH5HH.mjs → chunk-OYHDBTKY.mjs} +2 -2
  29. package/dist/sdk/{chunk-KG6PM4OL.mjs → chunk-WSPF7FAK.mjs} +3 -3
  30. package/dist/sdk/{chunk-KG6PM4OL.mjs.map → chunk-WSPF7FAK.mjs.map} +1 -1
  31. package/dist/sdk/{chunk-WZS4ARZB.mjs → chunk-ZJYQMNPA.mjs} +3 -3
  32. package/dist/sdk/{failure-condition-evaluator-P3MS5DRL.mjs → failure-condition-evaluator-CBJ2DP4X.mjs} +3 -3
  33. package/dist/sdk/{failure-condition-evaluator-MMPKQGUA.mjs → failure-condition-evaluator-V2YGFRKO.mjs} +3 -3
  34. package/dist/sdk/{github-frontend-7RLEBJWG.mjs → github-frontend-4LM4NAZK.mjs} +3 -3
  35. package/dist/sdk/{github-frontend-QTKOYB56.mjs → github-frontend-VGU6PNQH.mjs} +3 -3
  36. package/dist/sdk/{host-I2TBBKD5.mjs → host-AMJG7BIE.mjs} +4 -4
  37. package/dist/sdk/{host-SE3MQHWG.mjs → host-XXPPPC76.mjs} +4 -4
  38. package/dist/sdk/{routing-2X6QF5IW.mjs → routing-W6AUOIGF.mjs} +4 -4
  39. package/dist/sdk/{routing-QHXBQS6X.mjs → routing-YAYBIVPL.mjs} +4 -4
  40. package/dist/sdk/{schedule-tool-R6JJIDZ6.mjs → schedule-tool-BVWTYA2Y.mjs} +5 -5
  41. package/dist/sdk/{schedule-tool-W4SQ334O.mjs → schedule-tool-OIVJDIDK.mjs} +5 -5
  42. package/dist/sdk/{schedule-tool-MKT5FZ6J.mjs → schedule-tool-T3PAV4N3.mjs} +5 -5
  43. package/dist/sdk/{schedule-tool-handler-AOMZV3Q3.mjs → schedule-tool-handler-AYJP3FGI.mjs} +5 -5
  44. package/dist/sdk/{schedule-tool-handler-MPJFLH4J.mjs → schedule-tool-handler-SJF4ZKSB.mjs} +5 -5
  45. package/dist/sdk/{schedule-tool-handler-WY7WCFE5.mjs → schedule-tool-handler-VOCVDJSM.mjs} +5 -5
  46. package/dist/sdk/sdk.js +214 -138
  47. package/dist/sdk/sdk.js.map +1 -1
  48. package/dist/sdk/sdk.mjs +4 -4
  49. package/dist/sdk/{slack-frontend-XKSIOUXB.mjs → slack-frontend-OWD7BSWF.mjs} +22 -3
  50. package/dist/sdk/slack-frontend-OWD7BSWF.mjs.map +1 -0
  51. package/dist/sdk/{trace-helpers-4ADQ4GB3.mjs → trace-helpers-FZAVMGTD.mjs} +2 -2
  52. package/dist/sdk/{trace-helpers-K47ZVJSU.mjs → trace-helpers-QL2B75AK.mjs} +2 -2
  53. package/dist/sdk/{track-execution-XTCZBUWX.mjs → track-execution-2Q66SXBZ.mjs} +20 -2
  54. package/dist/sdk/{track-execution-XTCZBUWX.mjs.map → track-execution-2Q66SXBZ.mjs.map} +1 -1
  55. package/dist/sdk/{workflow-check-provider-WHZP7BDF.mjs → workflow-check-provider-IXW6BMQA.mjs} +5 -5
  56. package/dist/sdk/{workflow-check-provider-WZN3B2S2.mjs → workflow-check-provider-JW43OGRQ.mjs} +5 -5
  57. package/dist/sdk/{workflow-check-provider-A3YH2UZJ.mjs → workflow-check-provider-ZG2JHKBH.mjs} +5 -5
  58. package/dist/traces/{run-2026-03-11T06-33-05-398Z.ndjson → run-2026-03-11T13-57-13-250Z.ndjson} +96 -96
  59. package/dist/traces/{run-2026-03-11T06-33-47-884Z.ndjson → run-2026-03-11T13-57-55-455Z.ndjson} +1932 -1932
  60. package/dist/utils/workspace-manager.d.ts +2 -0
  61. package/dist/utils/workspace-manager.d.ts.map +1 -1
  62. package/package.json +2 -2
  63. package/dist/sdk/chunk-AK64Y6Y2.mjs.map +0 -1
  64. package/dist/sdk/chunk-ANEKFNAS.mjs.map +0 -1
  65. package/dist/sdk/chunk-B7XHSG3L.mjs.map +0 -1
  66. package/dist/sdk/slack-frontend-XKSIOUXB.mjs.map +0 -1
  67. /package/dist/sdk/{a2a-frontend-U3PTNCLR.mjs.map → a2a-frontend-HKPCABGG.mjs.map} +0 -0
  68. /package/dist/sdk/{a2a-frontend-WYBMBBYG.mjs.map → a2a-frontend-KJFLIZJT.mjs.map} +0 -0
  69. /package/dist/sdk/{check-provider-registry-3DZOXYIA.mjs.map → check-provider-registry-EXP6DYGL.mjs.map} +0 -0
  70. /package/dist/sdk/{check-provider-registry-T5J3H2N7.mjs.map → check-provider-registry-SYAHJMWJ.mjs.map} +0 -0
  71. /package/dist/sdk/{check-provider-registry-ZX76MY2L.mjs.map → check-provider-registry-WKVXEZXA.mjs.map} +0 -0
  72. /package/dist/sdk/{chunk-4ECMTCOM.mjs.map → chunk-DMUBFE4V.mjs.map} +0 -0
  73. /package/dist/sdk/{chunk-ENSZDV3O.mjs.map → chunk-NNL5M6QR.mjs.map} +0 -0
  74. /package/dist/sdk/{chunk-CDRKH5HH.mjs.map → chunk-OYHDBTKY.mjs.map} +0 -0
  75. /package/dist/sdk/{chunk-WZS4ARZB.mjs.map → chunk-ZJYQMNPA.mjs.map} +0 -0
  76. /package/dist/sdk/{failure-condition-evaluator-MMPKQGUA.mjs.map → failure-condition-evaluator-CBJ2DP4X.mjs.map} +0 -0
  77. /package/dist/sdk/{failure-condition-evaluator-P3MS5DRL.mjs.map → failure-condition-evaluator-V2YGFRKO.mjs.map} +0 -0
  78. /package/dist/sdk/{github-frontend-7RLEBJWG.mjs.map → github-frontend-4LM4NAZK.mjs.map} +0 -0
  79. /package/dist/sdk/{github-frontend-QTKOYB56.mjs.map → github-frontend-VGU6PNQH.mjs.map} +0 -0
  80. /package/dist/sdk/{host-I2TBBKD5.mjs.map → host-AMJG7BIE.mjs.map} +0 -0
  81. /package/dist/sdk/{host-SE3MQHWG.mjs.map → host-XXPPPC76.mjs.map} +0 -0
  82. /package/dist/sdk/{routing-2X6QF5IW.mjs.map → routing-W6AUOIGF.mjs.map} +0 -0
  83. /package/dist/sdk/{routing-QHXBQS6X.mjs.map → routing-YAYBIVPL.mjs.map} +0 -0
  84. /package/dist/sdk/{schedule-tool-MKT5FZ6J.mjs.map → schedule-tool-BVWTYA2Y.mjs.map} +0 -0
  85. /package/dist/sdk/{schedule-tool-R6JJIDZ6.mjs.map → schedule-tool-OIVJDIDK.mjs.map} +0 -0
  86. /package/dist/sdk/{schedule-tool-W4SQ334O.mjs.map → schedule-tool-T3PAV4N3.mjs.map} +0 -0
  87. /package/dist/sdk/{schedule-tool-handler-AOMZV3Q3.mjs.map → schedule-tool-handler-AYJP3FGI.mjs.map} +0 -0
  88. /package/dist/sdk/{schedule-tool-handler-MPJFLH4J.mjs.map → schedule-tool-handler-SJF4ZKSB.mjs.map} +0 -0
  89. /package/dist/sdk/{schedule-tool-handler-WY7WCFE5.mjs.map → schedule-tool-handler-VOCVDJSM.mjs.map} +0 -0
  90. /package/dist/sdk/{trace-helpers-4ADQ4GB3.mjs.map → trace-helpers-FZAVMGTD.mjs.map} +0 -0
  91. /package/dist/sdk/{trace-helpers-K47ZVJSU.mjs.map → trace-helpers-QL2B75AK.mjs.map} +0 -0
  92. /package/dist/sdk/{workflow-check-provider-A3YH2UZJ.mjs.map → workflow-check-provider-IXW6BMQA.mjs.map} +0 -0
  93. /package/dist/sdk/{workflow-check-provider-WHZP7BDF.mjs.map → workflow-check-provider-JW43OGRQ.mjs.map} +0 -0
  94. /package/dist/sdk/{workflow-check-provider-WZN3B2S2.mjs.map → workflow-check-provider-ZG2JHKBH.mjs.map} +0 -0
@@ -270,11 +270,11 @@ inputs:
270
270
  allowed_commands:
271
271
  type: array
272
272
  items: { type: string }
273
- description: Bash command patterns this skill is allowed to run (e.g., 'git:log:*')
273
+ description: Bash command patterns this skill is allowed to run (e.g., 'git:log:*'). Only applied for skills with non-workflow tools.
274
274
  disallowed_commands:
275
275
  type: array
276
276
  items: { type: string }
277
- description: Bash command patterns this skill should not run (e.g., 'git:push:*')
277
+ description: Bash command patterns this skill should not run (e.g., 'git:push:*'). Only applied for skills with non-workflow tools.
278
278
  always:
279
279
  type: boolean
280
280
  description: Always activate this skill regardless of classification
@@ -293,7 +293,7 @@ inputs:
293
293
  - name: max_iterations
294
294
  required: false
295
295
  description: Maximum AI iterations
296
- default: 30
296
+ default: 100
297
297
  schema:
298
298
  type: number
299
299
 
@@ -654,18 +654,34 @@ steps:
654
654
  }
655
655
  }
656
656
 
657
- // Collect bash command patterns from active skills
658
- if (Array.isArray(skill.allowed_commands)) {
659
- for (let j = 0; j < skill.allowed_commands.length; j++) {
660
- if (bashAllow.indexOf(skill.allowed_commands[j]) === -1) {
661
- bashAllow.push(skill.allowed_commands[j]);
657
+ // Only merge bash command patterns from skills whose tools run in the
658
+ // parent orchestrator (MCP servers, built-ins). Skip skills that only have
659
+ // workflow-based tools those are sub-workflows with their own bash config.
660
+ let hasNonWorkflowTools = false;
661
+ if (normalizedTools && typeof normalizedTools === 'object') {
662
+ const tNames = Object.keys(normalizedTools);
663
+ for (let i = 0; i < tNames.length; i++) {
664
+ const tc = normalizedTools[tNames[i]];
665
+ if (!tc || !tc.workflow) {
666
+ hasNonWorkflowTools = true;
667
+ break;
662
668
  }
663
669
  }
664
670
  }
665
- if (Array.isArray(skill.disallowed_commands)) {
666
- for (let j = 0; j < skill.disallowed_commands.length; j++) {
667
- if (bashDeny.indexOf(skill.disallowed_commands[j]) === -1) {
668
- bashDeny.push(skill.disallowed_commands[j]);
671
+
672
+ if (hasNonWorkflowTools) {
673
+ if (Array.isArray(skill.allowed_commands)) {
674
+ for (let j = 0; j < skill.allowed_commands.length; j++) {
675
+ if (bashAllow.indexOf(skill.allowed_commands[j]) === -1) {
676
+ bashAllow.push(skill.allowed_commands[j]);
677
+ }
678
+ }
679
+ }
680
+ if (Array.isArray(skill.disallowed_commands)) {
681
+ for (let j = 0; j < skill.disallowed_commands.length; j++) {
682
+ if (bashDeny.indexOf(skill.disallowed_commands[j]) === -1) {
683
+ bashDeny.push(skill.disallowed_commands[j]);
684
+ }
669
685
  }
670
686
  }
671
687
  }
@@ -871,6 +887,16 @@ steps:
871
887
  If you catch yourself about to use bash or file tools for code operations — STOP and
872
888
  delegate to the correct skill tool instead.
873
889
 
890
+ ## CRITICAL: Do Not Retry Failed Engineer Calls With the Same Approach
891
+ When the `engineer` tool fails or returns an error/partial result:
892
+ - **DO NOT call engineer again with the same task** — it will hit the same obstacles
893
+ - **Acknowledge the failure** to the user and explain what went wrong
894
+ - **Only retry if you have a fundamentally different approach** (different strategy,
895
+ different files, different technique — not just rephrasing the same request)
896
+ - If engineer hit its iteration limit or timed out, it means the task is too complex
897
+ for a single tool call — break it into smaller, independent pieces or report back
898
+ - Never poll/loop waiting for CI to pass — report the current status and let the user decide
899
+
874
900
  ## CRITICAL: Preserve Tool Output Details
875
901
  When tools return detailed data (lists, analytics, search results):
876
902
  - **DO NOT summarize or compress** the tool output
@@ -2244,10 +2270,6 @@ tests:
2244
2270
  request needs codebase exploration, understanding implementation details,
2245
2271
  code search, or documentation questions. READ-ONLY — cannot modify files,
2246
2272
  only investigate and answer questions.
2247
- allowed_commands:
2248
- - "git:log:*"
2249
- - "git:show:*"
2250
- - "git:diff:*"
2251
2273
  knowledge: |
2252
2274
  ## Code Explorer
2253
2275
  Use the code-talk tool to explore code repositories.
@@ -18,23 +18,23 @@ description: >
18
18
  request needs codebase exploration, understanding implementation details,
19
19
  code search, or documentation questions. READ-ONLY — cannot modify files,
20
20
  only investigate and answer questions.
21
- allowed_commands:
22
- - "git:log:*"
23
- - "git:show:*"
24
- - "git:diff:*"
25
21
  knowledge: |
26
- ## Code Explorer
27
- Use the code-talk tool to explore code repositories.
22
+ ## Code Explorer — MANDATORY for all code questions
23
+ The `code-explorer` tool is your ONLY way to read, search, or understand source code.
24
+ **DO NOT use bash** (git show, git diff, git log, cat, grep, find, etc.) for code tasks.
25
+ **ALWAYS call `code-explorer`** instead — it has full repository access and returns
26
+ structured answers with file references.
27
+
28
28
  The tool returns `confidence` ("high"/"medium"/"low") and `confidence_reason`.
29
29
  - If confidence "high", trust the answer — do NOT re-call with rephrased question
30
30
  - Only call again for a genuinely DIFFERENT aspect of the codebase
31
31
  - If confidence "medium" or "low", check confidence_reason for what to refine
32
32
 
33
33
  ## Usage Instructions
34
- 1. Call the code-explorer tool with the user's question
34
+ 1. Call the `code-explorer` tool with the user's question — do NOT try to answer code questions yourself
35
35
  2. Use the answer from the tool result as your response
36
36
  3. Include the references (file paths with URLs) in your answer
37
- 4. Do NOT generate a generic response - relay what the tool found
37
+ 4. Do NOT generate a generic response relay what the tool found
38
38
  tools:
39
39
  code-explorer:
40
40
  workflow: code-talk
@@ -1 +1 @@
1
- {"version":3,"file":"tasks-cli-handler.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/agent-protocol/tasks-cli-handler.ts"],"names":[],"mappings":"AAukBA,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CtE"}
1
+ {"version":3,"file":"tasks-cli-handler.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/agent-protocol/tasks-cli-handler.ts"],"names":[],"mappings":"AAslBA,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CtE"}
@@ -1 +1 @@
1
- {"version":3,"file":"track-execution.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/agent-protocol/track-execution.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAgB,SAAS,EAAE,MAAM,SAAS,CAAC;AAEvD,MAAM,MAAM,UAAU,GAClB,KAAK,GACL,OAAO,GACP,UAAU,GACV,OAAO,GACP,UAAU,GACV,OAAO,GACP,KAAK,GACL,KAAK,GACL,WAAW,GACX,SAAS,CAAC;AAEd,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,CAAC,EACpC,IAAI,EAAE,qBAAqB,EAC3B,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACzB,OAAO,CAAC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,CAAC,CAAA;CAAE,CAAC,CA0DzC"}
1
+ {"version":3,"file":"track-execution.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/agent-protocol/track-execution.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAgB,SAAS,EAAE,MAAM,SAAS,CAAC;AAEvD,MAAM,MAAM,UAAU,GAClB,KAAK,GACL,OAAO,GACP,UAAU,GACV,OAAO,GACP,UAAU,GACV,OAAO,GACP,KAAK,GACL,KAAK,GACL,WAAW,GACX,SAAS,CAAC;AAEd,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,CAAC,EACpC,IAAI,EAAE,qBAAqB,EAC3B,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACzB,OAAO,CAAC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,CAAC,CAAA;CAAE,CAAC,CAmFzC"}
@@ -270,11 +270,11 @@ inputs:
270
270
  allowed_commands:
271
271
  type: array
272
272
  items: { type: string }
273
- description: Bash command patterns this skill is allowed to run (e.g., 'git:log:*')
273
+ description: Bash command patterns this skill is allowed to run (e.g., 'git:log:*'). Only applied for skills with non-workflow tools.
274
274
  disallowed_commands:
275
275
  type: array
276
276
  items: { type: string }
277
- description: Bash command patterns this skill should not run (e.g., 'git:push:*')
277
+ description: Bash command patterns this skill should not run (e.g., 'git:push:*'). Only applied for skills with non-workflow tools.
278
278
  always:
279
279
  type: boolean
280
280
  description: Always activate this skill regardless of classification
@@ -293,7 +293,7 @@ inputs:
293
293
  - name: max_iterations
294
294
  required: false
295
295
  description: Maximum AI iterations
296
- default: 30
296
+ default: 100
297
297
  schema:
298
298
  type: number
299
299
 
@@ -654,18 +654,34 @@ steps:
654
654
  }
655
655
  }
656
656
 
657
- // Collect bash command patterns from active skills
658
- if (Array.isArray(skill.allowed_commands)) {
659
- for (let j = 0; j < skill.allowed_commands.length; j++) {
660
- if (bashAllow.indexOf(skill.allowed_commands[j]) === -1) {
661
- bashAllow.push(skill.allowed_commands[j]);
657
+ // Only merge bash command patterns from skills whose tools run in the
658
+ // parent orchestrator (MCP servers, built-ins). Skip skills that only have
659
+ // workflow-based tools those are sub-workflows with their own bash config.
660
+ let hasNonWorkflowTools = false;
661
+ if (normalizedTools && typeof normalizedTools === 'object') {
662
+ const tNames = Object.keys(normalizedTools);
663
+ for (let i = 0; i < tNames.length; i++) {
664
+ const tc = normalizedTools[tNames[i]];
665
+ if (!tc || !tc.workflow) {
666
+ hasNonWorkflowTools = true;
667
+ break;
662
668
  }
663
669
  }
664
670
  }
665
- if (Array.isArray(skill.disallowed_commands)) {
666
- for (let j = 0; j < skill.disallowed_commands.length; j++) {
667
- if (bashDeny.indexOf(skill.disallowed_commands[j]) === -1) {
668
- bashDeny.push(skill.disallowed_commands[j]);
671
+
672
+ if (hasNonWorkflowTools) {
673
+ if (Array.isArray(skill.allowed_commands)) {
674
+ for (let j = 0; j < skill.allowed_commands.length; j++) {
675
+ if (bashAllow.indexOf(skill.allowed_commands[j]) === -1) {
676
+ bashAllow.push(skill.allowed_commands[j]);
677
+ }
678
+ }
679
+ }
680
+ if (Array.isArray(skill.disallowed_commands)) {
681
+ for (let j = 0; j < skill.disallowed_commands.length; j++) {
682
+ if (bashDeny.indexOf(skill.disallowed_commands[j]) === -1) {
683
+ bashDeny.push(skill.disallowed_commands[j]);
684
+ }
669
685
  }
670
686
  }
671
687
  }
@@ -871,6 +887,16 @@ steps:
871
887
  If you catch yourself about to use bash or file tools for code operations — STOP and
872
888
  delegate to the correct skill tool instead.
873
889
 
890
+ ## CRITICAL: Do Not Retry Failed Engineer Calls With the Same Approach
891
+ When the `engineer` tool fails or returns an error/partial result:
892
+ - **DO NOT call engineer again with the same task** — it will hit the same obstacles
893
+ - **Acknowledge the failure** to the user and explain what went wrong
894
+ - **Only retry if you have a fundamentally different approach** (different strategy,
895
+ different files, different technique — not just rephrasing the same request)
896
+ - If engineer hit its iteration limit or timed out, it means the task is too complex
897
+ for a single tool call — break it into smaller, independent pieces or report back
898
+ - Never poll/loop waiting for CI to pass — report the current status and let the user decide
899
+
874
900
  ## CRITICAL: Preserve Tool Output Details
875
901
  When tools return detailed data (lists, analytics, search results):
876
902
  - **DO NOT summarize or compress** the tool output
@@ -2244,10 +2270,6 @@ tests:
2244
2270
  request needs codebase exploration, understanding implementation details,
2245
2271
  code search, or documentation questions. READ-ONLY — cannot modify files,
2246
2272
  only investigate and answer questions.
2247
- allowed_commands:
2248
- - "git:log:*"
2249
- - "git:show:*"
2250
- - "git:diff:*"
2251
2273
  knowledge: |
2252
2274
  ## Code Explorer
2253
2275
  Use the code-talk tool to explore code repositories.
@@ -18,23 +18,23 @@ description: >
18
18
  request needs codebase exploration, understanding implementation details,
19
19
  code search, or documentation questions. READ-ONLY — cannot modify files,
20
20
  only investigate and answer questions.
21
- allowed_commands:
22
- - "git:log:*"
23
- - "git:show:*"
24
- - "git:diff:*"
25
21
  knowledge: |
26
- ## Code Explorer
27
- Use the code-talk tool to explore code repositories.
22
+ ## Code Explorer — MANDATORY for all code questions
23
+ The `code-explorer` tool is your ONLY way to read, search, or understand source code.
24
+ **DO NOT use bash** (git show, git diff, git log, cat, grep, find, etc.) for code tasks.
25
+ **ALWAYS call `code-explorer`** instead — it has full repository access and returns
26
+ structured answers with file references.
27
+
28
28
  The tool returns `confidence` ("high"/"medium"/"low") and `confidence_reason`.
29
29
  - If confidence "high", trust the answer — do NOT re-call with rephrased question
30
30
  - Only call again for a genuinely DIFFERENT aspect of the codebase
31
31
  - If confidence "medium" or "low", check confidence_reason for what to refine
32
32
 
33
33
  ## Usage Instructions
34
- 1. Call the code-explorer tool with the user's question
34
+ 1. Call the `code-explorer` tool with the user's question — do NOT try to answer code questions yourself
35
35
  2. Use the answer from the tool result as your response
36
36
  3. Include the references (file paths with URLs) in your answer
37
- 4. Do NOT generate a generic response - relay what the tool found
37
+ 4. Do NOT generate a generic response relay what the tool found
38
38
  tools:
39
39
  code-explorer:
40
40
  workflow: code-talk
@@ -48,6 +48,12 @@ export declare class SlackFrontend implements Frontend {
48
48
  private getInboundSlackEvent;
49
49
  private isTelemetryEnabled;
50
50
  private maybePostError;
51
+ /**
52
+ * Post error to Slack regardless of errorNotified flag.
53
+ * Used for fatal/shutdown errors that must always reach the user.
54
+ */
55
+ private forcePostError;
56
+ private postErrorToSlack;
51
57
  private isExecutionFailureIssue;
52
58
  private maybePostExecutionFailure;
53
59
  private ensureAcknowledgement;
@@ -1 +1 @@
1
- {"version":3,"file":"slack-frontend.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/frontends/slack-frontend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAYxD,KAAK,mBAAmB,GAAG;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE;QACV,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;CACH,CAAC;AAEF,qBAAa,aAAc,YAAW,QAAQ;IAC5C,SAAgB,IAAI,WAAW;IAC/B,OAAO,CAAC,IAAI,CAAsC;IAClD,OAAO,CAAC,GAAG,CAAsB;IAEjC,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,MAAM,CAAgD;IAC9D,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,eAAe,CAAoD;gBAE/D,MAAM,CAAC,EAAE,mBAAmB;IAIxC,KAAK,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IA6JjC,IAAI,IAAI,IAAI;IAKZ,OAAO,CAAC,QAAQ;IAchB,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,kBAAkB;YAcZ,cAAc;IA2D5B,OAAO,CAAC,uBAAuB;YAcjB,yBAAyB;YAgCzB,qBAAqB;YAsCrB,iBAAiB;IA6B/B;;;;OAIG;YACW,oBAAoB;IA0QlC,OAAO,CAAC,YAAY;CAWrB"}
1
+ {"version":3,"file":"slack-frontend.d.ts","sourceRoot":"","sources":["file:///home/runner/work/visor/visor/src/frontends/slack-frontend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAYxD,KAAK,mBAAmB,GAAG;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE;QACV,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;CACH,CAAC;AAEF,qBAAa,aAAc,YAAW,QAAQ;IAC5C,SAAgB,IAAI,WAAW;IAC/B,OAAO,CAAC,IAAI,CAAsC;IAClD,OAAO,CAAC,GAAG,CAAsB;IAEjC,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,MAAM,CAAgD;IAC9D,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,eAAe,CAAoD;gBAE/D,MAAM,CAAC,EAAE,mBAAmB;IAIxC,KAAK,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI;IAyKjC,IAAI,IAAI,IAAI;IAKZ,OAAO,CAAC,QAAQ;IAchB,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,kBAAkB;YAcZ,cAAc;IAU5B;;;OAGG;YACW,cAAc;YASd,gBAAgB;IA0D9B,OAAO,CAAC,uBAAuB;YAcjB,yBAAyB;YAgCzB,qBAAqB;YAsCrB,iBAAiB;IA6B/B;;;;OAIG;YACW,oBAAoB;IA0QlC,OAAO,CAAC,YAAY;CAWrB"}