@runfusion/fusion 0.77.0-beta.11 → 0.77.0-beta.13

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 (148) hide show
  1. package/dist/bin.js +4920 -2723
  2. package/dist/child-process-worker.js +3369 -1522
  3. package/dist/client/.vite/manifest.json +256 -256
  4. package/dist/client/assets/AgentDetailView-DPoh46Ym.css +1 -0
  5. package/dist/client/assets/{AgentDetailView-DBtLmaDe.js → AgentDetailView-DwCr9HOY.js} +1 -1
  6. package/dist/client/assets/{AgentPermissionPolicyEditor-CUoT_KSS.js → AgentPermissionPolicyEditor-CXRP1R7V.js} +1 -1
  7. package/dist/client/assets/{AgentsView-BAr7SsM4.js → AgentsView-DEVhP_Ad.js} +3 -3
  8. package/dist/client/assets/CommandCenter-BshTzOtB.css +1 -0
  9. package/dist/client/assets/CommandCenter-sNTR0N1L.js +107 -0
  10. package/dist/client/assets/{DevServerView-Du_4m2bu.js → DevServerView-X1Ncu9x-.js} +1 -1
  11. package/dist/client/assets/{DirectoryPicker-BlAdIKxx.js → DirectoryPicker-UrDTGJYj.js} +1 -1
  12. package/dist/client/assets/{DocumentsView-ByJFT4I0.js → DocumentsView-DyyfLF1R.js} +1 -1
  13. package/dist/client/assets/{EvalsView-Dme2v3rH.js → EvalsView-DgMdhmj1.js} +1 -1
  14. package/dist/client/assets/{ExperimentalAgentOnboardingModal-C3AjkBSq.js → ExperimentalAgentOnboardingModal-DqETOMkr.js} +1 -1
  15. package/dist/client/assets/{GoalsView-B8n2ggt7.js → GoalsView-Cai1_q1j.js} +1 -1
  16. package/dist/client/assets/{InsightsView-CquFSXMH.js → InsightsView-DN9i_pr2.js} +1 -1
  17. package/dist/client/assets/{MemoryView-CiErG8PC.js → MemoryView-DpVhI_BB.js} +1 -1
  18. package/dist/client/assets/{PatchnodeView-5bDCQRSq.js → PatchnodeView-C9glaWoU.js} +1 -1
  19. package/dist/client/assets/{PiExtensionsManager-DQ03OEXC.js → PiExtensionsManager-DkJ3I9ur.js} +1 -1
  20. package/dist/client/assets/{PluginManager-k29ipdWr.js → PluginManager-C3BKqDE-.js} +1 -1
  21. package/dist/client/assets/{PullRequestView-BvWI2q9N.js → PullRequestView-BCPolzJY.js} +1 -1
  22. package/dist/client/assets/{ReportModal-BH9g02a6.js → ReportModal-CBc5lSf3.js} +1 -1
  23. package/dist/client/assets/{ResearchView-CeP1rljk.js → ResearchView-BInIb1tK.js} +1 -1
  24. package/dist/client/assets/{SecretsView-Dv3_J_81.js → SecretsView-Db2mKOcp.js} +1 -1
  25. package/dist/client/assets/SettingsModal-BEULP2a7.css +1 -0
  26. package/dist/client/assets/SettingsModal-Dn9vcqW7.js +21 -0
  27. package/dist/client/assets/{SettingsModal-DMjYH6JA.js → SettingsModal-tnr4Y2cG.js} +1 -1
  28. package/dist/client/assets/{SettingsTextareaRow-UZ0YryUW.js → SettingsTextareaRow-DDIEo7kX.js} +1 -1
  29. package/dist/client/assets/{SetupWizardModal-GSMFrNw2.js → SetupWizardModal-BgpCpOJi.js} +2 -2
  30. package/dist/client/assets/{SkillsView-gCNtWZf_.js → SkillsView-C4_dPxaH.js} +1 -1
  31. package/dist/client/assets/{WorkflowNodeEditor-DWu3E6Jg.js → WorkflowNodeEditor-BRIoMtdz.js} +1 -1
  32. package/dist/client/assets/{agent-import-generation-B1vyAdo0.js → agent-import-generation-DZjrAuLD.js} +1 -1
  33. package/dist/client/assets/{agentsOrgChartLayout-70TuKPlY.js → agentsOrgChartLayout-T3vfKGm-.js} +1 -1
  34. package/dist/client/assets/{app-CVozLPHX.js → app-BUPxz3_I.js} +1 -1
  35. package/dist/client/assets/{app-y8x9KYqa.js → app-Bsb-vSJ2.js} +3 -3
  36. package/dist/client/assets/{app-60jCmuOy.js → app-CDMzhkVk.js} +1 -1
  37. package/dist/client/assets/{app-BtBMuy2Z.js → app-Ca3_7roP.js} +3 -3
  38. package/dist/client/assets/{app-JnrgtY9I.js → app-CaiQxtA9.js} +3 -3
  39. package/dist/client/assets/{app-LrO9EOLE.js → app-D7N3gRgK.js} +3 -3
  40. package/dist/client/assets/{app-Cv-4fcPl.js → app-Du0s0Xs8.js} +1 -1
  41. package/dist/client/assets/{architectureDiagram-3BPJPVTR-s7myd3al.js → architectureDiagram-3BPJPVTR-CG7lqp3T.js} +1 -1
  42. package/dist/client/assets/{blockDiagram-GPEHLZMM-DRHcpa5H.js → blockDiagram-GPEHLZMM-CCQyln9-.js} +1 -1
  43. package/dist/client/assets/{c4Diagram-AAUBKEIU-BFsUy5yO.js → c4Diagram-AAUBKEIU-DgTWfMuv.js} +1 -1
  44. package/dist/client/assets/channel-DQn8tAbt.js +1 -0
  45. package/dist/client/assets/{chunk-2J33WTMH-BP1RbVtu.js → chunk-2J33WTMH-DbvgPKWu.js} +1 -1
  46. package/dist/client/assets/{chunk-4BX2VUAB-CPRpQLCP.js → chunk-4BX2VUAB-Jeug78io.js} +1 -1
  47. package/dist/client/assets/{chunk-55IACEB6-r6YyDKyy.js → chunk-55IACEB6-wSkfWEqo.js} +1 -1
  48. package/dist/client/assets/{chunk-727SXJPM-0xpHKXZs.js → chunk-727SXJPM-o-cSBR4a.js} +1 -1
  49. package/dist/client/assets/{chunk-AQP2D5EJ-C6JMfScy.js → chunk-AQP2D5EJ-9iL_Co48.js} +1 -1
  50. package/dist/client/assets/{chunk-FMBD7UC4-DxjEMlOu.js → chunk-FMBD7UC4-HKJKjpLt.js} +1 -1
  51. package/dist/client/assets/{chunk-ND2GUHAM-BGUlWNB6.js → chunk-ND2GUHAM-DZUdY7Yv.js} +1 -1
  52. package/dist/client/assets/{chunk-QZHKN3VN-CFRjGMND.js → chunk-QZHKN3VN-AFzlVJep.js} +1 -1
  53. package/dist/client/assets/classDiagram-4FO5ZUOK-BVZs0DmH.js +1 -0
  54. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BVZs0DmH.js +1 -0
  55. package/dist/client/assets/{cose-bilkent-S5V4N54A-DGG2Ux35.js → cose-bilkent-S5V4N54A-vhimfYza.js} +1 -1
  56. package/dist/client/assets/{dagre-BM42HDAG-CTY5i3so.js → dagre-BM42HDAG-wPz2jgXD.js} +1 -1
  57. package/dist/client/assets/{dashboard-view-N-SfZn-J.js → dashboard-view-BJVPfjWI.js} +1 -1
  58. package/dist/client/assets/{dashboard-view-BRjXwd9e.js → dashboard-view-BN6as5aN.js} +1 -1
  59. package/dist/client/assets/{dashboard-view-CDY9wohw.js → dashboard-view-ByLTU9KO.js} +1 -1
  60. package/dist/client/assets/{dashboard-view-Dq76DWwm.js → dashboard-view-HiX6AOAw.js} +1 -1
  61. package/dist/client/assets/{diagram-2AECGRRQ-DJArhGIk.js → diagram-2AECGRRQ-DvPGnzo9.js} +1 -1
  62. package/dist/client/assets/{diagram-5GNKFQAL-B84qgzdt.js → diagram-5GNKFQAL-CUD0xVXq.js} +1 -1
  63. package/dist/client/assets/{diagram-KO2AKTUF-CdNfsKkQ.js → diagram-KO2AKTUF-p88av64o.js} +1 -1
  64. package/dist/client/assets/{diagram-LMA3HP47-BEbs4y1i.js → diagram-LMA3HP47-B2V_VFOf.js} +1 -1
  65. package/dist/client/assets/{diagram-OG6HWLK6-CAtbZh_w.js → diagram-OG6HWLK6-CO02xKJJ.js} +1 -1
  66. package/dist/client/assets/{erDiagram-TEJ5UH35-xwztc3Q7.js → erDiagram-TEJ5UH35-LiIZMOks.js} +1 -1
  67. package/dist/client/assets/{flowDiagram-I6XJVG4X-Br7puzSx.js → flowDiagram-I6XJVG4X-BMgU0xdB.js} +1 -1
  68. package/dist/client/assets/{folder-open-DdKnoktO.js → folder-open-Bfz0pfA0.js} +1 -1
  69. package/dist/client/assets/{ganttDiagram-6RSMTGT7-BSi95Wyd.js → ganttDiagram-6RSMTGT7-C-DNnJ7F.js} +1 -1
  70. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-BBqhe6Fa.js → gitGraphDiagram-PVQCEYII-BKnH_s4c.js} +1 -1
  71. package/dist/client/assets/index-D6zw4rNc.js +2937 -0
  72. package/dist/client/assets/index-lxhrCjd_.css +1 -0
  73. package/dist/client/assets/{infoDiagram-5YYISTIA-CLDl9nTe.js → infoDiagram-5YYISTIA-DrFgtiS_.js} +1 -1
  74. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-CbAV7HqZ.js → ishikawaDiagram-YF4QCWOH-cXcVkWVR.js} +1 -1
  75. package/dist/client/assets/{journeyDiagram-JHISSGLW-qU403OEV.js → journeyDiagram-JHISSGLW-2rAR6JrI.js} +1 -1
  76. package/dist/client/assets/{kanban-definition-UN3LZRKU-Cm7X52UA.js → kanban-definition-UN3LZRKU-uaIVKg6k.js} +1 -1
  77. package/dist/client/assets/{mermaid.core-CRm31xPI.js → mermaid.core-Bl1eKb-3.js} +4 -4
  78. package/dist/client/assets/{mindmap-definition-RKZ34NQL-xK11OOHv.js → mindmap-definition-RKZ34NQL-C_ZfL855.js} +1 -1
  79. package/dist/client/assets/{pieDiagram-4H26LBE5-KeD-Qpaa.js → pieDiagram-4H26LBE5-B-GWMxe6.js} +1 -1
  80. package/dist/client/assets/{puzzle-DEZH73Mz.js → puzzle--EYtEUHj.js} +1 -1
  81. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-CxdT8X-P.js → quadrantDiagram-W4KKPZXB-C4yu-vxx.js} +1 -1
  82. package/dist/client/assets/{requirementDiagram-4Y6WPE33-DEURCYJL.js → requirementDiagram-4Y6WPE33-CmsMO-mZ.js} +1 -1
  83. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-C5VDamq0.js → sankeyDiagram-5OEKKPKP-DKXXMJDr.js} +1 -1
  84. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-BuW7sjzh.js → sequenceDiagram-3UESZ5HK-DbpptsX5.js} +1 -1
  85. package/dist/client/assets/{standing-instructions-template-D_2X2t4q.js → standing-instructions-template-bCcrFYtU.js} +1 -1
  86. package/dist/client/assets/{stateDiagram-AJRCARHV-Cyo0XRvV.js → stateDiagram-AJRCARHV-DDwdEj_k.js} +1 -1
  87. package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-DuPs9FQx.js → stateDiagram-v2-BHNVJYJU-CjOnclTc.js} +1 -1
  88. package/dist/client/assets/{timeline-definition-PNZ67QCA-DiUEvc6L.js → timeline-definition-PNZ67QCA-Q8Appf3Z.js} +1 -1
  89. package/dist/client/assets/{upload-DWeBKn62.js → upload-Ka3GrAEL.js} +1 -1
  90. package/dist/client/assets/{users-CmWW59nZ.js → users-B7a_oi7v.js} +1 -1
  91. package/dist/client/assets/{vennDiagram-CIIHVFJN-DKC77z8l.js → vennDiagram-CIIHVFJN-ZsuVN3Hk.js} +1 -1
  92. package/dist/client/assets/{wardley-L42UT6IY-Bu26Q283.js → wardley-L42UT6IY-Eh9WyxS2.js} +1 -1
  93. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-BJSAoAKw.js → wardleyDiagram-YWT4CUSO-CG1fl8Sj.js} +1 -1
  94. package/dist/client/assets/{xychartDiagram-2RQKCTM6-DmqYngZ7.js → xychartDiagram-2RQKCTM6-BnZAlrGh.js} +1 -1
  95. package/dist/client/index.html +2 -2
  96. package/dist/client/version.json +1 -1
  97. package/dist/droid-cli/package.json +1 -1
  98. package/dist/extension.js +4058 -2058
  99. package/dist/pi-claude-cli/package.json +1 -1
  100. package/dist/plugin-sdk/index.d.ts +9 -1
  101. package/dist/plugin-sdk/index.js +27 -14
  102. package/dist/plugins/fusion-plugin-acp-runtime/bundled.js +40 -19
  103. package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
  104. package/dist/plugins/fusion-plugin-claude-runtime/bundled.js +27 -14
  105. package/dist/plugins/fusion-plugin-claude-runtime/package.json +1 -1
  106. package/dist/plugins/fusion-plugin-cli-printing-press/bundled.js +27 -14
  107. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  108. package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +27 -14
  109. package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
  110. package/dist/plugins/fusion-plugin-cursor-runtime/bundled.js +27 -14
  111. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  112. package/dist/plugins/fusion-plugin-dependency-graph/bundled.js +27 -14
  113. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  114. package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +27 -14
  115. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  116. package/dist/plugins/fusion-plugin-grok-runtime/bundled.js +27 -14
  117. package/dist/plugins/fusion-plugin-grok-runtime/package.json +1 -1
  118. package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +27 -14
  119. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  120. package/dist/plugins/fusion-plugin-linear-import/bundled.js +27 -14
  121. package/dist/plugins/fusion-plugin-linear-import/package.json +1 -1
  122. package/dist/plugins/fusion-plugin-omp-runtime/bundled.js +27 -14
  123. package/dist/plugins/fusion-plugin-omp-runtime/package.json +1 -1
  124. package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +27 -14
  125. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  126. package/dist/plugins/fusion-plugin-paperclip-runtime/bundled.js +27 -14
  127. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  128. package/dist/plugins/fusion-plugin-quality/bundled.js +27 -14
  129. package/dist/plugins/fusion-plugin-quality/package.json +1 -1
  130. package/dist/plugins/fusion-plugin-reports/bundled.js +27 -14
  131. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  132. package/dist/plugins/fusion-plugin-roadmap/bundled.js +27 -14
  133. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  134. package/dist/plugins/fusion-plugin-todos/bundled.js +27 -14
  135. package/dist/plugins/fusion-plugin-todos/package.json +1 -1
  136. package/dist/plugins/fusion-plugin-whatsapp-chat/bundled.js +27 -14
  137. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  138. package/package.json +1 -1
  139. package/dist/client/assets/AgentDetailView-jzgy1BAS.css +0 -1
  140. package/dist/client/assets/CommandCenter-Djf24bRQ.js +0 -102
  141. package/dist/client/assets/CommandCenter-ilm-DbtI.css +0 -1
  142. package/dist/client/assets/SettingsModal-C5ic1ls7.css +0 -1
  143. package/dist/client/assets/SettingsModal-DHLK98c1.js +0 -21
  144. package/dist/client/assets/channel-9ayksTsZ.js +0 -1
  145. package/dist/client/assets/classDiagram-4FO5ZUOK-6A8Tw1Fx.js +0 -1
  146. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-6A8Tw1Fx.js +0 -1
  147. package/dist/client/assets/index-CSZd8sbH.js +0 -2936
  148. package/dist/client/assets/index-DQBk-yr8.css +0 -1
