@runfusion/fusion 0.44.0 → 0.46.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 (240) hide show
  1. package/README.md +2 -1
  2. package/dist/bin.js +7431 -2240
  3. package/dist/client/.vite/manifest.json +1118 -331
  4. package/dist/client/assets/AgentDetailView-CgbB51Iw.css +1 -0
  5. package/dist/client/assets/AgentDetailView-D1cA9Bfj.js +18 -0
  6. package/dist/client/assets/{AgentPermissionPolicyEditor--YS4iMUY.js → AgentPermissionPolicyEditor-DE0wv8-L.js} +2 -2
  7. package/dist/client/assets/AgentsView-Bm_FA_1w.js +29 -0
  8. package/dist/client/assets/AgentsView-CzMa5Olf.css +1 -0
  9. package/dist/client/assets/ChatView-BtjkE0V7.css +1 -0
  10. package/dist/client/assets/ChatView-CHEkov6q.js +19 -0
  11. package/dist/client/assets/CommandCenter-Cfgek-dC.js +71 -0
  12. package/dist/client/assets/CommandCenter-DDjpYkPe.css +1 -0
  13. package/dist/client/assets/DevServerView-DgDksVH2.css +1 -0
  14. package/dist/client/assets/DevServerView-_or2KLVw.js +1 -0
  15. package/dist/client/assets/DirectoryPicker-etVwa-6X.js +1 -0
  16. package/dist/client/assets/DocumentsView-e8ZTdPIZ.js +1 -0
  17. package/dist/client/assets/EvalsView-CTbgPUne.css +1 -0
  18. package/dist/client/assets/EvalsView-CjDRQFMQ.js +1 -0
  19. package/dist/client/assets/ExperimentalAgentOnboardingModal-3ZEFv8sr.css +1 -0
  20. package/dist/client/assets/ExperimentalAgentOnboardingModal-DXR0OAsR.js +1 -0
  21. package/dist/client/assets/GoalsView-CUh8JBnJ.css +1 -0
  22. package/dist/client/assets/GoalsView-WWDKVslN.js +2 -0
  23. package/dist/client/assets/InsightsView-C7yRTMPn.css +1 -0
  24. package/dist/client/assets/InsightsView-DxIfxOzx.js +11 -0
  25. package/dist/client/assets/MemoryView-BVW2hkWf.js +2 -0
  26. package/dist/client/assets/MemoryView-CBDUr2Jy.css +1 -0
  27. package/dist/client/assets/PiExtensionsManager-CpSfMok2.js +11 -0
  28. package/dist/client/assets/PluginManager-CpBCy656.js +1 -0
  29. package/dist/client/assets/PullRequestView-BMspX1ga.js +6 -0
  30. package/dist/client/assets/PullRequestView-CpdE3Yo_.css +1 -0
  31. package/dist/client/assets/ResearchView--YEtcv_s.js +1 -0
  32. package/dist/client/assets/ResearchView-DIVNQF4_.css +1 -0
  33. package/dist/client/assets/SecretsView-CC6QDMWN.js +1 -0
  34. package/dist/client/assets/SecretsView-CvFioX7R.css +1 -0
  35. package/dist/client/assets/SessionTerminal-D4R3ScvQ.css +1 -0
  36. package/dist/client/assets/SessionTerminal-DJGtgIls.js +2 -0
  37. package/dist/client/assets/SettingsModal-4d_p8D7W.js +1 -0
  38. package/dist/client/assets/SettingsModal-BESN59Ao.css +1 -0
  39. package/dist/client/assets/SettingsModal-ino68pI2.css +1 -0
  40. package/dist/client/assets/SettingsModal-wABa7xmZ.js +21 -0
  41. package/dist/client/assets/SetupWizardModal-DHe2tXzx.js +2 -0
  42. package/dist/client/assets/ShadcnColorPicker-HX3j1v66.js +11 -0
  43. package/dist/client/assets/ShadcnColorPicker-pqVWCC5-.css +1 -0
  44. package/dist/client/assets/SkillsView-CJ8snrma.css +1 -0
  45. package/dist/client/assets/SkillsView-mdFVTX-r.js +1 -0
  46. package/dist/client/assets/TodoView-CIsL_uvQ.css +1 -0
  47. package/dist/client/assets/TodoView-DQVugDpW.js +6 -0
  48. package/dist/client/assets/WorkflowNodeEditor-CeERQHHu.js +8 -0
  49. package/dist/client/assets/WorkflowNodeEditor-f_XPV5Jd.css +1 -0
  50. package/dist/client/assets/{addon-fit-SnYDEvGm.js → addon-fit-C1WQXRvu.js} +1 -1
  51. package/dist/client/assets/{addon-unicode11-s5GoZCpi.js → addon-unicode11-BVmNDUBM.js} +1 -1
  52. package/dist/client/assets/{addon-web-links-jjt2f_oV.js → addon-web-links-CkVew5xs.js} +1 -1
  53. package/dist/client/assets/{addon-webgl-Icn-RnEx.js → addon-webgl-uLc0RKcC.js} +1 -1
  54. package/dist/client/assets/agentSkills-C2v1wbxh.js +1 -0
  55. package/dist/client/assets/{ExperimentalAgentOnboardingModal-CZ_jbgep.css → agentSkills-bQJ4X1gH.css} +1 -1
  56. package/dist/client/assets/agentsOrgChartLayout-BMvyuaLA.js +1 -0
  57. package/dist/client/assets/app-BJGkp7Tt.js +13 -0
  58. package/dist/client/assets/app-BKLUvvm8.js +13 -0
  59. package/dist/client/assets/app-BaoNC9zg.js +13 -0
  60. package/dist/client/assets/app-CZQ_fFNf.js +13 -0
  61. package/dist/client/assets/app-DAu3AzsS.js +13 -0
  62. package/dist/client/assets/app-DgezOJub.js +13 -0
  63. package/dist/client/assets/arc-cxkkNsnK.js +1 -0
  64. package/dist/client/assets/architectureDiagram-3BPJPVTR-CGEhhgX_.js +36 -0
  65. package/dist/client/assets/band-CquvqAHh.js +1 -0
  66. package/dist/client/assets/blockDiagram-GPEHLZMM-D0DTo0HT.js +132 -0
  67. package/dist/client/assets/c4Diagram-AAUBKEIU-DNykNaRb.js +10 -0
  68. package/dist/client/assets/channel-Dwf1FoGU.js +1 -0
  69. package/dist/client/assets/chunk-2J33WTMH-5oQfAhmr.js +1 -0
  70. package/dist/client/assets/chunk-4BX2VUAB-BqLZXgFw.js +1 -0
  71. package/dist/client/assets/chunk-55IACEB6-C1oIjX3T.js +1 -0
  72. package/dist/client/assets/chunk-727SXJPM-BaovQTgk.js +206 -0
  73. package/dist/client/assets/chunk-AQP2D5EJ-B4ikBK42.js +231 -0
  74. package/dist/client/assets/chunk-FMBD7UC4-5zgtNnG2.js +15 -0
  75. package/dist/client/assets/chunk-ND2GUHAM-ByrypRna.js +1 -0
  76. package/dist/client/assets/chunk-QZHKN3VN-B7D1exsu.js +1 -0
  77. package/dist/client/assets/classDiagram-4FO5ZUOK-WqSUwcK_.js +1 -0
  78. package/dist/client/assets/classDiagram-v2-Q7XG4LA2-WqSUwcK_.js +1 -0
  79. package/dist/client/assets/common-BDp2y6CF.js +1 -0
  80. package/dist/client/assets/common-BnEo5fLN.js +1 -0
  81. package/dist/client/assets/common-Bzr_Y8h4.js +1 -0
  82. package/dist/client/assets/common-CvwyFzfv.js +1 -0
  83. package/dist/client/assets/common-CztCXRkz.js +1 -0
  84. package/dist/client/assets/common-DPe2mbb7.js +1 -0
  85. package/dist/client/assets/cose-bilkent-S5V4N54A-CQmiNzGr.js +1 -0
  86. package/dist/client/assets/cytoscape.esm-OyMbaexL.js +331 -0
  87. package/dist/client/assets/dagre-BM42HDAG-BH8Uk0Up.js +4 -0
  88. package/dist/client/assets/{dashboard-view-B4LXCv5H.js → dashboard-view-CWJ-b59n.js} +1680 -1620
  89. package/dist/client/assets/dashboard-view-D3PWY2PH.js +1 -0
  90. package/dist/client/assets/dashboard-view-D_zsA-kz.css +1 -0
  91. package/dist/client/assets/defaultLocale-DX6XiGOO.js +1 -0
  92. package/dist/client/assets/diagram-2AECGRRQ-CDoHfkxY.js +43 -0
  93. package/dist/client/assets/diagram-5GNKFQAL-DARILCuD.js +10 -0
  94. package/dist/client/assets/diagram-KO2AKTUF-CNP-qi0y.js +3 -0
  95. package/dist/client/assets/diagram-LMA3HP47-SCiVmkcf.js +24 -0
  96. package/dist/client/assets/diagram-OG6HWLK6-iTJLXH61.js +24 -0
  97. package/dist/client/assets/erDiagram-TEJ5UH35-ByMpiPIa.js +85 -0
  98. package/dist/client/assets/flowDiagram-I6XJVG4X-DW3m3ZpM.js +162 -0
  99. package/dist/client/assets/{folder-open-33WGVnbp.js → folder-open-G-9vPAdv.js} +1 -1
  100. package/dist/client/assets/ganttDiagram-6RSMTGT7-BJeYH7Ol.js +292 -0
  101. package/dist/client/assets/gitGraphDiagram-PVQCEYII-CK_Chj4m.js +106 -0
  102. package/dist/client/assets/graph--OzhPTMs.js +1 -0
  103. package/dist/client/assets/index-BZBQ_KsL.css +1 -0
  104. package/dist/client/assets/index-ccFe_1av.js +1459 -0
  105. package/dist/client/assets/infoDiagram-5YYISTIA-D8Wg1IgN.js +2 -0
  106. package/dist/client/assets/init-Dmth1JHB.js +1 -0
  107. package/dist/client/assets/ishikawaDiagram-YF4QCWOH-DWROR2aX.js +70 -0
  108. package/dist/client/assets/journeyDiagram-JHISSGLW-Bns9774_.js +139 -0
  109. package/dist/client/assets/kanban-definition-UN3LZRKU-QtURfAoI.js +89 -0
  110. package/dist/client/assets/katex-HP8lGamR.js +257 -0
  111. package/dist/client/assets/layout-SsrduOYp.js +1 -0
  112. package/dist/client/assets/linear-dXivciGL.js +1 -0
  113. package/dist/client/assets/mermaid.core-DqgrgWWm.js +309 -0
  114. package/dist/client/assets/mindmap-definition-RKZ34NQL-jLaDb5_X.js +96 -0
  115. package/dist/client/assets/ordinal-DILIJJjt.js +1 -0
  116. package/dist/client/assets/pieDiagram-4H26LBE5-CjbHuIje.js +30 -0
  117. package/dist/client/assets/quadrantDiagram-W4KKPZXB-xgHbylQr.js +7 -0
  118. package/dist/client/assets/requirementDiagram-4Y6WPE33-CHdD7W41.js +84 -0
  119. package/dist/client/assets/sankeyDiagram-5OEKKPKP-C3me87g9.js +40 -0
  120. package/dist/client/assets/sequenceDiagram-3UESZ5HK-DSHfs1kU.js +162 -0
  121. package/dist/client/assets/{shield-alert-CqeGWBUK.js → shield-alert-DkGlhVjI.js} +1 -1
  122. package/dist/client/assets/stateDiagram-AJRCARHV-C08n7sMP.js +1 -0
  123. package/dist/client/assets/stateDiagram-v2-BHNVJYJU-BosoAbfO.js +1 -0
  124. package/dist/client/assets/step-yuy0qJer.js +1 -0
  125. package/dist/client/assets/time-DoDTxsna.js +1 -0
  126. package/dist/client/assets/timeline-definition-PNZ67QCA-C21h9Zqh.js +120 -0
  127. package/dist/client/assets/{upload-C11J2diI.js → upload-B9B-tYt9.js} +1 -1
  128. package/dist/client/assets/{users-a-ELbyyZ.js → users-C_BA3C7E.js} +1 -1
  129. package/dist/client/assets/{vendor-i18n-DYlSUfot.js → vendor-i18n-GF3RlKbq.js} +2 -2
  130. package/dist/client/assets/{vendor-react-BTgM5bbZ.js → vendor-react-SZ_qB27O.js} +1 -1
  131. package/dist/client/assets/vendor-reactflow-Bg-Qjzh8.js +15 -0
  132. package/dist/client/assets/{vendor-xterm-ea7-K05z.js → vendor-xterm-BNq00GSj.js} +1 -1
  133. package/dist/client/assets/vennDiagram-CIIHVFJN-Bv3G0dwI.js +34 -0
  134. package/dist/client/assets/wardley-L42UT6IY-WX0hHKcN.js +173 -0
  135. package/dist/client/assets/wardleyDiagram-YWT4CUSO-CMwIPWm7.js +78 -0
  136. package/dist/client/assets/xychartDiagram-2RQKCTM6-CZvFdt6j.js +7 -0
  137. package/dist/client/assets/zoom-out-NWbVkreR.js +41 -0
  138. package/dist/client/index.html +30 -10
  139. package/dist/client/sw.js +1 -1
  140. package/dist/client/theme-data.css +3082 -206
  141. package/dist/client/version.json +1 -1
  142. package/dist/droid-cli/index.ts +56 -40
  143. package/dist/droid-cli/package.json +1 -1
  144. package/dist/droid-cli/src/__tests__/index.test.ts +47 -21
  145. package/dist/droid-cli/src/__tests__/process-manager.test.ts +50 -33
  146. package/dist/extension.js +5405 -919
  147. package/dist/pi-claude-cli/package.json +1 -1
  148. package/dist/pi-claude-cli/src/__tests__/process-manager.test.ts +25 -0
  149. package/dist/pi-claude-cli/src/process-manager.ts +11 -1
  150. package/dist/plugin-sdk/index.d.ts +137 -4
  151. package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
  152. package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
  153. package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
  154. package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
  155. package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
  156. package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +68 -44
  157. package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
  158. package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
  159. package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
  160. package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
  161. package/dist/plugins/fusion-plugin-reports/package.json +1 -1
  162. package/dist/plugins/fusion-plugin-roadmap/bundled.js +5 -11
  163. package/dist/plugins/fusion-plugin-roadmap/manifest.json +1 -11
  164. package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
  165. package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
  166. package/package.json +3 -3
  167. package/skill/fusion/SKILL.md +1 -1
  168. package/skill/fusion/references/cli-commands.md +2 -1
  169. package/skill/fusion/references/extension-tools.md +10 -0
  170. package/skill/fusion/references/fusion-capabilities.md +3 -1
  171. package/dist/client/assets/AgentDetailView-CanIeYHg.css +0 -1
  172. package/dist/client/assets/AgentDetailView-DxV8pFHX.js +0 -18
  173. package/dist/client/assets/AgentsView-BVILQjdS.css +0 -1
  174. package/dist/client/assets/AgentsView-CTzbcvhK.js +0 -29
  175. package/dist/client/assets/ChatView-COygcnyk.js +0 -6
  176. package/dist/client/assets/ChatView-DwJAd5G1.css +0 -1
  177. package/dist/client/assets/CommandCenter-CTaopaC0.css +0 -1
  178. package/dist/client/assets/CommandCenter-DoKX2HWm.js +0 -56
  179. package/dist/client/assets/DevServerView-Cyevyvqx.js +0 -1
  180. package/dist/client/assets/DevServerView-VTQY28P7.css +0 -1
  181. package/dist/client/assets/DirectoryPicker-DBdyXEhR.js +0 -1
  182. package/dist/client/assets/DocumentsView-BzSMyrns.js +0 -1
  183. package/dist/client/assets/DocumentsView-WfVoTZt8.css +0 -1
  184. package/dist/client/assets/EvalsView-CUNJ1TLc.css +0 -1
  185. package/dist/client/assets/EvalsView-ikz00o9g.js +0 -1
  186. package/dist/client/assets/ExperimentalAgentOnboardingModal-D-rzCCET.js +0 -499
  187. package/dist/client/assets/GoalsView-Bfu1Oy2-.js +0 -2
  188. package/dist/client/assets/GoalsView-rg9VSIza.css +0 -1
  189. package/dist/client/assets/InsightsView-Cgmf5nES.js +0 -11
  190. package/dist/client/assets/InsightsView-LMv1M1dU.css +0 -1
  191. package/dist/client/assets/MemoryView-DkEuDKQs.js +0 -2
  192. package/dist/client/assets/MemoryView-zaXewZzi.css +0 -1
  193. package/dist/client/assets/NodesView-7VInxyf_.css +0 -1
  194. package/dist/client/assets/NodesView-B_KYfS4o.js +0 -14
  195. package/dist/client/assets/PiExtensionsManager-Dz69kkKs.js +0 -11
  196. package/dist/client/assets/PluginManager-LHCVcduP.js +0 -1
  197. package/dist/client/assets/PullRequestView-3AdbS2a1.css +0 -1
  198. package/dist/client/assets/PullRequestView-DBJutLLl.js +0 -6
  199. package/dist/client/assets/ResearchView-DTh8FLUm.css +0 -1
  200. package/dist/client/assets/ResearchView-gpn1XcVy.js +0 -1
  201. package/dist/client/assets/SecretsView-B7YqIowt.js +0 -1
  202. package/dist/client/assets/SecretsView-Djo1rahi.css +0 -1
  203. package/dist/client/assets/SessionTerminal-9l4bdKcn.js +0 -2
  204. package/dist/client/assets/SessionTerminal-BNgtmXb3.css +0 -1
  205. package/dist/client/assets/SettingsModal-BGEK9_9A.js +0 -31
  206. package/dist/client/assets/SettingsModal-CKv0TJfM.css +0 -1
  207. package/dist/client/assets/SettingsModal-CXogw-Er.css +0 -1
  208. package/dist/client/assets/SettingsModal-DIIoHGUH.js +0 -1
  209. package/dist/client/assets/SetupWizardModal-BcVeMxeX.js +0 -1
  210. package/dist/client/assets/SetupWizardModal-CIqFbkrD.css +0 -1
  211. package/dist/client/assets/SkillsView-3bhGyWs1.css +0 -1
  212. package/dist/client/assets/SkillsView-BxSJ4PHL.js +0 -1
  213. package/dist/client/assets/StashRecoveryView-B_8WIQEo.css +0 -1
  214. package/dist/client/assets/StashRecoveryView-BhFQ2FsP.js +0 -1
  215. package/dist/client/assets/TodoView-7xIh-Fmi.css +0 -1
  216. package/dist/client/assets/TodoView-BZpewjy0.js +0 -6
  217. package/dist/client/assets/WorkflowNodeEditor-Yn1FRF2v.css +0 -1
  218. package/dist/client/assets/WorkflowNodeEditor-tWsgCdVt.js +0 -8
  219. package/dist/client/assets/app-BmGA0Hiz.js +0 -13
  220. package/dist/client/assets/app-CEVYlVuJ.js +0 -13
  221. package/dist/client/assets/app-CbBFax2C.js +0 -13
  222. package/dist/client/assets/app-DORKrGAz.js +0 -13
  223. package/dist/client/assets/app-DQibuQ9z.js +0 -13
  224. package/dist/client/assets/app-k76GrQP0.js +0 -13
  225. package/dist/client/assets/common-BRyX4VxB.js +0 -1
  226. package/dist/client/assets/common-CN9QPI2d.js +0 -1
  227. package/dist/client/assets/common-CNbjPELi.js +0 -1
  228. package/dist/client/assets/common-DFDqu_n0.js +0 -1
  229. package/dist/client/assets/common-DgWWKG8Z.js +0 -1
  230. package/dist/client/assets/common-X6PzBnVA.js +0 -1
  231. package/dist/client/assets/createLucideIcon-DmVITl5d.js +0 -21
  232. package/dist/client/assets/dashboard-view-BFoyhTYF.js +0 -3
  233. package/dist/client/assets/dashboard-view-Cxzm_eqc.js +0 -1
  234. package/dist/client/assets/dashboard-view-DdGlfuu-.css +0 -1
  235. package/dist/client/assets/dashboard-view-_8yfNwju.css +0 -1
  236. package/dist/client/assets/index-Bglw05rM.js +0 -791
  237. package/dist/client/assets/index-FYgnflWD.css +0 -1
  238. package/dist/client/assets/vendor-reactflow-ZasuEfF9.js +0 -15
  239. package/dist/client/assets/x-PItWc-wQ.js +0 -61
  240. package/dist/client/assets/zoom-out-CzlHv0Kj.js +0 -21
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion/pi-claude-cli",
3
- "version": "0.44.0",
3
+ "version": "0.46.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,
@@ -414,6 +414,16 @@ describe("validateCliPresenceAsync", () => {
414
414
  const result = await validateCliPresenceAsync();
415
415
  expect(result.ok).toBe(false);
416
416
  });
