@runfusion/fusion 0.75.1-beta.0 → 0.75.1-beta.2

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 (136) hide show
  1. package/dist/bin.js +523 -212
  2. package/dist/child-process-worker.js +323 -99
  3. package/dist/client/.vite/manifest.json +249 -249
  4. package/dist/client/assets/{AgentDetailView-swTdiyeE.js → AgentDetailView-ltOG8f0-.js} +1 -1
  5. package/dist/client/assets/{AgentPermissionPolicyEditor-Dq-KuDaA.js → AgentPermissionPolicyEditor-CC_rrbbG.js} +1 -1
  6. package/dist/client/assets/{AgentsView-D1GEHyH0.js → AgentsView-DWUdi27N.js} +3 -3
  7. package/dist/client/assets/{ChatView-D1czGvvT.js → ChatView-mFKfoegS.js} +1 -1
  8. package/dist/client/assets/{CommandCenter-DWZ7OTOB.js → CommandCenter-C2wvDq_N.js} +1 -1
  9. package/dist/client/assets/{DevServerView-CAcUKOXd.js → DevServerView-0MWEJM7o.js} +1 -1
  10. package/dist/client/assets/{DirectoryPicker-DVUl5jOk.js → DirectoryPicker-BjMPhCdh.js} +1 -1
  11. package/dist/client/assets/{DocumentsView-CnexOxtr.js → DocumentsView-ckH3rjmd.js} +1 -1
  12. package/dist/client/assets/{EvalsView-rTupzcDf.js → EvalsView-NyA644VF.js} +1 -1
  13. package/dist/client/assets/{ExperimentalAgentOnboardingModal-CXE6Bj3V.js → ExperimentalAgentOnboardingModal-D0ZfbBRN.js} +1 -1
  14. package/dist/client/assets/{GoalsView-CjHwnnIi.js → GoalsView-Ctt5P_yo.js} +1 -1
  15. package/dist/client/assets/{InsightsView-C3XocYP-.js → InsightsView-NDp0bdNB.js} +1 -1
  16. package/dist/client/assets/{MemoryView-CsNHcx_d.js → MemoryView-BKbA4Bm4.js} +1 -1
  17. package/dist/client/assets/{PiExtensionsManager-BPTPoZBI.js → PiExtensionsManager-V3AFWMHm.js} +1 -1
  18. package/dist/client/assets/{PluginManager-CXadn8JE.js → PluginManager-D88G_TZh.js} +1 -1
  19. package/dist/client/assets/{PullRequestView-CC03CtZJ.js → PullRequestView-DQQmFFYC.js} +1 -1
  20. package/dist/client/assets/{ReportModal-Ci0na1eI.js → ReportModal-Clh1S8RF.js} +1 -1
  21. package/dist/client/assets/{ResearchView-DGWyAo8p.js → ResearchView-kxvq4zp5.js} +1 -1
  22. package/dist/client/assets/SecretsView-Dm0Vk8SA.js +1 -0
  23. package/dist/client/assets/{SessionTerminal-B22RlQeo.js → SessionTerminal-DJO4JTEX.js} +1 -1
  24. package/dist/client/assets/{SettingsModal-BkgBQZ19.js → SettingsModal-BN5mL_ym.js} +1 -1
  25. package/dist/client/assets/SettingsModal-CTf5voEW.js +21 -0
  26. package/dist/client/assets/{SettingsTextareaRow-0LXwMUQR.js → SettingsTextareaRow-CvKszqO-.js} +1 -1
  27. package/dist/client/assets/{SetupWizardModal-CyW3AlRO.js → SetupWizardModal-D5hVZh1G.js} +2 -2
  28. package/dist/client/assets/{SkillsView-3oqB1ubq.js → SkillsView-DQVz21w2.js} +1 -1
  29. package/dist/client/assets/{WorkflowNodeEditor-CfUK_xs1.js → WorkflowNodeEditor-CpKIi6Tb.js} +3 -3
  30. package/dist/client/assets/{agent-import-generation-C7-Cmo3M.js → agent-import-generation-DGUNF3nd.js} +1 -1
  31. package/dist/client/assets/{architectureDiagram-3BPJPVTR-BQ7ZN1r_.js → architectureDiagram-3BPJPVTR-CV83wubP.js} +1 -1
  32. package/dist/client/assets/{blockDiagram-GPEHLZMM-Debw1Xka.js → blockDiagram-GPEHLZMM-CNQsA3dD.js} +1 -1
  33. package/dist/client/assets/{c4Diagram-AAUBKEIU-CiU212s3.js → c4Diagram-AAUBKEIU-CXe7ii5H.js} +1 -1
  34. package/dist/client/assets/channel-DoX862zl.js +1 -0
  35. package/dist/client/assets/{chunk-2J33WTMH-BUJQ86zb.js → chunk-2J33WTMH-BS6W9bWv.js} +1 -1
  36. package/dist/client/assets/{chunk-4BX2VUAB-C6GdEm1z.js → chunk-4BX2VUAB-DbehRhdW.js} +1 -1
  37. package/dist/client/assets/{chunk-55IACEB6-CImvrxQL.js → chunk-55IACEB6-DMI5SR42.js} +1 -1
  38. package/dist/client/assets/{chunk-727SXJPM-Dt-A3pkM.js → chunk-727SXJPM-D1d-GBVj.js} +1 -1
  39. package/dist/client/assets/{chunk-AQP2D5EJ-DDj4oXTx.js → chunk-AQP2D5EJ-BzO6K3Uf.js} +1 -1
  40. package/dist/client/assets/{chunk-FMBD7UC4-BD4r1ukC.js → chunk-FMBD7UC4-BVRLV3lK.js} +1 -1
  41. package/dist/client/assets/{chunk-ND2GUHAM-DFSteefi.js → chunk-ND2GUHAM-DdWByQfn.js} +1 -1
  42. package/dist/client/assets/{chunk-QZHKN3VN-t2zF8tjB.js → chunk-QZHKN3VN-1ia12cRV.js} +1 -1
  43. package/dist/client/assets/classDiagram-4FO5ZUOK-mb2IeAGN.js +1 -0
  44. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-mb2IeAGN.js +1 -0
  45. package/dist/client/assets/{cose-bilkent-S5V4N54A-tkvDkXQA.js → cose-bilkent-S5V4N54A-BPDT41HR.js} +1 -1
  46. package/dist/client/assets/{dagre-BM42HDAG-DD2rW7wo.js → dagre-BM42HDAG-Cktn26EH.js} +1 -1
  47. package/dist/client/assets/{dashboard-view-B1vduc8x.js → dashboard-view-8o0EUcRX.js} +1 -1
  48. package/dist/client/assets/{dashboard-view-CciuDS5A.js → dashboard-view-CkCerlVJ.js} +1 -1
  49. package/dist/client/assets/{dashboard-view-DruCruAc.js → dashboard-view-D_HC4lnr.js} +1 -1
  50. package/dist/client/assets/{dashboard-view-C7jJ1lA4.js → dashboard-view-zd8GxC49.js} +1 -1
  51. package/dist/client/assets/{diagram-2AECGRRQ-DASuxGNc.js → diagram-2AECGRRQ-But4Lvf-.js} +1 -1
  52. package/dist/client/assets/{diagram-5GNKFQAL-f9WtiIUk.js → diagram-5GNKFQAL-2bpQAGFc.js} +1 -1
  53. package/dist/client/assets/{diagram-KO2AKTUF-QivICYCd.js → diagram-KO2AKTUF-Ckn9Qd1u.js} +1 -1
  54. package/dist/client/assets/{diagram-LMA3HP47-CMwcDFHR.js → diagram-LMA3HP47-Bjn8h84N.js} +1 -1
  55. package/dist/client/assets/{diagram-OG6HWLK6-C-vPMeHZ.js → diagram-OG6HWLK6-BI6541hx.js} +1 -1
  56. package/dist/client/assets/{erDiagram-TEJ5UH35-CxGtk9vj.js → erDiagram-TEJ5UH35-BqMiwHiM.js} +1 -1
  57. package/dist/client/assets/{flowDiagram-I6XJVG4X-qBZRZoV1.js → flowDiagram-I6XJVG4X-Q_SAB10M.js} +1 -1
  58. package/dist/client/assets/{folder-open-Dysi9Zzg.js → folder-open-CHiAJbTN.js} +1 -1
  59. package/dist/client/assets/{ganttDiagram-6RSMTGT7-DAaXroiu.js → ganttDiagram-6RSMTGT7-CqWFSfPF.js} +1 -1
  60. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-DNUNQot_.js → gitGraphDiagram-PVQCEYII-B1o4uEjO.js} +1 -1
  61. package/dist/client/assets/index-Bdw5eNKV.css +1 -0
  62. package/dist/client/assets/index-kwRywd9M.js +2767 -0
  63. package/dist/client/assets/{infoDiagram-5YYISTIA-BSJmWLwh.js → infoDiagram-5YYISTIA-BzaMa0c2.js} +1 -1
  64. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-AyVKvoDq.js → ishikawaDiagram-YF4QCWOH-I38yge00.js} +1 -1
  65. package/dist/client/assets/{journeyDiagram-JHISSGLW-972txzzd.js → journeyDiagram-JHISSGLW-WVQSgx4P.js} +1 -1
  66. package/dist/client/assets/{kanban-definition-UN3LZRKU-1xiNvIqK.js → kanban-definition-UN3LZRKU-BWtPQ3AH.js} +1 -1
  67. package/dist/client/assets/{mermaid.core-oeDA8jOm.js → mermaid.core-D1hnBtbi.js} +4 -4
  68. package/dist/client/assets/{mindmap-definition-RKZ34NQL-DcktmI8s.js → mindmap-definition-RKZ34NQL-DqiSLkW7.js} +1 -1
  69. package/dist/client/assets/{pieDiagram-4H26LBE5-ekBwLt-O.js → pieDiagram-4H26LBE5-CcgwbdIN.js} +1 -1
  70. package/dist/client/assets/{puzzle-I6pr6ZrW.js → puzzle-BhXUaTQl.js} +1 -1
  71. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-D_wjTsvn.js → quadrantDiagram-W4KKPZXB-MsqQQfDN.js} +1 -1
  72. package/dist/client/assets/{requirementDiagram-4Y6WPE33-CKGHyiJ1.js → requirementDiagram-4Y6WPE33-CILGjMMA.js} +1 -1
  73. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-CtiZFNk5.js → sankeyDiagram-5OEKKPKP-c14fWbtR.js} +1 -1
  74. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-B6OMrfGk.js → sequenceDiagram-3UESZ5HK-BD5bxMom.js} +1 -1
  75. package/dist/client/assets/{shield-alert-CVMmviMG.js → shield-alert-C9W2WywS.js} +1 -1
  76. package/dist/client/assets/{standing-instructions-template-Cg1a3tjW.js → standing-instructions-template-CJdbDSyg.js} +1 -1
  77. package/dist/client/assets/{stateDiagram-AJRCARHV-CyTY2M_7.js → stateDiagram-AJRCARHV-CZ5YqeOn.js} +1 -1
  78. package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-NWPCCiqC.js → stateDiagram-v2-BHNVJYJU-mdMN-PNX.js} +1 -1
  79. package/dist/client/assets/{timeline-definition-PNZ67QCA-DU4TVYpw.js → timeline-definition-PNZ67QCA-DHKay9uj.js} +1 -1
  80. package/dist/client/assets/{upload-VCzeCiFH.js → upload-DxEwowRU.js} +1 -1
  81. package/dist/client/assets/{users-DB3knZtm.js → users-mNFgW_Zd.js} +1 -1
  82. package/dist/client/assets/{vennDiagram-CIIHVFJN-DX0Ppll6.js → vennDiagram-CIIHVFJN-X29K9hWM.js} +1 -1
  83. package/dist/client/assets/{wardley-L42UT6IY-CBoWxpDv.js → wardley-L42UT6IY-yEoTrfmN.js} +1 -1
  84. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-B_eVqdhC.js → wardleyDiagram-YWT4CUSO-ny4k3kG0.js} +1 -1
  85. package/dist/client/assets/{xychartDiagram-2RQKCTM6-DeZzEX0f.js → xychartDiagram-2RQKCTM6-DC8ODtRJ.js} +1 -1
  86. package/dist/client/index.html +2 -2
  87. package/dist/client/version.json +1 -1
  88. package/dist/droid-cli/package.json +1 -1
  89. package/dist/extension.js +411 -155
  90. package/dist/pi-claude-cli/package.json +1 -1
  91. package/dist/plugin-sdk/index.d.ts +159 -141
  92. package/dist/plugin-sdk/index.js +19 -0
  93. package/dist/plugins/fusion-plugin-acp-runtime/bundled.js +19 -0
  94. package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
  95. package/dist/plugins/fusion-plugin-claude-runtime/bundled.js +19 -0
  96. package/dist/plugins/fusion-plugin-claude-runtime/package.json +1 -1
  97. package/dist/plugins/fusion-plugin-cli-printing-press/bundled.js +19 -0
  98. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  99. package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +19 -0
  100. package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
  101. package/dist/plugins/fusion-plugin-cursor-runtime/bundled.js +19 -0
  102. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  103. package/dist/plugins/fusion-plugin-dependency-graph/bundled.js +19 -0
  104. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  105. package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +19 -0
  106. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  107. package/dist/plugins/fusion-plugin-grok-runtime/bundled.js +19 -0
  108. package/dist/plugins/fusion-plugin-grok-runtime/package.json +1 -1
  109. package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +19 -0
  110. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  111. package/dist/plugins/fusion-plugin-linear-import/bundled.js +19 -0
  112. package/dist/plugins/fusion-plugin-linear-import/package.json +1 -1
  113. package/dist/plugins/fusion-plugin-omp-runtime/bundled.js +19 -0
  114. package/dist/plugins/fusion-plugin-omp-runtime/package.json +1 -1
  115. package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +19 -0
  116. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  117. package/dist/plugins/fusion-plugin-paperclip-runtime/bundled.js +19 -0
  118. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  119. package/dist/plugins/fusion-plugin-quality/bundled.js +19 -0
  120. package/dist/plugins/fusion-plugin-quality/package.json +1 -1
  121. package/dist/plugins/fusion-plugin-reports/bundled.js +19 -0
  122. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  123. package/dist/plugins/fusion-plugin-roadmap/bundled.js +19 -0
  124. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  125. package/dist/plugins/fusion-plugin-todos/bundled.js +19 -0
  126. package/dist/plugins/fusion-plugin-todos/package.json +1 -1
  127. package/dist/plugins/fusion-plugin-whatsapp-chat/bundled.js +19 -0
  128. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  129. package/package.json +1 -1
  130. package/dist/client/assets/SecretsView-Cv2IuqFO.js +0 -1
  131. package/dist/client/assets/SettingsModal-CPRpRK71.js +0 -21
  132. package/dist/client/assets/channel-D-O4mRXx.js +0 -1
  133. package/dist/client/assets/classDiagram-4FO5ZUOK-BhHdSetA.js +0 -1
  134. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BhHdSetA.js +0 -1
  135. package/dist/client/assets/index-D0QgE5F5.js +0 -2767
  136. package/dist/client/assets/index-DHk_s6rA.css +0 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion/pi-claude-cli",