@@ -9026,8 +9026,23 @@ function planReviewOptionalGroupNode(column, options = {}) {
9026
9026
  };
9027
9027
  }
9028
9028
 
9029
+ // ../core/src/workflows/workflow-merge-region.ts
9030
+ var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
9031
+ "merge-gate",
9032
+ "merge-attempt",
9033
+ "manual-merge-hold",
9034
+ "retry-backoff",
9035
+ "recovery-router",
9036
+ "branch-group-member-integration",
9037
+ "branch-group-promotion",
9038
+ "pr-create",
9039
+ "pr-respond",
9040
+ "pr-merge"
9041
+ ]);
9042
+
9029
9043
  // ../core/src/workflows/workflow-step-results.ts
9030
9044
  var PLAN_REVIEW_LEASE_STALENESS_MS = 15 * 60 * 1e3;
9045
+ var REMEDIATION_ATTEMPT_CLAIM_STALENESS_MS = 15 * 60 * 1e3;
9031
9046
 
9032
9047
  // ../core/src/merge/task-merge.ts
9033
9048
  var HARD_BLOCKING_TASK_STATUSES = /* @__PURE__ */ new Set([
@@ -10574,20 +10589,6 @@ function classifyWorkflowAgentNode(node) {
10574
10589
  }
10575
10590
  }
10576
10591
 
10577
- // ../core/src/workflows/workflow-merge-region.ts
10578
- var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
10579
- "merge-gate",
10580
- "merge-attempt",
10581
- "manual-merge-hold",
10582
- "retry-backoff",
10583
- "recovery-router",
10584
- "branch-group-member-integration",
10585
- "branch-group-promotion",
10586
- "pr-create",
10587
- "pr-respond",
10588
- "pr-merge"
10589
- ]);
10590
-
10591
10592
  // ../core/src/workflows/workflow-extension-types.ts