417
+
418
+ it("resolves ok=false instead of rejecting when claude spawn throws synchronously", async () => {
419
+ (spawn as any).mockImplementationOnce(() => {
420
+ throw new Error("Real AI CLI launch blocked during tests: claude --version");
421
+ });
422
+
423
+ await expect(validateCliPresenceAsync()).resolves.toMatchObject({
424
+ ok: false,
425
+ });
426
+ });
417
427
  });
418
428
 
419
429
  describe("validateCliAuthAsync", () => {
@@ -451,6 +461,21 @@ describe("validateCliAuthAsync", () => {
451
461
  );
452
462
  warnSpy.mockRestore();
453
463
  });
464
+
465
+ it("resolves false instead of rejecting when claude auth spawn throws synchronously", async () => {
466
+ (spawn as any).mockImplementationOnce(() => {
467
+ throw new Error(
468
+ "Real AI CLI launch blocked during tests: claude auth status",
469
+ );
470
+ });
471
+ const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
472
+
473
+ await expect(validateCliAuthAsync()).resolves.toBe(false);
474
+ expect(warnSpy).toHaveBeenCalledWith(
475
+ expect.stringContaining("not authenticated"),
476
+ );
477
+ warnSpy.mockRestore();
478
+ });
454
479
  });
455
480
 
456
481
  describe("CLI flags", () => {
@@ -219,10 +219,20 @@ export function captureStderr(proc: ChildProcess): () => string {
219
219
  * does this on every chat send), sync probes freeze every other request.
220
220
  * This async variant uses spawn so the loop keeps turning while the subprocess
221
221
  * starts up.
222
+ *
223
+ * FNXC:CliRuntime 2026-06-20-17:25:
224
+ * FN-6808/FN-6801 require this fire-and-forget auth/presence probe to never reject. Catch synchronous spawn throws from the Vitest child-process guard or platform launch errors and resolve 127, matching the async error sentinel so callers degrade to unauthenticated/not-present instead of surfacing unhandled promise rejections.
222
225
  */
223
226
  function runClaudeProbe(args: string[], timeoutMs = 5000): Promise<number> {
224
227
  return new Promise((resolve) => {
225
- const proc = spawn("claude", args, { stdio: "ignore" });
228
+ let proc: ChildProcess;
229
+ try {
230
+ proc = spawn("claude", args, { stdio: "ignore" });
231
+ } catch {
232
+ resolve(127);
233
+ return;
234
+ }
235
+
226
236
  const timer = setTimeout(() => {
227
237
  try {
228
238
  proc.kill("SIGKILL");
@@ -236,6 +236,8 @@ interface FixFeatureCreatedPayload {
236
236
  }
237
237
  declare const MISSION_ASSERTION_STATUSES: readonly ["pending", "passed", "failed", "blocked"];
238
238
  type MissionAssertionStatus = (typeof MISSION_ASSERTION_STATUSES)[number];
239
+ declare const MISSION_ASSERTION_TYPES: readonly ["static", "behavioral"];
240
+ type MissionAssertionType = (typeof MISSION_ASSERTION_TYPES)[number];
239
241
  declare const MILESTONE_VALIDATION_STATES: readonly ["not_started", "needs_coverage", "ready", "passed", "failed", "blocked"];
240
242
  type MilestoneValidationState = (typeof MILESTONE_VALIDATION_STATES)[number];
241
243
  interface MissionContractAssertion {
@@ -245,6 +247,7 @@ interface MissionContractAssertion {
245
247
  title: string;
246
248
  assertion: string;
247
249
  status: MissionAssertionStatus;
250
+ type: MissionAssertionType;
248
251
  orderIndex: number;
249
252
  createdAt: string;
250
253
  updatedAt: string;
@@ -269,12 +272,14 @@ interface ContractAssertionCreateInput {
269
272
  title: string;
270
273
  assertion: string;
271
274
  status?: MissionAssertionStatus;
275
+ type?: MissionAssertionType;
272
276
  sourceFeatureId?: string;
273
277
  }
274
278
  interface ContractAssertionUpdateInput {
275
279
  title?: string;
276
280
  assertion?: string;
277
281
  status?: MissionAssertionStatus;
282
+ type?: MissionAssertionType;
278
283
  }
279
284
 
280
285
  type InReviewStallCode = "merge-blocker" | "transient-merge-status-no-owner" | "merge-retries-exhausted" | "no-worktree-no-merge-confirmed" | "non-retryable-provider-error";
@@ -284,6 +289,14 @@ interface InReviewStallSignal {
284
289
  observedAt: string;
285
290
  }
286
291
 
292
+ interface ModelPricing {
293
+ inputPer1M: number;
294
+ outputPer1M: number;
295
+ cacheReadPer1M: number;
296
+ cacheWritePer1M: number;
297
+ source: string;
298
+ }
299
+
287
300
  type InReviewStalledCode = "in-review-stalled";
288
301
  interface InReviewStalledSignal {
289
302
  code: InReviewStalledCode;
@@ -761,6 +774,7 @@ declare class GlobalSettingsStore {
761
774
  constructor(dir?: string);
762
775
  init(): Promise<boolean>;
763
776
  readRaw(): Promise<Record<string, unknown>>;
777
+ private readRawForUpdate;
764
778
  getSettings(): Promise<GlobalSettings>;
765
779
  updateSettings(patch: Partial<GlobalSettings> & Record<string, unknown>): Promise<GlobalSettings>;
766
780
  getSettingsPath(): string;
@@ -947,7 +961,9 @@ declare class MissionStore extends EventEmitter<MissionStoreEvents> {
947
961
  getValidatorRunsByFeature(featureId: string): MissionValidatorRun[];
948
962
  listStaleRunningValidatorRuns(maxAgeMs: number, now?: number): MissionValidatorRun[];
949
963
  reapValidatorRun(runId: string, reason: string): MissionValidatorRun;
950
- createGeneratedFixFeature(sourceFeatureId: string, runId: string, failedAssertionIds: string[], title?: string): MissionFeature;
964
+ createGeneratedFixFeature(sourceFeatureId: string, runId: string, failedAssertionIds: string[], failureReason?: string, title?: string): MissionFeature;
965
+ findGeneratedFixFeature(sourceFeatureId: string, runId: string): MissionFeature | undefined;
966
+ findOpenGeneratedFixFeature(sourceFeatureId: string): MissionFeature | undefined;
951
967
  getFeatureLoopSnapshot(featureId: string): MissionFeatureLoopSnapshot;
952
968
  transitionLoopState(featureId: string, newState: FeatureLoopState): MissionFeature;
953
969
  addContractAssertion(milestoneId: string, input: ContractAssertionCreateInput): MissionContractAssertion;
@@ -2701,9 +2717,13 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
2701
2717
  private debounceTimers;
2702
2718
  private debounceMs;
2703
2719
  private taskLocks;
2720
+ private closing;
2721
+ private deferredTaskCreatedWork;
2722
+ private trackDeferredTaskCreatedWork;
2704
2723
  private worktreeAllocationLock;
2705
2724
  private configLock;
2706
2725
  private taskIdStateReconciled;
2726
+ private dbWasCorruptionRecovered;
2707
2727
  private taskIdIntegrityReport;
2708
2728
  private lastTaskIdIntegrityLogSignature;
2709
2729
  private workflowStepsCache;
@@ -2758,6 +2778,7 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
2758
2778
  private buildArchivedAgentLogFields;
2759
2779
  private taskToArchiveEntry;
2760
2780
  private rowToTaskDocument;
2781
+ private rowToArtifact;
2761
2782
  private rowToTaskDocumentRevision;
2762
2783
  private rowToGoalCitation;
2763
2784
  recordGoalCitations(inputs: GoalCitationInput[]): GoalCitation[];
@@ -2798,6 +2819,17 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
2798
2819
  private insertRunAuditEventRow;
2799
2820
  private getSoftDeletedWriteConflict;
2800
2821
  private throwSoftDeletedWriteBlocked;
2822
+ private normalizeTaskFromDisk;
2823
+ private getMalformedTaskMetadataReason;
2824
+ reconcileOrphanedTaskDirs(opts?: {
2825
+ ignoreRecencyWindow?: boolean;
2826
+ }): Promise<{
2827
+ recovered: string[];
2828
+ skipped: Array<{
2829
+ id: string;
2830
+ reason: string;
2831
+ }>;
2832
+ }>;
2801
2833
  private readTaskJson;
2802
2834
  private writeTaskJsonFile;
2803
2835
  private atomicCreateTaskJson;
@@ -2823,6 +2855,8 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
2823
2855
  resolveLocalNodeIdForTaskAllocation(): Promise<string>;
2824
2856
  private createTaskWithDistributedReservation;
2825
2857
  private taskDir;
2858
+ private artifactRegistryDir;
2859
+ private static artifactStoredName;
2826
2860
  private getBuiltInWorkflowTemplate;
2827
2861
  private toBuiltInWorkflowStep;
2828
2862
  private toStoredWorkflowStep;
@@ -3097,6 +3131,10 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
3097
3131
  listWorkflowSettingValuesForProject(): Record<string, Record<string, unknown>>;
3098
3132
  computeMovedSettingsTargetWorkflowIds(): Promise<Set<string>>;
3099
3133
  getWorkflowSettingValues(workflowId: string, projectId: string): Record<string, unknown>;
3134
+ private parseWorkflowPromptOverrideJson;
3135
+ listWorkflowPromptOverridesForProject(): Record<string, Record<string, string>>;
3136
+ getWorkflowPromptOverrides(workflowId: string, projectId: string): Record<string, string>;
3137
+ updateWorkflowPromptOverrides(workflowId: string, projectId: string, patch: Record<string, string | null | undefined>): Record<string, string>;
3100
3138
  updateWorkflowSettingValues(workflowId: string, projectId: string, patch: Record<string, unknown>): Promise<Record<string, unknown>>;
3101
3139
  private updateTaskUnlocked;
3102
3140
  pauseTask(id: string, paused: boolean, runContext?: RunMutationContext, agentOptions?: {
@@ -3161,6 +3199,7 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
3161
3199
  }): CompletionHandoffMarker;
3162
3200
  clearCompletionHandoffAcceptedMarker(taskId: string): void;
3163
3201
  getCompletionHandoffAcceptedMarker(taskId: string): CompletionHandoffMarker | null;
3202
+ recordPluginActivation(input: PluginActivationInput): PluginActivation;
3164
3203
  private rowToRunAuditEvent;
3165
3204
  recordRunAuditEvent(input: RunAuditEventInput): RunAuditEvent;
3166
3205
  private isLegacyAutoMergeStampCandidate;
@@ -3262,6 +3301,19 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
3262
3301
  reviewState?: "APPROVED" | "CHANGES_REQUESTED" | "COMMENTED";
3263
3302
  }, runContext?: RunMutationContext): Promise<Task>;
3264
3303
  private hasActiveTask;
3304
+ private writeArtifactData;
3305
+ private insertArtifactRow;
3306
+ registerArtifact(input: ArtifactCreateInput): Promise<Artifact>;
3307
+ getArtifact(id: string): Promise<Artifact | null>;
3308
+ getArtifacts(taskId: string): Promise<Artifact[]>;
3309
+ listArtifacts(options?: {
3310
+ type?: ArtifactType;
3311
+ authorId?: string;
3312
+ taskId?: string;
3313
+ limit?: number;
3314
+ offset?: number;
3315
+ search?: string;
3316
+ }): Promise<ArtifactWithTask[]>;
3265
3317
  getTaskDocuments(taskId: string): Promise<TaskDocument[]>;
3266
3318
  getAllDocuments(options?: {
3267
3319
  searchQuery?: string;
@@ -3332,6 +3384,7 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
3332
3384
  includeDisabledBuiltins?: boolean;
3333
3385
  }): Promise<WorkflowDefinition[]>;
3334
3386
  private readAllWorkflowDefinitions;
3387
+ private applyBuiltInPromptOverridesSync;
3335
3388
  getWorkflowDefinition(id: string): Promise<WorkflowDefinition | undefined>;
3336
3389
  updateWorkflowDefinition(id: string, updates: WorkflowDefinitionUpdate): Promise<WorkflowDefinition>;
3337
3390
  deleteWorkflowDefinition(id: string): Promise<void>;
@@ -3397,7 +3450,7 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
3397
3450
  };
3398
3451
  }>;
3399
3452
  clearTaskWorkflowSelection(taskId: string): Promise<void>;
3400
- close(): void;
3453
+ close(): Promise<void>;
3401
3454
  get fts5Available(): boolean;
3402
3455
  get archiveFts5Available(): boolean;
3403
3456
  optimizeFts5(mode?: "optimize" | "merge"): boolean;
@@ -3494,6 +3547,9 @@ declare class TaskStore extends EventEmitter<TaskStoreEvents> {
3494
3547
  id?: string;
3495
3548
  }): Promise<TaskCommitAssociation>;
3496
3549
  getTaskCommitAssociationsByLineageId(lineageId: string): Promise<TaskCommitAssociation[]>;
3550
+ backfillCommitAssociationDiffStats(options?: {
3551
+ dryRun?: boolean;
3552
+ }): Promise<CommitAssociationDiffBackfillReport>;
3497
3553
  replaceLegacyTaskCommitAssociations(lineageId: string, associations: Array<Omit<TaskCommitAssociation, "id" | "createdAt" | "updatedAt" | "taskLineageId">>): Promise<void>;
3498
3554
  }
3499
3555
 
@@ -4042,6 +4098,7 @@ declare class Database {
4042
4098
  ok: false;
4043
4099
  errors: string[];
4044
4100
  };
4101
+ private runBackgroundIntegrityCheck;
4045
4102
  refreshIntegrityCheck(): {
4046
4103
  ok: true;
4047
4104
  } | {
@@ -4111,7 +4168,7 @@ declare class Database {
4111
4168
  getPath(): string;
4112
4169
  }
4113
4170
 
4114
- declare const THINKING_LEVELS: readonly ["off", "minimal", "low", "medium", "high"];
4171
+ declare const THINKING_LEVELS: readonly ["off", "minimal", "low", "medium", "high", "xhigh"];
4115
4172
  type ThinkingLevel = (typeof THINKING_LEVELS)[number];
4116
4173
  declare const COLUMNS: readonly ["triage", "todo", "in-progress", "in-review", "done", "archived"];
4117
4174
  type Column = (typeof COLUMNS)[number];
@@ -4237,7 +4294,7 @@ declare const COMPLETION_DOCUMENTATION_MODES: readonly ["off", "changeset", "cha
4237
4294
  type CompletionDocumentationMode = (typeof COMPLETION_DOCUMENTATION_MODES)[number];
4238
4295
  declare const THEME_MODES: readonly ["dark", "light", "system"];
4239
4296
  type ThemeMode = (typeof THEME_MODES)[number];
4240
- declare const COLOR_THEMES: readonly ["default", "ocean", "forest", "sunset", "zen", "berry", "high-contrast", "industrial", "monochrome", "slate", "ash", "graphite", "silver", "solarized", "factory", "ayu", "one-dark", "nord", "dracula", "gruvbox", "tokyo-night", "catppuccin-mocha", "github-dark", "everforest", "rose-pine", "kanagawa", "night-owl", "palenight", "monokai-pro", "slime", "brutalist", "neon-city", "parchment", "terminal", "glass", "horizon", "vitesse", "outrun", "snazzy", "porple", "espresso", "mars", "poimandres", "ember", "rust", "copper", "foundry", "carbon", "sandstone", "lagoon", "frost", "lavender", "neon-bloom", "sepia"];
4297
+ declare const COLOR_THEMES: readonly ["default", "ocean", "forest", "sunset", "zen", "berry", "high-contrast", "industrial", "monochrome", "slate", "ash", "air", "graphite", "silver", "solarized", "factory", "factory-mono", "ayu", "one-dark", "nord", "dracula", "gruvbox", "tokyo-night", "catppuccin-mocha", "github-dark", "everforest", "rose-pine", "kanagawa", "night-owl", "palenight", "monokai-pro", "slime", "brutalist", "neon-city", "parchment", "terminal", "glass", "horizon", "vitesse", "outrun", "snazzy", "porple", "espresso", "mars", "poimandres", "ember", "rust", "copper", "foundry", "carbon", "sandstone", "lagoon", "frost", "lavender", "neon-bloom", "sepia", "shadcn", "shadcn-custom", "shadcn-blue", "shadcn-green", "shadcn-red", "shadcn-purple", "shadcn-pink", "shadcn-orange", "shadcn-yellow", "shadcn-mono-red", "shadcn-mono-blue", "shadcn-mono-green", "shadcn-mono-purple", "shadcn-mono-pink", "shadcn-mono-orange", "shadcn-mono-yellow", "shadcn-black", "shadcn-gray", "shadcn-gray-blue"];
4241
4298
  type ColorTheme = (typeof COLOR_THEMES)[number];
4242
4299
  declare const SUPPORTED_LOCALES: readonly ["en", "zh-CN", "zh-TW", "fr", "es", "ko"];
4243
4300
  type Locale = (typeof SUPPORTED_LOCALES)[number];
@@ -4294,6 +4351,7 @@ interface WorkflowStep {
4294
4351
  gateMode: WorkflowStepGateMode;
4295
4352
  prompt: string;
4296
4353
  toolMode?: WorkflowStepToolMode;
4354
+ skillName?: string;
4297
4355
  scriptName?: string;
4298
4356
  enabled: boolean;
4299
4357
  defaultOn?: boolean;
@@ -4331,6 +4389,7 @@ interface WorkflowStepInput {
4331
4389
  gateMode?: WorkflowStepGateMode;
4332
4390
  prompt?: string;
4333
4391
  toolMode?: WorkflowStepToolMode;
4392
+ skillName?: string;
4334
4393
  scriptName?: string;
4335
4394
  enabled?: boolean;
4336
4395
  defaultOn?: boolean;
@@ -4647,6 +4706,42 @@ interface TaskDocumentWithTask extends TaskDocument {
4647
4706
  taskDescription?: string;
4648
4707
  taskColumn?: string;
4649
4708
  }
4709
+ type ArtifactType = "document" | "image" | "video" | "audio" | "other";
4710
+ interface Artifact {
4711
+ id: string;
4712
+ type: ArtifactType;
4713
+ title: string;
4714
+ description?: string;
4715
+ mimeType?: string;
4716
+ sizeBytes?: number;
4717
+ uri?: string;
4718
+ content?: string;
4719
+ authorId: string;
4720
+ authorType: "agent" | "user" | "system";
4721
+ taskId?: string;
4722
+ metadata?: Record<string, unknown>;
4723
+ createdAt: string;
4724
+ updatedAt: string;
4725
+ }
4726
+ interface ArtifactCreateInput {
4727
+ type: ArtifactType;
4728
+ title: string;
4729
+ description?: string;
4730
+ mimeType?: string;
4731
+ sizeBytes?: number;
4732
+ uri?: string;
4733
+ content?: string;
4734
+ authorId: string;
4735
+ authorType: "agent" | "user" | "system";
4736
+ taskId?: string;
4737
+ metadata?: Record<string, unknown>;
4738
+ data?: Buffer;
4739
+ }
4740
+ interface ArtifactWithTask extends Artifact {
4741
+ taskTitle?: string;
4742
+ taskDescription?: string;
4743
+ taskColumn?: string;
4744
+ }
4650
4745
  type GoalCitationSurface = "agent_log" | "task_document";
4651
4746
  interface GoalCitationInput {
4652
4747
  goalId: string;
@@ -4762,6 +4857,17 @@ interface CentralClaimStore {
4762
4857
  };
4763
4858
  getTaskClaim(projectId: string, taskId: string): TaskClaimRow | null;
4764
4859
  }
4860
+ interface TaskTokenUsagePerModel {
4861
+ modelProvider?: string;
4862
+ modelId?: string;
4863
+ inputTokens: number;
4864
+ outputTokens: number;
4865
+ cachedTokens: number;
4866
+ cacheWriteTokens: number;
4867
+ totalTokens: number;
4868
+ firstUsedAt: string;
4869
+ lastUsedAt: string;
4870
+ }
4765
4871
  interface TaskTokenUsage {
4766
4872
  inputTokens: number;
4767
4873
  outputTokens: number;
@@ -4772,6 +4878,7 @@ interface TaskTokenUsage {
4772
4878
  lastUsedAt: string;
4773
4879
  modelProvider?: string;
4774
4880
  modelId?: string;
4881
+ perModel?: TaskTokenUsagePerModel[];
4775
4882
  }
4776
4883
  interface TaskTokenBudget {
4777
4884
  soft?: number;
@@ -5237,11 +5344,15 @@ interface WorktrunkSettings {
5237
5344
  interface GlobalSettings {
5238
5345
  themeMode?: ThemeMode;
5239
5346
  colorTheme?: ColorTheme;
5347
+ shadcnCustomColors?: Record<string, string>;
5240
5348
  dashboardFontScalePct?: number;
5241
5349
  language?: Locale;
5242
5350
  defaultProvider?: string;
5243
5351
  defaultModelId?: string;
5244
5352
  testMode?: boolean;
5353
+ modelPricingOverrides?: Record<string, ModelPricing>;
5354
+ modelPricingFetchedAt?: string;
5355
+ modelPricingSource?: string;
5245
5356
  modelRouterEnabled?: boolean;
5246
5357
  modelRouterCheapProvider?: string;
5247
5358
  modelRouterCheapModelId?: string;
@@ -5621,6 +5732,7 @@ interface ProjectSettings {
5621
5732
  reflectionIntervalMs?: number;
5622
5733
  reflectionAfterTask?: boolean;
5623
5734
  reviewHandoffPolicy?: "disabled" | "comment-triggered" | "always";
5735
+ quickChatButtonMode?: "floating" | "footer" | "off";
5624
5736
  showQuickChatFAB?: boolean;
5625
5737
  chatAutoCleanupDays?: number;
5626
5738
  mailAutoCleanupDays?: number;
@@ -5745,6 +5857,14 @@ interface TaskCommitAssociation {
5745
5857
  createdAt: string;
5746
5858
  updatedAt: string;
5747
5859
  }
5860
+ interface CommitAssociationDiffBackfillReport {
5861
+ scannedRows: number;
5862
+ distinctCommits: number;
5863
+ updatedRows: number;
5864
+ skippedUnavailableCommits: number;
5865
+ skippedInvalidShas: number;
5866
+ dryRun: boolean;
5867
+ }
5748
5868
  interface ArchivedTaskEntry {
5749
5869
  id: string;
5750
5870
  lineageId: string;
@@ -6182,6 +6302,19 @@ interface AgentPromptsConfig {
6182
6302
  templates?: AgentPromptTemplate[];
6183
6303
  roleAssignments?: Partial<Record<AgentCapability, string>>;
6184
6304
  }
6305
+ interface PluginActivation {
6306
+ id: number;
6307
+ pluginId: string;
6308
+ source: string;
6309
+ pluginVersion: string | null;
6310
+ activatedAt: string;
6311
+ }
6312
+ interface PluginActivationInput {
6313
+ pluginId: string;
6314
+ source: string;
6315
+ pluginVersion?: string | null;
6316
+ activatedAt?: string;
6317
+ }
6185
6318
  type RunAuditDomain = "database" | "git" | "filesystem" | "sandbox";
6186
6319
  type RunAuditMutationType = "mergeQueue:enqueue" | "mergeQueue:lease-acquired" | "mergeQueue:lease-released" | "mergeQueue:lease-expired" | "task:handoff" | "task:handoff-invariant-violation" | (string & {});
6187
6320
  interface RunAuditEventInput {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/acp-runtime",
3
- "version": "0.1.7",
3
+ "version": "0.1.9",
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.24",
3
+ "version": "0.1.26",
4
4
  "type": "module",
5
5
  "description": "CLI Printing Press plugin package for Fusion",
6
6
  "private": true,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/compound-engineering",
3
- "version": "0.1.7",
3
+ "version": "0.1.9",
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.26",
3
+ "version": "0.1.28",
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.38",
3
+ "version": "0.1.40",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -136955,6 +136955,7 @@ function forceKillProcess(proc) {
136955
136955
  proc.kill("SIGKILL");
136956
136956
  }
136957
136957
  var activeProcesses = /* @__PURE__ */ new Set();
136958
+ var DROID_MODEL_DISCOVERY_TIMEOUT_MS = 1e4;
136958
136959
  function registerProcess(proc) {
136959
136960
  activeProcesses.add(proc);
136960
136961
  proc.on("exit", () => activeProcesses.delete(proc));
@@ -136979,7 +136980,13 @@ function captureStderr(proc) {
136979
136980
  }
136980
136981
  function runDroidProbe(args, timeoutMs = 45e3) {
136981
136982
  return new Promise((resolve2) => {
136982
- const proc = spawn("droid", args, { stdio: "ignore" });
136983
+ let proc;
136984
+ try {
136985
+ proc = spawn("droid", args, { stdio: "ignore" });
136986
+ } catch {
136987
+ resolve2(127);
136988
+ return;
136989
+ }
136983
136990
  const timer = setTimeout(() => {
136984
136991
  try {
136985
136992
  proc.kill("SIGKILL");
@@ -137015,41 +137022,51 @@ async function validateCliAuthAsync() {
137015
137022
  );
137016
137023
  return false;
137017
137024
  }
137018
- async function discoverDroidModels() {
137019
- const attempts = [["models", "--json"], ["model", "list", "--json"], ["models"]];
137020
- for (const args of attempts) {
137021
- const models = await new Promise((resolve2) => {
137022
- const proc = spawn("droid", args, { stdio: ["ignore", "pipe", "ignore"] });
137023
- let out = "";
137024
- proc.stdout?.on("data", (chunk) => {
137025
- out += chunk.toString();
137026
- });
137027
- proc.once("error", () => resolve2(null));
137028
- proc.once("exit", (code) => {
137029
- if (code !== 0) return resolve2(null);
137030
- const trimmed = out.trim();
137031
- if (!trimmed) return resolve2([]);
137032
- try {
137033
- const parsed = JSON.parse(trimmed);
137034
- if (Array.isArray(parsed)) {
137035
- return resolve2(
137036
- parsed.map(
137037
- (entry) => typeof entry === "string" ? entry : typeof entry?.id === "string" ? entry.id : typeof entry?.name === "string" ? entry.name : void 0
137038
- ).filter((id) => Boolean(id))
137039
- );
137040
- }
137041
- } catch {
137042
- }
137043
- resolve2(
137044
- trimmed.split(/\r?\n/).map((line) => line.trim()).filter(Boolean)
137045
- );
137046
- });
137047
- });
137048
- if (models && models.length > 0) {
137049
- return Array.from(new Set(models));
137025
+ function parseDroidModelsFromHelp(helpText) {
137026
+ const ids = [];
137027
+ let collecting = false;
137028
+ for (const line of helpText.split(/\r?\n/)) {
137029
+ if (/^[A-Za-z][A-Za-z ]*Models:\s*$/.test(line)) {
137030
+ collecting = true;
137031
+ continue;
137032
+ }
137033
+ if (collecting && line.trim() && !/^\s/.test(line)) {
137034
+ collecting = false;
137050
137035
  }
137036
+ if (!collecting) continue;
137037
+ const match2 = line.match(/^\s+(\S+)\s{2,}\S/);
137038
+ if (match2) ids.push(match2[1]);
137051
137039
  }
137052
- return [];
137040
+ return Array.from(new Set(ids));
137041
+ }
137042
+ async function discoverDroidModels() {
137043
+ return new Promise((resolve2) => {
137044
+ let proc;
137045
+ try {
137046
+ proc = spawn("droid", ["exec", "--help"], { stdio: ["ignore", "pipe", "ignore"] });
137047
+ } catch {
137048
+ resolve2([]);
137049
+ return;
137050
+ }
137051
+ let settled = false;
137052
+ const settle = (value) => {
137053
+ if (settled) return;
137054
+ settled = true;
137055
+ clearTimeout(timer);
137056
+ try {
137057
+ if (!proc.killed) proc.kill("SIGKILL");
137058
+ } catch {
137059
+ }
137060
+ resolve2(value);
137061
+ };
137062
+ const timer = setTimeout(() => settle([]), DROID_MODEL_DISCOVERY_TIMEOUT_MS);
137063
+ let out = "";
137064
+ proc.stdout?.on("data", (chunk) => {
137065
+ out += chunk.toString();
137066
+ });
137067
+ proc.once("error", () => settle([]));
137068
+ proc.once("exit", () => settle(parseDroidModelsFromHelp(out)));
137069
+ });
137053
137070
  }
137054
137071
 
137055
137072
  // ../../plugins/fusion-plugin-droid-runtime/src/stream-parser.ts
@@ -137693,15 +137710,28 @@ function resolveDroidBinaryPath(settings2) {
137693
137710
  }
137694
137711
  async function run(binary, args, timeoutMs = 2e3) {
137695
137712
  return new Promise((resolve2) => {
137696
- const child = spawn2(binary, args, { stdio: ["ignore", "pipe", "pipe"] });
137697
137713
  let stdout = "";
137698
137714
  let stderr = "";
137715
+ let child;
137716
+ try {
137717
+ child = spawn2(binary, args, { stdio: ["ignore", "pipe", "pipe"] });
137718
+ } catch {
137719
+ resolve2({ code: 127, stdout, stderr });
137720
+ return;
137721
+ }
137722
+ let settled = false;
137723
+ const settle = (code) => {
137724
+ if (settled) return;
137725
+ settled = true;
137726
+ clearTimeout(timer);
137727
+ resolve2({ code, stdout, stderr });
137728
+ };
137699
137729
  const timer = setTimeout(() => {
137700
137730
  try {
137701
137731
  child.kill("SIGKILL");
137702
137732
  } catch {
137703
137733
  }
137704
- resolve2({ code: 124, stdout, stderr });
137734
+ settle(124);
137705
137735
  }, timeoutMs);
137706
137736
  child.stdout?.on("data", (c) => {
137707
137737
  stdout += c.toString("utf-8");
@@ -137709,14 +137739,8 @@ async function run(binary, args, timeoutMs = 2e3) {
137709
137739
  child.stderr?.on("data", (c) => {
137710
137740
  stderr += c.toString("utf-8");
137711
137741
  });
137712
- child.on("error", () => {
137713
- clearTimeout(timer);
137714
- resolve2({ code: 127, stdout, stderr });
137715
- });
137716
- child.on("close", (code) => {
137717
- clearTimeout(timer);
137718
- resolve2({ code, stdout, stderr });
137719
- });
137742
+ child.on("error", () => settle(127));
137743
+ child.on("close", (code) => settle(code));
137720
137744
  });
137721
137745
  }
137722
137746
  async function probeDroidBinary(options) {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusion-plugin-examples/droid-runtime",
3
- "version": "0.1.33",
3
+ "version": "0.1.35",
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.57",
3
+ "version": "0.2.59",
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.57",
3
+ "version": "0.2.59",
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.57",
3
+ "version": "0.2.59",
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.26",
3
+ "version": "0.1.28",
4
4
  "type": "module",
5
5
  "description": "Reports plugin for Fusion",
6
6
  "private": true,