@runfusion/fusion 0.50.0 → 0.52.0

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 (144) hide show
  1. package/dist/bin.js +9801 -4827
  2. package/dist/client/.vite/manifest.json +328 -327
  3. package/dist/client/assets/{AgentDetailView-D2oYUApl.js → AgentDetailView-C-PM8cwG.js} +1 -1
  4. package/dist/client/assets/{AgentPermissionPolicyEditor-DGgx46f3.js → AgentPermissionPolicyEditor-DrVW4VPc.js} +1 -1
  5. package/dist/client/assets/{AgentsView-Dhf5Vq_T.js → AgentsView-DJJO0laF.js} +6 -11
  6. package/dist/client/assets/ChatView-C7uTm5hO.js +16 -0
  7. package/dist/client/assets/ChatView-D_2wBIIx.css +1 -0
  8. package/dist/client/assets/CommandCenter-CKvo0MuO.js +71 -0
  9. package/dist/client/assets/{DevServerView-DjJYp6Jj.js → DevServerView-BHLG4Mxg.js} +1 -1
  10. package/dist/client/assets/{DirectoryPicker-CYPYp9T4.js → DirectoryPicker-CRY-rpnj.js} +1 -1
  11. package/dist/client/assets/{DocumentsView-CeQVRVdp.js → DocumentsView-DhC4dnXD.js} +1 -1
  12. package/dist/client/assets/{EvalsView-D250mVR5.js → EvalsView-DsnLOVZB.js} +1 -1
  13. package/dist/client/assets/{ExperimentalAgentOnboardingModal-B1EEY_bl.js → ExperimentalAgentOnboardingModal-B4iFX60E.js} +1 -1
  14. package/dist/client/assets/{GoalsView-CUh8JBnJ.css → GoalsView-4-eEOeqw.css} +1 -1
  15. package/dist/client/assets/GoalsView-D5bzq6W9.js +2 -0
  16. package/dist/client/assets/{InsightsView-CbWItYe8.js → InsightsView-Drpu72M4.js} +1 -1
  17. package/dist/client/assets/{MemoryView-Ct0nOTES.js → MemoryView-auLBP3UW.js} +1 -1
  18. package/dist/client/assets/{PiExtensionsManager-DSQwngX-.js → PiExtensionsManager-RlbkXf_t.js} +1 -1
  19. package/dist/client/assets/{PluginManager-DqLxCiNg.js → PluginManager-BJMUacpG.js} +1 -1
  20. package/dist/client/assets/PullRequestView-344B9WF-.js +6 -0
  21. package/dist/client/assets/PullRequestView-NkeImY1n.css +1 -0
  22. package/dist/client/assets/{ResearchView-CJQL9XKC.js → ResearchView-BNqt-f53.js} +1 -1
  23. package/dist/client/assets/{SecretsView-ChN9aTbi.js → SecretsView-Be8Tm8It.js} +1 -1
  24. package/dist/client/assets/SessionTerminal-CumHUelZ.js +2 -0
  25. package/dist/client/assets/SettingsModal-AJfer-ve.js +21 -0
  26. package/dist/client/assets/{SettingsModal-CIC5jhgo.js → SettingsModal-B28DuhaN.js} +1 -1
  27. package/dist/client/assets/SettingsModal-CaE4JYxi.css +1 -0
  28. package/dist/client/assets/{SetupWizardModal-C6EGjmbd.js → SetupWizardModal-y2j9aZoi.js} +2 -2
  29. package/dist/client/assets/ShadcnColorPicker-Cc72uPKJ.js +11 -0
  30. package/dist/client/assets/ShadcnColorPicker-CyeAnJUU.css +1 -0
  31. package/dist/client/assets/{SkillsView-Dz8dDwfP.js → SkillsView-HQp7UTdA.js} +1 -1
  32. package/dist/client/assets/{TodoView-DvJFzoOv.js → TodoView-DF7_qWGH.js} +1 -1
  33. package/dist/client/assets/WorkflowNodeEditor-BjpqTIYE.js +8 -0
  34. package/dist/client/assets/WorkflowNodeEditor-Df-_206_.css +1 -0
  35. package/dist/client/assets/{agentSkills-B2dD5Nm5.js → agentSkills-Cy_HrYHd.js} +1 -1
  36. package/dist/client/assets/{app-D27ewSC0.js → app-CGubyqAW.js} +3 -3
  37. package/dist/client/assets/{app-dATBczl3.js → app-CrQpHbIs.js} +2 -2
  38. package/dist/client/assets/{app-BYq4S7Cb.js → app-DboK-0Ty.js} +1 -1
  39. package/dist/client/assets/{app-OPrfgjjn.js → app-DjnYET2y.js} +3 -3
  40. package/dist/client/assets/{app-DFLDkeOE.js → app-MacS555z.js} +3 -3
  41. package/dist/client/assets/{app-k1K9zAjp.js → app-nvVayIeU.js} +3 -3
  42. package/dist/client/assets/{architectureDiagram-3BPJPVTR-ClO0MnzR.js → architectureDiagram-3BPJPVTR-4ur4sxlr.js} +1 -1
  43. package/dist/client/assets/{blockDiagram-GPEHLZMM-C4cyy4WE.js → blockDiagram-GPEHLZMM-BgZeqq_q.js} +1 -1
  44. package/dist/client/assets/{c4Diagram-AAUBKEIU-NHPC9TJo.js → c4Diagram-AAUBKEIU-BQtdOIrm.js} +1 -1
  45. package/dist/client/assets/channel-Dn5XowfJ.js +1 -0
  46. package/dist/client/assets/{chunk-2J33WTMH-CGYIKTVR.js → chunk-2J33WTMH-C1k1PBy1.js} +1 -1
  47. package/dist/client/assets/{chunk-4BX2VUAB-BkCCD0tE.js → chunk-4BX2VUAB-hNujwvSn.js} +1 -1
  48. package/dist/client/assets/{chunk-55IACEB6-Be3yOIDe.js → chunk-55IACEB6-CnXV9LyI.js} +1 -1
  49. package/dist/client/assets/{chunk-727SXJPM-DxjyMaQQ.js → chunk-727SXJPM-B-ocMdYN.js} +1 -1
  50. package/dist/client/assets/{chunk-AQP2D5EJ-BC0PjN0W.js → chunk-AQP2D5EJ-CWNRUL6C.js} +1 -1
  51. package/dist/client/assets/{chunk-FMBD7UC4-DoWxmM8k.js → chunk-FMBD7UC4-DerrCiYe.js} +1 -1
  52. package/dist/client/assets/{chunk-ND2GUHAM-EOpuc9pP.js → chunk-ND2GUHAM-BfcSPlX-.js} +1 -1
  53. package/dist/client/assets/{chunk-QZHKN3VN-DiRyx9QZ.js → chunk-QZHKN3VN-BaWScAds.js} +1 -1
  54. package/dist/client/assets/classDiagram-4FO5ZUOK-zSOW-KNk.js +1 -0
  55. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-zSOW-KNk.js +1 -0
  56. package/dist/client/assets/{cose-bilkent-S5V4N54A-CfVoUUxT.js → cose-bilkent-S5V4N54A-n0Oeinz2.js} +1 -1
  57. package/dist/client/assets/{dagre-BM42HDAG-BfILvxLb.js → dagre-BM42HDAG-CUtehSt2.js} +1 -1
  58. package/dist/client/assets/{dashboard-view-C9YIcx-O.js → dashboard-view-BW3GHqgb.js} +1633 -1633
  59. package/dist/client/assets/{dashboard-view-wFC1pe4d.js → dashboard-view-DWKCxtr5.js} +1 -1
  60. package/dist/client/assets/{diagram-2AECGRRQ-6mdmbH-5.js → diagram-2AECGRRQ-Bz4aOzhR.js} +1 -1
  61. package/dist/client/assets/{diagram-5GNKFQAL-CY7MMwO1.js → diagram-5GNKFQAL-UoxIMwPf.js} +1 -1
  62. package/dist/client/assets/{diagram-KO2AKTUF-D05XnQqd.js → diagram-KO2AKTUF-BYR7hloS.js} +1 -1
  63. package/dist/client/assets/{diagram-LMA3HP47-B18FTOJG.js → diagram-LMA3HP47-BR9MaP8U.js} +1 -1
  64. package/dist/client/assets/{diagram-OG6HWLK6-xmXlYf5m.js → diagram-OG6HWLK6-BOfldYHv.js} +1 -1
  65. package/dist/client/assets/{erDiagram-TEJ5UH35-4XlgVLCs.js → erDiagram-TEJ5UH35-B8x9mfOs.js} +1 -1
  66. package/dist/client/assets/{flowDiagram-I6XJVG4X-BYl3ps7f.js → flowDiagram-I6XJVG4X-DBnTroCV.js} +1 -1
  67. package/dist/client/assets/{folder-open-BH6FwmO7.js → folder-open-CFze34Eq.js} +1 -1
  68. package/dist/client/assets/{ganttDiagram-6RSMTGT7-4vxuH9Dx.js → ganttDiagram-6RSMTGT7-BfzFy7iz.js} +1 -1
  69. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-BESmFgXT.js → gitGraphDiagram-PVQCEYII-CNTFu6IY.js} +1 -1
  70. package/dist/client/assets/index-QnHUwSjw.css +1 -0
  71. package/dist/client/assets/index-Y-vyXPPN.js +1331 -0
  72. package/dist/client/assets/{infoDiagram-5YYISTIA-DvjdjtwB.js → infoDiagram-5YYISTIA-DJiBRaAl.js} +1 -1
  73. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-Cis5IoEm.js → ishikawaDiagram-YF4QCWOH-CIY9t4cc.js} +1 -1
  74. package/dist/client/assets/{journeyDiagram-JHISSGLW-C20pB1W8.js → journeyDiagram-JHISSGLW-HLMZmcjY.js} +1 -1
  75. package/dist/client/assets/{kanban-definition-UN3LZRKU-CiVfCeU3.js → kanban-definition-UN3LZRKU-x9nKoxCI.js} +1 -1
  76. package/dist/client/assets/{linear-dXivciGL.js → linear-CwI45w2t.js} +1 -1
  77. package/dist/client/assets/{mermaid.core-CW0vCXA6.js → mermaid.core-pHkdB6fb.js} +4 -4
  78. package/dist/client/assets/{mindmap-definition-RKZ34NQL-E5rPHUdw.js → mindmap-definition-RKZ34NQL-Bs_4Tofu.js} +1 -1
  79. package/dist/client/assets/{pieDiagram-4H26LBE5-DVIFbPjH.js → pieDiagram-4H26LBE5-BGHz9JGZ.js} +1 -1
  80. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-C8qPRe_x.js → quadrantDiagram-W4KKPZXB-xHSR7cAR.js} +1 -1
  81. package/dist/client/assets/{requirementDiagram-4Y6WPE33-DQ-pwXh3.js → requirementDiagram-4Y6WPE33-D7YMNM44.js} +1 -1
  82. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-BnghLuUc.js → sankeyDiagram-5OEKKPKP-OAXuab3Y.js} +1 -1
  83. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-ChlGxGVk.js → sequenceDiagram-3UESZ5HK-BZCjKFVL.js} +1 -1
  84. package/dist/client/assets/{shield-alert-BfOnDO6O.js → shield-alert-BBK8Risa.js} +1 -1
  85. package/dist/client/assets/{stateDiagram-AJRCARHV-ByUvNEch.js → stateDiagram-AJRCARHV-COnJQqA4.js} +1 -1
  86. package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-Df38ITSP.js → stateDiagram-v2-BHNVJYJU-Diml4Nhm.js} +1 -1
  87. package/dist/client/assets/{time-DoDTxsna.js → time-Ckmi30gH.js} +1 -1
  88. package/dist/client/assets/{timeline-definition-PNZ67QCA-bsAGc83D.js → timeline-definition-PNZ67QCA-DHIKvV9L.js} +1 -1
  89. package/dist/client/assets/{upload-BK1crTqn.js → upload-CqUJUdZW.js} +1 -1
  90. package/dist/client/assets/{users-DW8jC2Z9.js → users-CAE-FEzI.js} +1 -1
  91. package/dist/client/assets/{vendor-reactflow-Bg-Qjzh8.js → vendor-reactflow-CnI7NMXG.js} +1 -1
  92. package/dist/client/assets/{vennDiagram-CIIHVFJN-BBIj6LFN.js → vennDiagram-CIIHVFJN-o9AxLDoL.js} +1 -1
  93. package/dist/client/assets/{wardley-L42UT6IY-De6JFroy.js → wardley-L42UT6IY-B7MIazje.js} +1 -1
  94. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-P1LOLx0_.js → wardleyDiagram-YWT4CUSO-B6qUJx0N.js} +1 -1
  95. package/dist/client/assets/{xychartDiagram-2RQKCTM6-v1G4ki6U.js → xychartDiagram-2RQKCTM6-13mSXuCA.js} +1 -1
  96. package/dist/client/index.html +8 -8
  97. package/dist/client/theme-data.css +140 -0
  98. package/dist/client/version.json +1 -1
  99. package/dist/droid-cli/package.json +1 -1
  100. package/dist/extension.js +7658 -3691
  101. package/dist/pi-claude-cli/index.ts +13 -0
  102. package/dist/pi-claude-cli/package.json +1 -1
  103. package/dist/pi-claude-cli/src/__tests__/process-manager.test.ts +2 -2
  104. package/dist/pi-claude-cli/src/__tests__/provider.test.ts +27 -4
  105. package/dist/plugin-sdk/index.d.ts +38 -1
  106. package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
  107. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  108. package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +1 -1
  109. package/dist/plugins/fusion-plugin-compound-engineering/manifest.json +1 -1
  110. package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
  111. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  112. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  113. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  114. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  115. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  116. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  117. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  118. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  119. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  120. package/package.json +1 -1
  121. package/skill/fusion/SKILL.md +1 -0
  122. package/skill/fusion/references/best-practices.md +3 -3
  123. package/skill/fusion/references/engine-tools.md +3 -3
  124. package/skill/fusion/references/extension-tools.md +82 -5
  125. package/skill/fusion/references/fusion-capabilities.md +9 -1
  126. package/skill/fusion/workflows/task-management.md +1 -1
  127. package/dist/client/assets/ChatView-DpgpxHva.js +0 -19
  128. package/dist/client/assets/ChatView-DwIIrJxb.css +0 -1
  129. package/dist/client/assets/CommandCenter-DzQhGq_J.js +0 -71
  130. package/dist/client/assets/GoalsView-MftVwE9g.js +0 -2
  131. package/dist/client/assets/PullRequestView-CpdE3Yo_.css +0 -1
  132. package/dist/client/assets/PullRequestView-D0WgwdAi.js +0 -6
  133. package/dist/client/assets/SessionTerminal-BVon9kbr.js +0 -2
  134. package/dist/client/assets/SettingsModal-B4WANQnu.js +0 -21
  135. package/dist/client/assets/SettingsModal-tUDR6nJ9.css +0 -1
  136. package/dist/client/assets/ShadcnColorPicker-4e_aXoGX.js +0 -11
  137. package/dist/client/assets/ShadcnColorPicker-CzZo9UOD.css +0 -1
  138. package/dist/client/assets/WorkflowNodeEditor-DrdTCstS.js +0 -8
  139. package/dist/client/assets/WorkflowNodeEditor-WYIxHTxY.css +0 -1
  140. package/dist/client/assets/channel-Q2WKocEP.js +0 -1
  141. package/dist/client/assets/classDiagram-4FO5ZUOK-CPFl2Aqd.js +0 -1
  142. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CPFl2Aqd.js +0 -1
  143. package/dist/client/assets/index-B9jtBwFy.css +0 -1
  144. package/dist/client/assets/index-DFeBJ3GM.js +0 -1302
@@ -190,6 +190,19 @@ export default function (pi: ExtensionAPI) {
190
190
  // catalog catches up.
191
191
  // https://platform.claude.com/docs/en/about-claude/models/overview
192
192
  const extraModels: typeof catalogModels = [
193
+ /*
194
+ * FNXC:ModelCatalog 2026-06-30-12:31:
195
+ * The vendored Claude CLI provider has its own model list because it exposes `pi-claude-cli` independently from direct `anthropic`. Add Claude Sonnet 5 here as supplemental metadata so Claude CLI users can select it before the upstream pi-ai catalog catches up, while the dedupe below prevents duplicate rows after it does.
196
+ */
197
+ {
198
+ id: "claude-sonnet-5",
199
+ name: "Claude Sonnet 5",
200
+ reasoning: true,
201
+ input: ["text", "image"],
202
+ cost: { input: 2, output: 10, cacheRead: 0.2, cacheWrite: 2.5 },
203
+ contextWindow: 1_000_000,
204
+ maxTokens: 128_000,
205
+ },
193
206
  {
194
207
  id: "claude-opus-4-7",
195
208
  name: "Claude Opus 4.7",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion/pi-claude-cli",
3
- "version": "0.50.0",
3
+ "version": "0.52.0",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "main": "index.ts",
@@ -61,14 +61,14 @@ describe("buildClaudeSpawnArgs", () => {
61
61
  });
62
62
 
63
63
  it("builds args including model and optional session/mcp flags", () => {
64
- const args = buildClaudeSpawnArgs("claude-sonnet-4-6", undefined, {
64
+ const args = buildClaudeSpawnArgs("claude-sonnet-5", undefined, {
65
65
  resumeSessionId: "sess-1",
66
66
  effort: "high",
67
67
  mcpConfigPath: "/tmp/mcp.json",
68
68
  });
69
69
 
70
70
  expect(args).toContain("--model");
71
- expect(args).toContain("claude-sonnet-4-6");
71
+ expect(args[args.indexOf("--model") + 1]).toBe("claude-sonnet-5");
72
72
  expect(args).toContain("--resume");
73
73
  expect(args).toContain("sess-1");
74
74
  expect(args).toContain("--effort");
@@ -127,6 +127,7 @@ describe("provider registration (default export)", () => {
127
127
  const modelIds = new Set(config.models.map((m: { id: string }) => m.id));
128
128
 
129
129
  for (const id of [
130
+ "claude-sonnet-5",
130
131
  "claude-opus-4-7",
131
132
  "claude-sonnet-4-6",
132
133
  "claude-sonnet-4-5",
@@ -134,6 +135,15 @@ describe("provider registration (default export)", () => {
134
135
  ]) {
135
136
  expect(modelIds.has(id)).toBe(true);
136
137
  }
138
+
139
+ expect(config.models.find((m: { id: string }) => m.id === "claude-sonnet-5")).toMatchObject({
140
+ name: "Claude Sonnet 5",
141
+ reasoning: true,
142
+ input: ["text", "image"],
143
+ cost: { input: 2, output: 10, cacheRead: 0.2, cacheWrite: 2.5 },
144
+ contextWindow: 1_000_000,
145
+ maxTokens: 128_000,
146
+ });
137
147
  });
138
148
 
139
149
  it("deduplicates extra models when catalog already includes them", async () => {
@@ -143,6 +153,17 @@ describe("provider registration (default export)", () => {
143
153
 
144
154
  getModelsMock.mockReturnValueOnce([
145
155
  ...mockModels,
156
+ {
157
+ id: "claude-sonnet-5",
158
+ name: "Claude Sonnet 5 Upstream",
159
+ api: "anthropic",
160
+ provider: "anthropic",
161
+ reasoning: true,
162
+ input: ["text", "image"],
163
+ cost: { input: 2, output: 10, cacheRead: 0.2, cacheWrite: 2.5 },
164
+ contextWindow: 1_000_000,
165
+ maxTokens: 128_000,
166
+ } as any,
146
167
  {
147
168
  id: "claude-sonnet-4-6",
148
169
  name: "Claude Sonnet 4.6",
@@ -160,10 +181,12 @@ describe("provider registration (default export)", () => {
160
181
  mod.default(mockPi);
161
182
 
162
183
  const config = registerProvider.mock.calls[0][1];
163
- const matches = config.models.filter(
164
- (m: { id: string }) => m.id === "claude-sonnet-4-6",
165
- );
166
- expect(matches).toHaveLength(1);
184
+ for (const id of ["claude-sonnet-5", "claude-sonnet-4-6"]) {
185
+ const matches = config.models.filter(
186
+ (m: { id: string }) => m.id === id,
187
+ );
188
+ expect(matches).toHaveLength(1);
189
+ }
167
190
  });
168
191
  });
169
192
 
@@ -689,6 +689,13 @@ interface CustomFieldRejection {
689
689
  detail: string;
690
690
  }
691
691
 
692
+ type WorkflowLifecycleWarningCode = "missing-completion-summary" | "missing-merge-region" | "unsafe-terminal-before-merge" | "optional-group-after-execution" | "review-gate-without-failure-route";
693
+ interface WorkflowLifecycleWarning {
694
+ code: WorkflowLifecycleWarningCode;
695
+ nodeId?: string;
696
+ message: string;
697
+ }
698
+
692
699
  interface WorkflowNodeLayout {
693
700
  x: number;
694
701
  y: number;
@@ -698,15 +705,18 @@ interface WorkflowDefinition {
698
705
  id: string;
699
706
  name: string;
700
707
  description: string;
708
+ icon?: string;
701
709
  kind: WorkflowDefinitionKind;
702
710
  ir: WorkflowIr;
703
711
  layout: Record<string, WorkflowNodeLayout>;
712
+ lifecycleWarnings?: WorkflowLifecycleWarning[];
704
713
  createdAt: string;
705
714
  updatedAt: string;
706
715
  }
707
716
  interface WorkflowDefinitionInput {
708
717
  name: string;
709
718
  description?: string;
719
+ icon?: string;
710
720
  ir: WorkflowIr;
711
721
  layout?: Record<string, WorkflowNodeLayout>;
712
722
  kind?: WorkflowDefinitionKind;
@@ -714,6 +724,7 @@ interface WorkflowDefinitionInput {
714
724
  interface WorkflowDefinitionUpdate {
715
725
  name?: string;
716
726
  description?: string;
727
+ icon?: string | null;
717
728
  ir?: WorkflowIr;
718
729
  layout?: Record<string, WorkflowNodeLayout>;
719
730
  rehomeTo?: string;
@@ -2531,6 +2542,7 @@ interface TaskStoreEvents {
2531
2542
  settings: Settings;
2532
2543
  previous: Settings;
2533
2544
  }];
2545
+ "artifact:registered": [artifact: Artifact];
2534
2546
  "agent:log": [entry: AgentLogEntry];
2535
2547
  "merger:autostashOrphans": [
2536
2548
  data: {
@@ -2661,6 +2673,8 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
2661
2673
  private scanAndRecordCitations;
2662
2674
  private getTaskSelectClause;
2663
2675
  private computeTimedExecutionMs;
2676
+ private getLatestAgentLogActivityMs;
2677
+ private hasFreshAgentLogActivitySinceTaskUpdate;
2664
2678
  private getTaskSelectClauseWithActivityLogLimit;
2665
2679
  private createTaskPersistSerializationContext;
2666
2680
  private getTaskPersistValues;
@@ -2901,6 +2915,7 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
2901
2915
  handoffToReview(taskId: string, opts: HandoffToReviewOptions): Promise<Task>;
2902
2916
  private resolveWorkflowMoveActor;
2903
2917
  private resolveWorkflowBypassGuards;
2918
+ private isWorkflowDoneBypassGuardedTask;
2904
2919
  private shouldSkipWorkflowMovePolicies;
2905
2920
  private prepareWorkflowMovePolicyPreflight;
2906
2921
  private evaluateWorkflowMovePolicies;
@@ -3000,6 +3015,7 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
3000
3015
  githubTracking?: TaskGithubTracking | null;
3001
3016
  tokenUsage?: TaskTokenUsage | null;
3002
3017
  modifiedFiles?: string[] | null;
3018
+ workflowTransitionNotification?: Task["workflowTransitionNotification"] | null;
3003
3019
  missionId?: string | null;
3004
3020
  sliceId?: string | null;
3005
3021
  }, runContext?: RunMutationContext): Promise<Task>;
@@ -4327,7 +4343,7 @@ declare const COMPLETION_DOCUMENTATION_MODES: readonly ["off", "changeset", "cha
4327
4343
  type CompletionDocumentationMode = (typeof COMPLETION_DOCUMENTATION_MODES)[number];
4328
4344
  declare const THEME_MODES: readonly ["dark", "light", "system"];
4329
4345
  type ThemeMode = (typeof THEME_MODES)[number];
4330
- declare const COLOR_THEMES: readonly ["default", "ocean", "forest", "sunset", "zen", "berry", "high-contrast", "industrial", "monochrome", "slate", "ash", "air", "graphite", "silver", "solarized", "factory", "factory-mono", "ayu", "one-dark", "nord", "dracula", "gruvbox", "tokyo-night", "catppuccin-mocha", "github-dark", "everforest", "rose-pine", "kanagawa", "night-owl", "palenight", "monokai-pro", "slime", "brutalist", "neon-city", "parchment", "terminal", "glass", "horizon", "vitesse", "outrun", "snazzy", "porple", "espresso", "mars", "poimandres", "ember", "rust", "copper", "foundry", "carbon", "sandstone", "lagoon", "frost", "lavender", "neon-bloom", "sepia", "shadcn", "shadcn-custom", "shadcn-blue", "shadcn-green", "shadcn-red", "shadcn-purple", "shadcn-pink", "shadcn-orange", "shadcn-yellow", "shadcn-mono-red", "shadcn-mono-blue", "shadcn-mono-green", "shadcn-mono-purple", "shadcn-mono-pink", "shadcn-mono-orange", "shadcn-mono-yellow", "shadcn-black", "shadcn-gray", "shadcn-gray-blue"];
4346
+ declare const COLOR_THEMES: readonly ["default", "ocean", "forest", "sunset", "zen", "berry", "high-contrast", "industrial", "monochrome", "slate", "ash", "air", "graphite", "silver", "solarized", "factory", "factory-mono", "ayu", "one-dark", "nord", "dracula", "gruvbox", "tokyo-night", "catppuccin-mocha", "github-dark", "everforest", "rose-pine", "kanagawa", "night-owl", "palenight", "monokai-pro", "slime", "brutalist", "neon-city", "parchment", "terminal", "glass", "horizon", "vitesse", "outrun", "snazzy", "porple", "espresso", "mars", "poimandres", "ember", "rust", "copper", "foundry", "carbon", "sandstone", "lagoon", "frost", "lavender", "neon-bloom", "sepia", "shadcn", "shadcn-ember", "shadcn-custom", "shadcn-blue", "shadcn-green", "shadcn-red", "shadcn-purple", "shadcn-pink", "shadcn-orange", "shadcn-yellow", "shadcn-mono-red", "shadcn-mono-blue", "shadcn-mono-green", "shadcn-mono-purple", "shadcn-mono-pink", "shadcn-mono-orange", "shadcn-mono-yellow", "shadcn-black", "shadcn-gray", "shadcn-gray-blue"];
4331
4347
  type ColorTheme = (typeof COLOR_THEMES)[number];
4332
4348
  declare const SUPPORTED_LOCALES: readonly ["en", "zh-CN", "zh-TW", "fr", "es", "ko"];
4333
4349
  type Locale = (typeof SUPPORTED_LOCALES)[number];
@@ -4418,6 +4434,7 @@ interface WorkflowStepResult {
4418
4434
  workflowStepId: string;
4419
4435
  workflowStepName: string;
4420
4436
  phase?: WorkflowStepPhase;
4437
+ source?: "optional-group" | "node";
4421
4438
  status: "passed" | "failed" | "advisory_failure" | "skipped" | "pending";
4422
4439
  output?: string;
4423
4440
  verdict?: "APPROVE" | "APPROVE_WITH_NOTES" | "REVISE";
@@ -4474,6 +4491,7 @@ interface PrInfo {
4474
4491
  commentCount: number;
4475
4492
  isDraft?: boolean;
4476
4493
  draft?: boolean;
4494
+ manual?: boolean;
4477
4495
  autoMergeOnGreen?: boolean;
4478
4496
  autoMergeStrategy?: "merge" | "squash" | "rebase";
4479
4497
  lastMergeError?: string;
@@ -4535,6 +4553,15 @@ interface TaskLogEntry {
4535
4553
  outcome?: string;
4536
4554
  runContext?: RunMutationContext;
4537
4555
  }
4556
+ type WorkflowTransitionNotificationKind = "manual-merge-hold" | "recovery-requeue";
4557
+ interface WorkflowTransitionNotificationMarker {
4558
+ kind: WorkflowTransitionNotificationKind;
4559
+ column: ColumnId;
4560
+ transitionId: string;
4561
+ nodeId?: string;
4562
+ reason?: string;
4563
+ createdAt: string;
4564
+ }
4538
4565
  type ActivityEventType = "task:created" | "task:moved" | "task:updated" | "task:deleted" | "task:merged" | "task:failed" | "task:duplicate-warning-overridden" | "task:auto-archived-deterministic-duplicate" | "task:auto-archived-near-duplicate" | "task:near-duplicate-flagged" | "task:release-authorization-required" | "task:auto-archived-ghost-bug" | "task:auto-archived-duplicate" | "task:merge-worktree-reacquired" | "settings:updated" | "project:isolation-transition";
4539
4566
  interface ActivityLogEntry {
4540
4567
  id: string;
@@ -5113,6 +5140,7 @@ interface Task {
5113
5140
  stalePausedReview?: StalePausedReviewSignal;
5114
5141
  inReviewStalled?: InReviewStalledSignal;
5115
5142
  stalePausedTodo?: StalePausedTodoSignal;
5143
+ workflowTransitionNotification?: WorkflowTransitionNotificationMarker;
5116
5144
  stalledReview?: StalledReviewSignal;
5117
5145
  tokenUsage?: TaskTokenUsage;
5118
5146
  size?: "S" | "M" | "L";
@@ -5401,6 +5429,7 @@ interface GlobalSettings {
5401
5429
  colorTheme?: ColorTheme;
5402
5430
  shadcnCustomColors?: Record<string, string>;
5403
5431
  dashboardFontScalePct?: number;
5432
+ dismissModalsOnOutsideClick?: boolean;
5404
5433
  language?: Locale;
5405
5434
  defaultProvider?: string;
5406
5435
  defaultModelId?: string;
@@ -5577,6 +5606,7 @@ interface ProjectSettings {
5577
5606
  groupOverlappingFiles: boolean;
5578
5607
  ignoreHiddenOverlapPaths?: boolean;
5579
5608
  overlapIgnorePaths?: string[];
5609
+ allowAbsoluteFileBrowserPaths?: boolean;
5580
5610
  autoMerge: boolean;
5581
5611
  testMode?: boolean;
5582
5612
  mergeRequestContractShadowEnabled?: boolean;
@@ -5613,6 +5643,10 @@ interface ProjectSettings {
5613
5643
  testCommand?: string;
5614
5644
  buildCommand?: string;
5615
5645
  recycleWorktrees?: boolean;
5646
+ showWorktreeGrouping?: boolean;
5647
+ openTasksInRightSidebar?: boolean;
5648
+ openMobileTasksInPopup?: boolean;
5649
+ taskDetailChatFirst?: boolean;
5616
5650
  executorAllowSiblingBranchRename?: boolean;
5617
5651
  worktreeNaming?: "random" | "task-id" | "task-title";
5618
5652
  worktrunk?: WorktrunkSettings;
@@ -5769,6 +5803,8 @@ interface ProjectSettings {
5769
5803
  titleSummarizerModelId?: string;
5770
5804
  titleSummarizerFallbackProvider?: string;
5771
5805
  titleSummarizerFallbackModelId?: string;
5806
+ prTitlePromptInstructions?: string;
5807
+ prDescriptionPromptInstructions?: string;
5772
5808
  scripts?: Record<string, string>;
5773
5809
  setupScript?: string;
5774
5810
  insightExtractionEnabled?: boolean;
@@ -5795,6 +5831,7 @@ interface ProjectSettings {
5795
5831
  reflectionAfterTask?: boolean;
5796
5832
  reviewHandoffPolicy?: "disabled" | "comment-triggered" | "always";
5797
5833
  quickChatButtonMode?: "floating" | "footer" | "off";
5834
+ quickChatCloseOnOutsideClick?: boolean;
5798
5835
  showQuickChatFAB?: boolean;
5799
5836
  chatAutoCleanupDays?: number;
5800
5837
  mailAutoCleanupDays?: number;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/acp-runtime",
3
- "version": "0.1.13",
3
+ "version": "0.1.15",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/cli-printing-press",
3
- "version": "0.1.30",
3
+ "version": "0.1.32",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "exports": {
@@ -2413,7 +2413,7 @@ var plugin = definePlugin({
2413
2413
  viewId: "compound-engineering",
2414
2414
  label: "Compound Engineering",
2415
2415
  componentPath: "./dashboard-view",
2416
- icon: "Sparkles",
2416
+ icon: "Boxes",
2417
2417
  placement: "primary",
2418
2418
  order: 36
2419
2419
  }
@@ -10,7 +10,7 @@
10
10
  "viewId": "compound-engineering",
11
11
  "label": "Compound Engineering",
12
12
  "componentPath": "./dashboard-view",
13
- "icon": "Sparkles",
13
+ "icon": "Boxes",
14
14
  "placement": "primary",
15
15
  "order": 36
16
16
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/compound-engineering",
3
- "version": "0.1.13",
3
+ "version": "0.1.15",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/cursor-runtime",
3
- "version": "0.1.32",
3
+ "version": "0.1.34",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/dependency-graph",
3
- "version": "0.1.44",
3
+ "version": "0.1.46",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/droid-runtime",
3
- "version": "0.1.39",
3
+ "version": "0.1.41",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/hermes-runtime",
3
- "version": "0.2.63",
3
+ "version": "0.2.65",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/openclaw-runtime",
3
- "version": "0.2.63",
3
+ "version": "0.2.65",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/paperclip-runtime",
3
- "version": "0.2.63",
3
+ "version": "0.2.65",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/reports",
3
- "version": "0.1.32",
3
+ "version": "0.1.34",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/roadmap",
3
- "version": "0.1.32",
3
+ "version": "0.1.34",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/whatsapp-chat",
3
- "version": "0.1.32",
3
+ "version": "0.1.34",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "exports": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runfusion/fusion",
3
- "version": "0.50.0",
3
+ "version": "0.52.0",
4
4
  "license": "MIT",
5
5
  "description": "Fusion CLI: HTTP API server, daemon, dashboard launcher, and task tooling for the Fusion AI coding agent.",
6
6
  "homepage": "https://github.com/Runfusion/Fusion#readme",
@@ -28,6 +28,7 @@ Mission → Milestone → Slice → Feature → Task
28
28
  **Tool categories:**
29
29
  <!-- BEGIN: tool-categories (auto-generated by scripts/sync-fusion-skill-tools.mjs — do not edit by hand) -->
30
30
  - **Task tools** — `fn_task_create`, `fn_task_update`, `fn_task_list`, `fn_task_show`, `fn_task_attach`, `fn_task_pause`, `fn_task_unpause`, `fn_task_retry`, `fn_task_duplicate`, `fn_task_refine`, `fn_task_archive`, `fn_task_unarchive`, `fn_task_delete`, `fn_task_plan`
31
+ - **Workflow tools** — `fn_workflow_list`, `fn_workflow_get`, `fn_workflow_create`, `fn_workflow_update`, `fn_workflow_delete`, `fn_workflow_settings`, `fn_trait_list`, `fn_workflow_select`
31
32
  - **GitHub tools** — `fn_task_import_github`, `fn_task_import_github_issue`, `fn_task_browse_github_issues`
32
33
  - **Mission tools** — `fn_mission_create`, `fn_mission_list`, `fn_mission_show`, `fn_mission_list_goals`, `fn_mission_link_goal`, `fn_mission_unlink_goal`, `fn_mission_backfill_assertions`, `fn_mission_delete`, `fn_mission_update`, `fn_milestone_add`, `fn_slice_add`, `fn_feature_add`, `fn_feature_delete`, `fn_slice_delete`, `fn_milestone_delete`, `fn_slice_activate`, `fn_feature_link_task`, `fn_feature_update`, `fn_milestone_update`
33
34
  - **Goal tools** — `fn_goal_list`, `fn_goal_create`, `fn_goal_archive`, `fn_goal_show`
@@ -33,7 +33,7 @@ For work larger than L, use missions to break it into phases.
33
33
  | Vague idea needing refinement | `fn_task_plan` |
34
34
  | Large project with phases | `fn_mission_create` + hierarchy |
35
35
  | Task failed, needs retry | `fn_task_retry` |
36
- | Task needs manual intervention | `fn_task_pause` |
36
+ | User explicitly requests manual control | `fn_task_pause` |
37
37
  | Completed task needs follow-up | `fn_task_refine` |
38
38
  | Clean up done tasks | `fn_task_archive` |
39
39
  | Import external work | `fn_task_import_github*` |
@@ -49,10 +49,10 @@ For work larger than L, use missions to break it into phases.
49
49
  ## Working with the AI Engine
50
50
 
51
51
  - **Don't fight the automation** — let triage, scheduler, and executor do their jobs
52
- - **Pause if needed** — use `fn_task_pause` when you want manual control
52
+ - **Pause only on explicit user request** — use `fn_task_pause` for user-driven manual control, never as agent failure or blocker handling
53
53
  - **Steer don't micromanage** — use steering comments (via CLI `fn task steer`) to guide the AI without rewriting the spec
54
54
  - **Check progress** — use `fn_task_show` to monitor step completion
55
- - **Let it fail and retry** — if a task fails, check the log, then `fn_task_retry`
55
+ - **Let it fail and retry** — if a task fails, check the log, then `fn_task_retry` or create a focused follow-up task instead of pausing it
56
56
 
57
57
  ## Mission Planning Tips
58
58
 
@@ -1,11 +1,11 @@
1
1
  # Engine Session-Scoped Tools
2
2
 
3
- These tools are **not** part of the user-invokable extension surface. They are injected by the engine at runtime for specific agent session types.
3
+ This reference documents tools injected by the engine at runtime for specific agent session types. Some shared workflow tools are also part of the public extension surface; use `references/extension-tools.md` as the canonical user-invokable extension reference and this page for runtime agent-role availability.
4
4
 
5
5
  - Source files: `packages/engine/src/agent-tools.ts`, `triage.ts`, `executor.ts`, `merger.ts`, `agent-heartbeat.ts`
6
6
  - Availability: only when the engine creates a session for the matching agent role
7
7
  - Runtime contract: engine sessions now forward requested skill names (`skillSelection.requestedSkillNames`) into the generic runtime `skills` field so non-pi runtimes can still receive Fusion skill intent.
8
- - Important: do not tell users to call these directly from the generic extension tool list
8
+ - Important: do not tell users to call runtime-only tools directly from the generic extension tool list
9
9
 
10
10
  ## Shared runtime tools (`agent-tools.ts`)
11
11
 
@@ -54,7 +54,7 @@ These tools are **not** part of the user-invokable extension surface. They are i
54
54
  | `fn_send_message` | executor, step-session, heartbeat | Send inbox messages to agents/users | `to_id` (string), `content` (string), `type?` (`agent-to-agent` \| `agent-to-user`), `reply_to_message_id?` (string) |
55
55
  | `fn_read_messages` | executor, step-session, heartbeat | Read inbox messages | `unread_only?` (boolean), `limit?` (number) |
56
56
  | `fn_post_room_message` | heartbeat | Post a message to a chat room the agent is a member of | `roomId` (string), `content` (string), `replyToMessageId?` (string), `mentions?` (string[]) |
57
- | `fn_artifact_register` | triage, executor, heartbeat; chat/planning (explicit `task_id`) | Register an artifact (document, image, video, audio, or other) so other agents and tasks can discover it | `type` (string), `title` (string), `description?` (string), `mimeType?` (string), `uri?` (string), `content?` (string), `taskId?` (string); chat/planning also require `task_id` (string) |
57
+ | `fn_artifact_register` | triage, executor, heartbeat; chat/planning (explicit `task_id`) | Register an artifact (document, image, video, audio, or other) so other agents and tasks can discover it; image artifacts may provide `dataBase64` bytes for registry-managed media storage | `type` (string), `title` (string), `description?` (string), `mimeType?` (string), `uri?` (string), `content?` (string), `dataBase64?` (base64 string), `taskId?` (string); chat/planning also require `task_id` (string) |
58
58
  | `fn_artifact_list` | triage, executor, heartbeat; chat/planning (explicit `task_id`) | List registered artifacts across agents and tasks with filters for type, authorId, taskId, search, limit, and offset | `type?` (string), `authorId?` (string), `taskId?` (string), `search?` (string), `limit?` (number), `offset?` (number); chat/planning also require `task_id` (string) |
59
59
  | `fn_artifact_view` | triage, executor, heartbeat | View a registered artifact by id, including metadata and inline content or the uri/path reference for media artifacts | `id` (string) |
60
60
 
@@ -18,7 +18,7 @@ Create a new task on the Fusion task board. The task enters the planning column
18
18
  | `depends` | array | — | Task IDs this depends on (e.g. ['FN-001', 'FN-002']) |
19
19
  | `agentId` | string | — | Agent ID to assign this task to (e.g. 'agent-abc123') |
20
20
  | `priority` | string(enum) | — | Task priority (low, normal, high, urgent) |
21
- | `workflow_id` | string | — | Workflow ID to select for the new task (e.g. 'WF-003' or 'builtin:coding'). |
21
+ | `workflow_id` | string | — | Workflow ID to select for the new task (e.g. 'WF-003' or 'builtin:coding'). Omit to inherit the project default workflow. Use fn_workflow_list to discover valid IDs. |
22
22
 
23
23
  ### fn_task_update
24
24
 
@@ -33,7 +33,7 @@ Update fields on an existing task. Supports modifying the title, description, de
33
33
  | `agentId` | union | — | Agent ID to assign this task to, or null to clear (e.g. 'agent-abc123') |
34
34
  | `nodeId` | union | — | Node ID override for this task, or null to clear |
35
35
  | `priority` | string(enum) | — | Task priority (low, normal, high, urgent) |
36
- | `workflow_id` | union | — | Workflow ID to select for this task (e.g. 'WF-003' or 'builtin:coding'), |
36
+ | `workflow_id` | union | — | Workflow ID to select for this task (e.g. 'WF-003' or 'builtin:coding'), or null to clear the workflow selection and revert to the project default. Use fn_workflow_list to discover valid IDs. |
37
37
 
38
38
  ### fn_task_list
39
39
 
@@ -63,7 +63,7 @@ Attach a file to a task. Supports images (png, jpg, gif, webp) and text files (t
63
63
 
64
64
  ### fn_task_pause
65
65
 
66
- Pause a task — stops all automated agent and scheduler interaction for this task.
66
+ Pause a task for explicit user-requested manual control — stops all automated agent and scheduler interaction. Agents should not pause tasks to handle failures or blockers; use retry, create/delegate follow-up work, or let the task surface as failed instead.
67
67
 
68
68
  | Parameter | Type | Required | Description |
69
69
  |-----------|------|----------|-------------|
@@ -136,6 +136,83 @@ Create a task via AI-guided planning mode — interactive conversation to refine
136
136
  | `description` | string | — | Initial plan description (optional) — the AI will ask clarifying questions if not provided |
137
137
  | `baseBranch` | string | — | Optional base branch for the task created from this planning session |
138
138
 
139
+ ## Workflow Tools
140
+
141
+ ### fn_workflow_list
142
+
143
+ List built-in and custom Fusion workflow definitions available in this project.
144
+
145
+ No parameters.
146
+
147
+ ### fn_workflow_get
148
+
149
+ Fetch a Fusion workflow definition by ID, including its resolved workflow IR.
150
+
151
+ | Parameter | Type | Required | Description |
152
+ |-----------|------|----------|-------------|
153
+ | `workflow_id` | string | ✓ | The workflow definition ID to fetch (e.g. 'WF-003', or a 'builtin:*' id). Use fn_workflow_list to discover available IDs. |
154
+
155
+ ### fn_workflow_create
156
+
157
+ Create a custom Fusion workflow definition from a validated workflow IR.
158
+
159
+ | Parameter | Type | Required | Description |
160
+ |-----------|------|----------|-------------|
161
+ | `name` | string | ✓ | Workflow name (required, non-empty). |
162
+ | `description` | string | — | Optional human-readable description. |
163
+ | `icon` | string | — | Optional compact plain-text icon for this custom workflow. |
164
+ | `ir` | unknown | ✓ | Workflow graph (intermediate representation). Validated server-side; a malformed graph is rejected. |
165
+ | `layout` | record | — | Optional node layout map keyed by node id. |
166
+ | `confirm_policy_escalation` | boolean | — | Set true to confirm binding a column to an agent whose permission policy is broader (more privileged) than the project default. Required when such a binding is present; the create is otherwise rejected naming the offending column. |
167
+
168
+ ### fn_workflow_update
169
+
170
+ Update a custom Fusion workflow definition's metadata, IR, or layout.
171
+
172
+ | Parameter | Type | Required | Description |
173
+ |-----------|------|----------|-------------|
174
+ | `workflow_id` | string | ✓ | The workflow definition ID to update (built-ins cannot be edited). |
175
+ | `name` | string | — | New name. |
176
+ | `description` | string | — | New description. |
177
+ | `icon` | string | — | New compact plain-text icon; blank clears it. |
178
+ | `ir` | unknown | — | Replacement workflow graph (validated server-side). |
179
+ | `layout` | record | — | Replacement node layout map. |
180
+ | `rehome_to` | string | — | When an IR update removes a column that still holds cards, supply the column id to re-home those occupants into. Required to resolve an OccupiedColumns conflict; the target must exist in the new IR. |
181
+ | `confirm_policy_escalation` | boolean | — | Set true to confirm binding a column to an agent whose permission policy is broader (more privileged) than the project default. Required when such a binding is present; the update is otherwise rejected naming the offending column. |
182
+
183
+ ### fn_workflow_delete
184
+
185
+ Delete a custom Fusion workflow definition; built-in workflows are protected.
186
+
187
+ | Parameter | Type | Required | Description |
188
+ |-----------|------|----------|-------------|
189
+ | `workflow_id` | string | ✓ | The workflow definition ID to delete (built-ins cannot be deleted). |
190
+
191
+ ### fn_workflow_settings
192
+
193
+ Read or write per-project values for a workflow's declared settings.
194
+
195
+ | Parameter | Type | Required | Description |
196
+ |-----------|------|----------|-------------|
197
+ | `action` | union | ✓ | `get` reads the stored setting VALUES plus the engine-effective values for the workflow; `set` writes values (requires `values`). |
198
+ | `workflow_id` | string | ✓ | The workflow whose setting VALUES to read/write (e.g. 'WF-003', or a 'builtin:*' id). Values are scoped per (workflow, project). Built-in workflow VALUES are writable even though built-in DECLARATIONS are not (declarations are edited via the workflow IR's `settings`). Values are validated against THIS workflow's declared settings (use fn_workflow_get to inspect them). |
199
+ | `values` | record | — | For action='set': a map of settingId → value to write. A `null` value DELETES the override (null-as-delete). Each value is validated against the named workflow's declaration; on ANY rejection (unknown-setting/type-mismatch/enum-violation/no-settings-defined) nothing is persisted and the typed rejection list is returned. |
200
+
201
+ ### fn_trait_list
202
+
203
+ List column traits available when authoring Fusion workflow IR columns.
204
+
205
+ No parameters.
206
+
207
+ ### fn_workflow_select
208
+
209
+ Assign a workflow definition to a task by workflow ID.
210
+
211
+ | Parameter | Type | Required | Description |
212
+ |-----------|------|----------|-------------|
213
+ | `workflow_id` | string | ✓ | The workflow definition ID to select (e.g. 'WF-003', or a 'builtin:*' id). Use fn_workflow_list to discover available IDs. |
214
+ | `task_id` | string | — | Task to assign the workflow to. Defaults to the current task. |
215
+
139
216
  ## GitHub Tools
140
217
 
141
218
  ### fn_task_import_github
@@ -456,8 +533,8 @@ Create a new task and assign it to a specific agent for execution. The task goes
456
533
  |-----------|------|----------|-------------|
457
534
  | `agent_id` | string | ✓ | The agent ID to delegate work to |
458
535
  | `description` | string | ✓ | What needs to be done |
459
- | `dependencies` | array | — | Task IDs this new task depends on (e.g. [\"KB-001\"] |
460
- | `workflow_id` | string | — | Workflow ID to select for the new task (e.g. 'WF-003' or 'builtin:coding'). |
536
+ | `dependencies` | array | — | Task IDs this new task depends on (e.g. ["KB-001"] |
537
+ | `workflow_id` | string | — | Workflow ID to select for the new task (e.g. 'WF-003' or 'builtin:coding'). Omit to inherit the project default workflow. Use fn_workflow_list to discover valid IDs. |
461
538
  | `override` | boolean | — | Set true to bypass executor-role assignment policy |
462
539
 
463
540
  ### fn_agent_show
@@ -12,12 +12,20 @@ All skill/extension tool invocations in this catalog use the public `fn_*` names
12
12
  <!-- BEGIN: fusion-capabilities-tool-table (auto-generated by scripts/sync-fusion-skill-tools.mjs — do not edit by hand) -->
13
13
  | Tool | Purpose |
14
14
  |------|---------|
15
+ | `fn_workflow_list` | List built-in and custom Fusion workflow definitions available in this project. |
16
+ | `fn_workflow_get` | Fetch a Fusion workflow definition by ID, including its resolved workflow IR. |
17
+ | `fn_workflow_create` | Create a custom Fusion workflow definition from a validated workflow IR. |
18
+ | `fn_workflow_update` | Update a custom Fusion workflow definition's metadata, IR, or layout. |
19
+ | `fn_workflow_delete` | Delete a custom Fusion workflow definition; built-in workflows are protected. |
20
+ | `fn_workflow_settings` | Read or write per-project values for a workflow's declared settings. |
21
+ | `fn_trait_list` | List column traits available when authoring Fusion workflow IR columns. |
22
+ | `fn_workflow_select` | Assign a workflow definition to a task by workflow ID. |
15
23
  | `fn_task_create` | Create a new task on the Fusion task board. The task enters the planning column where the AI planning agent will plan it into a full prompt with steps, file scope, and acceptance criteria. Optionally pass workflow_id to select a workflow at creation time; use fn_workflow_list to discover valid IDs. |
16
24
  | `fn_task_update` | Update fields on an existing task. Supports modifying the title, description, dependencies, assigned agent, priority, and workflow_id after task creation. Set workflow_id to a workflow ID to select it, or null to clear the workflow selection. |
17
25
  | `fn_task_list` | List all tasks on the Fusion board, grouped by column. |
18
26
  | `fn_task_show` | Show full details for a task including steps, progress, and log entries. |
19
27
  | `fn_task_attach` | Attach a file to a task. Supports images (png, jpg, gif, webp) and text files (txt, log, json, yaml, yml, toml, csv, xml). |
20
- | `fn_task_pause` | Pause a task — stops all automated agent and scheduler interaction for this task. |
28
+ | `fn_task_pause` | Pause a task for explicit user-requested manual control — stops all automated agent and scheduler interaction. Agents should not pause tasks to handle failures or blockers; use retry, create/delegate follow-up work, or let the task surface as failed instead. |
21
29
  | `fn_task_unpause` | Unpause a task — resumes automated agent and scheduler interaction. |
22
30
  | `fn_task_retry` | Retry a failed task — clears the error state. Non-review failures move to todo; in-review execution failures move to todo preserving progress; in-review merge failures stay in-place for auto-merge retry. |
23
31
  | `fn_task_duplicate` | Duplicate an existing task, creating a fresh copy in planning. Copies the title and description but resets all execution state. The AI planning agent will replan the new task. |
@@ -60,7 +60,7 @@ Use `fn_task_show` with the task ID:
60
60
 
61
61
  | Action | Tool | Notes |
62
62
  |--------|------|-------|
63
- | Pause automation | `fn_task_pause` | Stops scheduler and executor from touching the task |
63
+ | Pause automation | `fn_task_pause` | Stops scheduler and executor from touching the task; use only when the user explicitly requests manual control, not for failure/blocker handling |
64
64
  | Resume automation | `fn_task_unpause` | Re-enables automated processing |
65
65
  | Retry failed task | `fn_task_retry` | Clears error, moves back to todo |
66
66
  | Duplicate task | `fn_task_duplicate` | Creates fresh copy in triage |