@runfusion/fusion 0.58.0 → 0.60.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 (148) hide show
  1. package/README.md +2 -3
  2. package/dist/bin.js +16034 -13546
  3. package/dist/client/.vite/manifest.json +251 -248
  4. package/dist/client/assets/AgentDetailView-BBjuuYbU.js +18 -0
  5. package/dist/client/assets/{AgentPermissionPolicyEditor-3x5cc2cp.js → AgentPermissionPolicyEditor-DOdy1ln0.js} +1 -1
  6. package/dist/client/assets/{AgentsView-B77vHi_7.js → AgentsView-DlyT08sc.js} +4 -4
  7. package/dist/client/assets/ChatView-CJBnc6rJ.js +6 -0
  8. package/dist/client/assets/CommandCenter-BhRLZmOH.js +99 -0
  9. package/dist/client/assets/CommandCenter-DSrIaOro.css +1 -0
  10. package/dist/client/assets/{DevServerView-BXmkO05R.js → DevServerView-DRpi8Xqz.js} +1 -1
  11. package/dist/client/assets/{DirectoryPicker-CZ3EXSE5.js → DirectoryPicker-Bw_A-64N.js} +1 -1
  12. package/dist/client/assets/{DocumentsView-BSWFgTsC.css → DocumentsView-BSC7wh2B.css} +1 -1
  13. package/dist/client/assets/{DocumentsView-GlAyW64J.js → DocumentsView-w0eDbpbG.js} +2 -2
  14. package/dist/client/assets/{EvalsView-BLmcsNNf.js → EvalsView-DxQALLwD.js} +1 -1
  15. package/dist/client/assets/ExperimentalAgentOnboardingModal-BuEWZrjl.js +1 -0
  16. package/dist/client/assets/{GoalsView-BRfZ4qGe.js → GoalsView-C3MGEtSt.js} +1 -1
  17. package/dist/client/assets/InsightsView-C0-BkE8_.js +11 -0
  18. package/dist/client/assets/{MemoryView-ChkuBpUf.js → MemoryView-Dd8uiLHH.js} +2 -2
  19. package/dist/client/assets/{PiExtensionsManager-DXwQdB7b.js → PiExtensionsManager-DlsEVOjG.js} +1 -1
  20. package/dist/client/assets/{PluginManager-B8zAjhqf.js → PluginManager-Cf9AOCcC.js} +1 -1
  21. package/dist/client/assets/{PullRequestView-DL1E1ixh.js → PullRequestView-hm77QtHV.js} +2 -2
  22. package/dist/client/assets/{ResearchView-BCYCHiyQ.js → ResearchView-BMQEnYH6.js} +1 -1
  23. package/dist/client/assets/SecretsView-Dc3sWf40.js +1 -0
  24. package/dist/client/assets/{SessionTerminal-BvK8A98c.css → SessionTerminal-CDTiqrd7.css} +1 -1
  25. package/dist/client/assets/SessionTerminal-CEv1G-9-.js +2 -0
  26. package/dist/client/assets/SettingsModal-DFrTDsBm.js +21 -0
  27. package/dist/client/assets/{SettingsModal-U7ma-5OU.js → SettingsModal-TuphE_CP.js} +1 -1
  28. package/dist/client/assets/{SetupWizardModal-BCDoA33s.js → SetupWizardModal-CNGogJJp.js} +2 -2
  29. package/dist/client/assets/{ShadcnColorPicker-EVU2cXpo.js → ShadcnColorPicker-1Z7JIWTE.js} +2 -2
  30. package/dist/client/assets/{SkillsView-V48VsthB.js → SkillsView-CjPvmnz6.js} +1 -1
  31. package/dist/client/assets/TodoView-CUD4xw3T.css +1 -0
  32. package/dist/client/assets/TodoView-DmJPSWOu.js +6 -0
  33. package/dist/client/assets/WorkflowNodeEditor-BqO2yRXe.js +8 -0
  34. package/dist/client/assets/{agentSkills-B-QDeW2q.js → agentSkills-BNahUMFe.js} +1 -1
  35. package/dist/client/assets/app-BzgEwAOr.js +13 -0
  36. package/dist/client/assets/{app-RIK4I745.js → app-C7eDKtXM.js} +3 -3
  37. package/dist/client/assets/{app-SHNioZxk.js → app-CL1Ik1qS.js} +3 -3
  38. package/dist/client/assets/{app-De_pkbYi.js → app-Ckb9wA3K.js} +3 -3
  39. package/dist/client/assets/{app-cZgmPvs6.js → app-Den3D7oy.js} +3 -3
  40. package/dist/client/assets/{app--U62_ZWS.js → app-nAsTBQMW.js} +3 -3
  41. package/dist/client/assets/{architectureDiagram-3BPJPVTR-DvR35aCH.js → architectureDiagram-3BPJPVTR-Bb_ZGdtz.js} +1 -1
  42. package/dist/client/assets/{blockDiagram-GPEHLZMM-ciQdpSqc.js → blockDiagram-GPEHLZMM-CWfWJnIM.js} +1 -1
  43. package/dist/client/assets/{c4Diagram-AAUBKEIU-CV0Z6UEL.js → c4Diagram-AAUBKEIU-Dufe_2hy.js} +1 -1
  44. package/dist/client/assets/channel-BYHFEnHT.js +1 -0
  45. package/dist/client/assets/{chunk-2J33WTMH-CkAQRX3g.js → chunk-2J33WTMH-BdKWX3Y7.js} +1 -1
  46. package/dist/client/assets/{chunk-4BX2VUAB-CJXvYVcN.js → chunk-4BX2VUAB-CQ9_zgu6.js} +1 -1
  47. package/dist/client/assets/{chunk-55IACEB6-DOv0lN1u.js → chunk-55IACEB6-DEFTCISD.js} +1 -1
  48. package/dist/client/assets/{chunk-727SXJPM-tRsHXz7i.js → chunk-727SXJPM-8RnJp1fx.js} +1 -1
  49. package/dist/client/assets/{chunk-AQP2D5EJ-CfzOMXn9.js → chunk-AQP2D5EJ-DJg6awe1.js} +1 -1
  50. package/dist/client/assets/{chunk-FMBD7UC4-BKvUZ2cn.js → chunk-FMBD7UC4-Bw-OImRT.js} +1 -1
  51. package/dist/client/assets/{chunk-ND2GUHAM-FqiVnW7u.js → chunk-ND2GUHAM-BSx9p0RO.js} +1 -1
  52. package/dist/client/assets/{chunk-QZHKN3VN-BAJDyCpZ.js → chunk-QZHKN3VN-Dbdv72P6.js} +1 -1
  53. package/dist/client/assets/classDiagram-4FO5ZUOK-BLstvJ1W.js +1 -0
  54. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BLstvJ1W.js +1 -0
  55. package/dist/client/assets/{cose-bilkent-S5V4N54A-DYizdcNp.js → cose-bilkent-S5V4N54A-CXtcC6U2.js} +1 -1
  56. package/dist/client/assets/{dagre-BM42HDAG-BDWwvXJx.js → dagre-BM42HDAG-BO0r4g14.js} +1 -1
  57. package/dist/client/assets/{dashboard-view-DmfIFCV-.js → dashboard-view-BTnVGch5.js} +1 -1
  58. package/dist/client/assets/{dashboard-view-BYn_jRw9.js → dashboard-view-CoDeYJbQ.js} +1 -1
  59. package/dist/client/assets/{diagram-2AECGRRQ-C8ic2E9q.js → diagram-2AECGRRQ-CLmeU2g6.js} +1 -1
  60. package/dist/client/assets/{diagram-5GNKFQAL-H5IDcv9E.js → diagram-5GNKFQAL-CKyM23Jy.js} +1 -1
  61. package/dist/client/assets/{diagram-KO2AKTUF-DkczJXd6.js → diagram-KO2AKTUF-ByeVRDs_.js} +1 -1
  62. package/dist/client/assets/{diagram-LMA3HP47-P1vh7RIU.js → diagram-LMA3HP47-r8qKTJDn.js} +1 -1
  63. package/dist/client/assets/{diagram-OG6HWLK6-CgeybA5t.js → diagram-OG6HWLK6-D2ugPdm7.js} +1 -1
  64. package/dist/client/assets/{erDiagram-TEJ5UH35-DSJa4zRQ.js → erDiagram-TEJ5UH35-dLzbDn0G.js} +1 -1
  65. package/dist/client/assets/{flowDiagram-I6XJVG4X-DG91ZWS9.js → flowDiagram-I6XJVG4X-et7EENd6.js} +1 -1
  66. package/dist/client/assets/{folder-open-iGyAYoN-.js → folder-open-BVtcjVIK.js} +1 -1
  67. package/dist/client/assets/{ganttDiagram-6RSMTGT7-dkOQjOK8.js → ganttDiagram-6RSMTGT7-DmiabChP.js} +1 -1
  68. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-GqrJtmDT.js → gitGraphDiagram-PVQCEYII-I1vbhqer.js} +1 -1
  69. package/dist/client/assets/index-C2HFa2A-.css +1 -0
  70. package/dist/client/assets/index-inWk2g6R.js +2540 -0
  71. package/dist/client/assets/{infoDiagram-5YYISTIA-BfFhhqbU.js → infoDiagram-5YYISTIA-xd6L9Gq3.js} +1 -1
  72. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-DBBV-PIS.js → ishikawaDiagram-YF4QCWOH-fUeEYBvD.js} +1 -1
  73. package/dist/client/assets/{journeyDiagram-JHISSGLW-xZisXOgZ.js → journeyDiagram-JHISSGLW-B7xjU8Oh.js} +1 -1
  74. package/dist/client/assets/{kanban-definition-UN3LZRKU-CbOJloOw.js → kanban-definition-UN3LZRKU-CJ8oRjFI.js} +1 -1
  75. package/dist/client/assets/{mermaid.core-DKBiVV3q.js → mermaid.core-2udKsaH3.js} +4 -4
  76. package/dist/client/assets/{mindmap-definition-RKZ34NQL-Bf9V63ac.js → mindmap-definition-RKZ34NQL-CVywzN7Q.js} +1 -1
  77. package/dist/client/assets/{pieDiagram-4H26LBE5-0ukMaTVl.js → pieDiagram-4H26LBE5-8vzzC4Mg.js} +1 -1
  78. package/dist/client/assets/{puzzle-BvEf9PLH.js → puzzle-D60d3Nv1.js} +1 -1
  79. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-CwXZAtYI.js → quadrantDiagram-W4KKPZXB-Cxyb4Mom.js} +1 -1
  80. package/dist/client/assets/{requirementDiagram-4Y6WPE33-DVsu9t-w.js → requirementDiagram-4Y6WPE33-Bs5RaG7r.js} +1 -1
  81. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-DOJUnv7J.js → sankeyDiagram-5OEKKPKP-Jf7Zq43D.js} +1 -1
  82. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-B67g0g9m.js → sequenceDiagram-3UESZ5HK-CG0I780H.js} +1 -1
  83. package/dist/client/assets/{shield-alert-4FPCIFZ2.js → shield-alert-B7JyuWPR.js} +1 -1
  84. package/dist/client/assets/{stateDiagram-AJRCARHV-CPPa0bHh.js → stateDiagram-AJRCARHV-C1c5XtKG.js} +1 -1
  85. package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-Dyj14elw.js → stateDiagram-v2-BHNVJYJU-Cv7_pOt_.js} +1 -1
  86. package/dist/client/assets/{timeline-definition-PNZ67QCA-UVWf2E8M.js → timeline-definition-PNZ67QCA-BWg-lsI0.js} +1 -1
  87. package/dist/client/assets/{upload-BkgVjwwc.js → upload-Dxv5FPaS.js} +1 -1
  88. package/dist/client/assets/{users-9nCT4liw.js → users-DvKg3opr.js} +1 -1
  89. package/dist/client/assets/{vennDiagram-CIIHVFJN-CqGrv1wQ.js → vennDiagram-CIIHVFJN-gFjFmLlv.js} +1 -1
  90. package/dist/client/assets/{wardley-L42UT6IY-aA0pos_F.js → wardley-L42UT6IY-BaCNX8ou.js} +1 -1
  91. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-C-O5tD1L.js → wardleyDiagram-YWT4CUSO-BRR6aw0q.js} +1 -1
  92. package/dist/client/assets/{xychartDiagram-2RQKCTM6-qoIF674C.js → xychartDiagram-2RQKCTM6-D6Gwn1XW.js} +1 -1
  93. package/dist/client/index.html +2 -2
  94. package/dist/client/version.json +1 -1
  95. package/dist/droid-cli/package.json +1 -1
  96. package/dist/extension.js +14159 -12709
  97. package/dist/pi-claude-cli/package.json +1 -1
  98. package/dist/plugin-sdk/index.d.ts +27 -1
  99. package/dist/plugins/fusion-plugin-acp-runtime/bundled.js +4 -7
  100. package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
  101. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  102. package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +0 -5
  103. package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
  104. package/dist/plugins/fusion-plugin-cursor-runtime/bundled.js +0 -5
  105. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  106. package/dist/plugins/fusion-plugin-dependency-graph/bundled.js +0 -5
  107. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  108. package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +0 -5
  109. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  110. package/dist/plugins/fusion-plugin-grok-runtime/bundled.js +4 -7
  111. package/dist/plugins/fusion-plugin-grok-runtime/package.json +1 -1
  112. package/dist/plugins/fusion-plugin-hermes-runtime/bundled.js +0 -5
  113. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  114. package/dist/plugins/fusion-plugin-linear-import/bundled.js +0 -5
  115. package/dist/plugins/fusion-plugin-linear-import/package.json +1 -1
  116. package/dist/plugins/fusion-plugin-openclaw-runtime/bundled.js +0 -5
  117. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  118. package/dist/plugins/fusion-plugin-paperclip-runtime/bundled.js +0 -5
  119. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  120. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  121. package/dist/plugins/fusion-plugin-reports/src/dashboard/components/ShareBlocksPanel.tsx +4 -1
  122. package/dist/plugins/fusion-plugin-reports/src/dashboard/components/__tests__/ShareBlocksPanel.test.tsx +41 -2
  123. package/dist/plugins/fusion-plugin-roadmap/bundled.js +0 -5
  124. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  125. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  126. package/package.json +1 -1
  127. package/skill/fusion/SKILL.md +1 -1
  128. package/skill/fusion/references/engine-tools.md +1 -0
  129. package/skill/fusion/references/extension-tools.md +10 -0
  130. package/skill/fusion/references/fusion-capabilities.md +1 -0
  131. package/dist/client/assets/AgentDetailView-whCXABbu.js +0 -18
  132. package/dist/client/assets/ChatView-CninsTIm.js +0 -6
  133. package/dist/client/assets/CommandCenter-B9q-zM9p.css +0 -1
  134. package/dist/client/assets/CommandCenter-C6LmdUin.js +0 -71
  135. package/dist/client/assets/ExperimentalAgentOnboardingModal-DvDix9pH.js +0 -1
  136. package/dist/client/assets/InsightsView-X4RlcgrU.js +0 -11
  137. package/dist/client/assets/SecretsView-B48BIZKw.js +0 -1
  138. package/dist/client/assets/SessionTerminal-CUyYlq16.js +0 -2
  139. package/dist/client/assets/SettingsModal-DbjBoUYD.js +0 -21
  140. package/dist/client/assets/TodoView-DmpJmxu7.css +0 -1
  141. package/dist/client/assets/TodoView-MZ9Pfl65.js +0 -6
  142. package/dist/client/assets/WorkflowNodeEditor-B95Dvf-O.js +0 -8
  143. package/dist/client/assets/app-SucmTDhV.js +0 -13
  144. package/dist/client/assets/channel-Y_Uhrtqx.js +0 -1
  145. package/dist/client/assets/classDiagram-4FO5ZUOK-DhicwSPE.js +0 -1
  146. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DhicwSPE.js +0 -1
  147. package/dist/client/assets/index-Bg8SMXUs.css +0 -1
  148. package/dist/client/assets/index-DO9Ch72Y.js +0 -2544
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion/pi-claude-cli",
3
- "version": "0.58.0",
3
+ "version": "0.60.0",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "main": "index.ts",
@@ -1079,6 +1079,7 @@ interface PluginUpdateInput {
1079
1079
  homepage?: string;
1080
1080
  path?: string;
1081
1081
  dependencies?: string[];
1082
+ settingsSchema?: Record<string, PluginSettingSchema> | null;
1082
1083
  aiScanOnLoad?: boolean;
1083
1084
  lastSecurityScan?: PluginSecurityScanResult;
1084
1085
  }
@@ -2604,6 +2605,7 @@ interface MoveTaskOptions {
2604
2605
  preserveProgress?: boolean;
2605
2606
  preserveWorktree?: boolean;
2606
2607
  preserveStatus?: boolean;
2608
+ preservePause?: boolean;
2607
2609
  allocateWorktree?: (reservedNames: Set<string>) => string | null;
2608
2610
  moveSource?: "user" | "engine" | "scheduler";
2609
2611
  workflowMoveActor?: WorkflowMovePolicyInput["actor"];
@@ -2961,7 +2963,7 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
2961
2963
  checkoutRunId: string | null;
2962
2964
  checkoutLeaseRenewedAt: string;
2963
2965
  }): Promise<Task>;
2964
- selectNextTaskForAgent(agentId: string, agent?: Pick<Agent, "id" | "role">): Promise<InboxTask | null>;
2966
+ selectNextTaskForAgent(agentId: string, agent?: Pick<Agent, "id" | "role"> & Partial<Pick<Agent, "runtimeConfig">>): Promise<InboxTask | null>;
2965
2967
  private areAllDependenciesDone;
2966
2968
  private readTaskForMove;
2967
2969
  moveTask(id: string, toColumn: ColumnId, options?: MoveTaskOptions): Promise<Task>;
@@ -3030,9 +3032,11 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
3030
3032
  workflowStepRetries?: number;
3031
3033
  stuckKillCount?: number | null;
3032
3034
  resumeLimboCount?: number | null;
3035
+ executeRequeueLoopCount?: number | null;
3033
3036
  graphResumeRetryCount?: number | null;
3034
3037
  resumeLimboTipSha?: string | null;
3035
3038
  resumeLimboStepSignature?: string | null;
3039
+ executeRequeueLoopSignature?: string | null;
3036
3040
  postReviewFixCount?: number | null;
3037
3041
  recoveryRetryCount?: number | null;
3038
3042
  taskDoneRetryCount?: number | null;
@@ -3055,6 +3059,8 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
3055
3059
  planningModelProvider?: string | null;
3056
3060
  planningModelId?: string | null;
3057
3061
  thinkingLevel?: string | null;
3062
+ validatorThinkingLevel?: string | null;
3063
+ planningThinkingLevel?: string | null;
3058
3064
  error?: string | null;
3059
3065
  summary?: string | null;
3060
3066
  sessionFile?: string | null;
@@ -3419,6 +3425,7 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
3419
3425
  consumePluginGateVerdicts(taskId: string, toColumn: string): PluginGateVerdict[];
3420
3426
  private resolveTaskCustomFieldDefsSync;
3421
3427
  private resolveTaskWorkflowIrSync;
3428
+ private resolveWorkflowIrByIdSync;
3422
3429
  private resolveEffectiveWorkflowIdSync;
3423
3430
  private countActiveInCapacitySlotSync;
3424
3431
  private countActiveExecutionWorktreeHoldersSync;
@@ -5298,9 +5305,11 @@ interface Task {
5298
5305
  workflowStepRetries?: number;
5299
5306
  stuckKillCount?: number;
5300
5307
  resumeLimboCount?: number;
5308
+ executeRequeueLoopCount?: number;
5301
5309
  graphResumeRetryCount?: number | null;
5302
5310
  resumeLimboTipSha?: string;
5303
5311
  resumeLimboStepSignature?: string;
5312
+ executeRequeueLoopSignature?: string;
5304
5313
  postReviewFixCount?: number;
5305
5314
  recoveryRetryCount?: number;
5306
5315
  taskDoneRetryCount?: number;
@@ -5318,6 +5327,8 @@ interface Task {
5318
5327
  awaitingApprovalReason?: "release-authorization";
5319
5328
  approvedPlanFingerprint?: string;
5320
5329
  thinkingLevel?: ThinkingLevel;
5330
+ validatorThinkingLevel?: ThinkingLevel;
5331
+ planningThinkingLevel?: ThinkingLevel;
5321
5332
  executionMode?: ExecutionMode;
5322
5333
  plannerOversightLevel?: PlannerOversightLevel;
5323
5334
  plannerOverseerState?: PlannerOverseerRuntimeSnapshot;
@@ -5405,6 +5416,8 @@ interface TaskCreateInput {
5405
5416
  planningModelProvider?: string;
5406
5417
  planningModelId?: string;
5407
5418
  thinkingLevel?: ThinkingLevel;
5419
+ validatorThinkingLevel?: ThinkingLevel;
5420
+ planningThinkingLevel?: ThinkingLevel;
5408
5421
  summarize?: boolean;
5409
5422
  missionId?: string;
5410
5423
  sliceId?: string;
@@ -5657,10 +5670,13 @@ interface GlobalSettings {
5657
5670
  validatorGlobalModelId?: string;
5658
5671
  titleSummarizerGlobalProvider?: string;
5659
5672
  titleSummarizerGlobalModelId?: string;
5673
+ mergerGlobalProvider?: string;
5674
+ mergerGlobalModelId?: string;
5660
5675
  executionGlobalThinkingLevel?: ThinkingLevel;
5661
5676
  planningGlobalThinkingLevel?: ThinkingLevel;
5662
5677
  validatorGlobalThinkingLevel?: ThinkingLevel;
5663
5678
  titleSummarizerGlobalThinkingLevel?: ThinkingLevel;
5679
+ mergerGlobalThinkingLevel?: ThinkingLevel;
5664
5680
  daemonToken?: string;
5665
5681
  daemonPort?: number;
5666
5682
  daemonHost?: string;
@@ -5817,6 +5833,7 @@ interface ProjectSettings {
5817
5833
  showWorktreeGrouping?: boolean;
5818
5834
  openTasksInRightSidebar?: boolean;
5819
5835
  openMobileTasksInPopup?: boolean;
5836
+ taskPopupsBoardListOnly?: boolean;
5820
5837
  showCostBadgeOnCards?: boolean;
5821
5838
  taskDetailChatFirst?: boolean;
5822
5839
  executorAllowSiblingBranchRename?: boolean;
@@ -5838,6 +5855,12 @@ interface ProjectSettings {
5838
5855
  defaultProviderOverride?: string;
5839
5856
  defaultModelIdOverride?: string;
5840
5857
  defaultThinkingLevelOverride?: ThinkingLevel;
5858
+ chatNewSessionMode?: "prompt" | "always-default";
5859
+ chatDefaultKind?: "model" | "agent";
5860
+ chatDefaultAgentId?: string;
5861
+ chatDefaultModelProvider?: string;
5862
+ chatDefaultModelId?: string;
5863
+ chatDefaultThinkingLevel?: ThinkingLevel;
5841
5864
  executionProvider?: string;
5842
5865
  executionModelId?: string;
5843
5866
  executionThinkingLevel?: ThinkingLevel;
@@ -5992,6 +6015,9 @@ interface ProjectSettings {
5992
6015
  titleSummarizerProvider?: string;
5993
6016
  titleSummarizerModelId?: string;
5994
6017
  titleSummarizerThinkingLevel?: ThinkingLevel;
6018
+ mergerProvider?: string;
6019
+ mergerModelId?: string;
6020
+ mergerThinkingLevel?: ThinkingLevel;
5995
6021
  titleSummarizerFallbackProvider?: string;
5996
6022
  titleSummarizerFallbackModelId?: string;
5997
6023
  titleSummarizerFallbackThinkingLevel?: ThinkingLevel;
@@ -5,11 +5,6 @@ var __export = (target, all) => {
5
5
  };
6
6
 
7
7
  // ../plugin-sdk/src/index.ts
8
- import {
9
- WORKFLOW_EXTENSION_SCHEMA_VERSION,
10
- workflowExtensionRegistryId,
11
- createBoardActionServices
12
- } from "@fusion/core";
13
8
  function definePlugin(plugin2) {
14
9
  return plugin2;
15
10
  }
@@ -16349,7 +16344,6 @@ var RequestError = class _RequestError extends Error {
16349
16344
 
16350
16345
  // ../../plugins/fusion-plugin-acp-runtime/src/process-manager.ts
16351
16346
  import { spawn } from "node:child_process";
16352
- import { redactSecrets } from "@fusion/core";
16353
16347
  function debugLog(message) {
16354
16348
  if (process.env.PI_ACP_DEBUG !== "1") return;
16355
16349
  console.error(`[acp-runtime] ${message}`);
@@ -17305,7 +17299,10 @@ function extractPromptImagesFromOptions(options) {
17305
17299
  const data = typeof rec.data === "string" ? rec.data : void 0;
17306
17300
  const mimeType = typeof rec.mimeType === "string" ? rec.mimeType : void 0;
17307
17301
  if (!data || !mimeType || data.length === 0 || mimeType.length === 0) continue;
17308
- const uri = typeof rec.uri === "string" && rec.uri.length > 0 ? rec.uri : void 0;
17302
+ let uri = typeof rec.uri === "string" && rec.uri.length > 0 ? rec.uri : void 0;
17303
+ if (!uri && typeof rec.path === "string" && rec.path.length > 0) {
17304
+ uri = rec.path.startsWith("file:") ? rec.path : `file://${rec.path}`;
17305
+ }
17309
17306
  images.push({ data, mimeType, ...uri ? { uri } : {} });
17310
17307
  }
17311
17308
  return images.length > 0 ? images : void 0;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/acp-runtime",
3
- "version": "0.1.23",
3
+ "version": "0.1.25",
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.40",
3
+ "version": "0.1.42",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "exports": {
@@ -1,9 +1,4 @@
1
1
  // ../plugin-sdk/src/index.ts
2
- import {
3
- WORKFLOW_EXTENSION_SCHEMA_VERSION,
4
- workflowExtensionRegistryId,
5
- createBoardActionServices
6
- } from "@fusion/core";
7
2
  function definePlugin(plugin2) {
8
3
  return plugin2;
9
4
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/compound-engineering",
3
- "version": "0.1.23",
3
+ "version": "0.1.25",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,9 +1,4 @@
1
1
  // ../plugin-sdk/src/index.ts
2
- import {
3
- WORKFLOW_EXTENSION_SCHEMA_VERSION,
4
- workflowExtensionRegistryId,
5
- createBoardActionServices
6
- } from "@fusion/core";
7
2
  function definePlugin(plugin2) {
8
3
  return plugin2;
9
4
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/cursor-runtime",
3
- "version": "0.1.42",
3
+ "version": "0.1.44",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,9 +1,4 @@
1
1
  // ../plugin-sdk/src/index.ts
2
- import {
3
- WORKFLOW_EXTENSION_SCHEMA_VERSION,
4
- workflowExtensionRegistryId,
5
- createBoardActionServices
6
- } from "@fusion/core";
7
2
  function definePlugin(plugin2) {
8
3
  return plugin2;
9
4
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/dependency-graph",
3
- "version": "0.1.54",
3
+ "version": "0.1.56",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -129072,11 +129072,6 @@ var init_openai_responses = __esm({
129072
129072
  });
129073
129073
 
129074
129074
  // ../plugin-sdk/src/index.ts
129075
- import {
129076
- WORKFLOW_EXTENSION_SCHEMA_VERSION,
129077
- workflowExtensionRegistryId,
129078
- createBoardActionServices
129079
- } from "@fusion/core";
129080
129075
  function definePlugin(plugin2) {
129081
129076
  return plugin2;
129082
129077
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/droid-runtime",
3
- "version": "0.1.49",
3
+ "version": "0.1.51",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -5,11 +5,6 @@ var __export = (target, all) => {
5
5
  };
6
6
 
7
7
  // ../plugin-sdk/src/index.ts
8
- import {
9
- WORKFLOW_EXTENSION_SCHEMA_VERSION,
10
- workflowExtensionRegistryId,
11
- createBoardActionServices
12
- } from "@fusion/core";
13
8
  function definePlugin(plugin2) {
14
9
  return plugin2;
15
10
  }
@@ -16337,7 +16332,6 @@ var RequestError = class _RequestError extends Error {
16337
16332
 
16338
16333
  // ../../plugins/fusion-plugin-grok-runtime/src/acp/process-manager.ts
16339
16334
  import { spawn } from "node:child_process";
16340
- import { redactSecrets } from "@fusion/core";
16341
16335
  function debugLog(message) {
16342
16336
  if (process.env.PI_ACP_DEBUG !== "1" && process.env.FUSION_GROK_ACP_DEBUG !== "1") return;
16343
16337
  console.error(`[grok-acp] ${message}`);
@@ -17293,7 +17287,10 @@ function extractPromptImagesFromOptions(options) {
17293
17287
  const data = typeof rec.data === "string" ? rec.data : void 0;
17294
17288
  const mimeType = typeof rec.mimeType === "string" ? rec.mimeType : void 0;
17295
17289
  if (!data || !mimeType || data.length === 0 || mimeType.length === 0) continue;
17296
- const uri = typeof rec.uri === "string" && rec.uri.length > 0 ? rec.uri : void 0;
17290
+ let uri = typeof rec.uri === "string" && rec.uri.length > 0 ? rec.uri : void 0;
17291
+ if (!uri && typeof rec.path === "string" && rec.path.length > 0) {
17292
+ uri = rec.path.startsWith("file:") ? rec.path : `file://${rec.path}`;
17293
+ }
17297
17294
  images.push({ data, mimeType, ...uri ? { uri } : {} });
17298
17295
  }
17299
17296
  return images.length > 0 ? images : void 0;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/grok-runtime",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,9 +1,4 @@
1
1
  // ../plugin-sdk/src/index.ts
2
- import {
3
- WORKFLOW_EXTENSION_SCHEMA_VERSION,
4
- workflowExtensionRegistryId,
5
- createBoardActionServices
6
- } from "@fusion/core";
7
2
  function definePlugin(plugin2) {
8
3
  return plugin2;
9
4
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/hermes-runtime",
3
- "version": "0.2.73",
3
+ "version": "0.2.75",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,9 +1,4 @@
1
1
  // ../plugin-sdk/src/index.ts
2
- import {
3
- WORKFLOW_EXTENSION_SCHEMA_VERSION,
4
- workflowExtensionRegistryId,
5
- createBoardActionServices
6
- } from "@fusion/core";
7
2
  function definePlugin(plugin2) {
8
3
  return plugin2;
9
4
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/linear-import",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,9 +1,4 @@
1
1
  // ../plugin-sdk/src/index.ts
2
- import {
3
- WORKFLOW_EXTENSION_SCHEMA_VERSION,
4
- workflowExtensionRegistryId,
5
- createBoardActionServices
6
- } from "@fusion/core";
7
2
  function definePlugin(plugin2) {
8
3
  return plugin2;
9
4
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/openclaw-runtime",
3
- "version": "0.2.73",
3
+ "version": "0.2.75",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,9 +1,4 @@
1
1
  // ../plugin-sdk/src/index.ts
2
- import {
3
- WORKFLOW_EXTENSION_SCHEMA_VERSION,
4
- workflowExtensionRegistryId,
5
- createBoardActionServices
6
- } from "@fusion/core";
7
2
  function definePlugin(plugin2) {
8
3
  return plugin2;
9
4
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/paperclip-runtime",
3
- "version": "0.2.73",
3
+ "version": "0.2.75",
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.42",
3
+ "version": "0.1.44",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "exports": {
@@ -1,4 +1,5 @@
1
1
  import { useEffect, useState } from "react";
2
+ import { copyTextToClipboard } from "@fusion/dashboard/app/utils/copyToClipboard";
2
3
  import { getShareBlocks } from "../api.js";
3
4
  import type { ReportRecord } from "../types.js";
4
5
  import type { ShareBlocks } from "../../share-blocks.js";
@@ -35,7 +36,9 @@ export function ShareBlocksPanel({ report }: { report: ReportRecord }) {
35
36
  </div>
36
37
  <textarea className="input share-blocks-panel__content" readOnly value={value} />
37
38
  <button className="btn btn-sm" onClick={async () => {
38
- await navigator.clipboard.writeText(value);
39
+ /* FNXC:Clipboard 2026-07-12-00:00: Direct navigator.clipboard.writeText crashes or mis-reports on non-secure origins such as mobile http://fusionstudio:4040; copyTextToClipboard centralizes the secure-context guard and execCommand fallback. */
40
+ const copiedToClipboard = await copyTextToClipboard(value);
41
+ if (!copiedToClipboard) return;
39
42
  setCopied(true);
40
43
  setTimeout(() => setCopied(false), 1000);
41
44
  }}>{copied ? "Copied" : "Copy"}</button>
@@ -1,14 +1,23 @@
1
1
  import { fireEvent, render, screen, waitFor } from "@testing-library/react";
2
- import { describe, expect, it, vi } from "vitest";
2
+ import { afterEach, describe, expect, it, vi } from "vitest";
3
3
  import { ShareBlocksPanel } from "../ShareBlocksPanel.js";
4
4
 
5
+ const originalClipboard = navigator.clipboard;
6
+ const originalExecCommand = document.execCommand;
7
+
5
8
  const getShareBlocks = vi.fn();
6
9
  vi.mock("../../api.js", () => ({ getShareBlocks: (...args: unknown[]) => getShareBlocks(...args) }));
7
10
 
8
11
  describe("ShareBlocksPanel", () => {
12
+ afterEach(() => {
13
+ Object.defineProperty(navigator, "clipboard", { configurable: true, value: originalClipboard });
14
+ Object.defineProperty(document, "execCommand", { configurable: true, value: originalExecCommand });
15
+ getShareBlocks.mockReset();
16
+ });
17
+
9
18
  it("renders tabs and copies selected block", async () => {
10
19
  getShareBlocks.mockResolvedValue({ plainText: "a", markdown: "b", slack: "c", emailHtml: "d" });
11
- Object.assign(navigator, { clipboard: { writeText: vi.fn().mockResolvedValue(undefined) } });
20
+ Object.defineProperty(navigator, "clipboard", { configurable: true, value: { writeText: vi.fn().mockResolvedValue(undefined) } });
12
21
  render(<ShareBlocksPanel report={{ id: "rep_1" } as any} />);
13
22
  await screen.findByText("Plain Text");
14
23
  fireEvent.click(screen.getByText("Markdown"));
@@ -16,6 +25,36 @@ describe("ShareBlocksPanel", () => {
16
25
  await waitFor(() => expect(navigator.clipboard.writeText).toHaveBeenCalledWith("b"));
17
26
  });
18
27
 
28
+ it("copies selected block through execCommand when Clipboard API is unavailable", async () => {
29
+ getShareBlocks.mockResolvedValue({ plainText: "a", markdown: "b", slack: "c", emailHtml: "d" });
30
+ const execCommand = vi.fn().mockReturnValue(true);
31
+ Object.defineProperty(navigator, "clipboard", { configurable: true, value: undefined });
32
+ Object.defineProperty(document, "execCommand", { configurable: true, value: execCommand });
33
+
34
+ render(<ShareBlocksPanel report={{ id: "rep_1" } as any} />);
35
+ await screen.findByText("Plain Text");
36
+ fireEvent.click(screen.getByText("Markdown"));
37
+ fireEvent.click(screen.getByText("Copy"));
38
+
39
+ await waitFor(() => expect(execCommand).toHaveBeenCalledWith("copy"));
40
+ expect(screen.getByText("Copied")).toBeInTheDocument();
41
+ });
42
+
43
+ it("does not show copied when both clipboard paths fail", async () => {
44
+ getShareBlocks.mockResolvedValue({ plainText: "a", markdown: "b", slack: "c", emailHtml: "d" });
45
+ const execCommand = vi.fn().mockReturnValue(false);
46
+ Object.defineProperty(navigator, "clipboard", { configurable: true, value: undefined });
47
+ Object.defineProperty(document, "execCommand", { configurable: true, value: execCommand });
48
+
49
+ render(<ShareBlocksPanel report={{ id: "rep_1" } as any} />);
50
+ await screen.findByText("Plain Text");
51
+ fireEvent.click(screen.getByText("Copy"));
52
+
53
+ await waitFor(() => expect(execCommand).toHaveBeenCalledWith("copy"));
54
+ expect(screen.getByText("Copy")).toBeInTheDocument();
55
+ expect(screen.queryByText("Copied")).not.toBeInTheDocument();
56
+ });
57
+
19
58
  it("shows locked message on 409", async () => {
20
59
  getShareBlocks.mockRejectedValue(new Error("409 Conflict"));
21
60
  render(<ShareBlocksPanel report={{ id: "rep_1" } as any} />);
@@ -1,9 +1,4 @@
1
1
  // ../plugin-sdk/src/index.ts
2
- import {
3
- WORKFLOW_EXTENSION_SCHEMA_VERSION,
4
- workflowExtensionRegistryId,
5
- createBoardActionServices
6
- } from "@fusion/core";
7
2
  function definePlugin(plugin2) {
8
3
  return plugin2;
9
4
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/roadmap",
3
- "version": "0.1.42",
3
+ "version": "0.1.44",
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.42",
3
+ "version": "0.1.44",
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.58.0",
3
+ "version": "0.60.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,7 +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_bypass_review`, `fn_task_duplicate`, `fn_task_refine`, `fn_task_archive`, `fn_task_unarchive`, `fn_task_delete`, `fn_task_browse_gitlab_project_issues`, `fn_task_import_gitlab_project_issues`, `fn_task_browse_gitlab_group_issues`, `fn_task_import_gitlab_group_issues`, `fn_task_browse_gitlab_merge_requests`, `fn_task_import_gitlab_merge_requests`, `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
+ - **Workflow tools** — `fn_workflow_list`, `fn_workflow_get`, `fn_workflow_validate`, `fn_workflow_create`, `fn_workflow_update`, `fn_workflow_delete`, `fn_workflow_settings`, `fn_trait_list`, `fn_workflow_select`
32
32
  - **GitHub tools** — `fn_task_import_github`, `fn_task_import_github_issue`, `fn_task_browse_github_issues`
33
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`
34
34
  - **Goal tools** — `fn_goal_list`, `fn_goal_create`, `fn_goal_archive`, `fn_goal_show`
@@ -27,6 +27,7 @@ This reference documents tools injected by the engine at runtime for specific ag
27
27
  | `fn_workflow_settings` | executor | Read/write a workflow's per-`(workflow, project)` setting **values** (`get` returns `{stored, effective, orphaned}`; `set` writes `values` and returns `{stored, effective, orphaned}`, with `null` clearing an override — including any stored value for an orphaned key). Validated against the named workflow's declared settings; built-in **values** are writable though built-in **declarations** are not; invalid values return a typed rejection list and persist nothing | `action` (`get` \| `set`), `workflow_id` (string), `values?` (object keyed by setting id) |
28
28
  | `fn_workflow_list` | executor, chat, planning | List the project's custom workflows (read-only built-ins plus user definitions) | none |
29
29
  | `fn_workflow_get` | executor, chat, planning | Fetch one workflow definition by id — name, description, builtin flag, and the full IR (nodes/edges/columns/artifacts/fields) as JSON | `workflow_id` (string) |
30
+ | `fn_workflow_validate` | executor, chat, planning | Dry-run validate a Fusion workflow IR without creating or mutating any workflow; runs the same server-side IR, trait, code-node, and column-agent validation as create/update and returns typed errors | `workflow_id?` (string), `ir?` (object) |
30
31
  | `fn_workflow_select` | executor, chat, planning | Assign a custom workflow to a task (defaults to the current task) | `workflow_id` (string), `task_id?` (string) |
31
32
  | `fn_workflow_create` | executor, chat, planning | Create a custom workflow definition from a graph IR (validated server-side). v2 IR supports step-inversion constructs: `parse-steps`, `foreach` (mode/isolation/concurrency/maxReworkCycles), `step-execute`, `step-review`, `code` nodes, `rework` edges, plus `artifacts` and custom `fields` declarations | `name` (string), `description?` (string), `ir` (object), `layout?` (object) |
32
33
  | `fn_workflow_update` | executor, chat, planning | Update a custom workflow definition's name/description/ir/layout (built-ins cannot be edited; same step-inversion IR constructs as create; editing `fields` orphans rather than destroys existing task values) | `workflow_id` (string), `name?` (string), `description?` (string), `ir?` (object), `layout?` (object), `rehome_to?` (string) |
@@ -223,6 +223,16 @@ Fetch a Fusion workflow definition by ID, including its resolved workflow IR.
223
223
  |-----------|------|----------|-------------|
224
224
  | `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. |
225
225
 
226
+ ### fn_workflow_validate
227
+
228
+ Dry-run validate a Fusion workflow IR without creating or mutating any workflow.
229
+
230
+ | Parameter | Type | Required | Description |
231
+ |-----------|------|----------|-------------|
232
+ | `workflow_id` | string | — | Workflow definition ID to dry-run validate (e.g. 'WF-003', or a 'builtin:*' id). Use either workflow_id or ir; validation performs no persistence. |
233
+ | `ir` | unknown | — | Inline workflow graph (intermediate representation) to dry-run validate. Use either ir or workflow_id; validation performs no persistence. |
234
+ | `confirm_policy_escalation` | boolean | — | Set true to confirm that validating column-agent bindings may allow a broader agent policy. This is checked exactly like create/update but never persists anything. |
235
+
226
236
  ### fn_workflow_create
227
237
 
228
238
  Create a custom Fusion workflow definition from a validated workflow IR.
@@ -14,6 +14,7 @@ All skill/extension tool invocations in this catalog use the public `fn_*` names
14
14
  |------|---------|
15
15
  | `fn_workflow_list` | List built-in and custom Fusion workflow definitions available in this project. |
16
16
  | `fn_workflow_get` | Fetch a Fusion workflow definition by ID, including its resolved workflow IR. |
17
+ | `fn_workflow_validate` | Dry-run validate a Fusion workflow IR without creating or mutating any workflow. |
17
18
  | `fn_workflow_create` | Create a custom Fusion workflow definition from a validated workflow IR. |
18
19
  | `fn_workflow_update` | Update a custom Fusion workflow definition's metadata, IR, or layout. |
19
20
  | `fn_workflow_delete` | Delete a custom Fusion workflow definition; built-in workflows are protected. |