3
- "version": "0.75.1-beta.0",
3
+ "version": "0.75.1-beta.2",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "main": "index.ts",
@@ -209,7 +209,160 @@ declare class Database {
209
209
  getPath(): string;
210
210
  }
211
211
 
212
+ declare const THINKING_LEVELS: readonly ["off", "minimal", "low", "medium", "high", "xhigh"];
213
+ type ThinkingLevel = (typeof THINKING_LEVELS)[number];
214
+ declare const COLUMNS: readonly ["triage", "todo", "in-progress", "in-review", "done", "archived"];
215
+ type Column = (typeof COLUMNS)[number];
216
+ type ColumnId = Column | (string & {});
217
+ declare const TASK_PRIORITIES: readonly ["low", "normal", "high", "urgent"];
218
+ type TaskPriority = (typeof TASK_PRIORITIES)[number];
219
+
220
+ interface ModelPreset {
221
+ id: string;
222
+ name: string;
223
+ executorProvider?: string;
224
+ executorModelId?: string;
225
+ executorCredentialInstanceId?: string;
226
+ validatorProvider?: string;
227
+ validatorModelId?: string;
228
+ validatorCredentialInstanceId?: string;
229
+ }
230
+ type WorkflowStepMode = "prompt" | "script";
231
+ type WorkflowStepToolMode = "readonly" | "coding";
232
+ type WorkflowStepGateMode = "gate" | "advisory";
233
+ type WorkflowReviewFindingSeverity = "low" | "medium" | "high" | "critical";
234
+ interface WorkflowReviewFinding {
235
+ id: string;
236
+ title: string;
237
+ body: string;
238
+ filePath?: string;
239
+ line?: number;
240
+ severity?: WorkflowReviewFindingSeverity;
241
+ }
242
+ type WorkflowStepPhase = "pre-merge" | "post-merge";
243
+ type WorkflowReviewKind = "plan" | "code";
244
+ interface WorkflowStep {
245
+ id: string;
246
+ templateId?: string;
247
+ name: string;
248
+ description: string;
249
+ mode: WorkflowStepMode;
250
+ phase?: WorkflowStepPhase;
251
+ gateMode: WorkflowStepGateMode;
252
+ prompt: string;
253
+ toolMode?: WorkflowStepToolMode;
254
+ skillName?: string;
255
+ requiresBrowser?: boolean;
256
+ scriptName?: string;
257
+ enabled: boolean;
258
+ defaultOn?: boolean;
259
+ modelProvider?: string;
260
+ modelId?: string;
261
+ thinkingLevel?: ThinkingLevel;
262
+ migratedFragmentId?: string;
263
+ createdAt: string;
264
+ updatedAt: string;
265
+ }
266
+ type NtfyNotificationEvent = "in-review" | "merged" | "failed" | "task-wedged" | "awaiting-approval" | "awaiting-user-review" | "planning-awaiting-input" | "cli-agent-awaiting-input" | "gridlock" | "board-stall-unrecovered" | "db-corruption-detected" | "fallback-used" | "memory-dreams-processed" | "token-budget" | "message:agent-to-user" | "message:agent-to-agent" | "message:room" | "oauth-token-expired" | "task-created" | "workflow-notify";
267
+ interface NotificationProviderConfig {
268
+ id: string;
269
+ name: string;
270
+ enabled: boolean;
271
+ config: Record<string, unknown>;
272
+ }
273
+ interface CustomProvider {
274
+ id: string;
275
+ name: string;
276
+ apiType: "openai-compatible" | "anthropic-compatible" | "google-generative-ai" | "openai-responses";
277
+ baseUrl: string;
278
+ apiKey?: string;
279
+ supportsDeveloperRole?: boolean;
280
+ anthropicPromptCaching?: boolean;
281
+ models?: {
282
+ id: string;
283
+ name: string;
284
+ }[];
285
+ }
286
+ interface WorkflowStepInput {
287
+ templateId?: string;
288
+ name: string;
289
+ description: string;
290
+ mode?: WorkflowStepMode;
291
+ phase?: WorkflowStepPhase;
292
+ gateMode?: WorkflowStepGateMode;
293
+ prompt?: string;
294
+ toolMode?: WorkflowStepToolMode;
295
+ skillName?: string;
296
+ scriptName?: string;
297
+ enabled?: boolean;
298
+ defaultOn?: boolean;
299
+ modelProvider?: string;
300
+ modelId?: string;
301
+ thinkingLevel?: ThinkingLevel;
302
+ migratedFragmentId?: string;
303
+ }
304
+ interface WorkflowStepResult {
305
+ workflowStepId: string;
306
+ workflowStepName: string;
307
+ phase?: WorkflowStepPhase;
308
+ source?: "optional-group" | "node";
309
+ status: "passed" | "failed" | "advisory_failure" | "skipped" | "pending";
310
+ reviewKind?: WorkflowReviewKind;
311
+ output?: string;
312
+ findings?: WorkflowReviewFinding[];
313
+ verdict?: "APPROVE" | "APPROVE_WITH_NOTES" | "REVISE";
314
+ notes?: string;
315
+ startedAt?: string;
316
+ completedAt?: string;
317
+ leaseOwner?: string;
318
+ leaseNodeId?: string;
319
+ bypassedBy?: string;
320
+ bypassedAt?: string;
321
+ bypassReason?: string;
322
+ bypassedFromStatus?: WorkflowStepResult["status"];
323
+ bypassedFromVerdict?: WorkflowStepResult["verdict"];
324
+ supersededAt?: string;
325
+ supersededReason?: "dependency-change";
326
+ planReviewAttemptCount?: number;
327
+ priorAttempts?: WorkflowStepResult[];
328
+ }
329
+ type WorkflowRunStepInstanceStatus = "pending" | "in-progress" | "awaiting-integration" | "completed" | "failed";
330
+ interface WorkflowRunStepInstance {
331
+ taskId: string;
332
+ runId: string;
333
+ foreachNodeId: string;
334
+ stepIndex: number;
335
+ pinnedStepCount: number;
336
+ currentNodeId?: string | null;
337
+ status: WorkflowRunStepInstanceStatus;
338
+ baselineSha?: string | null;
339
+ checkpointId?: string | null;
340
+ reworkCount: number;
341
+ branchName?: string | null;
342
+ integratedAt?: string | null;
343
+ updatedAt: string;
344
+ }
345
+ interface WorkflowStepTemplate {
346
+ id: string;
347
+ name: string;
348
+ description: string;
349
+ prompt: string;
350
+ mode?: WorkflowStepMode;
351
+ phase?: "pre-merge" | "post-merge";
352
+ scriptName?: string;
353
+ toolMode?: WorkflowStepToolMode;
354
+ gateMode?: WorkflowStepGateMode;
355
+ defaultOn?: boolean;
356
+ modelProvider?: string;
357
+ modelId?: string;
358
+ thinkingLevel?: ThinkingLevel;
359
+ category: string;
360
+ icon?: string;
361
+ enabled?: boolean;
362
+ }
363
+
212
364
  type WorkflowIrNodeKind = "start" | "prompt" | "script" | "gate" | "end" | "hold" | "split" | "join" | "foreach" | "loop" | "optional-group" | "step-review" | "parse-steps" | "code" | "notify" | "merge-gate" | "merge-attempt" | "manual-merge-hold" | "retry-backoff" | "recovery-router" | "branch-group-member-integration" | "branch-group-promotion" | "pr-create" | "pr-respond" | "pr-merge" | "ask-user" | "exit-gate";
365
+
213
366
  interface WorkflowIrNode {
214
367
  id: string;
215
368
  kind: WorkflowIrNodeKind;
@@ -521,14 +674,6 @@ type ToolFailureRetryClaim = {
521
674
  outcome: "exhausted";
522
675
  };
523
676
 
524
- declare const THINKING_LEVELS: readonly ["off", "minimal", "low", "medium", "high", "xhigh"];
525
- type ThinkingLevel = (typeof THINKING_LEVELS)[number];
526
- declare const COLUMNS: readonly ["triage", "todo", "in-progress", "in-review", "done", "archived"];
527
- type Column = (typeof COLUMNS)[number];
528
- type ColumnId = Column | (string & {});
529
- declare const TASK_PRIORITIES: readonly ["low", "normal", "high", "urgent"];
530
- type TaskPriority = (typeof TASK_PRIORITIES)[number];
531
-
532
677
  declare const MERGE_REQUEST_STATES: readonly ["queued", "running", "retrying", "succeeded", "exhausted", "cancelled", "manual-required"];
533
678
  type MergeRequestState = (typeof MERGE_REQUEST_STATES)[number];
534
679
  declare const WORKFLOW_WORK_ITEM_KINDS: readonly ["task", "merge", "retry", "manual-hold", "recovery"];
@@ -5670,138 +5815,6 @@ interface AutoRecoverySettings {
5670
5815
  type UnavailableNodePolicy = "block" | "fallback-local";
5671
5816
  type OwningNodeHandoffPolicy = "block" | "reassign-to-local" | "reassign-any-healthy";
5672
5817
 
5673
- interface ModelPreset {
5674
- id: string;
5675
- name: string;
5676
- executorProvider?: string;
5677
- executorModelId?: string;
5678
- executorCredentialInstanceId?: string;
5679
- validatorProvider?: string;
5680
- validatorModelId?: string;
5681
- validatorCredentialInstanceId?: string;
5682
- }
5683
- type WorkflowStepMode = "prompt" | "script";
5684
- type WorkflowStepToolMode = "readonly" | "coding";
5685
- type WorkflowStepGateMode = "gate" | "advisory";
5686
- type WorkflowStepPhase = "pre-merge" | "post-merge";
5687
- interface WorkflowStep {
5688
- id: string;
5689
- templateId?: string;
5690
- name: string;
5691
- description: string;
5692
- mode: WorkflowStepMode;
5693
- phase?: WorkflowStepPhase;
5694
- gateMode: WorkflowStepGateMode;
5695
- prompt: string;
5696
- toolMode?: WorkflowStepToolMode;
5697
- skillName?: string;
5698
- requiresBrowser?: boolean;
5699
- scriptName?: string;
5700
- enabled: boolean;
5701
- defaultOn?: boolean;
5702
- modelProvider?: string;
5703
- modelId?: string;
5704
- thinkingLevel?: ThinkingLevel;
5705
- migratedFragmentId?: string;
5706
- createdAt: string;
5707
- updatedAt: string;
5708
- }
5709
- type NtfyNotificationEvent = "in-review" | "merged" | "failed" | "task-wedged" | "awaiting-approval" | "awaiting-user-review" | "planning-awaiting-input" | "cli-agent-awaiting-input" | "gridlock" | "board-stall-unrecovered" | "db-corruption-detected" | "fallback-used" | "memory-dreams-processed" | "token-budget" | "message:agent-to-user" | "message:agent-to-agent" | "message:room" | "oauth-token-expired" | "task-created" | "workflow-notify";
5710
- interface NotificationProviderConfig {
5711
- id: string;
5712
- name: string;
5713
- enabled: boolean;
5714
- config: Record<string, unknown>;
5715
- }
5716
- interface CustomProvider {
5717
- id: string;
5718
- name: string;
5719
- apiType: "openai-compatible" | "anthropic-compatible" | "google-generative-ai" | "openai-responses";
5720
- baseUrl: string;
5721
- apiKey?: string;
5722
- supportsDeveloperRole?: boolean;
5723
- anthropicPromptCaching?: boolean;
5724
- models?: {
5725
- id: string;
5726
- name: string;
5727
- }[];
5728
- }
5729
- interface WorkflowStepInput {
5730
- templateId?: string;
5731
- name: string;
5732
- description: string;
5733
- mode?: WorkflowStepMode;
5734
- phase?: WorkflowStepPhase;
5735
- gateMode?: WorkflowStepGateMode;
5736
- prompt?: string;
5737
- toolMode?: WorkflowStepToolMode;
5738
- skillName?: string;
5739
- scriptName?: string;
5740
- enabled?: boolean;
5741
- defaultOn?: boolean;
5742
- modelProvider?: string;
5743
- modelId?: string;
5744
- thinkingLevel?: ThinkingLevel;
5745
- migratedFragmentId?: string;
5746
- }
5747
- interface WorkflowStepResult {
5748
- workflowStepId: string;
5749
- workflowStepName: string;
5750
- phase?: WorkflowStepPhase;
5751
- source?: "optional-group" | "node";
5752
- status: "passed" | "failed" | "advisory_failure" | "skipped" | "pending";
5753
- output?: string;
5754
- verdict?: "APPROVE" | "APPROVE_WITH_NOTES" | "REVISE";
5755
- notes?: string;
5756
- startedAt?: string;
5757
- completedAt?: string;
5758
- leaseOwner?: string;
5759
- leaseNodeId?: string;
5760
- bypassedBy?: string;
5761
- bypassedAt?: string;
5762
- bypassReason?: string;
5763
- bypassedFromStatus?: WorkflowStepResult["status"];
5764
- bypassedFromVerdict?: WorkflowStepResult["verdict"];
5765
- supersededAt?: string;
5766
- supersededReason?: "dependency-change";
5767
- planReviewAttemptCount?: number;
5768
- priorAttempts?: WorkflowStepResult[];
5769
- }
5770
- type WorkflowRunStepInstanceStatus = "pending" | "in-progress" | "awaiting-integration" | "completed" | "failed";
5771
- interface WorkflowRunStepInstance {
5772
- taskId: string;
5773
- runId: string;
5774
- foreachNodeId: string;
5775
- stepIndex: number;
5776
- pinnedStepCount: number;
5777
- currentNodeId?: string | null;
5778
- status: WorkflowRunStepInstanceStatus;
5779
- baselineSha?: string | null;
5780
- checkpointId?: string | null;
5781
- reworkCount: number;
5782
- branchName?: string | null;
5783
- integratedAt?: string | null;
5784
- updatedAt: string;
5785
- }
5786
- interface WorkflowStepTemplate {
5787
- id: string;
5788
- name: string;
5789
- description: string;
5790
- prompt: string;
5791
- mode?: WorkflowStepMode;
5792
- phase?: "pre-merge" | "post-merge";
5793
- scriptName?: string;
5794
- toolMode?: WorkflowStepToolMode;
5795
- gateMode?: WorkflowStepGateMode;
5796
- defaultOn?: boolean;
5797
- modelProvider?: string;
5798
- modelId?: string;
5799
- thinkingLevel?: ThinkingLevel;
5800
- category: string;
5801
- icon?: string;
5802
- enabled?: boolean;
5803
- }
5804
-
5805
5818
  type PrConflictState = "clean" | "conflicting" | "behind" | "blocked" | "unknown";
5806
5819
  interface PrConflictDiagnostics {
5807
5820
  conflictingFiles: string[];
@@ -5968,6 +5981,7 @@ type TaskReviewDecision = "approved" | "changes-requested" | "commented" | "pend
5968
5981
  type TaskReviewVerdict = "APPROVE" | "APPROVE_WITH_NOTES" | "REVISE" | "RETHINK" | "UNAVAILABLE";
5969
5982
  type TaskReviewerType = "plan" | "code";
5970
5983
  type TaskReviewItemStatus = "queued" | "in-progress" | "addressed" | "failed";
5984
+ type TaskReviewFindingSeverity = "low" | "medium" | "high" | "critical";
5971
5985
  interface LegacyTaskReviewItem {
5972
5986
  id: string;
5973
5987
  source: TaskReviewSource;
@@ -6020,6 +6034,7 @@ interface TaskReviewStateItem {
6020
6034
  threadId?: string;
6021
6035
  githubCommentId?: number;
6022
6036
  path?: string;
6037
+ line?: number;
6023
6038
  diffSide?: string;
6024
6039
  body: string;
6025
6040
  author: TaskReviewAuthor;
@@ -6033,6 +6048,7 @@ interface TaskReviewStateItem {
6033
6048
  verdict?: TaskReviewVerdict;
6034
6049
  step?: number;
6035
6050
  summary?: string;
6051
+ severity?: TaskReviewFindingSeverity;
6036
6052
  }
6037
6053
  type ReviewAddressingStatus = "queued" | "in-progress" | "addressed" | "failed";
6038
6054
  interface ReviewAddressingSnapshot {
@@ -6044,6 +6060,7 @@ interface ReviewAddressingSnapshot {
6044
6060
  authorLogin?: string;
6045
6061
  filePath?: string;
6046
6062
  lineNumber?: number;
6063
+ severity?: TaskReviewFindingSeverity;
6047
6064
  threadId?: string;
6048
6065
  url?: string;
6049
6066
  }
@@ -6518,7 +6535,7 @@ interface Task {
6518
6535
  pausedByAgentId?: string;
6519
6536
  baseBranch?: string;
6520
6537
  autoMerge?: boolean;
6521
- autoMergeProvenance?: "user" | "legacy-stamp";
6538
+ autoMergeProvenance?: "user" | "mission" | "legacy-stamp";
6522
6539
  branch?: string;
6523
6540
  branchContext?: TaskBranchContext;
6524
6541
  executionStartBranch?: string;
@@ -6708,6 +6725,7 @@ interface TaskCreateInput {
6708
6725
  branchContext?: TaskBranchContext;
6709
6726
  taskPrefix?: string;
6710
6727
  autoMerge?: boolean;
6728
+ autoMergeProvenance?: "mission";
6711
6729
  sourceIssue?: TaskSourceIssue;
6712
6730
  gitlabTracking?: TaskGitLabTracking;
6713
6731
  tokenUsage?: TaskTokenUsage;
@@ -10540,6 +10540,7 @@ function validateForeach(node, topLevelNodeIds, columnIds) {
10540
10540
  );
10541
10541
  }
10542
10542
  for (const inner of templateNodes) {
10543
+ validateReviewKind(inner, "nested");
10543
10544
  if (inner.kind === "foreach" || inner.kind === "loop") {
10544
10545
  throw new WorkflowIrError(
10545
10546
  `foreach node '${node.id}' template may not contain nested loop/foreach ('${inner.id}')`
@@ -10658,6 +10659,7 @@ function validateLoop(node, topLevelNodeIds, columnIds) {
10658
10659
  );
10659
10660
  }
10660
10661
  for (const inner of templateNodes) {
10662
+ validateReviewKind(inner, "nested");
10661
10663
  if (inner.kind === "loop" || inner.kind === "foreach") {
10662
10664
  throw new WorkflowIrError(
10663
10665
  `loop node '${node.id}' template may not contain nested loop/foreach ('${inner.id}')`
@@ -10751,6 +10753,7 @@ function validateOptionalGroup(node, topLevelNodeIds, columnIds) {
10751
10753
  throw new WorkflowIrError(`optional-group node '${node.id}' template has duplicate node ids`);
10752
10754
  }
10753
10755
  for (const inner of templateNodes) {
10756
+ validateReviewKind(inner, "nested");
10754
10757
  if (inner.kind === "loop" || inner.kind === "foreach" || inner.kind === "optional-group") {
10755
10758
  throw new WorkflowIrError(
10756
10759
  `optional-group node '${node.id}' template may not contain nested loop/foreach/optional-group ('${inner.id}')`
@@ -11422,6 +11425,19 @@ function validateColumnRecovery(column) {
11422
11425
  );
11423
11426
  }
11424
11427
  }
11428
+ function validateReviewKind(node, placement) {
11429
+ const value = node.config?.reviewKind;
11430
+ if (value === void 0) return;
11431
+ if (value !== "plan" && value !== "code") {
11432
+ throw new WorkflowIrError(`Workflow node '${node.id}' has invalid reviewKind '${String(value)}'; expected 'plan' or 'code'`);
11433
+ }
11434
+ if (placement === "nested") {
11435
+ throw new WorkflowIrError(`Workflow node '${node.id}' has reviewKind in an unsupported nested template placement`);
11436
+ }
11437
+ if (node.kind !== "prompt" && node.kind !== "gate" && node.kind !== "script" && node.kind !== "optional-group") {
11438
+ throw new WorkflowIrError(`Workflow node '${node.id}' has reviewKind on unsupported node kind '${node.kind}'`);
11439
+ }
11440
+ }
11425
11441
  function validateV2(ir) {
11426
11442
  validateColumns(ir);
11427
11443
  for (const [index2, column] of ir.columns.entries()) {
@@ -11444,6 +11460,7 @@ function validateV2(ir) {
11444
11460
  }
11445
11461
  const nodesById = new Map(ir.nodes.map((n) => [n.id, n]));
11446
11462
  for (const node of ir.nodes) {
11463
+ validateReviewKind(node, "top-level");
11447
11464
  validateExtensionMetadata(`Workflow node '${node.id}'`, node.extensions);
11448
11465
  if (node.column !== void 0 && !columnIds.has(node.column)) {
11449
11466
  throw new WorkflowIrError(
@@ -13614,6 +13631,7 @@ function codeReviewOptionalGroupNode(column, options = {}) {
13614
13631
  column,
13615
13632
  config: {
13616
13633
  name: CODE_REVIEW_NAME,
13634
+ reviewKind: "code",
13617
13635
  // Default-ON: runs for every coding task by default, but operators can toggle it
13618
13636
  // off per task (remove `code-review` from enabledWorkflowSteps).
13619
13637
  defaultOn: options.defaultOn ?? true,
@@ -13744,6 +13762,7 @@ function planReviewOptionalGroupNode(column, options = {}) {
13744
13762
  ...column ? { column } : {},
13745
13763
  config: {
13746
13764
  name: PLAN_REVIEW_NAME,
13765
+ reviewKind: "plan",
13747
13766
  defaultOn: options.defaultOn ?? true,
13748
13767
  /*
13749
13768
  * FNXC:WorkflowRemediation 2026-06-29-12:14:
@@ -10539,6 +10539,7 @@ function validateForeach(node, topLevelNodeIds, columnIds) {
10539
10539
  );
10540
10540
  }
10541
10541
  for (const inner of templateNodes) {
10542
+ validateReviewKind(inner, "nested");
10542
10543
  if (inner.kind === "foreach" || inner.kind === "loop") {
10543
10544
  throw new WorkflowIrError(
10544
10545
  `foreach node '${node.id}' template may not contain nested loop/foreach ('${inner.id}')`
@@ -10657,6 +10658,7 @@ function validateLoop(node, topLevelNodeIds, columnIds) {
10657
10658
  );
10658
10659
  }
10659
10660
  for (const inner of templateNodes) {
10661
+ validateReviewKind(inner, "nested");
10660
10662
  if (inner.kind === "loop" || inner.kind === "foreach") {
10661
10663
  throw new WorkflowIrError(
10662
10664
  `loop node '${node.id}' template may not contain nested loop/foreach ('${inner.id}')`
@@ -10750,6 +10752,7 @@ function validateOptionalGroup(node, topLevelNodeIds, columnIds) {
10750
10752
  throw new WorkflowIrError(`optional-group node '${node.id}' template has duplicate node ids`);
10751
10753
  }
10752
10754
  for (const inner of templateNodes) {
10755
+ validateReviewKind(inner, "nested");
10753
10756
  if (inner.kind === "loop" || inner.kind === "foreach" || inner.kind === "optional-group") {
10754
10757
  throw new WorkflowIrError(
10755
10758
  `optional-group node '${node.id}' template may not contain nested loop/foreach/optional-group ('${inner.id}')`
@@ -11421,6 +11424,19 @@ function validateColumnRecovery(column) {
11421
11424
  );
11422
11425
  }
11423
11426
  }
11427
+ function validateReviewKind(node, placement) {
11428
+ const value = node.config?.reviewKind;
11429
+ if (value === void 0) return;
11430
+ if (value !== "plan" && value !== "code") {
11431
+ throw new WorkflowIrError(`Workflow node '${node.id}' has invalid reviewKind '${String(value)}'; expected 'plan' or 'code'`);
11432
+ }
11433
+ if (placement === "nested") {
11434
+ throw new WorkflowIrError(`Workflow node '${node.id}' has reviewKind in an unsupported nested template placement`);
11435
+ }
11436
+ if (node.kind !== "prompt" && node.kind !== "gate" && node.kind !== "script" && node.kind !== "optional-group") {
11437
+ throw new WorkflowIrError(`Workflow node '${node.id}' has reviewKind on unsupported node kind '${node.kind}'`);
11438
+ }
11439
+ }
11424
11440
  function validateV2(ir) {
11425
11441
  validateColumns(ir);
11426
11442
  for (const [index2, column] of ir.columns.entries()) {
@@ -11443,6 +11459,7 @@ function validateV2(ir) {
11443
11459
  }
11444
11460
  const nodesById = new Map(ir.nodes.map((n) => [n.id, n]));
11445
11461
  for (const node of ir.nodes) {
11462
+ validateReviewKind(node, "top-level");
11446
11463
  validateExtensionMetadata(`Workflow node '${node.id}'`, node.extensions);
11447
11464
  if (node.column !== void 0 && !columnIds.has(node.column)) {
11448
11465
  throw new WorkflowIrError(
@@ -13613,6 +13630,7 @@ function codeReviewOptionalGroupNode(column, options = {}) {
13613
13630
  column,
13614
13631
  config: {
13615
13632
  name: CODE_REVIEW_NAME,
13633
+ reviewKind: "code",
13616
13634
  // Default-ON: runs for every coding task by default, but operators can toggle it
13617
13635
  // off per task (remove `code-review` from enabledWorkflowSteps).
13618
13636
  defaultOn: options.defaultOn ?? true,
@@ -13743,6 +13761,7 @@ function planReviewOptionalGroupNode(column, options = {}) {
13743
13761
  ...column ? { column } : {},
13744
13762
  config: {
13745
13763
  name: PLAN_REVIEW_NAME,
13764
+ reviewKind: "plan",
13746
13765
  defaultOn: options.defaultOn ?? true,
13747
13766
  /*
13748
13767
  * FNXC:WorkflowRemediation 2026-06-29-12:14:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/acp-runtime",
3
- "version": "0.1.34-beta.0",
3
+ "version": "0.1.34-beta.2",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -10539,6 +10539,7 @@ function validateForeach(node, topLevelNodeIds, columnIds) {
10539
10539
  );
10540
10540
  }
10541
10541
  for (const inner of templateNodes) {
10542
+ validateReviewKind(inner, "nested");
10542
10543
  if (inner.kind === "foreach" || inner.kind === "loop") {
10543
10544
  throw new WorkflowIrError(
10544
10545
  `foreach node '${node.id}' template may not contain nested loop/foreach ('${inner.id}')`
@@ -10657,6 +10658,7 @@ function validateLoop(node, topLevelNodeIds, columnIds) {
10657
10658
  );
10658
10659
  }
10659
10660
  for (const inner of templateNodes) {
10661
+ validateReviewKind(inner, "nested");
10660
10662
  if (inner.kind === "loop" || inner.kind === "foreach") {
10661
10663
  throw new WorkflowIrError(
10662
10664
  `loop node '${node.id}' template may not contain nested loop/foreach ('${inner.id}')`
@@ -10750,6 +10752,7 @@ function validateOptionalGroup(node, topLevelNodeIds, columnIds) {
10750
10752
  throw new WorkflowIrError(`optional-group node '${node.id}' template has duplicate node ids`);
10751
10753
  }
10752
10754
  for (const inner of templateNodes) {
10755
+ validateReviewKind(inner, "nested");
10753
10756
  if (inner.kind === "loop" || inner.kind === "foreach" || inner.kind === "optional-group") {
10754
10757
  throw new WorkflowIrError(
10755
10758
  `optional-group node '${node.id}' template may not contain nested loop/foreach/optional-group ('${inner.id}')`
@@ -11421,6 +11424,19 @@ function validateColumnRecovery(column) {
11421
11424
  );
11422
11425
  }
11423
11426
  }
11427
+ function validateReviewKind(node, placement) {
11428
+ const value = node.config?.reviewKind;
11429
+ if (value === void 0) return;
11430
+ if (value !== "plan" && value !== "code") {
11431
+ throw new WorkflowIrError(`Workflow node '${node.id}' has invalid reviewKind '${String(value)}'; expected 'plan' or 'code'`);
11432
+ }
11433
+ if (placement === "nested") {
11434
+ throw new WorkflowIrError(`Workflow node '${node.id}' has reviewKind in an unsupported nested template placement`);
11435
+ }
11436
+ if (node.kind !== "prompt" && node.kind !== "gate" && node.kind !== "script" && node.kind !== "optional-group") {
11437
+ throw new WorkflowIrError(`Workflow node '${node.id}' has reviewKind on unsupported node kind '${node.kind}'`);
11438
+ }
11439
+ }
11424
11440
  function validateV2(ir) {
11425
11441
  validateColumns(ir);
11426
11442
  for (const [index2, column] of ir.columns.entries()) {
@@ -11443,6 +11459,7 @@ function validateV2(ir) {
11443
11459
  }
11444
11460
  const nodesById = new Map(ir.nodes.map((n) => [n.id, n]));
11445
11461
  for (const node of ir.nodes) {
11462
+ validateReviewKind(node, "top-level");
11446
11463
  validateExtensionMetadata(`Workflow node '${node.id}'`, node.extensions);
11447
11464
  if (node.column !== void 0 && !columnIds.has(node.column)) {
11448
11465
  throw new WorkflowIrError(
@@ -13613,6 +13630,7 @@ function codeReviewOptionalGroupNode(column, options = {}) {
13613
13630
  column,
13614
13631
  config: {
13615
13632
  name: CODE_REVIEW_NAME,
13633
+ reviewKind: "code",
13616
13634
  // Default-ON: runs for every coding task by default, but operators can toggle it
13617
13635
  // off per task (remove `code-review` from enabledWorkflowSteps).
13618
13636
  defaultOn: options.defaultOn ?? true,
@@ -13743,6 +13761,7 @@ function planReviewOptionalGroupNode(column, options = {}) {
13743
13761
  ...column ? { column } : {},
13744
13762
  config: {
13745
13763
  name: PLAN_REVIEW_NAME,
13764
+ reviewKind: "plan",
13746
13765
  defaultOn: options.defaultOn ?? true,
13747
13766
  /*
13748
13767
  * FNXC:WorkflowRemediation 2026-06-29-12:14:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/claude-runtime",
3
- "version": "0.1.9-beta.0",
3
+ "version": "0.1.9-beta.2",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -10659,6 +10659,7 @@ function validateForeach(node, topLevelNodeIds, columnIds) {
10659
10659
  );
10660
10660
  }
10661
10661
  for (const inner of templateNodes) {
10662
+ validateReviewKind(inner, "nested");
10662
10663
  if (inner.kind === "foreach" || inner.kind === "loop") {
10663
10664
  throw new WorkflowIrError(
10664
10665
  `foreach node '${node.id}' template may not contain nested loop/foreach ('${inner.id}')`
@@ -10777,6 +10778,7 @@ function validateLoop(node, topLevelNodeIds, columnIds) {
10777
10778
  );
10778
10779
  }
10779
10780
  for (const inner of templateNodes) {
10781
+ validateReviewKind(inner, "nested");
10780
10782
  if (inner.kind === "loop" || inner.kind === "foreach") {
10781
10783
  throw new WorkflowIrError(
10782
10784
  `loop node '${node.id}' template may not contain nested loop/foreach ('${inner.id}')`
@@ -10870,6 +10872,7 @@ function validateOptionalGroup(node, topLevelNodeIds, columnIds) {
10870
10872
  throw new WorkflowIrError(`optional-group node '${node.id}' template has duplicate node ids`);
10871
10873
  }
10872
10874
  for (const inner of templateNodes) {
10875
+ validateReviewKind(inner, "nested");
10873
10876
  if (inner.kind === "loop" || inner.kind === "foreach" || inner.kind === "optional-group") {
10874
10877
  throw new WorkflowIrError(
10875
10878
  `optional-group node '${node.id}' template may not contain nested loop/foreach/optional-group ('${inner.id}')`
@@ -11541,6 +11544,19 @@ function validateColumnRecovery(column) {
11541
11544
  );
11542
11545
  }
11543
11546
  }
11547
+ function validateReviewKind(node, placement) {
11548
+ const value = node.config?.reviewKind;
11549
+ if (value === void 0) return;
11550
+ if (value !== "plan" && value !== "code") {
11551
+ throw new WorkflowIrError(`Workflow node '${node.id}' has invalid reviewKind '${String(value)}'; expected 'plan' or 'code'`);
11552
+ }
11553
+ if (placement === "nested") {
11554
+ throw new WorkflowIrError(`Workflow node '${node.id}' has reviewKind in an unsupported nested template placement`);
11555
+ }
11556
+ if (node.kind !== "prompt" && node.kind !== "gate" && node.kind !== "script" && node.kind !== "optional-group") {
11557
+ throw new WorkflowIrError(`Workflow node '${node.id}' has reviewKind on unsupported node kind '${node.kind}'`);
11558
+ }
11559
+ }
11544
11560
  function validateV2(ir) {
11545
11561
  validateColumns(ir);
11546
11562
  for (const [index2, column] of ir.columns.entries()) {
@@ -11563,6 +11579,7 @@ function validateV2(ir) {
11563
11579
  }
11564
11580
  const nodesById = new Map(ir.nodes.map((n) => [n.id, n]));
11565
11581
  for (const node of ir.nodes) {
11582
+ validateReviewKind(node, "top-level");
11566
11583
  validateExtensionMetadata(`Workflow node '${node.id}'`, node.extensions);
11567
11584
  if (node.column !== void 0 && !columnIds.has(node.column)) {
11568
11585
  throw new WorkflowIrError(
@@ -13733,6 +13750,7 @@ function codeReviewOptionalGroupNode(column, options = {}) {
13733
13750
  column,
13734
13751
  config: {
13735
13752
  name: CODE_REVIEW_NAME,
13753
+ reviewKind: "code",
13736
13754
  // Default-ON: runs for every coding task by default, but operators can toggle it
13737
13755
  // off per task (remove `code-review` from enabledWorkflowSteps).
13738
13756
  defaultOn: options.defaultOn ?? true,
@@ -13863,6 +13881,7 @@ function planReviewOptionalGroupNode(column, options = {}) {
13863
13881
  ...column ? { column } : {},
13864
13882
  config: {
13865
13883
  name: PLAN_REVIEW_NAME,
13884
+ reviewKind: "plan",
13866
13885
  defaultOn: options.defaultOn ?? true,
13867
13886
  /*
13868
13887
  * FNXC:WorkflowRemediation 2026-06-29-12:14:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/cli-printing-press",
3
- "version": "0.1.51-beta.0",
3
+ "version": "0.1.51-beta.2",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {