@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.
- package/README.md +2 -3
- package/dist/bin.js +16894 -14563
- package/dist/client/.vite/manifest.json +247 -244
- package/dist/client/assets/AgentDetailView-UmilJU0C.js +18 -0
- package/dist/client/assets/{AgentPermissionPolicyEditor-3x5cc2cp.js → AgentPermissionPolicyEditor-DqYOX1kN.js} +1 -1
- package/dist/client/assets/{AgentsView-B77vHi_7.js → AgentsView-Dt0nKyx7.js} +4 -4
- package/dist/client/assets/ChatView-C7trV16u.js +6 -0
- package/dist/client/assets/CommandCenter-DSrIaOro.css +1 -0
- package/dist/client/assets/CommandCenter-Dsg16_mK.js +99 -0
- package/dist/client/assets/{DevServerView-BXmkO05R.js → DevServerView-DnpnAU_g.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-CZ3EXSE5.js → DirectoryPicker-BzpWdpTC.js} +1 -1
- package/dist/client/assets/{DocumentsView-BSWFgTsC.css → DocumentsView-BSC7wh2B.css} +1 -1
- package/dist/client/assets/{DocumentsView-GlAyW64J.js → DocumentsView-C2jRDIo6.js} +2 -2
- package/dist/client/assets/{EvalsView-BLmcsNNf.js → EvalsView-M1nIXx-S.js} +1 -1
- package/dist/client/assets/ExperimentalAgentOnboardingModal-5Kg2iQtB.js +1 -0
- package/dist/client/assets/{GoalsView-BRfZ4qGe.js → GoalsView-7bFpy-lr.js} +1 -1
- package/dist/client/assets/InsightsView-D0HPy3RP.js +11 -0
- package/dist/client/assets/{MemoryView-ChkuBpUf.js → MemoryView-CNzJcoPi.js} +2 -2
- package/dist/client/assets/{PiExtensionsManager-DXwQdB7b.js → PiExtensionsManager-D0a8Q47c.js} +1 -1
- package/dist/client/assets/{PluginManager-B8zAjhqf.js → PluginManager-N2Ne57i_.js} +1 -1
- package/dist/client/assets/{PullRequestView-DL1E1ixh.js → PullRequestView-Be4GM2H5.js} +2 -2
- package/dist/client/assets/{ResearchView-BCYCHiyQ.js → ResearchView-DYW9ViMl.js} +1 -1
- package/dist/client/assets/SecretsView-B3jEFeGp.js +1 -0
- package/dist/client/assets/{SessionTerminal-BvK8A98c.css → SessionTerminal-CDTiqrd7.css} +1 -1
- package/dist/client/assets/SessionTerminal-DGFADOH4.js +2 -0
- package/dist/client/assets/SettingsModal-CtOCCZEj.js +21 -0
- package/dist/client/assets/{SettingsModal-U7ma-5OU.js → SettingsModal-Lw0RmeRd.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-BCDoA33s.js → SetupWizardModal-BifMmJIa.js} +2 -2
- package/dist/client/assets/{ShadcnColorPicker-EVU2cXpo.js → ShadcnColorPicker-B1UClHqm.js} +2 -2
- package/dist/client/assets/{SkillsView-V48VsthB.js → SkillsView--U-5lH1V.js} +1 -1
- package/dist/client/assets/TodoView-BwxNdIXm.js +6 -0
- package/dist/client/assets/TodoView-CUD4xw3T.css +1 -0
- package/dist/client/assets/WorkflowNodeEditor-BmTZR0i8.js +8 -0
- package/dist/client/assets/{agentSkills-B-QDeW2q.js → agentSkills-PqEK0Uf_.js} +1 -1
- package/dist/client/assets/{app-SucmTDhV.js → app-BlgX3hw4.js} +3 -3
- package/dist/client/assets/{app-RIK4I745.js → app-C7eDKtXM.js} +3 -3
- package/dist/client/assets/{app-SHNioZxk.js → app-CL1Ik1qS.js} +3 -3
- package/dist/client/assets/{app-De_pkbYi.js → app-Ckb9wA3K.js} +3 -3
- package/dist/client/assets/{app-cZgmPvs6.js → app-Den3D7oy.js} +3 -3
- package/dist/client/assets/{app--U62_ZWS.js → app-nAsTBQMW.js} +3 -3
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-DvR35aCH.js → architectureDiagram-3BPJPVTR-DxAKryer.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-ciQdpSqc.js → blockDiagram-GPEHLZMM-BfPC7WG4.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-CV0Z6UEL.js → c4Diagram-AAUBKEIU-DnVJBAB1.js} +1 -1
- package/dist/client/assets/channel-D23u9xEh.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-CkAQRX3g.js → chunk-2J33WTMH-2LaGYtnx.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-CJXvYVcN.js → chunk-4BX2VUAB-C7xxOb1T.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-DOv0lN1u.js → chunk-55IACEB6-CAxHAFXx.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-tRsHXz7i.js → chunk-727SXJPM-CnZuaU-I.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-CfzOMXn9.js → chunk-AQP2D5EJ-DutKSMk1.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-BKvUZ2cn.js → chunk-FMBD7UC4-C7PQ58jc.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-FqiVnW7u.js → chunk-ND2GUHAM-BQ0UHfJw.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-BAJDyCpZ.js → chunk-QZHKN3VN-BadmXu1v.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-BMIDIijD.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-BMIDIijD.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-DYizdcNp.js → cose-bilkent-S5V4N54A-37z9Hx7d.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-BDWwvXJx.js → dagre-BM42HDAG-B70rt1ZW.js} +1 -1
- package/dist/client/assets/{dashboard-view-BYn_jRw9.js → dashboard-view-DdAL0vfN.js} +1 -1
- package/dist/client/assets/{dashboard-view-DmfIFCV-.js → dashboard-view-GT7dDNd7.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-C8ic2E9q.js → diagram-2AECGRRQ-se4pabEk.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-H5IDcv9E.js → diagram-5GNKFQAL-ijyxpVgX.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-DkczJXd6.js → diagram-KO2AKTUF-DUGQ8jXI.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-P1vh7RIU.js → diagram-LMA3HP47-BYydC37K.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-CgeybA5t.js → diagram-OG6HWLK6-DlUn5jkD.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-DSJa4zRQ.js → erDiagram-TEJ5UH35-ChYKGDIc.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-DG91ZWS9.js → flowDiagram-I6XJVG4X-CoQKr6ba.js} +1 -1
- package/dist/client/assets/{folder-open-iGyAYoN-.js → folder-open-YuIEuDwd.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-dkOQjOK8.js → ganttDiagram-6RSMTGT7-Cff6URun.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-GqrJtmDT.js → gitGraphDiagram-PVQCEYII-CnlZVE6T.js} +1 -1
- package/dist/client/assets/index-C2HFa2A-.css +1 -0
- package/dist/client/assets/index-aBQwNV_I.js +2540 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-BfFhhqbU.js → infoDiagram-5YYISTIA-DYLBAKrj.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-DBBV-PIS.js → ishikawaDiagram-YF4QCWOH-7xSxQNhn.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-xZisXOgZ.js → journeyDiagram-JHISSGLW-DREqJGeQ.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-CbOJloOw.js → kanban-definition-UN3LZRKU-_lzeYhpL.js} +1 -1
- package/dist/client/assets/{mermaid.core-DKBiVV3q.js → mermaid.core-DNTJMy0V.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-Bf9V63ac.js → mindmap-definition-RKZ34NQL-DR9UulDp.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-0ukMaTVl.js → pieDiagram-4H26LBE5-DD1LCdSp.js} +1 -1
- package/dist/client/assets/{puzzle-BvEf9PLH.js → puzzle-DaVSYDOd.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-CwXZAtYI.js → quadrantDiagram-W4KKPZXB-iLEGylFT.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-DVsu9t-w.js → requirementDiagram-4Y6WPE33-D7IX9UbY.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-DOJUnv7J.js → sankeyDiagram-5OEKKPKP-DC30taEV.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-B67g0g9m.js → sequenceDiagram-3UESZ5HK-DjMKbjmL.js} +1 -1
- package/dist/client/assets/{shield-alert-4FPCIFZ2.js → shield-alert-BcyPZs5t.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-CPPa0bHh.js → stateDiagram-AJRCARHV-DJSnSkUL.js} +1 -1
- package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-Dyj14elw.js → stateDiagram-v2-BHNVJYJU-KC2rSU3J.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-UVWf2E8M.js → timeline-definition-PNZ67QCA-5DyrH8WZ.js} +1 -1
- package/dist/client/assets/{upload-BkgVjwwc.js → upload-C_8IHSzk.js} +1 -1
- package/dist/client/assets/{users-9nCT4liw.js → users-DfGiwmqG.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-CqGrv1wQ.js → vennDiagram-CIIHVFJN-Bh5X-uVf.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-aA0pos_F.js → wardley-L42UT6IY-ZIwV-wIZ.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-C-O5tD1L.js → wardleyDiagram-YWT4CUSO-DI92L1jA.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-qoIF674C.js → xychartDiagram-2RQKCTM6-B6RjJCM8.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/version.json +1 -1
- package/dist/droid-cli/package.json +1 -1
- package/dist/extension.js +12961 -11668
- package/dist/pi-claude-cli/package.json +1 -1
- package/dist/plugin-sdk/index.d.ts +20 -1
- package/dist/plugins/fusion-plugin-acp-runtime/bundled.js +4 -1
- package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
- package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
- package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
- package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-grok-runtime/bundled.js +4 -1
- package/dist/plugins/fusion-plugin-grok-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-linear-import/package.json +1 -1
- package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/src/dashboard/components/ShareBlocksPanel.tsx +4 -1
- package/dist/plugins/fusion-plugin-reports/src/dashboard/components/__tests__/ShareBlocksPanel.test.tsx +41 -2
- package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
- package/package.json +1 -1
- package/skill/fusion/SKILL.md +1 -1
- package/skill/fusion/references/engine-tools.md +1 -0
- package/skill/fusion/references/extension-tools.md +10 -0
- package/skill/fusion/references/fusion-capabilities.md +1 -0
- package/dist/client/assets/AgentDetailView-whCXABbu.js +0 -18
- package/dist/client/assets/ChatView-CninsTIm.js +0 -6
- package/dist/client/assets/CommandCenter-B9q-zM9p.css +0 -1
- package/dist/client/assets/CommandCenter-C6LmdUin.js +0 -71
- package/dist/client/assets/ExperimentalAgentOnboardingModal-DvDix9pH.js +0 -1
- package/dist/client/assets/InsightsView-X4RlcgrU.js +0 -11
- package/dist/client/assets/SecretsView-B48BIZKw.js +0 -1
- package/dist/client/assets/SessionTerminal-CUyYlq16.js +0 -2
- package/dist/client/assets/SettingsModal-DbjBoUYD.js +0 -21
- package/dist/client/assets/TodoView-DmpJmxu7.css +0 -1
- package/dist/client/assets/TodoView-MZ9Pfl65.js +0 -6
- package/dist/client/assets/WorkflowNodeEditor-B95Dvf-O.js +0 -8
- package/dist/client/assets/channel-Y_Uhrtqx.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-DhicwSPE.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-DhicwSPE.js +0 -1
- package/dist/client/assets/index-Bg8SMXUs.css +0 -1
- package/dist/client/assets/index-DO9Ch72Y.js +0 -2544
|
@@ -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
|
-
|
|
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;
|
|
@@ -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
|
-
|
|
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,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
|
-
|
|
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.
|
|
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} />);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@runfusion/fusion",
|
|
3
|
-
"version": "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",
|
package/skill/fusion/SKILL.md
CHANGED
|
@@ -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. |
|