@puddle-code/cli 0.3.1 → 0.3.3

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 (212) hide show
  1. package/CHANGELOG.md +8 -4
  2. package/dist/host-control.mjs +38 -7
  3. package/dist/index.js +162 -32
  4. package/dist/public/assets/App-CkunCEjY.js +2 -0
  5. package/dist/public/assets/Dashboard-3XQN7EWB.js +1 -0
  6. package/dist/public/assets/EditorTabClose-CCYbaxcQ.js +1 -0
  7. package/dist/public/assets/FindWidget-BsFwo-Vf.js +1 -0
  8. package/dist/public/assets/LazyTerminal-CRonN-zb.js +2 -0
  9. package/dist/public/assets/{ModelRefcount-DaHZ2vpK.js → ModelRefcount-BdmA-Mgb.js} +1 -1
  10. package/dist/public/assets/NewProjectDialog-Bsp8NGgY.js +1 -0
  11. package/dist/public/assets/PaneEditorBody-MSWyifa9.js +299 -0
  12. package/dist/public/assets/PdfViewer-C3kK31fw.js +2 -0
  13. package/dist/public/assets/SettingsDialog-CGT3gjKB.js +8 -0
  14. package/dist/public/assets/Terminal-_KJe85Cp.js +66 -0
  15. package/dist/public/assets/Workspace-ZdFFHXHa.js +20 -0
  16. package/dist/public/assets/abnfDiagram-VCTEODGH-CIbaiPRK.js +1 -0
  17. package/dist/public/assets/architecture-7GRP2DOG-C37y6gLW.js +1 -0
  18. package/dist/public/assets/architectureDiagram-5GKGNRK7-OE8n13hC.js +36 -0
  19. package/dist/public/assets/auth-C3Hg0pRq.js +73 -0
  20. package/dist/public/assets/{blockDiagram-I7D4REHJ-BnnIsbDF.js → blockDiagram-I7D4REHJ-TUFuv4qI.js} +1 -1
  21. package/dist/public/assets/buffer-store-De6oYRzb.js +16 -0
  22. package/dist/public/assets/button-DkCgQgIz.js +1 -0
  23. package/dist/public/assets/{c4Diagram-7LVT6UL2-CSC_Hbql.js → c4Diagram-7LVT6UL2-Cwvhq15S.js} +1 -1
  24. package/dist/public/assets/channel-Bl1m0NKH.js +1 -0
  25. package/dist/public/assets/chunk-2E4U76K2-3abpRZU5.js +2 -0
  26. package/dist/public/assets/chunk-2ZTRR5NV-NvRGlFrK.js +2 -0
  27. package/dist/public/assets/chunk-3Z5EZCMW-DiR4QWP9.js +1 -0
  28. package/dist/public/assets/{chunk-4HAMMTFA-CFf6LTHp.js → chunk-4HAMMTFA-eolw8o4c.js} +1 -1
  29. package/dist/public/assets/chunk-5V3GS4D5-C1iY134n.js +1 -0
  30. package/dist/public/assets/chunk-6AZGARVD-_0gi5QUW.js +1 -0
  31. package/dist/public/assets/chunk-6EIED4P4-BxkNo1Kd.js +1 -0
  32. package/dist/public/assets/chunk-6K3QC6MW-3E45BuBF.js +1 -0
  33. package/dist/public/assets/chunk-6TQVIW2G-CakkaKNk.js +1 -0
  34. package/dist/public/assets/chunk-747NJXEK-pfB9pTl1.js +2 -0
  35. package/dist/public/assets/{chunk-75Z2AOVW-DmsoAjw5.js → chunk-75Z2AOVW-CYC6lmPG.js} +1 -1
  36. package/dist/public/assets/{chunk-CLGD4ZFX-Dx1fE4HX.js → chunk-CLGD4ZFX-85mvsF4F.js} +1 -1
  37. package/dist/public/assets/chunk-DU6HZSFF-1ZoT19aa.js +125 -0
  38. package/dist/public/assets/{chunk-F27PBJKO-BSaAmHi0.js → chunk-F27PBJKO-DM71futS.js} +1 -1
  39. package/dist/public/assets/{chunk-GMAD6QVW-Dna8BJJq.js → chunk-GMAD6QVW-BzDEhlK8.js} +1 -1
  40. package/dist/public/assets/{chunk-GVQU2GXP-DOhlGSDl.js → chunk-GVQU2GXP-CZrUjjq3.js} +1 -1
  41. package/dist/public/assets/chunk-I5DQTOEV-Dcwirj_w.js +1 -0
  42. package/dist/public/assets/chunk-ICYGCRZG-BJAGKQA9.js +1 -0
  43. package/dist/public/assets/chunk-IH6LHLGP-BN2I9ljI.js +1 -0
  44. package/dist/public/assets/{chunk-IMKFNOWR-D65oIwAv.js → chunk-IMKFNOWR-CLsPi8Op.js} +1 -1
  45. package/dist/public/assets/chunk-KI3K4JFJ-v5_17D28.js +1 -0
  46. package/dist/public/assets/{chunk-L3NEJ4N5-BwcBPm7M.js → chunk-L3NEJ4N5-BW3s5_r9.js} +1 -1
  47. package/dist/public/assets/{chunk-OSK3NFVY-82MNmgWe.js → chunk-OSK3NFVY-Cs_K17E_.js} +1 -1
  48. package/dist/public/assets/chunk-OUJLGHUK-FHDQe81Z.js +2 -0
  49. package/dist/public/assets/{chunk-P2QGCYS3-CfrZ7JB4.js → chunk-P2QGCYS3-C5-f0Lvg.js} +1 -1
  50. package/dist/public/assets/{chunk-POPQ4Y6H-CHs8yAQU.js → chunk-POPQ4Y6H-gkafJx1Z.js} +1 -1
  51. package/dist/public/assets/{chunk-PWAF6VOD-BXxrEmLT.js → chunk-PWAF6VOD-CTSTb7zN.js} +1 -1
  52. package/dist/public/assets/{chunk-SHT3W25Y-DMUmvTem.js → chunk-SHT3W25Y-Cg6sVFNA.js} +1 -1
  53. package/dist/public/assets/{chunk-SVP7TREG-CPru3m3o.js → chunk-SVP7TREG-DRUnItYx.js} +1 -1
  54. package/dist/public/assets/{chunk-TICWLB2K-zN8e4oYt.js → chunk-TICWLB2K-HtG8ibWH.js} +1 -1
  55. package/dist/public/assets/chunk-TLUHSLCS-CcE5HWjm.js +2 -0
  56. package/dist/public/assets/chunk-UY3FDG6J-DHD-4eXF.js +1 -0
  57. package/dist/public/assets/chunk-XHIXRSVI-DRL0dwtI.js +1 -0
  58. package/dist/public/assets/classDiagram-ZZMXUADV-AgT8hWlv.js +1 -0
  59. package/dist/public/assets/classDiagram-v2-VYDZK3BY-AgT8hWlv.js +1 -0
  60. package/dist/public/assets/client-settings-CwqpIric.js +1 -0
  61. package/dist/public/assets/context-menu-0Tb8cG9E.js +1 -0
  62. package/dist/public/assets/copy-CKvSfzPk.js +1 -0
  63. package/dist/public/assets/cssMode-CSjHtANE.js +1 -0
  64. package/dist/public/assets/cynefin-OW5HDTMX-Dy2ZNO0g.js +1 -0
  65. package/dist/public/assets/cynefinDiagram-5FMLGOSQ-C2miE5p0.js +62 -0
  66. package/dist/public/assets/{dagre-GXQ25YYZ-t9AbgVhY.js → dagre-GXQ25YYZ-BjnR_o63.js} +1 -1
  67. package/dist/public/assets/{diagram-S7CK7UJ4-BldMPLHQ.js → diagram-S7CK7UJ4-CBYedG6v.js} +3 -3
  68. package/dist/public/assets/diagram-UQ7AKVKN-CUL346-t.js +41 -0
  69. package/dist/public/assets/diagram-VSXAHHWV-1DKb_UJ5.js +3 -0
  70. package/dist/public/assets/{diagram-VX7I27RA-DtaAnFuF.js → diagram-VX7I27RA-DYP31PbY.js} +2 -2
  71. package/dist/public/assets/{diagram-Z3DM3KII-Bu1-SbmM.js → diagram-Z3DM3KII-C-mC8cmq.js} +1 -1
  72. package/dist/public/assets/dialog-UpZ_vNTE.js +41 -0
  73. package/dist/public/assets/disclosure-D7vpyXdR.js +1 -0
  74. package/dist/public/assets/dist-C2WZA469.js +1 -0
  75. package/dist/public/assets/dist-v3Pwgb3Q.js +1 -0
  76. package/dist/public/assets/ebnfDiagram-PWID7BFC-CnSa44Tb.js +1 -0
  77. package/dist/public/assets/{erDiagram-RLTQ6QDP-C359QLoG.js → erDiagram-RLTQ6QDP-ZmDlrO9k.js} +1 -1
  78. package/dist/public/assets/{errors-1cUzcK5v.js → errors-BH_S68Hd.js} +1 -1
  79. package/dist/public/assets/eventmodeling-NTZA5JFV-uFnlWNGc.js +1 -0
  80. package/dist/public/assets/flowDiagram-HODETNUW-CW47qpBT.js +1 -0
  81. package/dist/public/assets/{ganttDiagram-EL5Y4UJY-xq_Yuf1R.js → ganttDiagram-EL5Y4UJY-raM_gefY.js} +1 -1
  82. package/dist/public/assets/gitGraph-4MIJSDKK-1PxNX92k.js +1 -0
  83. package/dist/public/assets/gitGraphDiagram-WWUBYQGX-DnLrgk4s.js +106 -0
  84. package/dist/public/assets/htmlMode-CIHMS93l.js +1 -0
  85. package/dist/public/assets/index-xDhpMZgv.js +10 -0
  86. package/dist/public/assets/info-A6RAGUB7-BZV44TW1.js +1 -0
  87. package/dist/public/assets/infoDiagram-27XIBGKW-eCv-Vsx8.js +2 -0
  88. package/dist/public/assets/{ishikawaDiagram-5VMMS53U-Bob975Xt.js → ishikawaDiagram-5VMMS53U-DCFnvrdr.js} +1 -1
  89. package/dist/public/assets/{journeyDiagram-3NMN7TZE-x9ssExSV.js → journeyDiagram-3NMN7TZE-6o4KvbhJ.js} +1 -1
  90. package/dist/public/assets/{jsonMode-CmlPrpF1.js → jsonMode-BijgXT6I.js} +1 -1
  91. package/dist/public/assets/jsx-runtime-ffCh33zF.js +1 -0
  92. package/dist/public/assets/{kanban-definition-UXKFOSKX-Cy8SkNND.js → kanban-definition-UXKFOSKX-CQKuhkFV.js} +1 -1
  93. package/dist/public/assets/{line-C0YxHEKk.js → line-D4r_bmlv.js} +1 -1
  94. package/dist/public/assets/markdown-mermaid-D0nzztEz.js +2 -0
  95. package/dist/public/assets/{math-B4Pf1FaR.js → math-CSw6sgCC.js} +2 -2
  96. package/dist/public/assets/math-delimiters-BCnTi7Ii.js +1 -0
  97. package/dist/public/assets/media-refresh-store-Ddvr6wz1.js +1 -0
  98. package/dist/public/assets/mermaid-parser.core-CICMKhjq.js +4 -0
  99. package/dist/public/assets/mermaid.core-D2QzpYEE.js +11 -0
  100. package/dist/public/assets/{mindmap-definition-YA3MSWOX-B6ghAwaT.js → mindmap-definition-YA3MSWOX-DAB8mHOv.js} +1 -1
  101. package/dist/public/assets/monaco.contribution-C0TYpF88.js +2 -0
  102. package/dist/public/assets/notification-delivery-CDu_5PS7.js +1 -0
  103. package/dist/public/assets/packet-AYTQ26CC-Cw5JteoC.js +1 -0
  104. package/dist/public/assets/{pdf-C7rjnygQ.js → pdf-EQHMWEbX.js} +1 -1
  105. package/dist/public/assets/pegDiagram-XKGWAZYB-BE_LYTdh.js +1 -0
  106. package/dist/public/assets/pie-WAS4IAKB-CnPKaBaN.js +1 -0
  107. package/dist/public/assets/pieDiagram-E7YTZNPT-BRffiJ1a.js +39 -0
  108. package/dist/public/assets/preload-helper-Czpn1I53.js +1 -0
  109. package/dist/public/assets/project-abbrev-Br6sQqPh.js +1 -0
  110. package/dist/public/assets/protocol-support-CLMCHX8i.js +1 -0
  111. package/dist/public/assets/{quadrantDiagram-AXDQQJYC-DRGzxdVf.js → quadrantDiagram-AXDQQJYC-DYWp1Jjq.js} +1 -1
  112. package/dist/public/assets/radar-RG4KPBEZ-Dqx79rlE.js +1 -0
  113. package/dist/public/assets/railroad-74A4TZTK-BkDQqaz7.js +1 -0
  114. package/dist/public/assets/railroad-abnf-HS5TGJTU-kgqWL-Ba.js +1 -0
  115. package/dist/public/assets/railroad-ebnf-LZEXJU2U-GspfOzjs.js +1 -0
  116. package/dist/public/assets/railroad-peg-WCYAUIDC-qO23KZap.js +1 -0
  117. package/dist/public/assets/railroadDiagram-O6MQD6OU-wuPYUWJ2.js +1 -0
  118. package/dist/public/assets/{requirementDiagram-BXWQKSXE-CSioB-S4.js → requirementDiagram-BXWQKSXE-BtGNZ92J.js} +1 -1
  119. package/dist/public/assets/{sankeyDiagram-P5KCCOFB-Be_RNG6h.js → sankeyDiagram-P5KCCOFB-XgIIrsbe.js} +1 -1
  120. package/dist/public/assets/{scroll-restoration-C6CrXFrx.js → scroll-restoration-hNqYmCAE.js} +1 -1
  121. package/dist/public/assets/selection-actions-Bh9Fkkqv.js +1 -0
  122. package/dist/public/assets/{sequenceDiagram-WJ2MYXX4-QO7Ba1BQ.js → sequenceDiagram-WJ2MYXX4-CVIIE7ze.js} +1 -1
  123. package/dist/public/assets/{stateDiagram-D77RDMKH-B52l08Ki.js → stateDiagram-D77RDMKH-0kIDexDQ.js} +1 -1
  124. package/dist/public/assets/stateDiagram-v2-MP3YSRHH-DdU6a-zG.js +1 -0
  125. package/dist/public/assets/{swimlanes-42K2YHIH-CEkCp-cn.js → swimlanes-42K2YHIH-BY2JV_Jb.js} +1 -1
  126. package/dist/public/assets/swimlanesDiagram-VR7AAH4N-BCiIa4tX.js +8 -0
  127. package/dist/public/assets/switch-SW6BMps1.js +1 -0
  128. package/dist/public/assets/{timeline-definition-24CTP7MA-0rICk4bz.js → timeline-definition-24CTP7MA-CPRUSXUS.js} +1 -1
  129. package/dist/public/assets/treeView-Q6P3EWNA-CiZNqz_z.js +1 -0
  130. package/dist/public/assets/treemap-WGGIJYW6-5hDYDC6e.js +1 -0
  131. package/dist/public/assets/{tsMode-iBk8vwDB.js → tsMode-B7q3gz7a.js} +1 -1
  132. package/dist/public/assets/use-ui-state-BiAROr3D.js +1 -0
  133. package/dist/public/assets/{vennDiagram-4TSXK5OY-B1JUHS0H.js → vennDiagram-4TSXK5OY-CU1Q7iGV.js} +1 -1
  134. package/dist/public/assets/view-state-store-C6OmciCC.js +1 -0
  135. package/dist/public/assets/wardley-WFR3VGLG-CWb_ROLo.js +1 -0
  136. package/dist/public/assets/{wardleyDiagram-VM6X3IG4-WNi3mtNy.js → wardleyDiagram-VM6X3IG4-B2Pn7CDF.js} +3 -3
  137. package/dist/public/assets/whole-word-2m2pmAFT.js +1 -0
  138. package/dist/public/assets/workers-Ck67TJT4.js +1 -0
  139. package/dist/public/assets/ws-DNNH0sEH.js +1 -0
  140. package/dist/public/assets/{xychartDiagram-S5SC5T6Z-CbKt4_V3.js → xychartDiagram-S5SC5T6Z-xhQ4tT_S.js} +1 -1
  141. package/dist/public/index.html +5 -1
  142. package/dist/pudl.js +45 -13
  143. package/package.json +1 -1
  144. package/dist/public/assets/App-CNmIJjl_.js +0 -2
  145. package/dist/public/assets/Dashboard-CXo8Im5Y.js +0 -1
  146. package/dist/public/assets/EditorTabClose--kyKHSwZ.js +0 -1
  147. package/dist/public/assets/FindWidget-PycvFKIo.js +0 -1
  148. package/dist/public/assets/LazyTerminal-CAhb0T8p.js +0 -2
  149. package/dist/public/assets/NewProjectDialog-BWkhYVKJ.js +0 -1
  150. package/dist/public/assets/PaneEditorBody-DKpaey4n.js +0 -299
  151. package/dist/public/assets/PdfViewer-B-O3C5Fb.js +0 -2
  152. package/dist/public/assets/SettingsDialog-DxI5UQty.js +0 -8
  153. package/dist/public/assets/Terminal-DE7QO3Lv.js +0 -66
  154. package/dist/public/assets/Workspace-CcPBZYc6.js +0 -20
  155. package/dist/public/assets/abnfDiagram-VCTEODGH-Bn8NH7EO.js +0 -1
  156. package/dist/public/assets/architecture-7GRP2DOG-Di8Z0gNN.js +0 -1
  157. package/dist/public/assets/architectureDiagram-5GKGNRK7-rXpMU6RM.js +0 -36
  158. package/dist/public/assets/buffer-store-B24QspY2.js +0 -16
  159. package/dist/public/assets/button-CcKBhdZO.js +0 -1
  160. package/dist/public/assets/channel-BpgRfG_m.js +0 -1
  161. package/dist/public/assets/chunk-2E4U76K2-BBFx22L7.js +0 -2
  162. package/dist/public/assets/chunk-DU6HZSFF-p5k9qXhh.js +0 -125
  163. package/dist/public/assets/chunk-TLUHSLCS-D9SadBk_.js +0 -2
  164. package/dist/public/assets/classDiagram-ZZMXUADV-Cvjt82YE.js +0 -1
  165. package/dist/public/assets/classDiagram-v2-VYDZK3BY-Cvjt82YE.js +0 -1
  166. package/dist/public/assets/context-menu-DeidX0Pi.js +0 -1
  167. package/dist/public/assets/copy-DWjBcRsB.js +0 -1
  168. package/dist/public/assets/cssMode-CZGyU_SG.js +0 -1
  169. package/dist/public/assets/cynefin-OW5HDTMX-DWHI9hMS.js +0 -1
  170. package/dist/public/assets/cynefinDiagram-5FMLGOSQ-D6ufz00C.js +0 -62
  171. package/dist/public/assets/diagram-UQ7AKVKN-D9T4tJbc.js +0 -41
  172. package/dist/public/assets/diagram-VSXAHHWV-Dh7CRewi.js +0 -3
  173. package/dist/public/assets/dialog-CxBgPsab.js +0 -41
  174. package/dist/public/assets/disclosure-BH-wuD_D.js +0 -1
  175. package/dist/public/assets/dist-D5t_kbYW.js +0 -1
  176. package/dist/public/assets/dist-qyIRFVt1.js +0 -1
  177. package/dist/public/assets/ebnfDiagram-PWID7BFC-DInnl0wx.js +0 -1
  178. package/dist/public/assets/eventmodeling-NTZA5JFV-BQVYxt7A.js +0 -1
  179. package/dist/public/assets/flowDiagram-HODETNUW--HTl_4V1.js +0 -1
  180. package/dist/public/assets/gitGraph-4MIJSDKK-U5qKRzrG.js +0 -1
  181. package/dist/public/assets/gitGraphDiagram-WWUBYQGX-BcXQM8eP.js +0 -106
  182. package/dist/public/assets/htmlMode-23yFfFGb.js +0 -1
  183. package/dist/public/assets/index-CPDXsNn7.js +0 -82
  184. package/dist/public/assets/info-A6RAGUB7-BXjSF_iH.js +0 -1
  185. package/dist/public/assets/infoDiagram-27XIBGKW-BIJ52Gpm.js +0 -2
  186. package/dist/public/assets/markdown-mermaid-wVNP7t8F.js +0 -2
  187. package/dist/public/assets/media-refresh-store-CcMOJ-U-.js +0 -1
  188. package/dist/public/assets/mermaid-parser.core-Cy8AG-qQ.js +0 -7
  189. package/dist/public/assets/mermaid.core-DoDuR-5f.js +0 -11
  190. package/dist/public/assets/notification-delivery-0LhR-ShC.js +0 -1
  191. package/dist/public/assets/packet-AYTQ26CC-BpWwI2oX.js +0 -1
  192. package/dist/public/assets/pegDiagram-XKGWAZYB-yj3GPtMG.js +0 -1
  193. package/dist/public/assets/pie-WAS4IAKB-DvE_icUX.js +0 -1
  194. package/dist/public/assets/pieDiagram-E7YTZNPT-DdwpR7qt.js +0 -39
  195. package/dist/public/assets/project-abbrev-DUQCetLc.js +0 -1
  196. package/dist/public/assets/protocol-support-DWTHwckn.js +0 -1
  197. package/dist/public/assets/radar-RG4KPBEZ-BMUoktqq.js +0 -1
  198. package/dist/public/assets/railroad-74A4TZTK-CRCU-hfz.js +0 -1
  199. package/dist/public/assets/railroad-abnf-HS5TGJTU-DgF_7Rby.js +0 -1
  200. package/dist/public/assets/railroad-ebnf-LZEXJU2U-yoQjOTe4.js +0 -1
  201. package/dist/public/assets/railroad-peg-WCYAUIDC-Bi2UnAcg.js +0 -1
  202. package/dist/public/assets/railroadDiagram-O6MQD6OU-DoYXFCYn.js +0 -1
  203. package/dist/public/assets/selection-actions-BuV-nTRE.js +0 -1
  204. package/dist/public/assets/stateDiagram-v2-MP3YSRHH-DyfZNcXp.js +0 -1
  205. package/dist/public/assets/swimlanesDiagram-VR7AAH4N-9I9MU74C.js +0 -8
  206. package/dist/public/assets/switch-B5sIV745.js +0 -1
  207. package/dist/public/assets/treeView-Q6P3EWNA-UwjA1jwm.js +0 -1
  208. package/dist/public/assets/treemap-WGGIJYW6-BWpfnhSW.js +0 -1
  209. package/dist/public/assets/use-ui-state-Bxj6PnLE.js +0 -1
  210. package/dist/public/assets/view-state-store-B5KgrWCh.js +0 -1
  211. package/dist/public/assets/wardley-WFR3VGLG-DGkljHJE.js +0 -1
  212. package/dist/public/assets/ws-D9g0r8Jb.js +0 -1