10592
10593
  function workflowExtensionRegistryId(pluginId, extensionId) {
10593
10594
  return `plugin:${pluginId}:${extensionId}`;
@@ -11579,6 +11580,16 @@ function validateReviewerAgentOverrides(nodes2) {
11579
11580
  if (Array.isArray(templateNodes)) validateReviewerAgentOverrides(templateNodes);
11580
11581
  }
11581
11582
  }
11583
+ function validateReadonlyMcpServersConfig(nodes2) {
11584
+ for (const node of nodes2) {
11585
+ const value = node.config?.readonlyMcpServers;
11586
+ if (value !== void 0 && (!Array.isArray(value) || value.some((name) => typeof name !== "string" || !name.trim()))) {
11587
+ throw new WorkflowIrError(`Workflow node '${node.id}' readonlyMcpServers must be an array of non-empty strings when present`);
11588
+ }
11589
+ const templateNodes = node.config?.template?.nodes;
11590
+ if (Array.isArray(templateNodes)) validateReadonlyMcpServersConfig(templateNodes);
11591
+ }
11592
+ }
11582
11593
  function validateThinkingLevelConfig(nodes2) {
11583
11594
  for (const node of nodes2) {
11584
11595
  const value = node.config?.thinkingLevel;
@@ -12193,6 +12204,7 @@ function validateV2(ir) {
12193
12204
  const topLevelIds = new Set(ir.nodes.map((n) => n.id));
12194
12205
  validateStepExecutePlacement(ir.nodes);
12195
12206
  validateThinkingLevelConfig(ir.nodes);
12207
+ validateReadonlyMcpServersConfig(ir.nodes);
12196
12208
  validateCredentialInstanceIdConfig(ir.nodes);
12197
12209
  validateReviewerAgentOverrides(ir.nodes);
12198
12210
  for (const node of ir.nodes) {
@@ -14392,6 +14404,7 @@ Be specific: cite \`file:line\` for every finding and explain the concrete failu
14392
14404
  - APPROVE_WITH_NOTES: shippable. Use this when your findings are all P1/P2 \u2014 they are recorded and handed to the implementer without another remediation round.
14393
14405
  - REVISE: a correctness bug, regression, or contract break requires changes before merge. Requires at least one \`critical\` finding in \`findings\`; a REVISE without one will be treated as APPROVE_WITH_NOTES.
14394
14406
  - Every blocking issue MUST appear as an entry in \`findings\` with its severity and \`filePath\`/\`line\`. Prose in \`notes\` alone does not block.
14407
+ - Every REVISE finding is a required Fix-step record. Its \`id\`, \`title\`, \`body\`, \`filePath\`, \`line\`, and \`severity\` must be concrete enough for an executor to implement without asking what to fix. If you cannot name an affected file and correction, do not return REVISE: investigate until you can, or return the appropriate non-blocking verdict.
14395
14408
  - \`notes\` MUST contain one to three sentences naming what was checked and why the verdict was reached. An empty \`notes\` string is a protocol violation.
14396
14409
  - Final output: output exactly one trailing JSON object on the final line (no markdown fences, no surrounding prose):
14397
14410
  {"verdict":"APPROVE|APPROVE_WITH_NOTES|REVISE","notes":"...","findings":[{"id":"stable-id","title":"concise issue","body":"concrete failure and remediation","filePath":"path/to/file.ts","line":1,"severity":"critical|high|medium|low","resolution":"open|resolved-in-review|superseded"}]}`;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/dependency-graph",
3
- "version": "0.1.67-beta.11",
3
+ "version": "0.1.67-beta.13",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -9026,8 +9026,23 @@ function planReviewOptionalGroupNode(column, options = {}) {
9026
9026
  };
9027
9027
  }
9028
9028
 
9029
+ // ../core/src/workflows/workflow-merge-region.ts
9030
+ var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
9031
+ "merge-gate",
9032
+ "merge-attempt",
9033
+ "manual-merge-hold",
9034
+ "retry-backoff",
9035
+ "recovery-router",
9036
+ "branch-group-member-integration",
9037
+ "branch-group-promotion",
9038
+ "pr-create",
9039
+ "pr-respond",
9040
+ "pr-merge"
9041
+ ]);
9042
+
9029
9043
  // ../core/src/workflows/workflow-step-results.ts
9030
9044
  var PLAN_REVIEW_LEASE_STALENESS_MS = 15 * 60 * 1e3;
9045
+ var REMEDIATION_ATTEMPT_CLAIM_STALENESS_MS = 15 * 60 * 1e3;
9031
9046
 
9032
9047
  // ../core/src/merge/task-merge.ts
9033
9048
  var HARD_BLOCKING_TASK_STATUSES = /* @__PURE__ */ new Set([
@@ -10574,20 +10589,6 @@ function classifyWorkflowAgentNode(node) {
10574
10589
  }
10575
10590
  }
10576
10591
 
10577
- // ../core/src/workflows/workflow-merge-region.ts
10578
- var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
10579
- "merge-gate",
10580
- "merge-attempt",
10581
- "manual-merge-hold",
10582
- "retry-backoff",
10583
- "recovery-router",
10584
- "branch-group-member-integration",
10585
- "branch-group-promotion",
10586
- "pr-create",
10587
- "pr-respond",
10588
- "pr-merge"
10589
- ]);
10590
-
10591
10592
  // ../core/src/workflows/workflow-extension-types.ts
10592
10593
  function workflowExtensionRegistryId(pluginId, extensionId) {
10593
10594
  return `plugin:${pluginId}:${extensionId}`;
@@ -11579,6 +11580,16 @@ function validateReviewerAgentOverrides(nodes2) {
11579
11580
  if (Array.isArray(templateNodes)) validateReviewerAgentOverrides(templateNodes);
11580
11581
  }
11581
11582
  }
11583
+ function validateReadonlyMcpServersConfig(nodes2) {
11584
+ for (const node of nodes2) {
11585
+ const value = node.config?.readonlyMcpServers;
11586
+ if (value !== void 0 && (!Array.isArray(value) || value.some((name) => typeof name !== "string" || !name.trim()))) {
11587
+ throw new WorkflowIrError(`Workflow node '${node.id}' readonlyMcpServers must be an array of non-empty strings when present`);
11588
+ }
11589
+ const templateNodes = node.config?.template?.nodes;
11590
+ if (Array.isArray(templateNodes)) validateReadonlyMcpServersConfig(templateNodes);
11591
+ }
11592
+ }
11582
11593
  function validateThinkingLevelConfig(nodes2) {
11583
11594
  for (const node of nodes2) {
11584
11595
  const value = node.config?.thinkingLevel;
@@ -12193,6 +12204,7 @@ function validateV2(ir) {
12193
12204
  const topLevelIds = new Set(ir.nodes.map((n) => n.id));
12194
12205
  validateStepExecutePlacement(ir.nodes);
12195
12206
  validateThinkingLevelConfig(ir.nodes);
12207
+ validateReadonlyMcpServersConfig(ir.nodes);
12196
12208
  validateCredentialInstanceIdConfig(ir.nodes);
12197
12209
  validateReviewerAgentOverrides(ir.nodes);
12198
12210
  for (const node of ir.nodes) {
@@ -14392,6 +14404,7 @@ Be specific: cite \`file:line\` for every finding and explain the concrete failu
14392
14404
  - APPROVE_WITH_NOTES: shippable. Use this when your findings are all P1/P2 \u2014 they are recorded and handed to the implementer without another remediation round.
14393
14405
  - REVISE: a correctness bug, regression, or contract break requires changes before merge. Requires at least one \`critical\` finding in \`findings\`; a REVISE without one will be treated as APPROVE_WITH_NOTES.
14394
14406
  - Every blocking issue MUST appear as an entry in \`findings\` with its severity and \`filePath\`/\`line\`. Prose in \`notes\` alone does not block.
14407
+ - Every REVISE finding is a required Fix-step record. Its \`id\`, \`title\`, \`body\`, \`filePath\`, \`line\`, and \`severity\` must be concrete enough for an executor to implement without asking what to fix. If you cannot name an affected file and correction, do not return REVISE: investigate until you can, or return the appropriate non-blocking verdict.
14395
14408
  - \`notes\` MUST contain one to three sentences naming what was checked and why the verdict was reached. An empty \`notes\` string is a protocol violation.
14396
14409
  - Final output: output exactly one trailing JSON object on the final line (no markdown fences, no surrounding prose):
14397
14410
  {"verdict":"APPROVE|APPROVE_WITH_NOTES|REVISE","notes":"...","findings":[{"id":"stable-id","title":"concise issue","body":"concrete failure and remediation","filePath":"path/to/file.ts","line":1,"severity":"critical|high|medium|low","resolution":"open|resolved-in-review|superseded"}]}`;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/droid-runtime",
3
- "version": "0.1.62-beta.11",
3
+ "version": "0.1.62-beta.13",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -9026,8 +9026,23 @@ function planReviewOptionalGroupNode(column, options = {}) {
9026
9026
  };
9027
9027
  }
9028
9028
 
9029
+ // ../core/src/workflows/workflow-merge-region.ts
9030
+ var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
9031
+ "merge-gate",
9032
+ "merge-attempt",
9033
+ "manual-merge-hold",
9034
+ "retry-backoff",
9035
+ "recovery-router",
9036
+ "branch-group-member-integration",
9037
+ "branch-group-promotion",
9038
+ "pr-create",
9039
+ "pr-respond",
9040
+ "pr-merge"
9041
+ ]);
9042
+
9029
9043
  // ../core/src/workflows/workflow-step-results.ts
9030
9044
  var PLAN_REVIEW_LEASE_STALENESS_MS = 15 * 60 * 1e3;
9045
+ var REMEDIATION_ATTEMPT_CLAIM_STALENESS_MS = 15 * 60 * 1e3;
9031
9046
 
9032
9047
  // ../core/src/merge/task-merge.ts
9033
9048
  var HARD_BLOCKING_TASK_STATUSES = /* @__PURE__ */ new Set([
@@ -10582,20 +10597,6 @@ function classifyWorkflowAgentNode(node) {
10582
10597
  }
10583
10598
  }
10584
10599
 
10585
- // ../core/src/workflows/workflow-merge-region.ts
10586
- var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
10587
- "merge-gate",
10588
- "merge-attempt",
10589
- "manual-merge-hold",
10590
- "retry-backoff",
10591
- "recovery-router",
10592
- "branch-group-member-integration",
10593
- "branch-group-promotion",
10594
- "pr-create",
10595
- "pr-respond",
10596
- "pr-merge"
10597
- ]);
10598
-
10599
10600
  // ../core/src/workflows/workflow-extension-types.ts
