@runfusion/fusion 0.17.2 → 0.18.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 (57) hide show
  1. package/dist/bin.js +1004 -633
  2. package/dist/client/assets/ChatView-BomXmqar.js +1 -0
  3. package/dist/client/assets/{DevServerView-GFFVXHVP.js → DevServerView-yFvF4xL4.js} +1 -1
  4. package/dist/client/assets/DirectoryPicker-BDNodhtF.js +1 -0
  5. package/dist/client/assets/DocumentsView-CAWtDEaL.js +1 -0
  6. package/dist/client/assets/{InsightsView-Bxu0TJkt.js → InsightsView-CDkiJeW1.js} +2 -2
  7. package/dist/client/assets/MemoryView-ZRQ9EL9H.js +2 -0
  8. package/dist/client/assets/NodesView-DosrOyeH.js +14 -0
  9. package/dist/client/assets/NodesView-sJgPLTzz.css +1 -0
  10. package/dist/client/assets/{PiExtensionsManager-4e3MlD62.js → PiExtensionsManager-CzZ1LEpz.js} +3 -3
  11. package/dist/client/assets/PluginManager-Dp3vPsMO.js +1 -0
  12. package/dist/client/assets/ResearchView-PvNkdaQE.js +1 -0
  13. package/dist/client/assets/{RoadmapsView-jHTOK0RQ.js → RoadmapsView-BUW-HJz5.js} +2 -2
  14. package/dist/client/assets/SettingsModal-BNSrO1M9.css +1 -0
  15. package/dist/client/assets/{SettingsModal-4Z8ZJMzD.js → SettingsModal-ByVl_fUi.js} +1 -1
  16. package/dist/client/assets/SettingsModal-oOnIed5O.css +1 -0
  17. package/dist/client/assets/SettingsModal-uzo470XS.js +31 -0
  18. package/dist/client/assets/SetupWizardModal-DH1hpyiP.js +1 -0
  19. package/dist/client/assets/SkillsView-B-RqQSFE.js +1 -0
  20. package/dist/client/assets/index-CtiRbTNv.js +1229 -0
  21. package/dist/client/assets/index-Dy-xC2C2.css +1 -0
  22. package/dist/client/assets/{users-D3u6f2Rz.js → users-WyHhw14V.js} +2 -2
  23. package/dist/client/index.html +2 -2
  24. package/dist/client/version.json +1 -1
  25. package/dist/droid-cli/index.ts +12 -7
  26. package/dist/droid-cli/package.json +4 -1
  27. package/dist/droid-cli/src/__tests__/provider.test.ts +42 -6
  28. package/dist/extension.js +488 -43
  29. package/dist/pi-claude-cli/package.json +1 -1
  30. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  31. package/package.json +2 -1
  32. package/skill/fusion/SKILL.md +2 -2
  33. package/skill/fusion/references/best-practices.md +33 -0
  34. package/skill/fusion/references/extension-tools.md +47 -2
  35. package/skill/fusion/references/fusion-capabilities.md +7 -2
  36. package/dist/client/assets/AgentDetailView-17J-F0Rl.js +0 -18
  37. package/dist/client/assets/AgentDetailView-yu8Xltqk.css +0 -1
  38. package/dist/client/assets/AgentsView-Bs03ptrd.css +0 -1
  39. package/dist/client/assets/AgentsView-sbBkb7Wd.js +0 -517
  40. package/dist/client/assets/ChatView-BR5cvK_B.js +0 -1
  41. package/dist/client/assets/DirectoryPicker-WPDSBdT6.js +0 -1
  42. package/dist/client/assets/DocumentsView-BHpDsIIt.js +0 -1
  43. package/dist/client/assets/MemoryView-CmnzZorw.js +0 -2
  44. package/dist/client/assets/NodesView-CO9_4hCr.js +0 -14
  45. package/dist/client/assets/NodesView-DuAXX_0j.css +0 -1
  46. package/dist/client/assets/PluginManager-DGN2rvOY.js +0 -1
  47. package/dist/client/assets/ResearchView-Dsa6Gykl.js +0 -1
  48. package/dist/client/assets/SettingsModal-D0kuJpBA.js +0 -31
  49. package/dist/client/assets/SettingsModal-D_AFkDJa.css +0 -1
  50. package/dist/client/assets/SettingsModal-Dq4a5KSX.css +0 -1
  51. package/dist/client/assets/SetupWizardModal-Bhumd4Rf.js +0 -1
  52. package/dist/client/assets/SkillsView-MHweJTz4.js +0 -1
  53. package/dist/client/assets/folder-open-BNQW9dE9.js +0 -6
  54. package/dist/client/assets/index-DEVBHvyW.css +0 -1
  55. package/dist/client/assets/index-k_85J1DS.js +0 -682
  56. package/dist/client/assets/star-7L86NZrT.js +0 -6
  57. package/dist/client/assets/upload-DsAS6tno.js +0 -6
@@ -1,6 +1,6 @@
1
- import{c as e}from"./index-k_85J1DS.js";/**
1
+ import{h as e}from"./index-CtiRbTNv.js";/**
2
2
  * @license lucide-react v1.7.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
5
5
  * See the LICENSE file in the root directory of this source tree.
6
- */const c=[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["path",{d:"M16 3.128a4 4 0 0 1 0 7.744",key:"16gr8j"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}]],r=e("users",c);export{r as U};
6
+ */const a=[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["path",{d:"M16 3.128a4 4 0 0 1 0 7.744",key:"16gr8j"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}]],r=e("users",a);export{r as U};
@@ -92,11 +92,11 @@
92
92
  }
93
93
  })();
94
94
  </script>
95
- <script type="module" crossorigin src="/assets/index-k_85J1DS.js"></script>
95
+ <script type="module" crossorigin src="/assets/index-CtiRbTNv.js"></script>
96
96
  <link rel="modulepreload" crossorigin href="/assets/vendor-react-K0fH_qHe.js">
97
97
  <link rel="modulepreload" crossorigin href="/assets/vendor-xterm-DzcZoU0P.js">
98
98
  <link rel="stylesheet" crossorigin href="/assets/vendor-xterm-LZoznX6r.css">
99
- <link rel="stylesheet" crossorigin href="/assets/index-DEVBHvyW.css">
99
+ <link rel="stylesheet" crossorigin href="/assets/index-Dy-xC2C2.css">
100
100
  </head>
101
101
  <body>
102
102
  <div id="root"></div>
@@ -1 +1 @@
1
- {"version":"17a663433-7b23395c"}
1
+ {"version":"9463d1c58-89b78e0b"}
@@ -1,18 +1,18 @@
1
1
  import type { ExtensionAPI } from "@mariozechner/pi-coding-agent";
2
- import { streamViaCli } from "./src/provider.js";
2
+ import { streamViaCli } from "../../plugins/fusion-plugin-droid-runtime/src/provider.js";
3
3
  import {
4
+ discoverDroidModels,
4
5
  validateCliPresenceAsync,
5
6
  validateCliAuthAsync,
6
7
  killAllProcesses,
7
- discoverDroidModels,
8
- } from "./src/process-manager.js";
8
+ } from "../../plugins/fusion-plugin-droid-runtime/src/process-manager.js";
9
9
  import { createHash } from "node:crypto";
10
10
  import {
11
11
  getCustomToolDefs,
12
12
  toolsFromContext,
13
13
  writeMcpConfig,
14
14
  type McpToolDef,
15
- } from "./src/mcp-config.js";
15
+ } from "../../plugins/fusion-plugin-droid-runtime/src/mcp-config.js";
16
16
 
17
17
  process.on("exit", killAllProcesses);
18
18
 
@@ -21,6 +21,7 @@ const PROVIDER_ID = "droid-cli";
21
21
  let cliValidationPromise: Promise<void> | undefined;
22
22
  type DiscoveredModel = { id: string; name: string; reasoning: boolean; input: Array<"text" | "image">; cost: { input: number; output: number; cacheRead: number; cacheWrite: number }; contextWindow: number; maxTokens: number };
23
23
  let discoveredModelsPromise: Promise<DiscoveredModel[]> | undefined;
24
+ type StreamSimpleHandler = NonNullable<Parameters<ExtensionAPI["registerProvider"]>[1]["streamSimple"]>;
24
25
 
25
26
  function runCliValidationOnce(): Promise<void> {
26
27
  if (cliValidationPromise) return cliValidationPromise;
@@ -112,13 +113,17 @@ export default function (pi: ExtensionAPI) {
112
113
  apiKey: "unused",
113
114
  api: "droid-cli",
114
115
  models,
115
- streamSimple: (model, context, options) => {
116
+ streamSimple: ((model, context, options) => {
116
117
  const configPath = ensureMcpConfig(
117
118
  pi,
118
119
  (context as { tools?: ReadonlyArray<{ name: string; description: string; parameters: Record<string, unknown> }> }).tools,
119
120
  );
120
- return streamViaCli(model, context, { ...options, mcpConfigPath: configPath });
121
- },
121
+ return streamViaCli(
122
+ model,
123
+ context as never,
124
+ { ...(options ?? {}), mcpConfigPath: configPath } as never,
125
+ ) as unknown as ReturnType<StreamSimpleHandler>;
126
+ }) as StreamSimpleHandler,
122
127
  });
123
128
  } catch (err) {
124
129
  console.error("[droid-cli] Failed to register provider:", err);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion/droid-cli",
3
- "version": "0.11.0",
3
+ "version": "0.11.1",
4
4
  "description": "First-party Fusion pi extension that routes LLM calls through the Droid CLI subprocess.",
5
5
  "license": "MIT",
6
6
  "private": true,
@@ -25,6 +25,9 @@
25
25
  "@mariozechner/pi-ai": "*",
26
26
  "@mariozechner/pi-coding-agent": "*"
27
27
  },
28
+ "dependencies": {
29
+ "@fusion-plugin-examples/droid-runtime": "workspace:*"
30
+ },
28
31
  "devDependencies": {
29
32
  "@types/node": "^22.0.0",
30
33
  "typescript": "^5.7.0",
@@ -71,16 +71,16 @@ import { streamViaCli } from "../provider";
71
71
  describe("provider registration (default export)", () => {
72
72
  it("registers provider id droid-cli with deduped discovered models", async () => {
73
73
  vi.resetModules();
74
- vi.doMock("../../src/provider.js", () => ({
74
+ vi.doMock("../../../../plugins/fusion-plugin-droid-runtime/src/provider.js", () => ({
75
75
  streamViaCli: vi.fn(() => ({ mocked: true })),
76
76
  }));
77
- vi.doMock("../../src/process-manager.js", () => ({
77
+ vi.doMock("../../../../plugins/fusion-plugin-droid-runtime/src/process-manager.js", () => ({
78
78
  validateCliPresenceAsync: vi.fn(async () => ({ ok: true })),
79
79
  validateCliAuthAsync: vi.fn(async () => true),
80
80
  killAllProcesses: vi.fn(),
81
81
  discoverDroidModels: vi.fn(async () => ["droid-pro", "droid-max", "droid-pro"]),
82
82
  }));
83
- vi.doMock("../../src/mcp-config.js", () => ({
83
+ vi.doMock("../../../../plugins/fusion-plugin-droid-runtime/src/mcp-config.js", () => ({
84
84
  getCustomToolDefs: vi.fn(() => []),
85
85
  toolsFromContext: vi.fn(() => []),
86
86
  writeMcpConfig: vi.fn(() => "/tmp/droid-mcp.json"),
@@ -105,9 +105,45 @@ describe("provider registration (default export)", () => {
105
105
  "droid-pro",
106
106
  "droid-max",
107
107
  ]);
108
- vi.doUnmock("../../src/provider.js");
109
- vi.doUnmock("../../src/process-manager.js");
110
- vi.doUnmock("../../src/mcp-config.js");
108
+ vi.doUnmock("../../../../plugins/fusion-plugin-droid-runtime/src/provider.js");
109
+ vi.doUnmock("../../../../plugins/fusion-plugin-droid-runtime/src/process-manager.js");
110
+ vi.doUnmock("../../../../plugins/fusion-plugin-droid-runtime/src/mcp-config.js");
111
+ });
112
+
113
+ it("delegates streamSimple execution to plugin-owned streamViaCli", async () => {
114
+ vi.resetModules();
115
+ const pluginStreamViaCli = vi.fn(() => ({ delegated: true }));
116
+ vi.doMock("../../../../plugins/fusion-plugin-droid-runtime/src/provider.js", () => ({
117
+ streamViaCli: pluginStreamViaCli,
118
+ }));
119
+ vi.doMock("../../../../plugins/fusion-plugin-droid-runtime/src/process-manager.js", () => ({
120
+ validateCliPresenceAsync: vi.fn(async () => ({ ok: true })),
121
+ validateCliAuthAsync: vi.fn(async () => true),
122
+ killAllProcesses: vi.fn(),
123
+ discoverDroidModels: vi.fn(async () => ["droid-pro"]),
124
+ }));
125
+ vi.doMock("../../../../plugins/fusion-plugin-droid-runtime/src/mcp-config.js", () => ({
126
+ getCustomToolDefs: vi.fn(() => []),
127
+ toolsFromContext: vi.fn(() => []),
128
+ writeMcpConfig: vi.fn(() => undefined),
129
+ }));
130
+
131
+ const registerProvider = vi.fn();
132
+ const on = vi.fn();
133
+ const getAllTools = vi.fn(() => []);
134
+ const setActiveTools = vi.fn();
135
+
136
+ const mod = await import("../../index");
137
+ mod.default({ registerProvider, on, getAllTools, setActiveTools } as any);
138
+ await new Promise((resolve) => setTimeout(resolve, 0));
139
+
140
+ const [, config] = registerProvider.mock.calls[0];
141
+ config.streamSimple({ id: "droid-pro", provider: "droid-cli" }, { messages: [] }, {});
142
+ expect(pluginStreamViaCli).toHaveBeenCalled();
143
+
144
+ vi.doUnmock("../../../../plugins/fusion-plugin-droid-runtime/src/provider.js");
145
+ vi.doUnmock("../../../../plugins/fusion-plugin-droid-runtime/src/process-manager.js");
146
+ vi.doUnmock("../../../../plugins/fusion-plugin-droid-runtime/src/mcp-config.js");
111
147
  });
112
148
  });
113
149