package/CHANGELOG.md CHANGED
@@ -4,13 +4,17 @@ Archived release changelog. Governance lives in CLAUDE.md §"Changelog disciplin
4
4
 
5
5
  # Changelog
6
6
 
7
- ## [0.3.1] — 2026-10-14
7
+ ## [0.3.3] — 2026-10-15
8
+
9
+ ### Added
10
+
11
+ - Reveal local files and folders in Finder, File Explorer or the system file manager from file-tree and editor-tab menus, including locally served browser cockpits; SSH and remote hosts omit the action (protocol 24.2).
8
12
 
9
13
  ### Changed
10
14
 
11
- - Rename the puddlang executable to `pudl` across npm, standalone installers and command examples; retain the puddlang language/API name.
12
- - Suppress desktop notifications only during recent typing, pasting or clicking in the notifying session when focused delivery is disabled; idle windows and other sessions no longer silence alerts.
15
+ - Show desktop notifications with host/project, session title and message preview in that order: native text fields on macOS and Windows, and a separate session line above the preview on Linux (protocol 24.1).
16
+ - Prefix web/mobile notification titles with the project abbreviation (`[ABBRV] Session title`) for both live alerts and encrypted background push.
13
17
 
14
18
  ### Fixed
15
19
 
16
- - Activate the exact session tab on desktop notification clicks, including when a file hides its terminal under the same URL, and open sessions without an existing tab.
20
+ - Attach desktop SSH authentication prompts to their host's window, display the target explicitly, and discard pending and late requests when that host closes while retaining at most one request per host.
@@ -14557,6 +14557,7 @@ var notificationContentSchema = external_exports.object({
14557
14557
  var desktopNotificationRequestSchema = external_exports.object({
14558
14558
  id: external_exports.string().min(1).max(128),
14559
14559
  title: external_exports.string().min(1).max(160),
14560
+ subtitle: external_exports.string().min(1).max(160).optional(),
14560
14561
  body: external_exports.string().min(1).max(256),
14561
14562
  target: notificationTargetSchema.optional()
14562
14563
  }).strict();
@@ -14602,7 +14603,20 @@ var agentLifecycleSignalSchema = external_exports.object({
14602
14603
  native_created_at: external_exports.iso.datetime({ offset: true }).optional(),
14603
14604
  native_updated_at: external_exports.iso.datetime({ offset: true }).optional()
14604
14605
  });
14605
- var agentSignalRequestSchema = external_exports.union([statusSignalSchema, agentLifecycleSignalSchema]);
14606
+ var agentTurnSignalSchema = external_exports.object({
14607
+ nonce: external_exports.string().min(16).max(200),
14608
+ event: external_exports.enum(["turn_start", "turn_complete", "turn_failed"]),
14609
+ agent_session_ref: external_exports.string().min(1).max(200),
14610
+ turn_id: external_exports.string().min(1).max(200),
14611
+ prompt_hash: external_exports.string().regex(/^[a-f0-9]{64}$/).optional(),
14612
+ reply: external_exports.string().max(256 * 1024).refine((value) => new TextEncoder().encode(value).length <= 256 * 1024).optional(),
14613
+ error: external_exports.string().max(4096).optional()
14614
+ });
14615
+ var agentSignalRequestSchema = external_exports.union([
14616
+ statusSignalSchema,
14617
+ agentLifecycleSignalSchema,
14618
+ agentTurnSignalSchema
14619
+ ]);
14606
14620
 
14607
14621
  // ../shared/src/api/config.ts
14608
14622
  var fields = {
@@ -14941,6 +14955,7 @@ var sessionStatusSchema = external_exports.enum([
14941
14955
  "archived"
14942
14956
  ]);
14943
14957
  var sessionKindSchema = external_exports.enum(["agent", "terminal"]);
14958
+ var agentModeSchema = external_exports.enum(["interactive", "headless"]);
14944
14959
  var sessionSchema = external_exports.object({
14945
14960
  id: sessionId,
14946
14961
  project_id: projectId,
@@ -14954,6 +14969,8 @@ var sessionSchema = external_exports.object({
14954
14969
  kind: sessionKindSchema,
14955
14970
  /** Null for terminal sessions, which run a plain shell rather than an agent. */
14956
14971
  agent_type: external_exports.string().nullable(),
14972
+ /** Native TUI or structured CLI execution with a terminal transcript. */
14973
+ agent_mode: agentModeSchema.optional(),
14957
14974
  /** Live foreground agent in a terminal session; icon hint only, never persisted. */
14958
14975
  detected_agent_type: external_exports.string().nullable().optional(),
14959
14976
  agent_session_ref: external_exports.string().nullable(),
@@ -15094,13 +15111,13 @@ var archiveRequestSchema = external_exports.object({
15094
15111
  });
15095
15112
 
15096
15113
  // ../shared/src/api/projects.ts
15097
- var projectAbbrev = external_exports.string().min(1).max(5);
15114
+ var projectAbbrev2 = external_exports.string().min(1).max(5);
15098
15115
  var projectSchema = external_exports.object({
15099
15116
  id: projectId,
15100
15117
  profile_id: profileId,
15101
15118
  repo_id: rowId,
15102
15119
  name: external_exports.string(),
15103
- abbrev: projectAbbrev.nullable().default(null),
15120
+ abbrev: projectAbbrev2.nullable().default(null),
15104
15121
  /**
15105
15122
  * Hidden from the homescreen but never deleted — every session, worktree, and
15106
15123
  * bit of data is retained, and un-archiving restores it all (SPEC §11).
@@ -15114,11 +15131,11 @@ var createProjectRequestSchema = external_exports.object({
15114
15131
  profile_id: profileId,
15115
15132
  repo_id: rowId,
15116
15133
  name: external_exports.string().min(1).max(100),
15117
- abbrev: projectAbbrev.optional()
15134
+ abbrev: projectAbbrev2.optional()
15118
15135
  });
15119
15136
  var patchProjectRequestSchema = external_exports.object({
15120
15137
  name: external_exports.string().min(1).max(100).optional(),
15121
- abbrev: projectAbbrev.optional(),
15138
+ abbrev: projectAbbrev2.optional(),
15122
15139
  archived: external_exports.boolean().optional()
15123
15140
  });
15124
15141
  var projectDetailSchema = external_exports.object({
@@ -15733,6 +15750,12 @@ var cockpitRefreshResponseSchema = external_exports.object({
15733
15750
  refreshId: external_exports.string().uuid(),
15734
15751
  instance: external_exports.string().uuid()
15735
15752
  });
15753
+ var cockpitFileManagerSchema = external_exports.object({
15754
+ name: external_exports.enum(["Finder", "File Explorer", "File Manager"]).nullable()
15755
+ });
15756
+ var cockpitRevealRequestSchema = external_exports.object({
15757
+ path: external_exports.string().min(1).max(4096).refine((path) => !path.includes("\0"))
15758
+ }).strict();
15736
15759
 
15737
15760
  // ../shared/src/ws/messages.ts
15738
15761
  var termId = external_exports.string().regex(/^(agent|shell-[0-9]+)$/);
@@ -15816,7 +15839,7 @@ var wsServerMessageSchema = external_exports.discriminatedUnion("t", [
15816
15839
  ]);
15817
15840
 
15818
15841
  // ../shared/src/remote/protocol.ts
15819
- var REMOTE_PROTOCOL_VERSION = 3;
15842
+ var REMOTE_PROTOCOL_VERSION = 4;
15820
15843
  var REMOTE_POLICY = {
15821
15844
  chunkBytes: 32 * 1024,
15822
15845
  frameBytes: 48 * 1024,
@@ -16196,6 +16219,7 @@ var sourceSchema = external_exports.string().min(1).max(PUDDLANG_MAX_SOURCE).ref
16196
16219
  );
16197
16220
  var puddlangSpawnSchema = external_exports.object({
16198
16221
  agent: external_exports.string().min(1).max(100),
16222
+ mode: agentModeSchema.optional(),
16199
16223
  account: external_exports.union([external_exports.string().min(1).max(100), external_exports.number().int().positive()]).optional(),
16200
16224
  project: external_exports.string().min(1).max(200).optional(),
16201
16225
  worktree: external_exports.string().min(1).max(4096).optional(),
@@ -16271,7 +16295,14 @@ var puddlangContextSchema = external_exports.object({
16271
16295
  accounts: external_exports.array(
16272
16296
  external_exports.object({ id: external_exports.number(), label: external_exports.string(), agent: external_exports.string(), logged_in: external_exports.boolean() })
16273
16297
  ),
16274
- agents: external_exports.array(external_exports.object({ id: external_exports.string(), scripted_turns: external_exports.boolean() }))
16298
+ agents: external_exports.array(
16299
+ external_exports.object({
16300
+ id: external_exports.string(),
16301
+ /** Automated turn support in either mode; this is not a mode name. */
16302
+ scripted_turns: external_exports.boolean(),
16303
+ modes: external_exports.array(agentModeSchema).optional()
16304
+ })
16305
+ )
16275
16306
  });
16276
16307
 
16277
16308
  // ../shared/src/api/puddlang-mcp.ts
package/dist/index.js CHANGED
@@ -3925,7 +3925,7 @@ import { createInterface } from "node:readline";
3925
3925
  import { Writable } from "node:stream";
3926
3926
 
3927
3927
  // ../shared/src/protocol.ts
3928
- var PROTOCOL_VERSION = { major: 23, minor: 0 };
3928
+ var PROTOCOL_VERSION = { major: 24, minor: 2 };
3929
3929
 
3930
3930
  // ../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
3931
3931
  var external_exports = {};
@@ -18477,6 +18477,7 @@ var notificationContentSchema = external_exports.object({
18477
18477
  var desktopNotificationRequestSchema = external_exports.object({
18478
18478
  id: external_exports.string().min(1).max(128),
18479
18479
  title: external_exports.string().min(1).max(160),
18480
+ subtitle: external_exports.string().min(1).max(160).optional(),
18480
18481
  body: external_exports.string().min(1).max(256),
18481
18482
  target: notificationTargetSchema.optional()
18482
18483
  }).strict();
@@ -18522,7 +18523,20 @@ var agentLifecycleSignalSchema = external_exports.object({
18522
18523
  native_created_at: external_exports.iso.datetime({ offset: true }).optional(),
18523
18524
  native_updated_at: external_exports.iso.datetime({ offset: true }).optional()
18524
18525
  });
18525
- var agentSignalRequestSchema = external_exports.union([statusSignalSchema, agentLifecycleSignalSchema]);
18526
+ var agentTurnSignalSchema = external_exports.object({
18527
+ nonce: external_exports.string().min(16).max(200),
18528
+ event: external_exports.enum(["turn_start", "turn_complete", "turn_failed"]),
18529
+ agent_session_ref: external_exports.string().min(1).max(200),
18530
+ turn_id: external_exports.string().min(1).max(200),
18531
+ prompt_hash: external_exports.string().regex(/^[a-f0-9]{64}$/).optional(),
18532
+ reply: external_exports.string().max(256 * 1024).refine((value) => new TextEncoder().encode(value).length <= 256 * 1024).optional(),
18533
+ error: external_exports.string().max(4096).optional()
18534
+ });
18535
+ var agentSignalRequestSchema = external_exports.union([
18536
+ statusSignalSchema,
18537
+ agentLifecycleSignalSchema,
18538
+ agentTurnSignalSchema
18539
+ ]);
18526
18540
 
18527
18541
  // ../shared/src/api/config.ts
18528
18542
  var fields = {
@@ -18861,6 +18875,7 @@ var sessionStatusSchema = external_exports.enum([
18861
18875
  "archived"
18862
18876
  ]);
18863
18877
  var sessionKindSchema = external_exports.enum(["agent", "terminal"]);
18878
+ var agentModeSchema = external_exports.enum(["interactive", "headless"]);
18864
18879
  var sessionSchema = external_exports.object({
18865
18880
  id: sessionId,
18866
18881
  project_id: projectId,
@@ -18874,6 +18889,8 @@ var sessionSchema = external_exports.object({
18874
18889
  kind: sessionKindSchema,
18875
18890
  /** Null for terminal sessions, which run a plain shell rather than an agent. */
18876
18891
  agent_type: external_exports.string().nullable(),
18892
+ /** Native TUI or structured CLI execution with a terminal transcript. */
18893
+ agent_mode: agentModeSchema.optional(),
18877
18894
  /** Live foreground agent in a terminal session; icon hint only, never persisted. */
18878
18895
  detected_agent_type: external_exports.string().nullable().optional(),
18879
18896
  agent_session_ref: external_exports.string().nullable(),
@@ -19014,13 +19031,13 @@ var archiveRequestSchema = external_exports.object({
19014
19031
  });
19015
19032
 
19016
19033
  // ../shared/src/api/projects.ts
19017
- var projectAbbrev = external_exports.string().min(1).max(5);
19034
+ var projectAbbrev2 = external_exports.string().min(1).max(5);
19018
19035
  var projectSchema = external_exports.object({
19019
19036
  id: projectId,
19020
19037
  profile_id: profileId,
19021
19038
  repo_id: rowId,
19022
19039
  name: external_exports.string(),
19023
- abbrev: projectAbbrev.nullable().default(null),
19040
+ abbrev: projectAbbrev2.nullable().default(null),
19024
19041
  /**
19025
19042
  * Hidden from the homescreen but never deleted — every session, worktree, and
19026
19043
  * bit of data is retained, and un-archiving restores it all (SPEC §11).
@@ -19034,11 +19051,11 @@ var createProjectRequestSchema = external_exports.object({
19034
19051
  profile_id: profileId,
19035
19052
  repo_id: rowId,
19036
19053
  name: external_exports.string().min(1).max(100),
19037
- abbrev: projectAbbrev.optional()
19054
+ abbrev: projectAbbrev2.optional()
19038
19055
  });
19039
19056
  var patchProjectRequestSchema = external_exports.object({
19040
19057
  name: external_exports.string().min(1).max(100).optional(),
19041
- abbrev: projectAbbrev.optional(),
19058
+ abbrev: projectAbbrev2.optional(),
19042
19059
  archived: external_exports.boolean().optional()
19043
19060
  });
19044
19061
  var projectDetailSchema = external_exports.object({
@@ -19653,6 +19670,12 @@ var cockpitRefreshResponseSchema = external_exports.object({
19653
19670
  refreshId: external_exports.string().uuid(),
19654
19671
  instance: external_exports.string().uuid()
19655
19672
  });
19673
+ var cockpitFileManagerSchema = external_exports.object({
19674
+ name: external_exports.enum(["Finder", "File Explorer", "File Manager"]).nullable()
19675
+ });
19676
+ var cockpitRevealRequestSchema = external_exports.object({
19677
+ path: external_exports.string().min(1).max(4096).refine((path) => !path.includes("\0"))
19678
+ }).strict();
19656
19679
 
19657
19680
  // ../shared/src/ws/messages.ts
19658
19681
  var termId = external_exports.string().regex(/^(agent|shell-[0-9]+)$/);
@@ -19736,7 +19759,7 @@ var wsServerMessageSchema = external_exports.discriminatedUnion("t", [
19736
19759
  ]);
19737
19760
 
19738
19761
  // ../shared/src/remote/protocol.ts
19739
- var REMOTE_PROTOCOL_VERSION = 3;
19762
+ var REMOTE_PROTOCOL_VERSION = 4;
19740
19763
  var REMOTE_POLICY = {
19741
19764
  chunkBytes: 32 * 1024,
19742
19765
  frameBytes: 48 * 1024,
@@ -20116,6 +20139,7 @@ var sourceSchema = external_exports.string().min(1).max(PUDDLANG_MAX_SOURCE).ref
20116
20139
  );
20117
20140
  var puddlangSpawnSchema = external_exports.object({
20118
20141
  agent: external_exports.string().min(1).max(100),
20142
+ mode: agentModeSchema.optional(),
20119
20143
  account: external_exports.union([external_exports.string().min(1).max(100), external_exports.number().int().positive()]).optional(),
20120
20144
  project: external_exports.string().min(1).max(200).optional(),
20121
20145
  worktree: external_exports.string().min(1).max(4096).optional(),
@@ -20191,7 +20215,14 @@ var puddlangContextSchema = external_exports.object({
20191
20215
  accounts: external_exports.array(
20192
20216
  external_exports.object({ id: external_exports.number(), label: external_exports.string(), agent: external_exports.string(), logged_in: external_exports.boolean() })
20193
20217
  ),
20194
- agents: external_exports.array(external_exports.object({ id: external_exports.string(), scripted_turns: external_exports.boolean() }))
20218
+ agents: external_exports.array(
20219
+ external_exports.object({
20220
+ id: external_exports.string(),
20221
+ /** Automated turn support in either mode; this is not a mode name. */
20222
+ scripted_turns: external_exports.boolean(),
20223
+ modes: external_exports.array(agentModeSchema).optional()
20224
+ })
20225
+ )
20195
20226
  });
20196
20227
 
20197
20228
  // ../shared/src/api/puddlang-mcp.ts
@@ -21749,7 +21780,7 @@ async function acquireAuthority(transport) {
21749
21780
  // src/cli/run.ts
21750
21781
  init_attach();
21751
21782
  import { existsSync as existsSync7 } from "node:fs";
21752
- import { dirname as dirname12, join as join17 } from "node:path";
21783
+ import { dirname as dirname13, join as join17 } from "node:path";
21753
21784
  import { fileURLToPath as fileURLToPath5 } from "node:url";
21754
21785
 
21755
21786
  // src/lib/browser.ts
@@ -21793,7 +21824,7 @@ import { readFileSync as readFileSync4 } from "node:fs";
21793
21824
  import { dirname as dirname4, join as join5 } from "node:path";
21794
21825
  import { fileURLToPath as fileURLToPath2 } from "node:url";
21795
21826
  function cliVersion() {
21796
- if (true) return "0.3.1";
21827
+ if (true) return "0.3.3";
21797
21828
  const here = dirname4(fileURLToPath2(import.meta.url));
21798
21829
  for (const candidate of [
21799
21830
  join5(here, "..", "..", "package.json"),
@@ -22192,7 +22223,9 @@ var RELEASE_PROTOCOLS = {
22192
22223
  "0.2.23": { major: 22, minor: 5 },
22193
22224
  "0.2.24": { major: 22, minor: 5 },
22194
22225
  "0.3.0": { major: 23, minor: 0 },
22195
- "0.3.1": { major: 23, minor: 0 }
22226
+ "0.3.1": { major: 23, minor: 0 },
22227
+ "0.3.2": { major: 24, minor: 0 },
22228
+ "0.3.3": { major: 24, minor: 2 }
22196
22229
  };
22197
22230
  function validProtocol(value) {
22198
22231
  if (typeof value !== "object" || value === null) return false;
@@ -23638,6 +23671,34 @@ async function checkRemoteRegistration(req, res, authorised) {
23638
23671
  }
23639
23672
  }
23640
23673
 
23674
+ // src/lib/serve/file-manager.ts
23675
+ function fileManagerHandler(manager) {
23676
+ let busy = false;
23677
+ return async (req, res, authorised) => {
23678
+ if (req.method === "GET") return json2(res, 200, { name: manager?.name ?? null });
23679
+ if (req.method !== "POST") return fail(res, 405, "method_not_allowed");
23680
+ if (!manager) return fail(res, 404, "file_manager_unavailable");
23681
+ const request = cockpitRevealRequestSchema.parse(await readJson(req));
23682
+ if (!authorised()) return fail(res, 401, "browser_rejected");
23683
+ if (busy) return fail(res, 409, "file_manager_busy", "A folder is already being revealed.");
23684
+ busy = true;
23685
+ try {
23686
+ await manager.reveal(request.path, authorised);
23687
+ res.writeHead(204);
23688
+ res.end();
23689
+ } catch (error51) {
23690
+ fail(
23691
+ res,
23692
+ 400,
23693
+ "reveal_failed",
23694
+ error51 instanceof Error ? error51.message : "Could not reveal this path."
23695
+ );
23696
+ } finally {
23697
+ busy = false;
23698
+ }
23699
+ };
23700
+ }
23701
+
23641
23702
  // src/lib/serve/ui-server.ts
23642
23703
  var DEFAULT_UI_PORT = 7433;
23643
23704
  var MAX_PORT_PROBES = 50;
@@ -23647,6 +23708,9 @@ async function startUiServer(opts) {
23647
23708
  const tracker = new ProxySocketTracker();
23648
23709
  const serveStatic = createStaticHandler(opts.assetsDir);
23649
23710
  const handleRemoteAccess = remoteAccessHandler(opts.remoteAccess);
23711
+ const handleFileManager = fileManagerHandler(
23712
+ opts.identity === "local" ? opts.fileManager : void 0
23713
+ );
23650
23714
  const nonce = randomUUID3();
23651
23715
  let origin = "";
23652
23716
  let proxyOrigin = "";
@@ -23695,6 +23759,8 @@ async function startUiServer(opts) {
23695
23759
  }
23696
23760
  if (url2.pathname === "/cockpit/local-sync")
23697
23761
  return handleLocalSync(req, res, opts.localSync, () => browsers.valid(browser));
23762
+ if (url2.pathname === "/cockpit/file-manager")
23763
+ return handleFileManager(req, res, () => browsers.valid(browser));
23698
23764
  if (url2.pathname === "/cockpit/remote")
23699
23765
  return handleRemoteAccess(req, res, () => browsers.valid(browser));
23700
23766
  if (url2.pathname === "/cockpit/remote/registration") {
@@ -24358,6 +24424,69 @@ function sanitise(record2) {
24358
24424
  // src/lib/start.ts
24359
24425
  import { join as join14 } from "node:path";
24360
24426
  init_types();
24427
+
24428
+ // src/lib/file-manager.ts
24429
+ import { execFile, spawn as spawn6 } from "node:child_process";
24430
+ import { lstat, stat } from "node:fs/promises";
24431
+ import { dirname as dirname9, isAbsolute, win32 } from "node:path";
24432
+ import { pathToFileURL } from "node:url";
24433
+ import { promisify } from "node:util";
24434
+ var execute = promisify(execFile);
24435
+ function localFileManager(platform = process.platform) {
24436
+ const name = platform === "darwin" ? "Finder" : platform === "win32" ? "File Explorer" : platform === "linux" ? "File Manager" : null;
24437
+ if (!name) return;
24438
+ return {
24439
+ name,
24440
+ async reveal(path, authorised) {
24441
+ if (!(platform === "win32" ? win32.isAbsolute(path) : isAbsolute(path)) || path.includes("\0"))
24442
+ throw new Error("Expected an absolute local path.");
24443
+ const entry = await lstat(path);
24444
+ const directory = entry.isDirectory() || entry.isSymbolicLink() && await stat(path).then(
24445
+ (target) => target.isDirectory(),
24446
+ () => false
24447
+ );
24448
+ const run3 = async (command, args, detached = false) => {
24449
+ if (!authorised()) throw new Error("Browser authorisation expired.");
24450
+ if (detached) {
24451
+ await new Promise((resolve6, reject) => {
24452
+ const child = spawn6(command, args, { stdio: "ignore", detached: true });
24453
+ child.once("error", reject);
24454
+ child.once("spawn", () => {
24455
+ child.unref();
24456
+ resolve6();
24457
+ });
24458
+ });
24459
+ return;
24460
+ }
24461
+ await execute(command, args, { timeout: 1e4, maxBuffer: 16384, windowsHide: true });
24462
+ };
24463
+ if (platform === "darwin") {
24464
+ await run3("/usr/bin/open", directory ? ["-a", "Finder", "--", path] : ["-R", "--", path]);
24465
+ } else if (platform === "win32") {
24466
+ await run3("explorer.exe", directory ? [path] : ["/select,", path], true);
24467
+ } else {
24468
+ try {
24469
+ await run3("gdbus", [
24470
+ "call",
24471
+ "--session",
24472
+ "--dest",
24473
+ "org.freedesktop.FileManager1",
24474
+ "--object-path",
24475
+ "/org/freedesktop/FileManager1",
24476
+ "--method",
24477
+ `org.freedesktop.FileManager1.${directory ? "ShowFolders" : "ShowItems"}`,
24478
+ JSON.stringify([pathToFileURL(path).href]),
24479
+ ""
24480
+ ]);
24481
+ } catch {
24482
+ await run3("xdg-open", [directory ? path : dirname9(path)], true);
24483
+ }
24484
+ }
24485
+ }
24486
+ };
24487
+ }
24488
+
24489
+ // src/lib/start.ts
24361
24490
  async function startLocal(opts) {
24362
24491
  const logger = opts.logger ?? silentLogger;
24363
24492
  const transport = new LocalTransport();
@@ -24392,6 +24521,7 @@ async function startLocal(opts) {
24392
24521
  target: { host: "127.0.0.1", port: endpoint.port },
24393
24522
  ...opts.onRefreshRequest !== void 0 ? { control: { onRefresh: opts.onRefreshRequest } } : {},
24394
24523
  localSync: { file: join14(clientHome(), "local-sync.json") },
24524
+ fileManager: localFileManager(),
24395
24525
  remoteAccess: new RemoteAccessControl(transport)
24396
24526
  });
24397
24527
  currentUi = ui;
@@ -24446,23 +24576,23 @@ init_types();
24446
24576
 
24447
24577
  // src/cli/manage-cli.ts
24448
24578
  init_types();
24449
- import { spawn as spawn7 } from "node:child_process";
24450
- import { dirname as dirname10 } from "node:path";
24579
+ import { spawn as spawn8 } from "node:child_process";
24580
+ import { dirname as dirname11 } from "node:path";
24451
24581
 
24452
24582
  // src/lib/standalone-cli.ts
24453
24583
  init_types();
24454
- import { spawn as spawn6 } from "node:child_process";
24584
+ import { spawn as spawn7 } from "node:child_process";
24455
24585
  import { existsSync as existsSync5, lstatSync as lstatSync2, readFileSync as readFileSync9, realpathSync as realpathSync2 } from "node:fs";
24456
24586
  import { mkdir as mkdir2, readFile as readFile2, rm as rm2, unlink } from "node:fs/promises";
24457
- import { basename, dirname as dirname9, isAbsolute, join as join15, resolve as resolve5 } from "node:path";
24587
+ import { basename, dirname as dirname10, isAbsolute as isAbsolute2, join as join15, resolve as resolve5 } from "node:path";
24458
24588
  import { fileURLToPath as fileURLToPath4 } from "node:url";
24459
24589
  function standaloneInstallation(entryFile = fileURLToPath4(import.meta.url), execPath = process.execPath) {
24460
- const release = resolve5(dirname9(entryFile), "..");
24590
+ const release = resolve5(dirname10(entryFile), "..");
24461
24591
  if (!existsSync5(join15(release, "STANDALONE"))) return null;
24462
24592
  try {
24463
24593
  const root = resolve5(release, "..", "..");
24464
24594
  const record2 = JSON.parse(readFileSync9(join15(root, "installation.json"), "utf8"));
24465
- if (readFileSync9(join15(release, "STANDALONE"), "utf8").trim() !== "puddle-cli" || readFileSync9(join15(root, "INSTALLATION"), "utf8").trim() !== "puddle-cli" || dirname9(release) !== join15(root, "versions") || realpathSync2(release) !== release || realpathSync2(execPath) !== join15(release, "bin/node") || record2.kind !== "puddle-cli" || typeof record2.launcher !== "string" || !isAbsolute(record2.launcher) || record2.scriptLauncher !== void 0 && record2.scriptLauncher !== join15(dirname9(record2.launcher), "pudl") && record2.scriptLauncher !== join15(dirname9(record2.launcher), "puddlang"))
24595
+ if (readFileSync9(join15(release, "STANDALONE"), "utf8").trim() !== "puddle-cli" || readFileSync9(join15(root, "INSTALLATION"), "utf8").trim() !== "puddle-cli" || dirname10(release) !== join15(root, "versions") || realpathSync2(release) !== release || realpathSync2(execPath) !== join15(release, "bin/node") || record2.kind !== "puddle-cli" || typeof record2.launcher !== "string" || !isAbsolute2(record2.launcher) || record2.scriptLauncher !== void 0 && record2.scriptLauncher !== join15(dirname10(record2.launcher), "pudl") && record2.scriptLauncher !== join15(dirname10(record2.launcher), "puddlang"))
24466
24596
  throw new Error("Installation metadata does not match this CLI");
24467
24597
  return {
24468
24598
  root,
@@ -24486,12 +24616,12 @@ function upgradeStandaloneCli(installation, version2, repo) {
24486
24616
  "--prefix",
24487
24617
  installation.root,
24488
24618
  "--bin-dir",
24489
- dirname9(installation.launcher)
24619
+ dirname10(installation.launcher)
24490
24620
  ];
24491
24621
  if (version2 !== void 0) args.push("--version", version2);
24492
24622
  if (repo !== void 0) args.push("--repo", repo);
24493
24623
  return new Promise((resolve6, reject) => {
24494
- const child = spawn6("sh", args, { stdio: ["pipe", "inherit", "inherit"] });
24624
+ const child = spawn7("sh", args, { stdio: ["pipe", "inherit", "inherit"] });
24495
24625
  child.on("error", reject);
24496
24626
  child.stdin.on("error", (error51) => {
24497
24627
  if (error51.code !== "EPIPE") reject(error51);
@@ -24546,7 +24676,7 @@ function upgradeCli(version2, logger) {
24546
24676
  const spec = `@puddle-code/cli@${version2 ?? "latest"}`;
24547
24677
  logger.info(`puddle CLI ${cliVersion()} \u2014 asking npm for ${version2 ?? "the latest release"}`);
24548
24678
  return new Promise((resolve6, reject) => {
24549
- const child = spawn7("npm", ["install", "-g", spec], { stdio: "inherit" });
24679
+ const child = spawn8("npm", ["install", "-g", spec], { stdio: "inherit" });
24550
24680
  child.on(
24551
24681
  "error",
24552
24682
  () => reject(
@@ -24571,7 +24701,7 @@ async function removeCli(yes, logger) {
24571
24701
  const standalone = standaloneInstallation();
24572
24702
  if (standalone) {
24573
24703
  const proceed2 = await confirm(
24574
- `Remove the standalone CLI at ${standalone.root} and its launcher in ${dirname10(standalone.launcher)}? Close its cockpits first; daemons and their sessions are untouched.`,
24704
+ `Remove the standalone CLI at ${standalone.root} and its launcher in ${dirname11(standalone.launcher)}? Close its cockpits first; daemons and their sessions are untouched.`,
24575
24705
  { skip: yes }
24576
24706
  );
24577
24707
  if (!proceed2) {
@@ -24583,7 +24713,7 @@ async function removeCli(yes, logger) {
24583
24713
  return 0;
24584
24714
  }
24585
24715
  const managed = await new Promise((resolve6) => {
24586
- const child = spawn7("npm", ["ls", "-g", "@puddle-code/cli", "--depth=0"], { stdio: "ignore" });
24716
+ const child = spawn8("npm", ["ls", "-g", "@puddle-code/cli", "--depth=0"], { stdio: "ignore" });
24587
24717
  child.on("error", () => resolve6(false));
24588
24718
  child.on("exit", (code) => resolve6(code === 0));
24589
24719
  });
@@ -24603,7 +24733,7 @@ async function removeCli(yes, logger) {
24603
24733
  return 0;
24604
24734
  }
24605
24735
  return new Promise((resolve6, reject) => {
24606
- const child = spawn7("npm", ["uninstall", "-g", "@puddle-code/cli"], { stdio: "inherit" });
24736
+ const child = spawn8("npm", ["uninstall", "-g", "@puddle-code/cli"], { stdio: "inherit" });
24607
24737
  child.on("error", () => reject(new CliError("not_installed", "npm is not on PATH")));
24608
24738
  child.on("exit", (code) => {
24609
24739
  if (code === 0) {
@@ -24617,7 +24747,7 @@ async function removeCli(yes, logger) {
24617
24747
  }
24618
24748
 
24619
24749
  // src/cli/manage.ts
24620
- import { spawn as spawn9 } from "node:child_process";
24750
+ import { spawn as spawn10 } from "node:child_process";
24621
24751
  import { existsSync as existsSync6 } from "node:fs";
24622
24752
  import { chmod as chmod2, copyFile, mkdir as mkdir3, rename, rm as rm3 } from "node:fs/promises";
24623
24753
  import { homedir as homedir2 } from "node:os";
@@ -24758,9 +24888,9 @@ async function upgradeDaemon(transport, opts = {}) {
24758
24888
  }
24759
24889
 
24760
24890
  // src/cli/detach.ts
24761
- import { spawn as spawn8 } from "node:child_process";
24891
+ import { spawn as spawn9 } from "node:child_process";
24762
24892
  import { closeSync as closeSync2, mkdirSync as mkdirSync6, openSync as openSync2, readFileSync as readFileSync10 } from "node:fs";
24763
- import { dirname as dirname11 } from "node:path";
24893
+ import { dirname as dirname12 } from "node:path";
24764
24894
  init_types();
24765
24895
  var COCKPIT_CHILD_ENV = "PUDDLE_COCKPIT_CHILD";
24766
24896
  var READY_TIMEOUT_MS = 3e5;
@@ -24799,10 +24929,10 @@ async function launchDetached(opts) {
24799
24929
  }
24800
24930
  if (target !== "local") await new SshTransport(target).open();
24801
24931
  const logFile = cockpitLogPath(target);
24802
- mkdirSync6(dirname11(logFile), { recursive: true });
24932
+ mkdirSync6(dirname12(logFile), { recursive: true });
24803
24933
  const fd = openSync2(logFile, "w");
24804
24934
  const argv = opts.argv ?? process.argv.slice(2);
24805
- const child = spawn8(process.execPath, [process.argv[1] ?? "", ...argv], {
24935
+ const child = spawn9(process.execPath, [process.argv[1] ?? "", ...argv], {
24806
24936
  detached: true,
24807
24937
  stdio: ["ignore", fd, fd, "ipc"],
24808
24938
  env: { ...process.env, [COCKPIT_CHILD_ENV]: "1" }
@@ -24867,7 +24997,7 @@ async function followStartup(target, childPid, logFile) {
24867
24997
  }
24868
24998
  function spawnDetachedRefresh(target, argv, refreshId) {
24869
24999
  const logFile = cockpitLogPath(target);
24870
- mkdirSync6(dirname11(logFile), { recursive: true });
25000
+ mkdirSync6(dirname12(logFile), { recursive: true });
24871
25001
  const fd = openSync2(logFile, "a");
24872
25002
  const env = {
24873
25003
  ...process.env,
@@ -24875,7 +25005,7 @@ function spawnDetachedRefresh(target, argv, refreshId) {
24875
25005
  PUDDLE_INTERNAL_REFRESH: "1"
24876
25006
  };
24877
25007
  delete env[COCKPIT_CHILD_ENV];
24878
- const child = spawn8(process.execPath, [process.argv[1] ?? "", ...argv], {
25008
+ const child = spawn9(process.execPath, [process.argv[1] ?? "", ...argv], {
24879
25009
  detached: true,
24880
25010
  stdio: ["ignore", fd, fd],
24881
25011
  env
@@ -25110,7 +25240,7 @@ async function installDesktopAppImage(version2, logger) {
25110
25240
  ...protocol ? { protocol } : {}
25111
25241
  });
25112
25242
  logger.info(`installed \u2014 run it directly (${target}) or add it to your launcher`);
25113
- const opener = spawn9("xdg-open", [dir], { stdio: "ignore", detached: true });
25243
+ const opener = spawn10("xdg-open", [dir], { stdio: "ignore", detached: true });
25114
25244
  opener.on("error", () => void 0);
25115
25245
  opener.unref();
25116
25246
  return 0;
@@ -25277,7 +25407,7 @@ function timestampedLogger() {
25277
25407
 
25278
25408
  // src/cli/run.ts
25279
25409
  function assetsDir() {
25280
- const here = dirname12(fileURLToPath5(import.meta.url));
25410
+ const here = dirname13(fileURLToPath5(import.meta.url));
25281
25411
  for (const candidate of [join17(here, "public"), join17(here, "..", "..", "dist", "public")]) {
25282
25412
  if (existsSync7(join17(candidate, "index.html"))) return candidate;
25283
25413
  }