@runfusion/fusion 0.43.1 → 0.44.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 (168) hide show
  1. package/dist/automation-store-EKXXEE2S.js +10 -0
  2. package/dist/automation-store-PLNG3X72.js +10 -0
  3. package/dist/automation-store-RDDYZFUJ.js +10 -0
  4. package/dist/bin.js +8097 -1796
  5. package/dist/chunk-2JI3F6MG.js +948 -0
  6. package/dist/chunk-4L6CLWJC.js +8345 -0
  7. package/dist/chunk-4VNS5WPM.js +42 -0
  8. package/dist/chunk-5RGECGQL.js +1139 -0
  9. package/dist/chunk-6JDLN7IL.js +409 -0
  10. package/dist/chunk-AICJATVW.js +948 -0
  11. package/dist/chunk-AWKNRUOR.js +1148 -0
  12. package/dist/chunk-BHM3UYWS.js +4651 -0
  13. package/dist/chunk-BMUXDSBF.js +4647 -0
  14. package/dist/chunk-GETECT6V.js +353 -0
  15. package/dist/chunk-GUV4QQT3.js +1143 -0
  16. package/dist/chunk-JKQO7YYZ.js +8369 -0
  17. package/dist/chunk-LYZVU6UV.js +409 -0
  18. package/dist/chunk-MAN4WYHO.js +353 -0
  19. package/dist/chunk-MCUG2Z7M.js +4651 -0
  20. package/dist/chunk-PSDYB45U.js +948 -0
  21. package/dist/chunk-RR2HM46R.js +8345 -0
  22. package/dist/chunk-RXMQ5OMY.js +9226 -0
  23. package/dist/chunk-S2EVJUY3.js +353 -0
  24. package/dist/chunk-UXR5XZFZ.js +409 -0
  25. package/dist/client/.vite/manifest.json +272 -261
  26. package/dist/client/assets/{AgentDetailView-BGN03dyz.css → AgentDetailView-CanIeYHg.css} +1 -1
  27. package/dist/client/assets/{AgentDetailView-DKMz3r04.js → AgentDetailView-DxV8pFHX.js} +3 -3
  28. package/dist/client/assets/{AgentPermissionPolicyEditor-BiY1a4KR.js → AgentPermissionPolicyEditor--YS4iMUY.js} +2 -2
  29. package/dist/client/assets/AgentsView-BVILQjdS.css +1 -0
  30. package/dist/client/assets/{AgentsView-Co-k4vjh.js → AgentsView-CTzbcvhK.js} +3 -3
  31. package/dist/client/assets/ChatView-COygcnyk.js +6 -0
  32. package/dist/client/assets/CommandCenter-CTaopaC0.css +1 -0
  33. package/dist/client/assets/CommandCenter-DoKX2HWm.js +56 -0
  34. package/dist/client/assets/DevServerView-Cyevyvqx.js +1 -0
  35. package/dist/client/assets/{DirectoryPicker-DTKtd8L2.css → DirectoryPicker-0rspvcMz.css} +1 -1
  36. package/dist/client/assets/{DirectoryPicker-CkcGjyv0.js → DirectoryPicker-DBdyXEhR.js} +1 -1
  37. package/dist/client/assets/DocumentsView-BzSMyrns.js +1 -0
  38. package/dist/client/assets/{EvalsView-CUfyj5GW.js → EvalsView-ikz00o9g.js} +1 -1
  39. package/dist/client/assets/ExperimentalAgentOnboardingModal-CZ_jbgep.css +1 -0
  40. package/dist/client/assets/{ExperimentalAgentOnboardingModal-Dau9RTU_.js → ExperimentalAgentOnboardingModal-D-rzCCET.js} +10 -10
  41. package/dist/client/assets/GoalsView-Bfu1Oy2-.js +2 -0
  42. package/dist/client/assets/GoalsView-rg9VSIza.css +1 -0
  43. package/dist/client/assets/{InsightsView-BQPxHxKI.js → InsightsView-Cgmf5nES.js} +1 -1
  44. package/dist/client/assets/InsightsView-LMv1M1dU.css +1 -0
  45. package/dist/client/assets/MemoryView-DkEuDKQs.js +2 -0
  46. package/dist/client/assets/{NodesView-CSMvGwDU.js → NodesView-B_KYfS4o.js} +3 -3
  47. package/dist/client/assets/{PiExtensionsManager-BtqXF3fl.js → PiExtensionsManager-Dz69kkKs.js} +2 -2
  48. package/dist/client/assets/PluginManager-DSiHizRD.css +1 -0
  49. package/dist/client/assets/{PluginManager-CSSDb3VO.js → PluginManager-LHCVcduP.js} +1 -1
  50. package/dist/client/assets/PullRequestView-3AdbS2a1.css +1 -0
  51. package/dist/client/assets/{PullRequestView-Bjyfffdu.js → PullRequestView-DBJutLLl.js} +2 -2
  52. package/dist/client/assets/{ResearchView-CRU_NPho.js → ResearchView-gpn1XcVy.js} +1 -1
  53. package/dist/client/assets/{SecretsView-Bs8ySyC5.js → SecretsView-B7YqIowt.js} +1 -1
  54. package/dist/client/assets/SessionTerminal-9l4bdKcn.js +2 -0
  55. package/dist/client/assets/SessionTerminal-BNgtmXb3.css +1 -0
  56. package/dist/client/assets/SettingsModal-BGEK9_9A.js +31 -0
  57. package/dist/client/assets/{SettingsModal-DpAxDq6M.css → SettingsModal-CKv0TJfM.css} +1 -1
  58. package/dist/client/assets/SettingsModal-CXogw-Er.css +1 -0
  59. package/dist/client/assets/{SettingsModal-Nw5cTKAK.js → SettingsModal-DIIoHGUH.js} +1 -1
  60. package/dist/client/assets/{SetupWizardModal-CE79myEy.js → SetupWizardModal-BcVeMxeX.js} +1 -1
  61. package/dist/client/assets/{SkillsView-Dc8YskAX.js → SkillsView-BxSJ4PHL.js} +1 -1
  62. package/dist/client/assets/{StashRecoveryView-CqKOFiXT.js → StashRecoveryView-BhFQ2FsP.js} +1 -1
  63. package/dist/client/assets/{TodoView-BqIRwcZw.js → TodoView-BZpewjy0.js} +2 -2
  64. package/dist/client/assets/WorkflowNodeEditor-Yn1FRF2v.css +1 -0
  65. package/dist/client/assets/WorkflowNodeEditor-tWsgCdVt.js +8 -0
  66. package/dist/client/assets/{addon-fit-B4jkcKk4.js → addon-fit-SnYDEvGm.js} +1 -1
  67. package/dist/client/assets/{addon-unicode11-Cdne2Sj4.js → addon-unicode11-s5GoZCpi.js} +1 -1
  68. package/dist/client/assets/{addon-web-links-CRNLzj7m.js → addon-web-links-jjt2f_oV.js} +1 -1
  69. package/dist/client/assets/{addon-webgl-CeCSULF1.js → addon-webgl-Icn-RnEx.js} +1 -1
  70. package/dist/client/assets/{app-sEkTyT-w.js → app-BmGA0Hiz.js} +3 -3
  71. package/dist/client/assets/{app-BffGU_HQ.js → app-CEVYlVuJ.js} +3 -3
  72. package/dist/client/assets/{app-C8AHhs5N.js → app-CbBFax2C.js} +3 -3
  73. package/dist/client/assets/{app-B2ZxMfJT.js → app-DORKrGAz.js} +3 -3
  74. package/dist/client/assets/{app-Ri9Te2Dv.js → app-DQibuQ9z.js} +3 -3
  75. package/dist/client/assets/app-k76GrQP0.js +13 -0
  76. package/dist/client/assets/{createLucideIcon-BYvOGRiO.js → createLucideIcon-DmVITl5d.js} +1 -1
  77. package/dist/client/assets/{dashboard-view-C3SsjXo1.js → dashboard-view-B4LXCv5H.js} +4 -4
  78. package/dist/client/assets/{dashboard-view-DlKsVySD.js → dashboard-view-BFoyhTYF.js} +1 -1
  79. package/dist/client/assets/{dashboard-view-BhbN8LPh.js → dashboard-view-Cxzm_eqc.js} +1 -1
  80. package/dist/client/assets/dashboard-view-_8yfNwju.css +1 -0
  81. package/dist/client/assets/{folder-open-Bw1mxVfa.js → folder-open-33WGVnbp.js} +1 -1
  82. package/dist/client/assets/index-Bglw05rM.js +791 -0
  83. package/dist/client/assets/index-FYgnflWD.css +1 -0
  84. package/dist/client/assets/shield-alert-CqeGWBUK.js +6 -0
  85. package/dist/client/assets/{upload-BCmd-1I0.js → upload-C11J2diI.js} +1 -1
  86. package/dist/client/assets/{users-DO_t3V1p.js → users-a-ELbyyZ.js} +1 -1
  87. package/dist/client/assets/{vendor-i18n-CV0mwX_-.js → vendor-i18n-DYlSUfot.js} +1 -1
  88. package/dist/client/assets/vendor-react-BTgM5bbZ.js +49 -0
  89. package/dist/client/assets/{vendor-reactflow-CRZcPCXF.js → vendor-reactflow-ZasuEfF9.js} +3 -3
  90. package/dist/client/assets/{vendor-xterm-tcedd2Jt.js → vendor-xterm-ea7-K05z.js} +1 -1
  91. package/dist/client/assets/{x-CqNX_9E2.js → x-PItWc-wQ.js} +1 -1
  92. package/dist/client/assets/{zoom-out-CSTHbJgD.js → zoom-out-CzlHv0Kj.js} +1 -1
  93. package/dist/client/icons/icon-192.png +0 -0
  94. package/dist/client/icons/icon-512.png +0 -0
  95. package/dist/client/index.html +6 -6
  96. package/dist/client/sw.js +1 -1
  97. package/dist/client/theme-data.css +288 -285
  98. package/dist/client/version.json +1 -1
  99. package/dist/droid-cli/package.json +1 -1
  100. package/dist/droid-cli/src/__tests__/execsync-guard.test.ts +17 -0
  101. package/dist/droid-cli/src/__tests__/process-manager.test.ts +1 -45
  102. package/dist/extension.js +4780 -793
  103. package/dist/extract-zip-WL55Z3AU.js +2497 -0
  104. package/dist/index.min-CHQ3ABYJ.js +2926 -0
  105. package/dist/memory-dreams-7USISKVE.js +32 -0
  106. package/dist/memory-dreams-PBPISUDD.js +32 -0
  107. package/dist/memory-dreams-XNO2B2QF.js +32 -0
  108. package/dist/migration-EH2YOCYQ.js +15 -0
  109. package/dist/migration-PLGTTKL5.js +15 -0
  110. package/dist/migration-WZEZK22R.js +15 -0
  111. package/dist/pi-claude-cli/index.ts +47 -8
  112. package/dist/pi-claude-cli/package.json +4 -1
  113. package/dist/pi-claude-cli/src/__tests__/acp-dispatch.test.ts +80 -0
  114. package/dist/pi-claude-cli/src/__tests__/acp-driver.test.ts +423 -0
  115. package/dist/pi-claude-cli/src/__tests__/execsync-guard.test.ts +14 -0
  116. package/dist/pi-claude-cli/src/__tests__/process-manager.test.ts +1 -45
  117. package/dist/pi-claude-cli/src/__tests__/provider.test.ts +0 -1
  118. package/dist/pi-claude-cli/src/acp-driver.ts +585 -0
  119. package/dist/pi-claude-cli/src/event-bridge.ts +7 -0
  120. package/dist/pi-claude-cli/src/mcp-config.ts +29 -0
  121. package/dist/pi-claude-cli/src/process-manager.ts +6 -38
  122. package/dist/plugin-sdk/index.d.ts +5179 -5144
  123. package/dist/plugins/fusion-plugin-acp-runtime/bundled.js +263 -19
  124. package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
  125. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  126. package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +37 -7
  127. package/dist/plugins/fusion-plugin-compound-engineering/manifest.json +4 -4
  128. package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
  129. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  130. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  131. package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +1 -1
  132. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  133. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  134. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  135. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  136. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  137. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  138. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  139. package/dist/plugins/fusion-plugin-whatsapp-chat/src/__tests__/index.test.ts +5 -1
  140. package/dist/routine-store-GIJ6MXWY.js +10 -0
  141. package/dist/routine-store-HTVC2PUQ.js +10 -0
  142. package/dist/routine-store-KGHZBPDF.js +10 -0
  143. package/package.json +1 -1
  144. package/skill/fusion/references/engine-tools.md +6 -4
  145. package/dist/client/assets/AgentsView-DfznJDek.css +0 -1
  146. package/dist/client/assets/ChatView-BkAG99bj.js +0 -6
  147. package/dist/client/assets/DevServerView-C6DC0URX.js +0 -1
  148. package/dist/client/assets/DocumentsView-OCK1Vsw_.js +0 -1
  149. package/dist/client/assets/ExperimentalAgentOnboardingModal-BNpveCEk.css +0 -1
  150. package/dist/client/assets/GoalsView-CNLTn0rX.js +0 -2
  151. package/dist/client/assets/GoalsView-DI66UsjT.css +0 -1
  152. package/dist/client/assets/InsightsView-C9-mqVvf.css +0 -1
  153. package/dist/client/assets/MemoryView-D3xQIFjj.js +0 -2
  154. package/dist/client/assets/PluginManager-UHVLvWWl.css +0 -1
  155. package/dist/client/assets/PullRequestView-WQIS0zUC.css +0 -1
  156. package/dist/client/assets/ReliabilityView-QKMUDebT.js +0 -1
  157. package/dist/client/assets/ReliabilityView-eoKBhBc4.css +0 -1
  158. package/dist/client/assets/SessionTerminal-BiigPP2l.css +0 -1
  159. package/dist/client/assets/SessionTerminal-Dk1NgmN2.js +0 -2
  160. package/dist/client/assets/SettingsModal-JCaNvdAb.js +0 -31
  161. package/dist/client/assets/SettingsModal-nF_GaeeK.css +0 -1
  162. package/dist/client/assets/WorkflowNodeEditor-2jDuk2FR.js +0 -8
  163. package/dist/client/assets/WorkflowNodeEditor-BokhW3de.css +0 -1
  164. package/dist/client/assets/app-CUu1sm3x.js +0 -13
  165. package/dist/client/assets/dashboard-view-Du53JbmQ.css +0 -1
  166. package/dist/client/assets/index-CpTBp1RG.js +0 -793
  167. package/dist/client/assets/index-DqhCiU35.css +0 -1
  168. package/dist/client/assets/vendor-react-D37HfzIf.js +0 -49
@@ -0,0 +1,32 @@
1
+ import {
2
+ DEFAULT_MEMORY_DREAMS_SCHEDULE,
3
+ MEMORY_DREAMS_SCHEDULE_NAME,
4
+ agentDailyMemoryPath,
5
+ agentMemoryDreamsPath,
6
+ agentMemoryLongTermPath,
7
+ agentMemoryWorkspacePath,
8
+ buildDreamProcessingPrompt,
9
+ createMemoryDreamsAutomation,
10
+ ensureAgentMemoryFiles,
11
+ extractDreamProcessorResult,
12
+ processAgentMemoryDreams,
13
+ processMemoryDreams,
14
+ syncMemoryDreamsAutomation
15
+ } from "./chunk-PSDYB45U.js";
16
+ import "./chunk-5RGECGQL.js";
17
+ import "./chunk-4VNS5WPM.js";
18
+ export {
19
+ DEFAULT_MEMORY_DREAMS_SCHEDULE,
20
+ MEMORY_DREAMS_SCHEDULE_NAME,
21
+ agentDailyMemoryPath,
22
+ agentMemoryDreamsPath,
23
+ agentMemoryLongTermPath,
24
+ agentMemoryWorkspacePath,
25
+ buildDreamProcessingPrompt,
26
+ createMemoryDreamsAutomation,
27
+ ensureAgentMemoryFiles,
28
+ extractDreamProcessorResult,
29
+ processAgentMemoryDreams,
30
+ processMemoryDreams,
31
+ syncMemoryDreamsAutomation
32
+ };
@@ -0,0 +1,32 @@
1
+ import {
2
+ DEFAULT_MEMORY_DREAMS_SCHEDULE,
3
+ MEMORY_DREAMS_SCHEDULE_NAME,
4
+ agentDailyMemoryPath,
5
+ agentMemoryDreamsPath,
6
+ agentMemoryLongTermPath,
7
+ agentMemoryWorkspacePath,
8
+ buildDreamProcessingPrompt,
9
+ createMemoryDreamsAutomation,
10
+ ensureAgentMemoryFiles,
11
+ extractDreamProcessorResult,
12
+ processAgentMemoryDreams,
13
+ processMemoryDreams,
14
+ syncMemoryDreamsAutomation
15
+ } from "./chunk-2JI3F6MG.js";
16
+ import "./chunk-AWKNRUOR.js";
17
+ import "./chunk-4VNS5WPM.js";
18
+ export {
19
+ DEFAULT_MEMORY_DREAMS_SCHEDULE,
20
+ MEMORY_DREAMS_SCHEDULE_NAME,
21
+ agentDailyMemoryPath,
22
+ agentMemoryDreamsPath,
23
+ agentMemoryLongTermPath,
24
+ agentMemoryWorkspacePath,
25
+ buildDreamProcessingPrompt,
26
+ createMemoryDreamsAutomation,
27
+ ensureAgentMemoryFiles,
28
+ extractDreamProcessorResult,
29
+ processAgentMemoryDreams,
30
+ processMemoryDreams,
31
+ syncMemoryDreamsAutomation
32
+ };
@@ -0,0 +1,32 @@
1
+ import {
2
+ DEFAULT_MEMORY_DREAMS_SCHEDULE,
3
+ MEMORY_DREAMS_SCHEDULE_NAME,
4
+ agentDailyMemoryPath,
5
+ agentMemoryDreamsPath,
6
+ agentMemoryLongTermPath,
7
+ agentMemoryWorkspacePath,
8
+ buildDreamProcessingPrompt,
9
+ createMemoryDreamsAutomation,
10
+ ensureAgentMemoryFiles,
11
+ extractDreamProcessorResult,
12
+ processAgentMemoryDreams,
13
+ processMemoryDreams,
14
+ syncMemoryDreamsAutomation
15
+ } from "./chunk-AICJATVW.js";
16
+ import "./chunk-GUV4QQT3.js";
17
+ import "./chunk-4VNS5WPM.js";
18
+ export {
19
+ DEFAULT_MEMORY_DREAMS_SCHEDULE,
20
+ MEMORY_DREAMS_SCHEDULE_NAME,
21
+ agentDailyMemoryPath,
22
+ agentMemoryDreamsPath,
23
+ agentMemoryLongTermPath,
24
+ agentMemoryWorkspacePath,
25
+ buildDreamProcessingPrompt,
26
+ createMemoryDreamsAutomation,
27
+ ensureAgentMemoryFiles,
28
+ extractDreamProcessorResult,
29
+ processAgentMemoryDreams,
30
+ processMemoryDreams,
31
+ syncMemoryDreamsAutomation
32
+ };
@@ -0,0 +1,15 @@
1
+ import {
2
+ BackwardCompat,
3
+ FirstRunDetector,
4
+ MigrationCoordinator,
5
+ ProjectRequiredError
6
+ } from "./chunk-4L6CLWJC.js";
7
+ import "./chunk-BHM3UYWS.js";
8
+ import "./chunk-AWKNRUOR.js";
9
+ import "./chunk-4VNS5WPM.js";
10
+ export {
11
+ BackwardCompat,
12
+ FirstRunDetector,
13
+ MigrationCoordinator,
14
+ ProjectRequiredError
15
+ };
@@ -0,0 +1,15 @@
1
+ import {
2
+ BackwardCompat,
3
+ FirstRunDetector,
4
+ MigrationCoordinator,
5
+ ProjectRequiredError
6
+ } from "./chunk-JKQO7YYZ.js";
7
+ import "./chunk-BMUXDSBF.js";
8
+ import "./chunk-5RGECGQL.js";
9
+ import "./chunk-4VNS5WPM.js";
10
+ export {
11
+ BackwardCompat,
12
+ FirstRunDetector,
13
+ MigrationCoordinator,
14
+ ProjectRequiredError
15
+ };
@@ -0,0 +1,15 @@
1
+ import {
2
+ BackwardCompat,
3
+ FirstRunDetector,
4
+ MigrationCoordinator,
5
+ ProjectRequiredError
6
+ } from "./chunk-RR2HM46R.js";
7
+ import "./chunk-MCUG2Z7M.js";
8
+ import "./chunk-GUV4QQT3.js";
9
+ import "./chunk-4VNS5WPM.js";
10
+ export {
11
+ BackwardCompat,
12
+ FirstRunDetector,
13
+ MigrationCoordinator,
14
+ ProjectRequiredError
15
+ };
@@ -8,6 +8,7 @@
8
8
  import { getModels } from "@earendil-works/pi-ai";
9
9
  import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
10
10
  import { streamViaCli } from "./src/provider.js";
11
+ import { streamViaAcp } from "./src/acp-driver.js";
11
12
  import {
12
13
  validateCliPresenceAsync,
13
14
  validateCliAuthAsync,
@@ -18,9 +19,32 @@ import {
18
19
  getCustomToolDefs,
19
20
  toolsFromContext,
20
21
  writeMcpConfig,
22
+ buildAcpMcpServers,
21
23
  type McpToolDef,
22
24
  } from "./src/mcp-config.js";
23
25
 
26
+ /**
27
+ * Route A kill-switch (U11). When `FUSION_CLAUDE_ACP=1` AND a bridge binary path
28
+ * is available (`FUSION_CLAUDE_ACP_BRIDGE`, injected by the engine seam per
29
+ * KTD10), the provider drives Claude through the ACP bridge instead of
30
+ * `claude -p`. OFF by default: the live `-p` path is untouched until soak.
31
+ */
32
+ function resolveAcpBridgePath(): string | undefined {
33
+ if (process.env.FUSION_CLAUDE_ACP !== "1") return undefined;
34
+ const p = process.env.FUSION_CLAUDE_ACP_BRIDGE;
35
+ return typeof p === "string" && p.length > 0 ? p : undefined;
36
+ }
37
+
38
+ /** Resolve custom tool defs the same way ensureMcpConfig does (context → registry). */
39
+ function resolveToolDefs(
40
+ pi: ExtensionAPI,
41
+ contextTools?: ReadonlyArray<{ name: string; description: string; parameters: Record<string, unknown> }>,
42
+ ): McpToolDef[] {
43
+ let toolDefs = toolsFromContext(contextTools);
44
+ if (toolDefs.length === 0 && Array.isArray(pi.getAllTools())) toolDefs = getCustomToolDefs(pi);
45
+ return toolDefs;
46
+ }
47
+
24
48
  // Kill all active Claude subprocesses on process exit to prevent orphans
25
49
  process.on("exit", killAllProcesses);
26
50
 
@@ -220,14 +244,29 @@ export default function (pi: ExtensionAPI) {
220
244
  api: "pi-claude-cli",
221
245
  models,
222
246
  streamSimple: (model, context, options) => {
223
- const configPath = ensureMcpConfig(
224
- pi,
225
- (context as { tools?: ReadonlyArray<{
226
- name: string;
227
- description: string;
228
- parameters: Record<string, unknown>;
229
- }> }).tools,
230
- );
247
+ const contextTools = (context as { tools?: ReadonlyArray<{
248
+ name: string;
249
+ description: string;
250
+ parameters: Record<string, unknown>;
251
+ }> }).tools;
252
+
253
+ // Route A (U11): drive Claude through the ACP bridge when the kill-switch
254
+ // is on AND a bridge path is injected. OFF by default → `-p` path below.
255
+ const bridgePath = resolveAcpBridgePath();
256
+ if (bridgePath) {
257
+ const toolDefs = resolveToolDefs(pi, contextTools);
258
+ const hash = createHash("sha1").update(JSON.stringify(toolDefs)).digest("hex").slice(0, 12);
259
+ return streamViaAcp(model, context, {
260
+ ...options,
261
+ bridgePath,
262
+ mcpServers: buildAcpMcpServers(toolDefs, hash),
263
+ // Forward only HOME/PATH so the bridged `claude` authenticates from the
264
+ // login/keychain session (R17); never inherited process.env or API keys.
265
+ bridgeEnv: { HOME: process.env.HOME, PATH: process.env.PATH },
266
+ });
267
+ }
268
+
269
+ const configPath = ensureMcpConfig(pi, contextTools);
231
270
  return streamViaCli(model, context, {
232
271
  ...options,
233
272
  mcpConfigPath: configPath,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion/pi-claude-cli",
3
- "version": "0.43.1",
3
+ "version": "0.44.0",
4
4
  "description": "Fusion vendored fork: pi coding-agent extension that routes LLM calls through the Claude Code CLI. Forked from rchern/pi-claude-cli (MIT). See UPSTREAM.md.",
5
5
  "license": "MIT",
6
6
  "private": true,
@@ -19,6 +19,9 @@
19
19
  "url": "https://github.com/Runfusion/Fusion",
20
20
  "directory": "packages/pi-claude-cli"
21
21
  },
22
+ "dependencies": {
23
+ "@agentclientprotocol/sdk": "0.24.0"
24
+ },
22
25
  "peerDependencies": {
23
26
  "@earendil-works/pi-ai": "*",
24
27
  "@earendil-works/pi-coding-agent": "*"
@@ -0,0 +1,80 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+
3
+ // Spy on both transports so we can assert which one streamSimple dispatches to.
4
+ const { streamViaCli, streamViaAcp } = vi.hoisted(() => ({
5
+ streamViaCli: vi.fn(() => ({ kind: "cli" })),
6
+ streamViaAcp: vi.fn(() => ({ kind: "acp" })),
7
+ }));
8
+ vi.mock("../provider.js", () => ({ streamViaCli }));
9
+ vi.mock("../acp-driver.js", () => ({ streamViaAcp }));
10
+ // Registering the provider kicks off async CLI presence/auth probes; stub them
11
+ // so the test doesn't trip the "real CLI launch blocked" guard.
12
+ vi.mock("../process-manager.js", () => ({
13
+ validateCliPresenceAsync: vi.fn(async () => ({ ok: true })),
14
+ validateCliAuthAsync: vi.fn(async () => ({ ok: true })),
15
+ killAllProcesses: vi.fn(),
16
+ }));
17
+ // Belt-and-suspenders: no real CLI spawn even if a probe slips through.
18
+ vi.mock("node:child_process", () => ({ spawn: vi.fn(() => ({ on: vi.fn(), stdout: { on: vi.fn() }, stderr: { on: vi.fn() }, stdin: { write: vi.fn(), end: vi.fn() }, kill: vi.fn() })), execSync: vi.fn(() => Buffer.from("")) }));
19
+
20
+ vi.mock("@earendil-works/pi-ai", () => ({
21
+ getModels: vi.fn(() => []),
22
+ AssistantMessageEventStream: vi.fn(),
23
+ calculateCost: vi.fn(),
24
+ }));
25
+
26
+ import register from "../../index.js";
27
+
28
+ function registerAndGetStreamSimple() {
29
+ const calls: Array<[string, { streamSimple: (...a: unknown[]) => unknown }]> = [];
30
+ const pi = {
31
+ registerProvider: (name: string, cfg: { streamSimple: (...a: unknown[]) => unknown }) => calls.push([name, cfg]),
32
+ on: vi.fn(),
33
+ getAllTools: () => [],
34
+ setActiveTools: vi.fn(),
35
+ } as never;
36
+ register(pi);
37
+ return calls[0][1].streamSimple;
38
+ }
39
+
40
+ const MODEL = { id: "claude-sonnet-4-5" } as never;
41
+ const CTX = { messages: [{ role: "user", content: "hi" }], tools: [] } as never;
42
+
43
+ describe("streamSimple kill-switch dispatch (U11/R9/R14)", () => {
44
+ const saved = { flag: process.env.FUSION_CLAUDE_ACP, bridge: process.env.FUSION_CLAUDE_ACP_BRIDGE };
45
+ beforeEach(() => { streamViaCli.mockClear(); streamViaAcp.mockClear(); });
46
+ afterEach(() => {
47
+ process.env.FUSION_CLAUDE_ACP = saved.flag;
48
+ process.env.FUSION_CLAUDE_ACP_BRIDGE = saved.bridge;
49
+ });
50
+
51
+ it("defaults to the -p path (streamViaCli) when the kill-switch is OFF", () => {
52
+ delete process.env.FUSION_CLAUDE_ACP;
53
+ const streamSimple = registerAndGetStreamSimple();
54
+ streamSimple(MODEL, CTX, {});
55
+ expect(streamViaCli).toHaveBeenCalledTimes(1);
56
+ expect(streamViaAcp).not.toHaveBeenCalled();
57
+ });
58
+
59
+ it("stays on -p when the flag is set but NO bridge path is provided", () => {
60
+ process.env.FUSION_CLAUDE_ACP = "1";
61
+ delete process.env.FUSION_CLAUDE_ACP_BRIDGE;
62
+ const streamSimple = registerAndGetStreamSimple();
63
+ streamSimple(MODEL, CTX, {});
64
+ expect(streamViaCli).toHaveBeenCalledTimes(1);
65
+ expect(streamViaAcp).not.toHaveBeenCalled();
66
+ });
67
+
68
+ it("dispatches to the ACP bridge when the flag AND a bridge path are set", () => {
69
+ process.env.FUSION_CLAUDE_ACP = "1";
70
+ process.env.FUSION_CLAUDE_ACP_BRIDGE = "/abs/claude-code-cli-acp";
71
+ const streamSimple = registerAndGetStreamSimple();
72
+ streamSimple(MODEL, CTX, {});
73
+ expect(streamViaAcp).toHaveBeenCalledTimes(1);
74
+ expect(streamViaCli).not.toHaveBeenCalled();
75
+ // bridgePath forwarded; env restricted to the allow-list at spawn (driver).
76
+ const opts = (streamViaAcp.mock.calls[0] as unknown[])[2] as { bridgePath?: string; bridgeEnv?: Record<string, unknown> };
77
+ expect(opts.bridgePath).toBe("/abs/claude-code-cli-acp");
78
+ expect(opts.bridgeEnv).toBeDefined();
79
+ });
80
+ });