10600
10601
  function workflowExtensionRegistryId(pluginId, extensionId) {
10601
10602
  return `plugin:${pluginId}:${extensionId}`;
@@ -11587,6 +11588,16 @@ function validateReviewerAgentOverrides(nodes2) {
11587
11588
  if (Array.isArray(templateNodes)) validateReviewerAgentOverrides(templateNodes);
11588
11589
  }
11589
11590
  }
11591
+ function validateReadonlyMcpServersConfig(nodes2) {
11592
+ for (const node of nodes2) {
11593
+ const value = node.config?.readonlyMcpServers;
11594
+ if (value !== void 0 && (!Array.isArray(value) || value.some((name) => typeof name !== "string" || !name.trim()))) {
11595
+ throw new WorkflowIrError(`Workflow node '${node.id}' readonlyMcpServers must be an array of non-empty strings when present`);
11596
+ }
11597
+ const templateNodes = node.config?.template?.nodes;
11598
+ if (Array.isArray(templateNodes)) validateReadonlyMcpServersConfig(templateNodes);
11599
+ }
11600
+ }
11590
11601
  function validateThinkingLevelConfig(nodes2) {
11591
11602
  for (const node of nodes2) {
11592
11603
  const value = node.config?.thinkingLevel;
@@ -12201,6 +12212,7 @@ function validateV2(ir) {
12201
12212
  const topLevelIds = new Set(ir.nodes.map((n) => n.id));
12202
12213
  validateStepExecutePlacement(ir.nodes);
12203
12214
  validateThinkingLevelConfig(ir.nodes);
12215
+ validateReadonlyMcpServersConfig(ir.nodes);
12204
12216
  validateCredentialInstanceIdConfig(ir.nodes);
12205
12217
  validateReviewerAgentOverrides(ir.nodes);
12206
12218
  for (const node of ir.nodes) {
@@ -14400,6 +14412,7 @@ Be specific: cite \`file:line\` for every finding and explain the concrete failu
14400
14412
  - APPROVE_WITH_NOTES: shippable. Use this when your findings are all P1/P2 \u2014 they are recorded and handed to the implementer without another remediation round.
14401
14413
  - REVISE: a correctness bug, regression, or contract break requires changes before merge. Requires at least one \`critical\` finding in \`findings\`; a REVISE without one will be treated as APPROVE_WITH_NOTES.
14402
14414
  - Every blocking issue MUST appear as an entry in \`findings\` with its severity and \`filePath\`/\`line\`. Prose in \`notes\` alone does not block.
14415
+ - Every REVISE finding is a required Fix-step record. Its \`id\`, \`title\`, \`body\`, \`filePath\`, \`line\`, and \`severity\` must be concrete enough for an executor to implement without asking what to fix. If you cannot name an affected file and correction, do not return REVISE: investigate until you can, or return the appropriate non-blocking verdict.
14403
14416
  - \`notes\` MUST contain one to three sentences naming what was checked and why the verdict was reached. An empty \`notes\` string is a protocol violation.
14404
14417
  - Final output: output exactly one trailing JSON object on the final line (no markdown fences, no surrounding prose):
14405
14418
  {"verdict":"APPROVE|APPROVE_WITH_NOTES|REVISE","notes":"...","findings":[{"id":"stable-id","title":"concise issue","body":"concrete failure and remediation","filePath":"path/to/file.ts","line":1,"severity":"critical|high|medium|low","resolution":"open|resolved-in-review|superseded"}]}`;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/grok-runtime",
3
- "version": "0.2.14-beta.11",
3
+ "version": "0.2.14-beta.13",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -9029,8 +9029,23 @@ function planReviewOptionalGroupNode(column, options = {}) {
9029
9029
  };
9030
9030
  }
9031
9031
 
9032
+ // ../core/src/workflows/workflow-merge-region.ts
9033
+ var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
9034
+ "merge-gate",
9035
+ "merge-attempt",
9036
+ "manual-merge-hold",
9037
+ "retry-backoff",
9038
+ "recovery-router",
9039
+ "branch-group-member-integration",
9040
+ "branch-group-promotion",
9041
+ "pr-create",
9042
+ "pr-respond",
9043
+ "pr-merge"
9044
+ ]);
9045
+
9032
9046
  // ../core/src/workflows/workflow-step-results.ts
9033
9047
  var PLAN_REVIEW_LEASE_STALENESS_MS = 15 * 60 * 1e3;
9048
+ var REMEDIATION_ATTEMPT_CLAIM_STALENESS_MS = 15 * 60 * 1e3;
9034
9049
 
9035
9050
  // ../core/src/merge/task-merge.ts
9036
9051
  var HARD_BLOCKING_TASK_STATUSES = /* @__PURE__ */ new Set([
@@ -10577,20 +10592,6 @@ function classifyWorkflowAgentNode(node) {
10577
10592
  }
10578
10593
  }
10579
10594
 
10580
- // ../core/src/workflows/workflow-merge-region.ts
10581
- var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
10582
- "merge-gate",
10583
- "merge-attempt",
10584
- "manual-merge-hold",
10585
- "retry-backoff",
10586
- "recovery-router",
10587
- "branch-group-member-integration",
10588
- "branch-group-promotion",
10589
- "pr-create",
10590
- "pr-respond",
10591
- "pr-merge"
10592
- ]);
10593
-
10594
10595
  // ../core/src/workflows/workflow-extension-types.ts
10595
10596
  function workflowExtensionRegistryId(pluginId, extensionId) {
10596
10597
  return `plugin:${pluginId}:${extensionId}`;
@@ -11582,6 +11583,16 @@ function validateReviewerAgentOverrides(nodes2) {
11582
11583
  if (Array.isArray(templateNodes)) validateReviewerAgentOverrides(templateNodes);
11583
11584
  }
11584
11585
  }
11586
+ function validateReadonlyMcpServersConfig(nodes2) {
11587
+ for (const node of nodes2) {
11588
+ const value = node.config?.readonlyMcpServers;
11589
+ if (value !== void 0 && (!Array.isArray(value) || value.some((name) => typeof name !== "string" || !name.trim()))) {
11590
+ throw new WorkflowIrError(`Workflow node '${node.id}' readonlyMcpServers must be an array of non-empty strings when present`);
11591
+ }
11592
+ const templateNodes = node.config?.template?.nodes;
11593
+ if (Array.isArray(templateNodes)) validateReadonlyMcpServersConfig(templateNodes);
11594
+ }
11595
+ }
11585
11596
  function validateThinkingLevelConfig(nodes2) {
11586
11597
  for (const node of nodes2) {
11587
11598
  const value = node.config?.thinkingLevel;
@@ -12196,6 +12207,7 @@ function validateV2(ir) {
12196
12207
  const topLevelIds = new Set(ir.nodes.map((n) => n.id));
12197
12208
  validateStepExecutePlacement(ir.nodes);
12198
12209
  validateThinkingLevelConfig(ir.nodes);
12210
+ validateReadonlyMcpServersConfig(ir.nodes);
12199
12211
  validateCredentialInstanceIdConfig(ir.nodes);
12200
12212
  validateReviewerAgentOverrides(ir.nodes);
12201
12213
  for (const node of ir.nodes) {
@@ -14395,6 +14407,7 @@ Be specific: cite \`file:line\` for every finding and explain the concrete failu
14395
14407
  - APPROVE_WITH_NOTES: shippable. Use this when your findings are all P1/P2 \u2014 they are recorded and handed to the implementer without another remediation round.
14396
14408
  - REVISE: a correctness bug, regression, or contract break requires changes before merge. Requires at least one \`critical\` finding in \`findings\`; a REVISE without one will be treated as APPROVE_WITH_NOTES.
14397
14409
  - Every blocking issue MUST appear as an entry in \`findings\` with its severity and \`filePath\`/\`line\`. Prose in \`notes\` alone does not block.
14410
+ - Every REVISE finding is a required Fix-step record. Its \`id\`, \`title\`, \`body\`, \`filePath\`, \`line\`, and \`severity\` must be concrete enough for an executor to implement without asking what to fix. If you cannot name an affected file and correction, do not return REVISE: investigate until you can, or return the appropriate non-blocking verdict.
14398
14411
  - \`notes\` MUST contain one to three sentences naming what was checked and why the verdict was reached. An empty \`notes\` string is a protocol violation.
14399
14412
  - Final output: output exactly one trailing JSON object on the final line (no markdown fences, no surrounding prose):
14400
14413
  {"verdict":"APPROVE|APPROVE_WITH_NOTES|REVISE","notes":"...","findings":[{"id":"stable-id","title":"concise issue","body":"concrete failure and remediation","filePath":"path/to/file.ts","line":1,"severity":"critical|high|medium|low","resolution":"open|resolved-in-review|superseded"}]}`;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/hermes-runtime",
3
- "version": "0.2.86-beta.11",
3
+ "version": "0.2.86-beta.13",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -9026,8 +9026,23 @@ function planReviewOptionalGroupNode(column, options = {}) {
9026
9026
  };
9027
9027
  }
9028
9028
 
9029
+ // ../core/src/workflows/workflow-merge-region.ts
9030
+ var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
9031
+ "merge-gate",
9032
+ "merge-attempt",
9033
+ "manual-merge-hold",
9034
+ "retry-backoff",
9035
+ "recovery-router",
9036
+ "branch-group-member-integration",
9037
+ "branch-group-promotion",
9038
+ "pr-create",
9039
+ "pr-respond",
9040
+ "pr-merge"
9041
+ ]);
9042
+
9029
9043
  // ../core/src/workflows/workflow-step-results.ts
9030
9044
  var PLAN_REVIEW_LEASE_STALENESS_MS = 15 * 60 * 1e3;
9045
+ var REMEDIATION_ATTEMPT_CLAIM_STALENESS_MS = 15 * 60 * 1e3;
9031
9046
 
9032
9047
  // ../core/src/merge/task-merge.ts
9033
9048
  var HARD_BLOCKING_TASK_STATUSES = /* @__PURE__ */ new Set([
@@ -10574,20 +10589,6 @@ function classifyWorkflowAgentNode(node) {
10574
10589
  }
10575
10590
  }
10576
10591
 
10577
- // ../core/src/workflows/workflow-merge-region.ts
10578
- var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
10579
- "merge-gate",
10580
- "merge-attempt",
10581
- "manual-merge-hold",
10582
- "retry-backoff",
10583
- "recovery-router",
10584
- "branch-group-member-integration",
10585
- "branch-group-promotion",
10586
- "pr-create",
10587
- "pr-respond",
10588
- "pr-merge"
10589
- ]);
10590
-
10591
10592
  // ../core/src/workflows/workflow-extension-types.ts
10592
10593
  function workflowExtensionRegistryId(pluginId, extensionId) {
10593
10594
  return `plugin:${pluginId}:${extensionId}`;
@@ -11579,6 +11580,16 @@ function validateReviewerAgentOverrides(nodes2) {
11579
11580
  if (Array.isArray(templateNodes)) validateReviewerAgentOverrides(templateNodes);
11580
11581
  }
11581
11582
  }
11583
+ function validateReadonlyMcpServersConfig(nodes2) {
11584
+ for (const node of nodes2) {
11585
+ const value = node.config?.readonlyMcpServers;
11586
+ if (value !== void 0 && (!Array.isArray(value) || value.some((name) => typeof name !== "string" || !name.trim()))) {
11587
+ throw new WorkflowIrError(`Workflow node '${node.id}' readonlyMcpServers must be an array of non-empty strings when present`);
11588
+ }
11589
+ const templateNodes = node.config?.template?.nodes;
11590
+ if (Array.isArray(templateNodes)) validateReadonlyMcpServersConfig(templateNodes);
11591
+ }
11592
+ }
11582
11593
  function validateThinkingLevelConfig(nodes2) {
11583
11594
  for (const node of nodes2) {
11584
11595
  const value = node.config?.thinkingLevel;
@@ -12193,6 +12204,7 @@ function validateV2(ir) {
12193
12204
  const topLevelIds = new Set(ir.nodes.map((n) => n.id));
12194
12205
  validateStepExecutePlacement(ir.nodes);
12195
12206
  validateThinkingLevelConfig(ir.nodes);
12207
+ validateReadonlyMcpServersConfig(ir.nodes);
12196
12208
  validateCredentialInstanceIdConfig(ir.nodes);
12197
12209
  validateReviewerAgentOverrides(ir.nodes);
12198
12210
  for (const node of ir.nodes) {
@@ -14392,6 +14404,7 @@ Be specific: cite \`file:line\` for every finding and explain the concrete failu
14392
14404
  - APPROVE_WITH_NOTES: shippable. Use this when your findings are all P1/P2 \u2014 they are recorded and handed to the implementer without another remediation round.
14393
14405
  - REVISE: a correctness bug, regression, or contract break requires changes before merge. Requires at least one \`critical\` finding in \`findings\`; a REVISE without one will be treated as APPROVE_WITH_NOTES.
14394
14406
  - Every blocking issue MUST appear as an entry in \`findings\` with its severity and \`filePath\`/\`line\`. Prose in \`notes\` alone does not block.
14407
+ - Every REVISE finding is a required Fix-step record. Its \`id\`, \`title\`, \`body\`, \`filePath\`, \`line\`, and \`severity\` must be concrete enough for an executor to implement without asking what to fix. If you cannot name an affected file and correction, do not return REVISE: investigate until you can, or return the appropriate non-blocking verdict.
14395
14408
  - \`notes\` MUST contain one to three sentences naming what was checked and why the verdict was reached. An empty \`notes\` string is a protocol violation.
14396
14409
  - Final output: output exactly one trailing JSON object on the final line (no markdown fences, no surrounding prose):
14397
14410
  {"verdict":"APPROVE|APPROVE_WITH_NOTES|REVISE","notes":"...","findings":[{"id":"stable-id","title":"concise issue","body":"concrete failure and remediation","filePath":"path/to/file.ts","line":1,"severity":"critical|high|medium|low","resolution":"open|resolved-in-review|superseded"}]}`;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/linear-import",
3
- "version": "0.1.18-beta.11",
3
+ "version": "0.1.18-beta.13",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -9026,8 +9026,23 @@ function planReviewOptionalGroupNode(column, options = {}) {
9026
9026
  };
9027
9027
  }
9028
9028
 
9029
+ // ../core/src/workflows/workflow-merge-region.ts
9030
+ var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
9031
+ "merge-gate",
9032
+ "merge-attempt",
9033
+ "manual-merge-hold",
9034
+ "retry-backoff",
9035
+ "recovery-router",
9036
+ "branch-group-member-integration",
9037
+ "branch-group-promotion",
9038
+ "pr-create",
9039
+ "pr-respond",
9040
+ "pr-merge"
9041
+ ]);
9042
+
9029
9043
  // ../core/src/workflows/workflow-step-results.ts
9030
9044
  var PLAN_REVIEW_LEASE_STALENESS_MS = 15 * 60 * 1e3;
9045
+ var REMEDIATION_ATTEMPT_CLAIM_STALENESS_MS = 15 * 60 * 1e3;
9031
9046
 
9032
9047
  // ../core/src/merge/task-merge.ts
9033
9048
  var HARD_BLOCKING_TASK_STATUSES = /* @__PURE__ */ new Set([
@@ -10582,20 +10597,6 @@ function classifyWorkflowAgentNode(node) {
10582
10597
  }
10583
10598
  }
10584
10599
 
10585
- // ../core/src/workflows/workflow-merge-region.ts
10586
- var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
10587
- "merge-gate",
10588
- "merge-attempt",
10589
- "manual-merge-hold",
10590
- "retry-backoff",
10591
- "recovery-router",
10592
- "branch-group-member-integration",
10593
- "branch-group-promotion",
10594
- "pr-create",
10595
- "pr-respond",
10596
- "pr-merge"
10597
- ]);
10598
-
10599
10600
  // ../core/src/workflows/workflow-extension-types.ts
10600
10601
  function workflowExtensionRegistryId(pluginId, extensionId) {
10601
10602
  return `plugin:${pluginId}:${extensionId}`;
@@ -11587,6 +11588,16 @@ function validateReviewerAgentOverrides(nodes2) {
11587
11588
  if (Array.isArray(templateNodes)) validateReviewerAgentOverrides(templateNodes);
11588
11589
  }
11589
11590
  }
11591
+ function validateReadonlyMcpServersConfig(nodes2) {
11592
+ for (const node of nodes2) {
11593
+ const value = node.config?.readonlyMcpServers;
11594
+ if (value !== void 0 && (!Array.isArray(value) || value.some((name) => typeof name !== "string" || !name.trim()))) {
11595
+ throw new WorkflowIrError(`Workflow node '${node.id}' readonlyMcpServers must be an array of non-empty strings when present`);
11596
+ }
11597
+ const templateNodes = node.config?.template?.nodes;
11598
+ if (Array.isArray(templateNodes)) validateReadonlyMcpServersConfig(templateNodes);
11599
+ }
11600
+ }
11590
11601
  function validateThinkingLevelConfig(nodes2) {
11591
11602
  for (const node of nodes2) {
11592
11603
  const value = node.config?.thinkingLevel;
@@ -12201,6 +12212,7 @@ function validateV2(ir) {
12201
12212
  const topLevelIds = new Set(ir.nodes.map((n) => n.id));
12202
12213
  validateStepExecutePlacement(ir.nodes);
12203
12214
  validateThinkingLevelConfig(ir.nodes);
12215
+ validateReadonlyMcpServersConfig(ir.nodes);
12204
12216
  validateCredentialInstanceIdConfig(ir.nodes);
12205
12217
  validateReviewerAgentOverrides(ir.nodes);
12206
12218
  for (const node of ir.nodes) {
@@ -14400,6 +14412,7 @@ Be specific: cite \`file:line\` for every finding and explain the concrete failu
14400
14412
  - APPROVE_WITH_NOTES: shippable. Use this when your findings are all P1/P2 \u2014 they are recorded and handed to the implementer without another remediation round.
14401
14413
  - REVISE: a correctness bug, regression, or contract break requires changes before merge. Requires at least one \`critical\` finding in \`findings\`; a REVISE without one will be treated as APPROVE_WITH_NOTES.
14402
14414
  - Every blocking issue MUST appear as an entry in \`findings\` with its severity and \`filePath\`/\`line\`. Prose in \`notes\` alone does not block.
14415
+ - Every REVISE finding is a required Fix-step record. Its \`id\`, \`title\`, \`body\`, \`filePath\`, \`line\`, and \`severity\` must be concrete enough for an executor to implement without asking what to fix. If you cannot name an affected file and correction, do not return REVISE: investigate until you can, or return the appropriate non-blocking verdict.
14403
14416
  - \`notes\` MUST contain one to three sentences naming what was checked and why the verdict was reached. An empty \`notes\` string is a protocol violation.
14404
14417
  - Final output: output exactly one trailing JSON object on the final line (no markdown fences, no surrounding prose):
14405
14418
  {"verdict":"APPROVE|APPROVE_WITH_NOTES|REVISE","notes":"...","findings":[{"id":"stable-id","title":"concise issue","body":"concrete failure and remediation","filePath":"path/to/file.ts","line":1,"severity":"critical|high|medium|low","resolution":"open|resolved-in-review|superseded"}]}`;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/omp-runtime",
3
- "version": "0.1.11-beta.11",
3
+ "version": "0.1.11-beta.13",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -9026,8 +9026,23 @@ function planReviewOptionalGroupNode(column, options = {}) {
9026
9026
  };
9027
9027
  }
9028
9028
 
9029
+ // ../core/src/workflows/workflow-merge-region.ts
9030
+ var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
9031
+ "merge-gate",
9032
+ "merge-attempt",
9033
+ "manual-merge-hold",
9034
+ "retry-backoff",
9035
+ "recovery-router",
9036
+ "branch-group-member-integration",
9037
+ "branch-group-promotion",
9038
+ "pr-create",
9039
+ "pr-respond",
9040
+ "pr-merge"
9041
+ ]);
9042
+
9029
9043
  // ../core/src/workflows/workflow-step-results.ts
9030
9044
  var PLAN_REVIEW_LEASE_STALENESS_MS = 15 * 60 * 1e3;
9045
+ var REMEDIATION_ATTEMPT_CLAIM_STALENESS_MS = 15 * 60 * 1e3;
9031
9046
 
9032
9047
  // ../core/src/merge/task-merge.ts
9033
9048
  var HARD_BLOCKING_TASK_STATUSES = /* @__PURE__ */ new Set([
@@ -10574,20 +10589,6 @@ function classifyWorkflowAgentNode(node) {
10574
10589
  }
10575
10590
  }
10576
10591
 
10577
- // ../core/src/workflows/workflow-merge-region.ts
10578
- var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
10579
- "merge-gate",
10580
- "merge-attempt",
10581
- "manual-merge-hold",
10582
- "retry-backoff",
10583
- "recovery-router",
10584
- "branch-group-member-integration",
10585
- "branch-group-promotion",
10586
- "pr-create",
10587
- "pr-respond",
10588
- "pr-merge"
10589
- ]);
10590
-
10591
10592
  // ../core/src/workflows/workflow-extension-types.ts
10592
10593
  function workflowExtensionRegistryId(pluginId, extensionId) {
10593
10594
  return `plugin:${pluginId}:${extensionId}`;
@@ -11579,6 +11580,16 @@ function validateReviewerAgentOverrides(nodes2) {
11579
11580
  if (Array.isArray(templateNodes)) validateReviewerAgentOverrides(templateNodes);
11580
11581
  }
11581
11582
  }
11583
+ function validateReadonlyMcpServersConfig(nodes2) {
11584
+ for (const node of nodes2) {
11585
+ const value = node.config?.readonlyMcpServers;
11586
+ if (value !== void 0 && (!Array.isArray(value) || value.some((name) => typeof name !== "string" || !name.trim()))) {
11587
+ throw new WorkflowIrError(`Workflow node '${node.id}' readonlyMcpServers must be an array of non-empty strings when present`);
11588
+ }
11589
+ const templateNodes = node.config?.template?.nodes;
11590
+ if (Array.isArray(templateNodes)) validateReadonlyMcpServersConfig(templateNodes);
11591
+ }
11592
+ }
11582
11593
  function validateThinkingLevelConfig(nodes2) {
11583
11594
  for (const node of nodes2) {
11584
11595
  const value = node.config?.thinkingLevel;
@@ -12193,6 +12204,7 @@ function validateV2(ir) {
12193
12204
  const topLevelIds = new Set(ir.nodes.map((n) => n.id));
12194
12205
  validateStepExecutePlacement(ir.nodes);
12195
12206
  validateThinkingLevelConfig(ir.nodes);
12207
+ validateReadonlyMcpServersConfig(ir.nodes);
12196
12208
  validateCredentialInstanceIdConfig(ir.nodes);
12197
12209
  validateReviewerAgentOverrides(ir.nodes);
12198
12210
  for (const node of ir.nodes) {
@@ -14392,6 +14404,7 @@ Be specific: cite \`file:line\` for every finding and explain the concrete failu
14392
14404
  - APPROVE_WITH_NOTES: shippable. Use this when your findings are all P1/P2 \u2014 they are recorded and handed to the implementer without another remediation round.
14393
14405
  - REVISE: a correctness bug, regression, or contract break requires changes before merge. Requires at least one \`critical\` finding in \`findings\`; a REVISE without one will be treated as APPROVE_WITH_NOTES.
14394
14406
  - Every blocking issue MUST appear as an entry in \`findings\` with its severity and \`filePath\`/\`line\`. Prose in \`notes\` alone does not block.
14407
+ - Every REVISE finding is a required Fix-step record. Its \`id\`, \`title\`, \`body\`, \`filePath\`, \`line\`, and \`severity\` must be concrete enough for an executor to implement without asking what to fix. If you cannot name an affected file and correction, do not return REVISE: investigate until you can, or return the appropriate non-blocking verdict.
14395
14408
  - \`notes\` MUST contain one to three sentences naming what was checked and why the verdict was reached. An empty \`notes\` string is a protocol violation.
14396
14409
  - Final output: output exactly one trailing JSON object on the final line (no markdown fences, no surrounding prose):
14397
14410
  {"verdict":"APPROVE|APPROVE_WITH_NOTES|REVISE","notes":"...","findings":[{"id":"stable-id","title":"concise issue","body":"concrete failure and remediation","filePath":"path/to/file.ts","line":1,"severity":"critical|high|medium|low","resolution":"open|resolved-in-review|superseded"}]}`;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/openclaw-runtime",
3
- "version": "0.2.86-beta.11",
3
+ "version": "0.2.86-beta.13",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {