@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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion/pi-claude-cli",
3
- "version": "0.77.0-beta.11",
3
+ "version": "0.77.0-beta.13",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "main": "index.ts",
@@ -273,6 +273,7 @@ interface WorkflowStep {
273
273
  gateMode: WorkflowStepGateMode;
274
274
  prompt: string;
275
275
  toolMode?: WorkflowStepToolMode;
276
+ readonlyMcpServers?: string[];
276
277
  skillName?: string;
277
278
  requiresBrowser?: boolean;
278
279
  scriptName?: string;
@@ -336,6 +337,10 @@ interface WorkflowStepResult {
336
337
  repositoryScopeRevision?: number;
337
338
  remediationArchivedAt?: string;
338
339
  remediationArchivedFromStatus?: WorkflowStepResult["status"];
340
+ remediationAttemptSignature?: string;
341
+ remediationAttemptOwner?: string;
342
+ remediationAttemptClaimedAt?: string;
343
+ remediationRefusedReason?: "no-actionable-findings" | "upstream-out-of-scope" | "unclassified-gate-no-reopen" | "appender-declined";
339
344
  notRunReason?: WorkflowStepNotRunReason;
340
345
  reviewInputFingerprint?: string;
341
346
  reviewedCommitSha?: string;
@@ -5073,7 +5078,6 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
5073
5078
  taskIdIntegrityReport: TaskIdIntegrityReport;
5074
5079
  lastTaskIdIntegrityLogSignature: string | null;
5075
5080
  workflowStepsCache: WorkflowStep[] | null;
5076
- workflowDefinitionsCache: WorkflowDefinition[] | null;
5077
5081
  _pluginWorkflowStepTemplates: Array<{
5078
5082
  pluginId: string;
5079
5083
  template: WorkflowStepTemplate;
@@ -5823,6 +5827,10 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
5823
5827
  updateTaskAtomic(id: string, updater: (current: Task) => Parameters<TaskStore["updateTask"]>[1] | null | undefined | Promise<Parameters<TaskStore["updateTask"]>[1] | null | undefined>, runContext?: RunMutationContext): Promise<Task>;
5824
5828
  appendRemediationSteps(taskId: string, steps: readonly TaskStep[], options?: AppendRemediationStepsOptions): Promise<AppendRemediationStepsResult>;
5825
5829
  updateWorkflowStepResultsFenced(id: string, compute: WorkflowStepResultsFencedCompute): Promise<WorkflowStepResultsFencedUpdateResult>;
5830
+ updateWorkflowStepResultsWithLogFenced(id: string, compute: (current: Task) => {
5831
+ workflowStepResults: Task["workflowStepResults"];
5832
+ logEntry: TaskLogEntry;
5833
+ } | null): Promise<WorkflowStepResultsFencedUpdateResult>;
5826
5834
  dismissAiMergeReviewFinding(taskId: string, findingId: string, reason: string, actor?: string): Promise<Task>;
5827
5835
  linkTaskRecommendation(id: string, recommendationId: string, createdTaskId: string, completeColumns?: ReadonlySet<string>): Promise<Task>;
5828
5836
  normalizeWorkspaceTaskWorktreeMetadata(id: string): Promise<Task>;
@@ -9027,8 +9027,23 @@ function planReviewOptionalGroupNode(column, options = {}) {
9027
9027
  };
9028
9028
  }
9029
9029
 
9030
+ // ../core/src/workflows/workflow-merge-region.ts
9031
+ var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
9032
+ "merge-gate",
9033
+ "merge-attempt",
9034
+ "manual-merge-hold",
9035
+ "retry-backoff",
9036
+ "recovery-router",
9037
+ "branch-group-member-integration",
9038
+ "branch-group-promotion",
9039
+ "pr-create",
9040
+ "pr-respond",
9041
+ "pr-merge"
9042
+ ]);
9043
+
9030
9044
  // ../core/src/workflows/workflow-step-results.ts
9031
9045
  var PLAN_REVIEW_LEASE_STALENESS_MS = 15 * 60 * 1e3;
9046
+ var REMEDIATION_ATTEMPT_CLAIM_STALENESS_MS = 15 * 60 * 1e3;
9032
9047
 
9033
9048
  // ../core/src/merge/task-merge.ts
9034
9049
  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"}]}`;
@@ -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"}]}`;
@@ -37992,11 +38005,19 @@ async function authenticateAcpConnection(connection, opts) {
37992
38005
  return { methodId };
37993
38006
  }
37994
38007
  async function newAcpSession(connection, opts) {
37995
- const res = await connection.conn.newSession({
37996
- cwd: opts.cwd,
37997
- mcpServers: opts.mcpServers ?? [],
37998
- ...opts.meta && Object.keys(opts.meta).length > 0 ? { _meta: opts.meta } : {}
37999
- });
38008
+ let res;
38009
+ try {
38010
+ res = await connection.conn.newSession({
38011
+ cwd: opts.cwd,
38012
+ mcpServers: opts.mcpServers ?? [],
38013
+ ...opts.meta && Object.keys(opts.meta).length > 0 ? { _meta: opts.meta } : {}
38014
+ });
38015
+ } catch (error51) {
38016
+ throw new Error(
38017
+ `session/new failed (cwd ${opts.cwd}): ${describeAcpTurnError(error51)}`,
38018
+ { cause: error51 }
38019
+ );
38020
+ }
38000
38021
  return { sessionId: boundIdentifier(res.sessionId), modes: res.modes ?? void 0 };
38001
38022
  }
38002
38023
  var RETRYABLE_JSONRPC_CODES = /* @__PURE__ */ new Set([
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/acp-runtime",
3
- "version": "0.1.36-beta.11",
3
+ "version": "0.1.36-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/claude-runtime",
3
- "version": "0.1.11-beta.11",
3
+ "version": "0.1.11-beta.13",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -9146,8 +9146,23 @@ function planReviewOptionalGroupNode(column, options = {}) {
9146
9146
  };
9147
9147
  }
9148
9148
 
9149
+ // ../core/src/workflows/workflow-merge-region.ts
9150
+ var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
9151
+ "merge-gate",
9152
+ "merge-attempt",
9153
+ "manual-merge-hold",
9154
+ "retry-backoff",
9155
+ "recovery-router",
9156
+ "branch-group-member-integration",
9157
+ "branch-group-promotion",
9158
+ "pr-create",
9159
+ "pr-respond",
9160
+ "pr-merge"
9161
+ ]);
9162
+
9149
9163
  // ../core/src/workflows/workflow-step-results.ts
9150
9164
  var PLAN_REVIEW_LEASE_STALENESS_MS = 15 * 60 * 1e3;
9165
+ var REMEDIATION_ATTEMPT_CLAIM_STALENESS_MS = 15 * 60 * 1e3;
9151
9166
 
9152
9167
  // ../core/src/merge/task-merge.ts
9153
9168
  var HARD_BLOCKING_TASK_STATUSES = /* @__PURE__ */ new Set([
@@ -10694,20 +10709,6 @@ function classifyWorkflowAgentNode(node) {
10694
10709
  }
10695
10710
  }
10696
10711
 
10697
- // ../core/src/workflows/workflow-merge-region.ts
10698
- var MERGE_REGION_ENTRY_NODE_KINDS = /* @__PURE__ */ new Set([
10699
- "merge-gate",
10700
- "merge-attempt",
10701
- "manual-merge-hold",
10702
- "retry-backoff",
10703
- "recovery-router",
10704
- "branch-group-member-integration",
10705
- "branch-group-promotion",
10706
- "pr-create",
10707
- "pr-respond",
10708
- "pr-merge"
10709
- ]);
10710
-
10711
10712
  // ../core/src/workflows/workflow-extension-types.ts
10712
10713
  function workflowExtensionRegistryId(pluginId, extensionId) {
10713
10714
  return `plugin:${pluginId}:${extensionId}`;
@@ -11699,6 +11700,16 @@ function validateReviewerAgentOverrides(nodes2) {
11699
11700
  if (Array.isArray(templateNodes)) validateReviewerAgentOverrides(templateNodes);
11700
11701
  }
11701
11702
  }
11703
+ function validateReadonlyMcpServersConfig(nodes2) {
11704
+ for (const node of nodes2) {
11705
+ const value = node.config?.readonlyMcpServers;
11706
+ if (value !== void 0 && (!Array.isArray(value) || value.some((name) => typeof name !== "string" || !name.trim()))) {
11707
+ throw new WorkflowIrError(`Workflow node '${node.id}' readonlyMcpServers must be an array of non-empty strings when present`);
11708
+ }
11709
+ const templateNodes = node.config?.template?.nodes;
11710
+ if (Array.isArray(templateNodes)) validateReadonlyMcpServersConfig(templateNodes);
11711
+ }
11712
+ }
11702
11713
  function validateThinkingLevelConfig(nodes2) {
11703
11714
  for (const node of nodes2) {
11704
11715
  const value = node.config?.thinkingLevel;
@@ -12313,6 +12324,7 @@ function validateV2(ir) {
12313
12324
  const topLevelIds = new Set(ir.nodes.map((n) => n.id));
12314
12325
  validateStepExecutePlacement(ir.nodes);
12315
12326
  validateThinkingLevelConfig(ir.nodes);
12327
+ validateReadonlyMcpServersConfig(ir.nodes);
12316
12328
  validateCredentialInstanceIdConfig(ir.nodes);
12317
12329
  validateReviewerAgentOverrides(ir.nodes);
12318
12330
  for (const node of ir.nodes) {
@@ -14512,6 +14524,7 @@ Be specific: cite \`file:line\` for every finding and explain the concrete failu
14512
14524
  - 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.
14513
14525
  - 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.
14514
14526
  - Every blocking issue MUST appear as an entry in \`findings\` with its severity and \`filePath\`/\`line\`. Prose in \`notes\` alone does not block.
14527
+ - 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.
14515
14528
  - \`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.
14516
14529
  - Final output: output exactly one trailing JSON object on the final line (no markdown fences, no surrounding prose):
14517
14530
  {"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/cli-printing-press",
3
- "version": "0.1.53-beta.11",
3
+ "version": "0.1.53-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/compound-engineering",
3
- "version": "0.1.36-beta.11",
3
+ "version": "0.1.36-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/cursor-runtime",
3
- "version": "0.1.55-beta.11",
3
+ "version": "0.1.55-beta.13",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {