@runfusion/fusion 0.58.0 → 0.59.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 (138) hide show
  1. package/README.md +2 -3
  2. package/dist/bin.js +16894 -14563
  3. package/dist/client/.vite/manifest.json +247 -244
  4. package/dist/client/assets/AgentDetailView-UmilJU0C.js +18 -0
  5. package/dist/client/assets/{AgentPermissionPolicyEditor-3x5cc2cp.js → AgentPermissionPolicyEditor-DqYOX1kN.js} +1 -1
  6. package/dist/client/assets/{AgentsView-B77vHi_7.js → AgentsView-Dt0nKyx7.js} +4 -4
  7. package/dist/client/assets/ChatView-C7trV16u.js +6 -0
  8. package/dist/client/assets/CommandCenter-DSrIaOro.css +1 -0
  9. package/dist/client/assets/CommandCenter-Dsg16_mK.js +99 -0
  10. package/dist/client/assets/{DevServerView-BXmkO05R.js → DevServerView-DnpnAU_g.js} +1 -1
  11. package/dist/client/assets/{DirectoryPicker-CZ3EXSE5.js → DirectoryPicker-BzpWdpTC.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-C2jRDIo6.js} +2 -2
  14. package/dist/client/assets/{EvalsView-BLmcsNNf.js → EvalsView-M1nIXx-S.js} +1 -1
  15. package/dist/client/assets/ExperimentalAgentOnboardingModal-5Kg2iQtB.js +1 -0
  16. package/dist/client/assets/{GoalsView-BRfZ4qGe.js → GoalsView-7bFpy-lr.js} +1 -1
  17. package/dist/client/assets/InsightsView-D0HPy3RP.js +11 -0
  18. package/dist/client/assets/{MemoryView-ChkuBpUf.js → MemoryView-CNzJcoPi.js} +2 -2
  19. package/dist/client/assets/{PiExtensionsManager-DXwQdB7b.js → PiExtensionsManager-D0a8Q47c.js} +1 -1
  20. package/dist/client/assets/{PluginManager-B8zAjhqf.js → PluginManager-N2Ne57i_.js} +1 -1
  21. package/dist/client/assets/{PullRequestView-DL1E1ixh.js → PullRequestView-Be4GM2H5.js} +2 -2
  22. package/dist/client/assets/{ResearchView-BCYCHiyQ.js → ResearchView-DYW9ViMl.js} +1 -1
  23. package/dist/client/assets/SecretsView-B3jEFeGp.js +1 -0
  24. package/dist/client/assets/{SessionTerminal-BvK8A98c.css → SessionTerminal-CDTiqrd7.css} +1 -1
  25. package/dist/client/assets/SessionTerminal-DGFADOH4.js +2 -0
  26. package/dist/client/assets/SettingsModal-CtOCCZEj.js +21 -0
  27. package/dist/client/assets/{SettingsModal-U7ma-5OU.js → SettingsModal-Lw0RmeRd.js} +1 -1
  28. package/dist/client/assets/{SetupWizardModal-BCDoA33s.js → SetupWizardModal-BifMmJIa.js} +2 -2
  29. package/dist/client/assets/{ShadcnColorPicker-EVU2cXpo.js → ShadcnColorPicker-B1UClHqm.js} +2 -2
  30. package/dist/client/assets/{SkillsView-V48VsthB.js → SkillsView--U-5lH1V.js} +1 -1
  31. package/dist/client/assets/TodoView-BwxNdIXm.js +6 -0
  32. package/dist/client/assets/TodoView-CUD4xw3T.css +1 -0
  33. package/dist/client/assets/WorkflowNodeEditor-BmTZR0i8.js +8 -0
  34. package/dist/client/assets/{agentSkills-B-QDeW2q.js → agentSkills-PqEK0Uf_.js} +1 -1
  35. package/dist/client/assets/{app-SucmTDhV.js → app-BlgX3hw4.js} +3 -3
  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-DxAKryer.js} +1 -1
  42. package/dist/client/assets/{blockDiagram-GPEHLZMM-ciQdpSqc.js → blockDiagram-GPEHLZMM-BfPC7WG4.js} +1 -1
  43. package/dist/client/assets/{c4Diagram-AAUBKEIU-CV0Z6UEL.js → c4Diagram-AAUBKEIU-DnVJBAB1.js} +1 -1
  44. package/dist/client/assets/channel-D23u9xEh.js +1 -0
  45. package/dist/client/assets/{chunk-2J33WTMH-CkAQRX3g.js → chunk-2J33WTMH-2LaGYtnx.js} +1 -1
  46. package/dist/client/assets/{chunk-4BX2VUAB-CJXvYVcN.js → chunk-4BX2VUAB-C7xxOb1T.js} +1 -1
  47. package/dist/client/assets/{chunk-55IACEB6-DOv0lN1u.js → chunk-55IACEB6-CAxHAFXx.js} +1 -1
  48. package/dist/client/assets/{chunk-727SXJPM-tRsHXz7i.js → chunk-727SXJPM-CnZuaU-I.js} +1 -1
  49. package/dist/client/assets/{chunk-AQP2D5EJ-CfzOMXn9.js → chunk-AQP2D5EJ-DutKSMk1.js} +1 -1
  50. package/dist/client/assets/{chunk-FMBD7UC4-BKvUZ2cn.js → chunk-FMBD7UC4-C7PQ58jc.js} +1 -1
  51. package/dist/client/assets/{chunk-ND2GUHAM-FqiVnW7u.js → chunk-ND2GUHAM-BQ0UHfJw.js} +1 -1
  52. package/dist/client/assets/{chunk-QZHKN3VN-BAJDyCpZ.js → chunk-QZHKN3VN-BadmXu1v.js} +1 -1
  53. package/dist/client/assets/classDiagram-4FO5ZUOK-BMIDIijD.js +1 -0
  54. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BMIDIijD.js +1 -0
  55. package/dist/client/assets/{cose-bilkent-S5V4N54A-DYizdcNp.js → cose-bilkent-S5V4N54A-37z9Hx7d.js} +1 -1
  56. package/dist/client/assets/{dagre-BM42HDAG-BDWwvXJx.js → dagre-BM42HDAG-B70rt1ZW.js} +1 -1
  57. package/dist/client/assets/{dashboard-view-BYn_jRw9.js → dashboard-view-DdAL0vfN.js} +1 -1
  58. package/dist/client/assets/{dashboard-view-DmfIFCV-.js → dashboard-view-GT7dDNd7.js} +1 -1
  59. package/dist/client/assets/{diagram-2AECGRRQ-C8ic2E9q.js → diagram-2AECGRRQ-se4pabEk.js} +1 -1
  60. package/dist/client/assets/{diagram-5GNKFQAL-H5IDcv9E.js → diagram-5GNKFQAL-ijyxpVgX.js} +1 -1
  61. package/dist/client/assets/{diagram-KO2AKTUF-DkczJXd6.js → diagram-KO2AKTUF-DUGQ8jXI.js} +1 -1
  62. package/dist/client/assets/{diagram-LMA3HP47-P1vh7RIU.js → diagram-LMA3HP47-BYydC37K.js} +1 -1
  63. package/dist/client/assets/{diagram-OG6HWLK6-CgeybA5t.js → diagram-OG6HWLK6-DlUn5jkD.js} +1 -1
  64. package/dist/client/assets/{erDiagram-TEJ5UH35-DSJa4zRQ.js → erDiagram-TEJ5UH35-ChYKGDIc.js} +1 -1
  65. package/dist/client/assets/{flowDiagram-I6XJVG4X-DG91ZWS9.js → flowDiagram-I6XJVG4X-CoQKr6ba.js} +1 -1
  66. package/dist/client/assets/{folder-open-iGyAYoN-.js → folder-open-YuIEuDwd.js} +1 -1
  67. package/dist/client/assets/{ganttDiagram-6RSMTGT7-dkOQjOK8.js → ganttDiagram-6RSMTGT7-Cff6URun.js} +1 -1
  68. package/dist/client/assets/{gitGraphDiagram-PVQCEYII-GqrJtmDT.js → gitGraphDiagram-PVQCEYII-CnlZVE6T.js} +1 -1
  69. package/dist/client/assets/index-C2HFa2A-.css +1 -0
  70. package/dist/client/assets/index-aBQwNV_I.js +2540 -0
  71. package/dist/client/assets/{infoDiagram-5YYISTIA-BfFhhqbU.js → infoDiagram-5YYISTIA-DYLBAKrj.js} +1 -1
  72. package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-DBBV-PIS.js → ishikawaDiagram-YF4QCWOH-7xSxQNhn.js} +1 -1
  73. package/dist/client/assets/{journeyDiagram-JHISSGLW-xZisXOgZ.js → journeyDiagram-JHISSGLW-DREqJGeQ.js} +1 -1
  74. package/dist/client/assets/{kanban-definition-UN3LZRKU-CbOJloOw.js → kanban-definition-UN3LZRKU-_lzeYhpL.js} +1 -1
  75. package/dist/client/assets/{mermaid.core-DKBiVV3q.js → mermaid.core-DNTJMy0V.js} +4 -4
  76. package/dist/client/assets/{mindmap-definition-RKZ34NQL-Bf9V63ac.js → mindmap-definition-RKZ34NQL-DR9UulDp.js} +1 -1
  77. package/dist/client/assets/{pieDiagram-4H26LBE5-0ukMaTVl.js → pieDiagram-4H26LBE5-DD1LCdSp.js} +1 -1
  78. package/dist/client/assets/{puzzle-BvEf9PLH.js → puzzle-DaVSYDOd.js} +1 -1
  79. package/dist/client/assets/{quadrantDiagram-W4KKPZXB-CwXZAtYI.js → quadrantDiagram-W4KKPZXB-iLEGylFT.js} +1 -1
  80. package/dist/client/assets/{requirementDiagram-4Y6WPE33-DVsu9t-w.js → requirementDiagram-4Y6WPE33-D7IX9UbY.js} +1 -1
  81. package/dist/client/assets/{sankeyDiagram-5OEKKPKP-DOJUnv7J.js → sankeyDiagram-5OEKKPKP-DC30taEV.js} +1 -1
  82. package/dist/client/assets/{sequenceDiagram-3UESZ5HK-B67g0g9m.js → sequenceDiagram-3UESZ5HK-DjMKbjmL.js} +1 -1
  83. package/dist/client/assets/{shield-alert-4FPCIFZ2.js → shield-alert-BcyPZs5t.js} +1 -1
  84. package/dist/client/assets/{stateDiagram-AJRCARHV-CPPa0bHh.js → stateDiagram-AJRCARHV-DJSnSkUL.js} +1 -1
  85. package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-Dyj14elw.js → stateDiagram-v2-BHNVJYJU-KC2rSU3J.js} +1 -1
  86. package/dist/client/assets/{timeline-definition-PNZ67QCA-UVWf2E8M.js → timeline-definition-PNZ67QCA-5DyrH8WZ.js} +1 -1
  87. package/dist/client/assets/{upload-BkgVjwwc.js → upload-C_8IHSzk.js} +1 -1
  88. package/dist/client/assets/{users-9nCT4liw.js → users-DfGiwmqG.js} +1 -1
  89. package/dist/client/assets/{vennDiagram-CIIHVFJN-CqGrv1wQ.js → vennDiagram-CIIHVFJN-Bh5X-uVf.js} +1 -1
  90. package/dist/client/assets/{wardley-L42UT6IY-aA0pos_F.js → wardley-L42UT6IY-ZIwV-wIZ.js} +1 -1
  91. package/dist/client/assets/{wardleyDiagram-YWT4CUSO-C-O5tD1L.js → wardleyDiagram-YWT4CUSO-DI92L1jA.js} +1 -1
  92. package/dist/client/assets/{xychartDiagram-2RQKCTM6-qoIF674C.js → xychartDiagram-2RQKCTM6-B6RjJCM8.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 +12961 -11668
  97. package/dist/pi-claude-cli/package.json +1 -1
  98. package/dist/plugin-sdk/index.d.ts +20 -1
  99. package/dist/plugins/fusion-plugin-acp-runtime/bundled.js +4 -1
  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/package.json +1 -1
  103. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  104. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  105. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  106. package/dist/plugins/fusion-plugin-grok-runtime/bundled.js +4 -1
  107. package/dist/plugins/fusion-plugin-grok-runtime/package.json +1 -1
  108. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  109. package/dist/plugins/fusion-plugin-linear-import/package.json +1 -1
  110. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  111. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  112. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  113. package/dist/plugins/fusion-plugin-reports/src/dashboard/components/ShareBlocksPanel.tsx +4 -1
  114. package/dist/plugins/fusion-plugin-reports/src/dashboard/components/__tests__/ShareBlocksPanel.test.tsx +41 -2
  115. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  116. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  117. package/package.json +1 -1
  118. package/skill/fusion/SKILL.md +1 -1
  119. package/skill/fusion/references/engine-tools.md +1 -0
  120. package/skill/fusion/references/extension-tools.md +10 -0
  121. package/skill/fusion/references/fusion-capabilities.md +1 -0
  122. package/dist/client/assets/AgentDetailView-whCXABbu.js +0 -18
  123. package/dist/client/assets/ChatView-CninsTIm.js +0 -6
  124. package/dist/client/assets/CommandCenter-B9q-zM9p.css +0 -1
  125. package/dist/client/assets/CommandCenter-C6LmdUin.js +0 -71
  126. package/dist/client/assets/ExperimentalAgentOnboardingModal-DvDix9pH.js +0 -1
  127. package/dist/client/assets/InsightsView-X4RlcgrU.js +0 -11
  128. package/dist/client/assets/SecretsView-B48BIZKw.js +0 -1
  129. package/dist/client/assets/SessionTerminal-CUyYlq16.js +0 -2
  130. package/dist/client/assets/SettingsModal-DbjBoUYD.js +0 -21
  131. package/dist/client/assets/TodoView-DmpJmxu7.css +0 -1
  132. package/dist/client/assets/TodoView-MZ9Pfl65.js +0 -6
  133. package/dist/client/assets/WorkflowNodeEditor-B95Dvf-O.js +0 -8
  134. package/dist/client/assets/channel-Y_Uhrtqx.js +0 -1
  135. package/dist/client/assets/classDiagram-4FO5ZUOK-DhicwSPE.js +0 -1
  136. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DhicwSPE.js +0 -1
  137. package/dist/client/assets/index-Bg8SMXUs.css +0 -1
  138. 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.59.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;
@@ -5838,6 +5851,12 @@ interface ProjectSettings {
5838
5851
  defaultProviderOverride?: string;
5839
5852
  defaultModelIdOverride?: string;
5840
5853
  defaultThinkingLevelOverride?: ThinkingLevel;
5854
+ chatNewSessionMode?: "prompt" | "always-default";
5855
+ chatDefaultKind?: "model" | "agent";
5856
+ chatDefaultAgentId?: string;
5857
+ chatDefaultModelProvider?: string;
5858
+ chatDefaultModelId?: string;
5859
+ chatDefaultThinkingLevel?: ThinkingLevel;
5841
5860
  executionProvider?: string;
5842
5861
  executionModelId?: string;
5843
5862
  executionThinkingLevel?: ThinkingLevel;
@@ -17305,7 +17305,10 @@ function extractPromptImagesFromOptions(options) {
17305
17305
  const data = typeof rec.data === "string" ? rec.data : void 0;
17306
17306
  const mimeType = typeof rec.mimeType === "string" ? rec.mimeType : void 0;
17307
17307
  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;
17308
+ let uri = typeof rec.uri === "string" && rec.uri.length > 0 ? rec.uri : void 0;
17309
+ if (!uri && typeof rec.path === "string" && rec.path.length > 0) {
17310
+ uri = rec.path.startsWith("file:") ? rec.path : `file://${rec.path}`;
17311
+ }
17309
17312
  images.push({ data, mimeType, ...uri ? { uri } : {} });
17310
17313
  }
17311
17314
  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.24",
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.41",
4
4
  "type": "module",
5
5
  "private": true,
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/compound-engineering",
3
- "version": "0.1.23",
3
+ "version": "0.1.24",
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.42",
3
+ "version": "0.1.43",
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.54",
3
+ "version": "0.1.55",
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.49",
3
+ "version": "0.1.50",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -17293,7 +17293,10 @@ function extractPromptImagesFromOptions(options) {
17293
17293
  const data = typeof rec.data === "string" ? rec.data : void 0;
17294
17294
  const mimeType = typeof rec.mimeType === "string" ? rec.mimeType : void 0;
17295
17295
  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;
17296
+ let uri = typeof rec.uri === "string" && rec.uri.length > 0 ? rec.uri : void 0;
17297
+ if (!uri && typeof rec.path === "string" && rec.path.length > 0) {
17298
+ uri = rec.path.startsWith("file:") ? rec.path : `file://${rec.path}`;
17299
+ }
17297
17300
  images.push({ data, mimeType, ...uri ? { uri } : {} });
17298
17301
  }
17299
17302
  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.2",
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.73",
3
+ "version": "0.2.74",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/linear-import",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
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.73",
3
+ "version": "0.2.74",
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.73",
3
+ "version": "0.2.74",
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.43",
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/roadmap",
3
- "version": "0.1.42",
3
+ "version": "0.1.43",
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.43",
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.59.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. |