@puddle-code/cli 0.3.2 → 0.3.4

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 (225) hide show
  1. package/CHANGELOG.md +9 -7
  2. package/dist/host-control.mjs +67 -6
  3. package/dist/index.js +191 -31
  4. package/dist/public/assets/App-CwV0Dizo.js +2 -0
  5. package/dist/public/assets/Dashboard-fA7E3Mr1.js +1 -0
  6. package/dist/public/assets/EditorTabClose-DNWGZZN8.js +1 -0
  7. package/dist/public/assets/FindWidget-BSK2PIfO.js +1 -0
  8. package/dist/public/assets/LazyTerminal-CAvxgexS.js +2 -0
  9. package/dist/public/assets/{ModelRefcount-Dkp1avzM.js → ModelRefcount-CJK-g5rf.js} +1 -1
  10. package/dist/public/assets/NewProjectDialog-eDAOcbIM.js +1 -0
  11. package/dist/public/assets/PaneEditorBody-Cxn0s84L.js +302 -0
  12. package/dist/public/assets/PdfViewer-BY5xRKk1.js +2 -0
  13. package/dist/public/assets/SettingsDialog-Sd6i7Plz.js +8 -0
  14. package/dist/public/assets/Terminal-CqjwbNAI.js +66 -0
  15. package/dist/public/assets/Workspace-C-M1AjMn.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-cjbSLnao.js +73 -0
  20. package/dist/public/assets/{blockDiagram-I7D4REHJ-NHlOsaCN.js → blockDiagram-I7D4REHJ-TUFuv4qI.js} +1 -1
  21. package/dist/public/assets/buffer-store-BAQjeFXg.js +16 -0
  22. package/dist/public/assets/button-Chvl9hcE.js +1 -0
  23. package/dist/public/assets/{c4Diagram-7LVT6UL2-ZLfrwKT4.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-Brp_wxZT.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-9vLeKuoB.js → chunk-75Z2AOVW-CYC6lmPG.js} +1 -1
  36. package/dist/public/assets/{chunk-CLGD4ZFX-B8Oa13vy.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-I29_mrbz.js → chunk-F27PBJKO-DM71futS.js} +1 -1
  39. package/dist/public/assets/{chunk-GMAD6QVW-ZzqGXNRY.js → chunk-GMAD6QVW-BzDEhlK8.js} +1 -1
  40. package/dist/public/assets/{chunk-GVQU2GXP-DiJctosx.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-yuPnJltA.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-DB3LOw2c.js → chunk-L3NEJ4N5-BW3s5_r9.js} +1 -1
  47. package/dist/public/assets/{chunk-OSK3NFVY-ygO9ccvX.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-CaO30dnF.js → chunk-P2QGCYS3-C5-f0Lvg.js} +1 -1
  50. package/dist/public/assets/{chunk-POPQ4Y6H-BS_wlBQ7.js → chunk-POPQ4Y6H-gkafJx1Z.js} +1 -1
  51. package/dist/public/assets/{chunk-PWAF6VOD-BYtVJDwT.js → chunk-PWAF6VOD-CTSTb7zN.js} +1 -1
  52. package/dist/public/assets/{chunk-SHT3W25Y-DbWwFCez.js → chunk-SHT3W25Y-Cg6sVFNA.js} +1 -1
  53. package/dist/public/assets/{chunk-SVP7TREG-DLDU3lFF.js → chunk-SVP7TREG-DRUnItYx.js} +1 -1
  54. package/dist/public/assets/{chunk-TICWLB2K-Bo_jKuAY.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-DVUv5Z6a.js +1 -0
  62. package/dist/public/assets/copy-Df7qIcX6.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-DJ40uVpF.js → dagre-GXQ25YYZ-BjnR_o63.js} +1 -1
  67. package/dist/public/assets/{diagram-S7CK7UJ4-CakLFIEW.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-VJip2Tpi.js → diagram-VX7I27RA-DYP31PbY.js} +2 -2
  71. package/dist/public/assets/{diagram-Z3DM3KII-CPQuWy39.js → diagram-Z3DM3KII-C-mC8cmq.js} +1 -1
  72. package/dist/public/assets/dialog-Bnex_wlx.js +1 -0
  73. package/dist/public/assets/disclosure-C2uTs3Vm.js +1 -0
  74. package/dist/public/assets/dist-B67qxih2.js +1 -0
  75. package/dist/public/assets/dist-BCwJL3w9.js +1 -0
  76. package/dist/public/assets/dist-Cl5AP2As.js +1 -0
  77. package/dist/public/assets/dist-DmyIHyF9.js +1 -0
  78. package/dist/public/assets/ebnfDiagram-PWID7BFC-CnSa44Tb.js +1 -0
  79. package/dist/public/assets/{erDiagram-RLTQ6QDP-DqwnnH7t.js → erDiagram-RLTQ6QDP-ZmDlrO9k.js} +1 -1
  80. package/dist/public/assets/{errors-BkbAF9Bu.js → errors-BiS6nBXL.js} +1 -1
  81. package/dist/public/assets/es2015-CrC2hHeB.js +41 -0
  82. package/dist/public/assets/eventmodeling-NTZA5JFV-uFnlWNGc.js +1 -0
  83. package/dist/public/assets/flowDiagram-HODETNUW-CW47qpBT.js +1 -0
  84. package/dist/public/assets/{ganttDiagram-EL5Y4UJY-BvWbPqg4.js → ganttDiagram-EL5Y4UJY-raM_gefY.js} +1 -1
  85. package/dist/public/assets/gitGraph-4MIJSDKK-1PxNX92k.js +1 -0
  86. package/dist/public/assets/gitGraphDiagram-WWUBYQGX-DnLrgk4s.js +106 -0
  87. package/dist/public/assets/htmlMode-CIHMS93l.js +1 -0
  88. package/dist/public/assets/index-CW1P_8TN.js +10 -0
  89. package/dist/public/assets/index-XBWIhnuP.css +2 -0
  90. package/dist/public/assets/info-A6RAGUB7-BZV44TW1.js +1 -0
  91. package/dist/public/assets/infoDiagram-27XIBGKW-eCv-Vsx8.js +2 -0
  92. package/dist/public/assets/{ishikawaDiagram-5VMMS53U-Bq13tOFJ.js → ishikawaDiagram-5VMMS53U-DCFnvrdr.js} +1 -1
  93. package/dist/public/assets/{journeyDiagram-3NMN7TZE-7GJvjukT.js → journeyDiagram-3NMN7TZE-6o4KvbhJ.js} +1 -1
  94. package/dist/public/assets/{jsonMode-C6jAdn8r.js → jsonMode-BijgXT6I.js} +1 -1
  95. package/dist/public/assets/jsx-runtime-ffCh33zF.js +1 -0
  96. package/dist/public/assets/{kanban-definition-UXKFOSKX-BIFvSwV9.js → kanban-definition-UXKFOSKX-CQKuhkFV.js} +1 -1
  97. package/dist/public/assets/{line-BjlS8UJs.js → line-D4r_bmlv.js} +1 -1
  98. package/dist/public/assets/markdown-mermaid-JPAETK2Y.js +2 -0
  99. package/dist/public/assets/{math-BNNuKpUP.js → math-CSw6sgCC.js} +2 -2
  100. package/dist/public/assets/math-delimiters-BCnTi7Ii.js +1 -0
  101. package/dist/public/assets/media-refresh-store-CHnqDJWI.js +1 -0
  102. package/dist/public/assets/mermaid-parser.core-CICMKhjq.js +4 -0
  103. package/dist/public/assets/mermaid.core-D2QzpYEE.js +11 -0
  104. package/dist/public/assets/{mindmap-definition-YA3MSWOX-Cy4SIHHe.js → mindmap-definition-YA3MSWOX-DAB8mHOv.js} +1 -1
  105. package/dist/public/assets/monaco.contribution-C0TYpF88.js +2 -0
  106. package/dist/public/assets/notification-delivery-Lz-hnQG7.js +1 -0
  107. package/dist/public/assets/packet-AYTQ26CC-Cw5JteoC.js +1 -0
  108. package/dist/public/assets/{pdf-Cnp8bCq1.js → pdf-EQHMWEbX.js} +1 -1
  109. package/dist/public/assets/pegDiagram-XKGWAZYB-BE_LYTdh.js +1 -0
  110. package/dist/public/assets/pie-WAS4IAKB-CnPKaBaN.js +1 -0
  111. package/dist/public/assets/pieDiagram-E7YTZNPT-BRffiJ1a.js +39 -0
  112. package/dist/public/assets/popover-C-BfSLgw.js +1 -0
  113. package/dist/public/assets/preload-helper-Czpn1I53.js +1 -0
  114. package/dist/public/assets/preview-kind-CJ9RTgbs.js +1 -0
  115. package/dist/public/assets/project-abbrev-Bz8ZEwrb.js +1 -0
  116. package/dist/public/assets/protocol-support-CJIxbQCB.js +1 -0
  117. package/dist/public/assets/{quadrantDiagram-AXDQQJYC-2BigfRRK.js → quadrantDiagram-AXDQQJYC-DYWp1Jjq.js} +1 -1
  118. package/dist/public/assets/radar-RG4KPBEZ-Dqx79rlE.js +1 -0
  119. package/dist/public/assets/railroad-74A4TZTK-BkDQqaz7.js +1 -0
  120. package/dist/public/assets/railroad-abnf-HS5TGJTU-kgqWL-Ba.js +1 -0
  121. package/dist/public/assets/railroad-ebnf-LZEXJU2U-GspfOzjs.js +1 -0
  122. package/dist/public/assets/railroad-peg-WCYAUIDC-qO23KZap.js +1 -0
  123. package/dist/public/assets/railroadDiagram-O6MQD6OU-wuPYUWJ2.js +1 -0
  124. package/dist/public/assets/recipes-K5GH3Kht.js +1 -0
  125. package/dist/public/assets/{requirementDiagram-BXWQKSXE-BfBBVeo_.js → requirementDiagram-BXWQKSXE-BtGNZ92J.js} +1 -1
  126. package/dist/public/assets/rotate-ccw-CNjR2LSi.js +1 -0
  127. package/dist/public/assets/{sankeyDiagram-P5KCCOFB-BHy22mhl.js → sankeyDiagram-P5KCCOFB-XgIIrsbe.js} +1 -1
  128. package/dist/public/assets/scroll-restoration-r--43sOx.js +1 -0
  129. package/dist/public/assets/select-YFIOZ3zx.js +1 -0
  130. package/dist/public/assets/selection-actions-C2udLSyj.js +1 -0
  131. package/dist/public/assets/{sequenceDiagram-WJ2MYXX4-Dhgnxvrt.js → sequenceDiagram-WJ2MYXX4-CVIIE7ze.js} +1 -1
  132. package/dist/public/assets/{stateDiagram-D77RDMKH-CPWwa5Aj.js → stateDiagram-D77RDMKH-0kIDexDQ.js} +1 -1
  133. package/dist/public/assets/stateDiagram-v2-MP3YSRHH-DdU6a-zG.js +1 -0
  134. package/dist/public/assets/{swimlanes-42K2YHIH-DsqTASlp.js → swimlanes-42K2YHIH-BY2JV_Jb.js} +1 -1
  135. package/dist/public/assets/swimlanesDiagram-VR7AAH4N-BCiIa4tX.js +8 -0
  136. package/dist/public/assets/switch-DwMO1AUH.js +1 -0
  137. package/dist/public/assets/{timeline-definition-24CTP7MA-B7hjD0KJ.js → timeline-definition-24CTP7MA-CPRUSXUS.js} +1 -1
  138. package/dist/public/assets/treeView-Q6P3EWNA-CiZNqz_z.js +1 -0
  139. package/dist/public/assets/treemap-WGGIJYW6-5hDYDC6e.js +1 -0
  140. package/dist/public/assets/{tsMode-CillYPbz.js → tsMode-B7q3gz7a.js} +1 -1
  141. package/dist/public/assets/use-ui-state-Crvfdw4F.js +1 -0
  142. package/dist/public/assets/{vennDiagram-4TSXK5OY-BvS0i65j.js → vennDiagram-4TSXK5OY-CU1Q7iGV.js} +1 -1
  143. package/dist/public/assets/wardley-WFR3VGLG-CWb_ROLo.js +1 -0
  144. package/dist/public/assets/{wardleyDiagram-VM6X3IG4-CxconmGB.js → wardleyDiagram-VM6X3IG4-B2Pn7CDF.js} +3 -3
  145. package/dist/public/assets/whole-word-2m2pmAFT.js +1 -0
  146. package/dist/public/assets/workers-Ck67TJT4.js +1 -0
  147. package/dist/public/assets/ws-B1kcYo2j.js +1 -0
  148. package/dist/public/assets/x-DCpy1q13.js +1 -0
  149. package/dist/public/assets/{xychartDiagram-S5SC5T6Z-DSJMW0r7.js → xychartDiagram-S5SC5T6Z-xhQ4tT_S.js} +1 -1
  150. package/dist/public/index.html +6 -2
  151. package/dist/pudl.js +68 -7
  152. package/package.json +1 -1
  153. package/dist/public/assets/App-D_YTB3jH.js +0 -2
  154. package/dist/public/assets/Dashboard-Djw9nPV_.js +0 -1
  155. package/dist/public/assets/EditorTabClose-BCunnuEj.js +0 -1
  156. package/dist/public/assets/FindWidget-Ch-y_4eH.js +0 -1
  157. package/dist/public/assets/LazyTerminal-BN3rEDcD.js +0 -2
  158. package/dist/public/assets/NewProjectDialog-BK_gfWmL.js +0 -1
  159. package/dist/public/assets/PaneEditorBody-ClWRSuGV.js +0 -299
  160. package/dist/public/assets/PdfViewer-CbC1KAkq.js +0 -2
  161. package/dist/public/assets/SettingsDialog-DsmyHhQB.js +0 -8
  162. package/dist/public/assets/Terminal-CDnGRsgd.js +0 -66
  163. package/dist/public/assets/Workspace-CmclLFK3.js +0 -20
  164. package/dist/public/assets/abnfDiagram-VCTEODGH-Aa5uAdnV.js +0 -1
  165. package/dist/public/assets/architecture-7GRP2DOG-D3814jvH.js +0 -1
  166. package/dist/public/assets/architectureDiagram-5GKGNRK7-B0d475xG.js +0 -36
  167. package/dist/public/assets/buffer-store-BtRP7zZm.js +0 -16
  168. package/dist/public/assets/button-D3DTuFk3.js +0 -1
  169. package/dist/public/assets/channel-C6g1aWXR.js +0 -1
  170. package/dist/public/assets/chunk-2E4U76K2-DyVxGuz5.js +0 -2
  171. package/dist/public/assets/chunk-DU6HZSFF-ziCxw8j9.js +0 -125
  172. package/dist/public/assets/chunk-TLUHSLCS-BGFLoTUj.js +0 -2
  173. package/dist/public/assets/classDiagram-ZZMXUADV-BiQrxRCS.js +0 -1
  174. package/dist/public/assets/classDiagram-v2-VYDZK3BY-BiQrxRCS.js +0 -1
  175. package/dist/public/assets/context-menu-CwR-PGrS.js +0 -1
  176. package/dist/public/assets/copy-ZzKoF5dj.js +0 -1
  177. package/dist/public/assets/cssMode-DBrJeag9.js +0 -1
  178. package/dist/public/assets/cynefin-OW5HDTMX-DsXo9hDP.js +0 -1
  179. package/dist/public/assets/cynefinDiagram-5FMLGOSQ-CNr5UISm.js +0 -62
  180. package/dist/public/assets/diagram-UQ7AKVKN-Blm9jWHJ.js +0 -41
  181. package/dist/public/assets/diagram-VSXAHHWV-BzXCydDQ.js +0 -3
  182. package/dist/public/assets/dialog-BoaHxScl.js +0 -41
  183. package/dist/public/assets/disclosure-DNbP2Rp4.js +0 -1
  184. package/dist/public/assets/dist-CQZ_zg-s.js +0 -1
  185. package/dist/public/assets/dist-DUfD4S2p.js +0 -1
  186. package/dist/public/assets/ebnfDiagram-PWID7BFC-x8Hm-8FP.js +0 -1
  187. package/dist/public/assets/eventmodeling-NTZA5JFV-DE-zSV6F.js +0 -1
  188. package/dist/public/assets/flowDiagram-HODETNUW-Cn9XuALP.js +0 -1
  189. package/dist/public/assets/gitGraph-4MIJSDKK-DKeR8Wjx.js +0 -1
  190. package/dist/public/assets/gitGraphDiagram-WWUBYQGX-CPJ482wi.js +0 -106
  191. package/dist/public/assets/htmlMode-CKCaIwmL.js +0 -1
  192. package/dist/public/assets/index-CAvJOpdz.css +0 -2
  193. package/dist/public/assets/index-CPKHBs7z.js +0 -82
  194. package/dist/public/assets/info-A6RAGUB7-CYKUxPau.js +0 -1
  195. package/dist/public/assets/infoDiagram-27XIBGKW-5qHuu76B.js +0 -2
  196. package/dist/public/assets/markdown-mermaid-B_y_6yBe.js +0 -2
  197. package/dist/public/assets/media-refresh-store-BnZNW8xS.js +0 -1
  198. package/dist/public/assets/mermaid-parser.core-BwJKOdFv.js +0 -7
  199. package/dist/public/assets/mermaid.core-Cii531li.js +0 -11
  200. package/dist/public/assets/notification-delivery-Cn-YcMec.js +0 -1
  201. package/dist/public/assets/packet-AYTQ26CC-y8aHtpCT.js +0 -1
  202. package/dist/public/assets/pegDiagram-XKGWAZYB-yIL7Oty_.js +0 -1
  203. package/dist/public/assets/pie-WAS4IAKB-DNZ4gYKN.js +0 -1
  204. package/dist/public/assets/pieDiagram-E7YTZNPT-CUwYqrWF.js +0 -39
  205. package/dist/public/assets/preview-kind-QJSMKfUN.js +0 -1
  206. package/dist/public/assets/project-abbrev-B5CMO00I.js +0 -1
  207. package/dist/public/assets/protocol-support-hVrRUHAd.js +0 -1
  208. package/dist/public/assets/radar-RG4KPBEZ-DCE8-Z-G.js +0 -1
  209. package/dist/public/assets/railroad-74A4TZTK-BfnC2It7.js +0 -1
  210. package/dist/public/assets/railroad-abnf-HS5TGJTU-C8QChwRk.js +0 -1
  211. package/dist/public/assets/railroad-ebnf-LZEXJU2U-DN6nLE-f.js +0 -1
  212. package/dist/public/assets/railroad-peg-WCYAUIDC-emPIg_g-.js +0 -1
  213. package/dist/public/assets/railroadDiagram-O6MQD6OU-DpX2WbJ5.js +0 -1
  214. package/dist/public/assets/scroll-restoration-rhyw8Ck0.js +0 -1
  215. package/dist/public/assets/selection-actions-BDJnKwuj.js +0 -1
  216. package/dist/public/assets/stateDiagram-v2-MP3YSRHH-CmGYleZg.js +0 -1
  217. package/dist/public/assets/swimlanesDiagram-VR7AAH4N-CUahIPDv.js +0 -8
  218. package/dist/public/assets/switch-DGZtVofo.js +0 -1
  219. package/dist/public/assets/treeView-Q6P3EWNA-WU6eWUi6.js +0 -1
  220. package/dist/public/assets/treemap-WGGIJYW6-BNZcLwqI.js +0 -1
  221. package/dist/public/assets/use-ui-state-BZeOd2de.js +0 -1
  222. package/dist/public/assets/view-state-store-BEl9Q1Jm.js +0 -1
  223. package/dist/public/assets/wardley-WFR3VGLG-ChvHhLGz.js +0 -1
  224. package/dist/public/assets/ws-B6RLTvWI.js +0 -1
  225. package/dist/public/assets/x-CZCUod6A.js +0 -1
package/CHANGELOG.md CHANGED
@@ -4,16 +4,18 @@ Archived release changelog. Governance lives in CLAUDE.md §"Changelog disciplin
4
4
 
5
5
  # Changelog
6
6
 
7
- ## [0.3.2] — 2026-10-14
7
+ ## [0.3.4] — 2026-10-23
8
8
 
9
9
  ### Added
10
10
 
11
- - Support Claude Code, Codex, OpenCode and Gemini CLI in Puddlang with per-agent interactive or headless execution, persisted mode selection, exact reply correlation and account-preserving native conversation resume (daemon protocol 24.0).
11
+ - Keep notebook kernels alive across runs and browser reconnects; add notebook header controls for cells, Run All, clearing output, outline navigation, kernel selection, interruption, restart and shutdown.
12
+ - Add language-selectable compilation and execution defaults under Settings → Editor, sharing command controls with per-file overrides.
13
+ - Choose project name colours from the profile palette when creating or editing a project, or from either sidebar's project context menu; retain colours across dashboard cards and project navigation.
14
+ - Add editable `.ipynb` notebook views with saved rich output, a JSON source toggle, and explicit whole-notebook execution through host-installed Jupyter.
15
+ - Run Python, JavaScript, TypeScript, C, C++, Rust, Go, Ruby, Perl, R and shell files with detected host tools, per-file command overrides, bounded output and managed result tabs; keep code execution manual.
12
16
 
13
17
  ### Changed
14
18
 
15
- - Rename Puddlang's `scripted` execution mode to `headless` across spawn options, session state, agent modules, examples and documentation; migrate existing placements and advance daemon protocol to 24.0 and remote protocol to 4.
16
-
17
- ### Fixed
18
-
19
- - Include the Puddlang runner and its imports in standalone daemon archives, with a release smoke test that executes a TypeScript programme using both `puddlang` and `zod`.
19
+ - Advance the daemon/cockpit protocol to 24.6 for host kernel discovery, status and explicit notebook lifecycle actions.
20
+ - Advance the daemon/cockpit protocol to 24.5 for optional project colours; hide colour controls on older hosts and preserve existing project styling by default.
21
+ - Advance the daemon/cockpit protocol to 24.4 for profile language command defaults, inherited file commands and an optional compilation-provider action label; retain LaTeX eager controls only for providers that advertise eager support.
@@ -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();
@@ -14689,6 +14690,15 @@ ${RULES_TOKEN}
14689
14690
  4. If the user states a standing rule for all future worktrees ("always\u2026", "never\u2026", "from now on\u2026"), write the complete updated rules to \`.puddle/onboarding-notes.md\` in this worktree \u2014 full replacement, user-owned prose; record their decision, don't invent policy.
14690
14691
 
14691
14692
  Then proceed with the task below (or await instructions if none is given).`;
14693
+ var PROFILE_ICON_COLOURS = [
14694
+ "navy",
14695
+ "gold",
14696
+ "blue",
14697
+ "green",
14698
+ "red",
14699
+ "violet",
14700
+ "cyan"
14701
+ ];
14692
14702
  var profileSchema = external_exports.object({
14693
14703
  id: profileId,
14694
14704
  name: fsSafeName,
@@ -15110,13 +15120,15 @@ var archiveRequestSchema = external_exports.object({
15110
15120
  });
15111
15121
 
15112
15122
  // ../shared/src/api/projects.ts
15113
- var projectAbbrev = external_exports.string().min(1).max(5);
15123
+ var projectAbbrev2 = external_exports.string().min(1).max(5);
15124
+ var projectColourSchema = external_exports.enum(PROFILE_ICON_COLOURS);
15114
15125
  var projectSchema = external_exports.object({
15115
15126
  id: projectId,
15116
15127
  profile_id: profileId,
15117
15128
  repo_id: rowId,
15118
15129
  name: external_exports.string(),
15119
- abbrev: projectAbbrev.nullable().default(null),
15130
+ abbrev: projectAbbrev2.nullable().default(null),
15131
+ colour: projectColourSchema.nullable().optional(),
15120
15132
  /**
15121
15133
  * Hidden from the homescreen but never deleted — every session, worktree, and
15122
15134
  * bit of data is retained, and un-archiving restores it all (SPEC §11).
@@ -15130,11 +15142,13 @@ var createProjectRequestSchema = external_exports.object({
15130
15142
  profile_id: profileId,
15131
15143
  repo_id: rowId,
15132
15144
  name: external_exports.string().min(1).max(100),
15133
- abbrev: projectAbbrev.optional()
15145
+ abbrev: projectAbbrev2.optional(),
15146
+ colour: projectColourSchema.nullable().optional()
15134
15147
  });
15135
15148
  var patchProjectRequestSchema = external_exports.object({
15136
15149
  name: external_exports.string().min(1).max(100).optional(),
15137
- abbrev: projectAbbrev.optional(),
15150
+ abbrev: projectAbbrev2.optional(),
15151
+ colour: projectColourSchema.nullable().optional(),
15138
15152
  archived: external_exports.boolean().optional()
15139
15153
  });
15140
15154
  var projectDetailSchema = external_exports.object({
@@ -15195,7 +15209,9 @@ var compilationProviderSchema = external_exports.object({
15195
15209
  available: external_exports.boolean(),
15196
15210
  /** The preferred host executable when available, for honest capability UI. */
15197
15211
  executor: external_exports.string().min(1).nullable(),
15198
- eager: external_exports.boolean()
15212
+ eager: external_exports.boolean(),
15213
+ /** Omitted by older providers, whose action remains compilation. */
15214
+ action: external_exports.enum(["compile", "run"]).optional()
15199
15215
  });
15200
15216
  var compilationCapabilitiesResponseSchema = external_exports.object({
15201
15217
  providers: external_exports.array(compilationProviderSchema)
@@ -15264,7 +15280,9 @@ var compilationCommandSlotSchema = external_exports.object({
15264
15280
  /** Stable trigger copy lets a generic dialog explain exactly when this slot runs. */
15265
15281
  run_when: external_exports.enum(["when_clicked", "upon_file_change"]),
15266
15282
  default_command: external_exports.string().min(1).nullable(),
15267
- override_command: external_exports.string().min(1).nullable()
15283
+ override_command: external_exports.string().min(1).nullable(),
15284
+ /** Profile language default inherited by this file (24.4); null uses the provider. */
15285
+ inherited_command: external_exports.string().min(1).nullable().optional()
15268
15286
  });
15269
15287
  var compilationSettingsRequestSchema = compilationTargetRequestSchema.extend({
15270
15288
  profile_id: profileId,
@@ -15284,6 +15302,18 @@ var updateCompilationSettingsRequestSchema = compilationSettingsRequestSchema.ex
15284
15302
  mode: compilationModeSchema,
15285
15303
  command: external_exports.string().trim().min(1).max(16384).nullable()
15286
15304
  });
15305
+ var compilationDefaultsRequestSchema = external_exports.object({
15306
+ profile_id: profileId,
15307
+ provider: compilationProviderIdSchema
15308
+ });
15309
+ var compilationDefaultsResponseSchema = compilationSettingsResponseSchema.omit({
15310
+ file_type: true,
15311
+ file_path: true
15312
+ });
15313
+ var updateCompilationDefaultsRequestSchema = compilationDefaultsRequestSchema.extend({
15314
+ mode: compilationModeSchema,
15315
+ command: updateCompilationSettingsRequestSchema.shape.command
15316
+ });
15287
15317
 
15288
15318
  // ../shared/src/api/ui-state.ts
15289
15319
  var editorTabRefSchema = external_exports.object({
@@ -15450,6 +15480,31 @@ var patchLayoutRequestSchema = external_exports.object({
15450
15480
  active_session: sessionId.nullable().optional()
15451
15481
  });
15452
15482
 
15483
+ // ../shared/src/api/notebooks.ts
15484
+ var notebookKernelSpecSchema = external_exports.object({
15485
+ name: external_exports.string().min(1),
15486
+ display_name: external_exports.string().min(1),
15487
+ language: external_exports.string()
15488
+ });
15489
+ var notebookKernelsResponseSchema = external_exports.object({
15490
+ available: external_exports.boolean(),
15491
+ kernels: external_exports.array(notebookKernelSpecSchema),
15492
+ error: external_exports.string().optional()
15493
+ });
15494
+ var notebookKernelRequestSchema = external_exports.object({ source: compilationFileTargetSchema });
15495
+ var notebookKernelStatusSchema = external_exports.object({
15496
+ state: external_exports.enum(["stopped", "starting", "idle", "busy", "dead"]),
15497
+ kernel: external_exports.string().nullable(),
15498
+ error: external_exports.string().optional()
15499
+ });
15500
+ var notebookKernelActionSchema = external_exports.discriminatedUnion("action", [
15501
+ notebookKernelRequestSchema.extend({
15502
+ action: external_exports.literal("select"),
15503
+ kernel: external_exports.string().min(1).max(256)
15504
+ }),
15505
+ notebookKernelRequestSchema.extend({ action: external_exports.enum(["interrupt", "restart", "shutdown"]) })
15506
+ ]);
15507
+
15453
15508
  // ../shared/src/api/latex.ts
15454
15509
  var latexSynctexRequestSchema = compilationFileTargetSchema.extend({
15455
15510
  root: external_exports.string().min(1),
@@ -15749,6 +15804,12 @@ var cockpitRefreshResponseSchema = external_exports.object({
15749
15804
  refreshId: external_exports.string().uuid(),
15750
15805
  instance: external_exports.string().uuid()
15751
15806
  });
15807
+ var cockpitFileManagerSchema = external_exports.object({
15808
+ name: external_exports.enum(["Finder", "File Explorer", "File Manager"]).nullable()
15809
+ });
15810
+ var cockpitRevealRequestSchema = external_exports.object({
15811
+ path: external_exports.string().min(1).max(4096).refine((path) => !path.includes("\0"))
15812
+ }).strict();
15752
15813
 
15753
15814
  // ../shared/src/ws/messages.ts
15754
15815
  var termId = external_exports.string().regex(/^(agent|shell-[0-9]+)$/);
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: 24, minor: 0 };
3928
+ var PROTOCOL_VERSION = { major: 24, minor: 6 };
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();
@@ -18609,6 +18610,15 @@ ${RULES_TOKEN}
18609
18610
  4. If the user states a standing rule for all future worktrees ("always\u2026", "never\u2026", "from now on\u2026"), write the complete updated rules to \`.puddle/onboarding-notes.md\` in this worktree \u2014 full replacement, user-owned prose; record their decision, don't invent policy.
18610
18611
 
18611
18612
  Then proceed with the task below (or await instructions if none is given).`;
18613
+ var PROFILE_ICON_COLOURS = [
18614
+ "navy",
18615
+ "gold",
18616
+ "blue",
18617
+ "green",
18618
+ "red",
18619
+ "violet",
18620
+ "cyan"
18621
+ ];
18612
18622
  var profileSchema = external_exports.object({
18613
18623
  id: profileId,
18614
18624
  name: fsSafeName,
@@ -19030,13 +19040,15 @@ var archiveRequestSchema = external_exports.object({
19030
19040
  });
19031
19041
 
19032
19042
  // ../shared/src/api/projects.ts
19033
- var projectAbbrev = external_exports.string().min(1).max(5);
19043
+ var projectAbbrev2 = external_exports.string().min(1).max(5);
19044
+ var projectColourSchema = external_exports.enum(PROFILE_ICON_COLOURS);
19034
19045
  var projectSchema = external_exports.object({
19035
19046
  id: projectId,
19036
19047
  profile_id: profileId,
19037
19048
  repo_id: rowId,
19038
19049
  name: external_exports.string(),
19039
- abbrev: projectAbbrev.nullable().default(null),
19050
+ abbrev: projectAbbrev2.nullable().default(null),
19051
+ colour: projectColourSchema.nullable().optional(),
19040
19052
  /**
19041
19053
  * Hidden from the homescreen but never deleted — every session, worktree, and
19042
19054
  * bit of data is retained, and un-archiving restores it all (SPEC §11).
@@ -19050,11 +19062,13 @@ var createProjectRequestSchema = external_exports.object({
19050
19062
  profile_id: profileId,
19051
19063
  repo_id: rowId,
19052
19064
  name: external_exports.string().min(1).max(100),
19053
- abbrev: projectAbbrev.optional()
19065
+ abbrev: projectAbbrev2.optional(),
19066
+ colour: projectColourSchema.nullable().optional()
19054
19067
  });
19055
19068
  var patchProjectRequestSchema = external_exports.object({
19056
19069
  name: external_exports.string().min(1).max(100).optional(),
19057
- abbrev: projectAbbrev.optional(),
19070
+ abbrev: projectAbbrev2.optional(),
19071
+ colour: projectColourSchema.nullable().optional(),
19058
19072
  archived: external_exports.boolean().optional()
19059
19073
  });
19060
19074
  var projectDetailSchema = external_exports.object({
@@ -19115,7 +19129,9 @@ var compilationProviderSchema = external_exports.object({
19115
19129
  available: external_exports.boolean(),
19116
19130
  /** The preferred host executable when available, for honest capability UI. */
19117
19131
  executor: external_exports.string().min(1).nullable(),
19118
- eager: external_exports.boolean()
19132
+ eager: external_exports.boolean(),
19133
+ /** Omitted by older providers, whose action remains compilation. */
19134
+ action: external_exports.enum(["compile", "run"]).optional()
19119
19135
  });
19120
19136
  var compilationCapabilitiesResponseSchema = external_exports.object({
19121
19137
  providers: external_exports.array(compilationProviderSchema)
@@ -19184,7 +19200,9 @@ var compilationCommandSlotSchema = external_exports.object({
19184
19200
  /** Stable trigger copy lets a generic dialog explain exactly when this slot runs. */
19185
19201
  run_when: external_exports.enum(["when_clicked", "upon_file_change"]),
19186
19202
  default_command: external_exports.string().min(1).nullable(),
19187
- override_command: external_exports.string().min(1).nullable()
19203
+ override_command: external_exports.string().min(1).nullable(),
19204
+ /** Profile language default inherited by this file (24.4); null uses the provider. */
19205
+ inherited_command: external_exports.string().min(1).nullable().optional()
19188
19206
  });
19189
19207
  var compilationSettingsRequestSchema = compilationTargetRequestSchema.extend({
19190
19208
  profile_id: profileId,
@@ -19204,6 +19222,18 @@ var updateCompilationSettingsRequestSchema = compilationSettingsRequestSchema.ex
19204
19222
  mode: compilationModeSchema,
19205
19223
  command: external_exports.string().trim().min(1).max(16384).nullable()
19206
19224
  });
19225
+ var compilationDefaultsRequestSchema = external_exports.object({
19226
+ profile_id: profileId,
19227
+ provider: compilationProviderIdSchema
19228
+ });
19229
+ var compilationDefaultsResponseSchema = compilationSettingsResponseSchema.omit({
19230
+ file_type: true,
19231
+ file_path: true
19232
+ });
19233
+ var updateCompilationDefaultsRequestSchema = compilationDefaultsRequestSchema.extend({
19234
+ mode: compilationModeSchema,
19235
+ command: updateCompilationSettingsRequestSchema.shape.command
19236
+ });
19207
19237
 
19208
19238
  // ../shared/src/api/ui-state.ts
19209
19239
  var editorTabRefSchema = external_exports.object({
@@ -19370,6 +19400,31 @@ var patchLayoutRequestSchema = external_exports.object({
19370
19400
  active_session: sessionId.nullable().optional()
19371
19401
  });
19372
19402
 
19403
+ // ../shared/src/api/notebooks.ts
19404
+ var notebookKernelSpecSchema = external_exports.object({
19405
+ name: external_exports.string().min(1),
19406
+ display_name: external_exports.string().min(1),
19407
+ language: external_exports.string()
19408
+ });
19409
+ var notebookKernelsResponseSchema = external_exports.object({
19410
+ available: external_exports.boolean(),
19411
+ kernels: external_exports.array(notebookKernelSpecSchema),
19412
+ error: external_exports.string().optional()
19413
+ });
19414
+ var notebookKernelRequestSchema = external_exports.object({ source: compilationFileTargetSchema });
19415
+ var notebookKernelStatusSchema = external_exports.object({
19416
+ state: external_exports.enum(["stopped", "starting", "idle", "busy", "dead"]),
19417
+ kernel: external_exports.string().nullable(),
19418
+ error: external_exports.string().optional()
19419
+ });
19420
+ var notebookKernelActionSchema = external_exports.discriminatedUnion("action", [
19421
+ notebookKernelRequestSchema.extend({
19422
+ action: external_exports.literal("select"),
19423
+ kernel: external_exports.string().min(1).max(256)
19424
+ }),
19425
+ notebookKernelRequestSchema.extend({ action: external_exports.enum(["interrupt", "restart", "shutdown"]) })
19426
+ ]);
19427
+
19373
19428
  // ../shared/src/api/latex.ts
19374
19429
  var latexSynctexRequestSchema = compilationFileTargetSchema.extend({
19375
19430
  root: external_exports.string().min(1),
@@ -19669,6 +19724,12 @@ var cockpitRefreshResponseSchema = external_exports.object({
19669
19724
  refreshId: external_exports.string().uuid(),
19670
19725
  instance: external_exports.string().uuid()
19671
19726
  });
19727
+ var cockpitFileManagerSchema = external_exports.object({
19728
+ name: external_exports.enum(["Finder", "File Explorer", "File Manager"]).nullable()
19729
+ });
19730
+ var cockpitRevealRequestSchema = external_exports.object({
19731
+ path: external_exports.string().min(1).max(4096).refine((path) => !path.includes("\0"))
19732
+ }).strict();
19672
19733
 
19673
19734
  // ../shared/src/ws/messages.ts
19674
19735
  var termId = external_exports.string().regex(/^(agent|shell-[0-9]+)$/);
@@ -21773,7 +21834,7 @@ async function acquireAuthority(transport) {
21773
21834
  // src/cli/run.ts
21774
21835
  init_attach();
21775
21836
  import { existsSync as existsSync7 } from "node:fs";
21776
- import { dirname as dirname12, join as join17 } from "node:path";
21837
+ import { dirname as dirname13, join as join17 } from "node:path";
21777
21838
  import { fileURLToPath as fileURLToPath5 } from "node:url";
21778
21839
 
21779
21840
  // src/lib/browser.ts
@@ -21817,7 +21878,7 @@ import { readFileSync as readFileSync4 } from "node:fs";
21817
21878
  import { dirname as dirname4, join as join5 } from "node:path";
21818
21879
  import { fileURLToPath as fileURLToPath2 } from "node:url";
21819
21880
  function cliVersion() {
21820
- if (true) return "0.3.2";
21881
+ if (true) return "0.3.4";
21821
21882
  const here = dirname4(fileURLToPath2(import.meta.url));
21822
21883
  for (const candidate of [
21823
21884
  join5(here, "..", "..", "package.json"),
@@ -22217,7 +22278,9 @@ var RELEASE_PROTOCOLS = {
22217
22278
  "0.2.24": { major: 22, minor: 5 },
22218
22279
  "0.3.0": { major: 23, minor: 0 },
22219
22280
  "0.3.1": { major: 23, minor: 0 },
22220
- "0.3.2": { major: 24, minor: 0 }
22281
+ "0.3.2": { major: 24, minor: 0 },
22282
+ "0.3.3": { major: 24, minor: 2 },
22283
+ "0.3.4": { major: 24, minor: 6 }
22221
22284
  };
22222
22285
  function validProtocol(value) {
22223
22286
  if (typeof value !== "object" || value === null) return false;
@@ -23663,6 +23726,34 @@ async function checkRemoteRegistration(req, res, authorised) {
23663
23726
  }
23664
23727
  }
23665
23728
 
23729
+ // src/lib/serve/file-manager.ts
23730
+ function fileManagerHandler(manager) {
23731
+ let busy = false;
23732
+ return async (req, res, authorised) => {
23733
+ if (req.method === "GET") return json2(res, 200, { name: manager?.name ?? null });
23734
+ if (req.method !== "POST") return fail(res, 405, "method_not_allowed");
23735
+ if (!manager) return fail(res, 404, "file_manager_unavailable");
23736
+ const request = cockpitRevealRequestSchema.parse(await readJson(req));
23737
+ if (!authorised()) return fail(res, 401, "browser_rejected");
23738
+ if (busy) return fail(res, 409, "file_manager_busy", "A folder is already being revealed.");
23739
+ busy = true;
23740
+ try {
23741
+ await manager.reveal(request.path, authorised);
23742
+ res.writeHead(204);
23743
+ res.end();
23744
+ } catch (error51) {
23745
+ fail(
23746
+ res,
23747
+ 400,
23748
+ "reveal_failed",
23749
+ error51 instanceof Error ? error51.message : "Could not reveal this path."
23750
+ );
23751
+ } finally {
23752
+ busy = false;
23753
+ }
23754
+ };
23755
+ }
23756
+
23666
23757
  // src/lib/serve/ui-server.ts
23667
23758
  var DEFAULT_UI_PORT = 7433;
23668
23759
  var MAX_PORT_PROBES = 50;
@@ -23672,6 +23763,9 @@ async function startUiServer(opts) {
23672
23763
  const tracker = new ProxySocketTracker();
23673
23764
  const serveStatic = createStaticHandler(opts.assetsDir);
23674
23765
  const handleRemoteAccess = remoteAccessHandler(opts.remoteAccess);
23766
+ const handleFileManager = fileManagerHandler(
23767
+ opts.identity === "local" ? opts.fileManager : void 0
23768
+ );
23675
23769
  const nonce = randomUUID3();
23676
23770
  let origin = "";
23677
23771
  let proxyOrigin = "";
@@ -23720,6 +23814,8 @@ async function startUiServer(opts) {
23720
23814
  }
23721
23815
  if (url2.pathname === "/cockpit/local-sync")
23722
23816
  return handleLocalSync(req, res, opts.localSync, () => browsers.valid(browser));
23817
+ if (url2.pathname === "/cockpit/file-manager")
23818
+ return handleFileManager(req, res, () => browsers.valid(browser));
23723
23819
  if (url2.pathname === "/cockpit/remote")
23724
23820
  return handleRemoteAccess(req, res, () => browsers.valid(browser));
23725
23821
  if (url2.pathname === "/cockpit/remote/registration") {
@@ -24383,6 +24479,69 @@ function sanitise(record2) {
24383
24479
  // src/lib/start.ts
24384
24480
  import { join as join14 } from "node:path";
24385
24481
  init_types();
24482
+
24483
+ // src/lib/file-manager.ts
24484
+ import { execFile, spawn as spawn6 } from "node:child_process";
24485
+ import { lstat, stat } from "node:fs/promises";
24486
+ import { dirname as dirname9, isAbsolute, win32 } from "node:path";
24487
+ import { pathToFileURL } from "node:url";
24488
+ import { promisify } from "node:util";
24489
+ var execute = promisify(execFile);
24490
+ function localFileManager(platform = process.platform) {
24491
+ const name = platform === "darwin" ? "Finder" : platform === "win32" ? "File Explorer" : platform === "linux" ? "File Manager" : null;
24492
+ if (!name) return;
24493
+ return {
24494
+ name,
24495
+ async reveal(path, authorised) {
24496
+ if (!(platform === "win32" ? win32.isAbsolute(path) : isAbsolute(path)) || path.includes("\0"))
24497
+ throw new Error("Expected an absolute local path.");
24498
+ const entry = await lstat(path);
24499
+ const directory = entry.isDirectory() || entry.isSymbolicLink() && await stat(path).then(
24500
+ (target) => target.isDirectory(),
24501
+ () => false
24502
+ );
24503
+ const run3 = async (command, args, detached = false) => {
24504
+ if (!authorised()) throw new Error("Browser authorisation expired.");
24505
+ if (detached) {
24506
+ await new Promise((resolve6, reject) => {
24507
+ const child = spawn6(command, args, { stdio: "ignore", detached: true });
24508
+ child.once("error", reject);
24509
+ child.once("spawn", () => {
24510
+ child.unref();
24511
+ resolve6();
24512
+ });
24513
+ });
24514
+ return;
24515
+ }
24516
+ await execute(command, args, { timeout: 1e4, maxBuffer: 16384, windowsHide: true });
24517
+ };
24518
+ if (platform === "darwin") {
24519
+ await run3("/usr/bin/open", directory ? ["-a", "Finder", "--", path] : ["-R", "--", path]);
24520
+ } else if (platform === "win32") {
24521
+ await run3("explorer.exe", directory ? [path] : ["/select,", path], true);
24522
+ } else {
24523
+ try {
24524
+ await run3("gdbus", [
24525
+ "call",
24526
+ "--session",
24527
+ "--dest",
24528
+ "org.freedesktop.FileManager1",
24529
+ "--object-path",
24530
+ "/org/freedesktop/FileManager1",
24531
+ "--method",
24532
+ `org.freedesktop.FileManager1.${directory ? "ShowFolders" : "ShowItems"}`,
24533
+ JSON.stringify([pathToFileURL(path).href]),
24534
+ ""
24535
+ ]);
24536
+ } catch {
24537
+ await run3("xdg-open", [directory ? path : dirname9(path)], true);
24538
+ }
24539
+ }
24540
+ }
24541
+ };
24542
+ }
24543
+
24544
+ // src/lib/start.ts
24386
24545
  async function startLocal(opts) {
24387
24546
  const logger = opts.logger ?? silentLogger;
24388
24547
  const transport = new LocalTransport();
@@ -24417,6 +24576,7 @@ async function startLocal(opts) {
24417
24576
  target: { host: "127.0.0.1", port: endpoint.port },
24418
24577
  ...opts.onRefreshRequest !== void 0 ? { control: { onRefresh: opts.onRefreshRequest } } : {},
24419
24578
  localSync: { file: join14(clientHome(), "local-sync.json") },
24579
+ fileManager: localFileManager(),
24420
24580
  remoteAccess: new RemoteAccessControl(transport)
24421
24581
  });
24422
24582
  currentUi = ui;
@@ -24471,23 +24631,23 @@ init_types();
24471
24631
 
24472
24632
  // src/cli/manage-cli.ts
24473
24633
  init_types();
24474
- import { spawn as spawn7 } from "node:child_process";
24475
- import { dirname as dirname10 } from "node:path";
24634
+ import { spawn as spawn8 } from "node:child_process";
24635
+ import { dirname as dirname11 } from "node:path";
24476
24636
 
24477
24637
  // src/lib/standalone-cli.ts
24478
24638
  init_types();
24479
- import { spawn as spawn6 } from "node:child_process";
24639
+ import { spawn as spawn7 } from "node:child_process";
24480
24640
  import { existsSync as existsSync5, lstatSync as lstatSync2, readFileSync as readFileSync9, realpathSync as realpathSync2 } from "node:fs";
24481
24641
  import { mkdir as mkdir2, readFile as readFile2, rm as rm2, unlink } from "node:fs/promises";
24482
- import { basename, dirname as dirname9, isAbsolute, join as join15, resolve as resolve5 } from "node:path";
24642
+ import { basename, dirname as dirname10, isAbsolute as isAbsolute2, join as join15, resolve as resolve5 } from "node:path";
24483
24643
  import { fileURLToPath as fileURLToPath4 } from "node:url";
24484
24644
  function standaloneInstallation(entryFile = fileURLToPath4(import.meta.url), execPath = process.execPath) {
24485
- const release = resolve5(dirname9(entryFile), "..");
24645
+ const release = resolve5(dirname10(entryFile), "..");
24486
24646
  if (!existsSync5(join15(release, "STANDALONE"))) return null;
24487
24647
  try {
24488
24648
  const root = resolve5(release, "..", "..");
24489
24649
  const record2 = JSON.parse(readFileSync9(join15(root, "installation.json"), "utf8"));
24490
- 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"))
24650
+ 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"))
24491
24651
  throw new Error("Installation metadata does not match this CLI");
24492
24652
  return {
24493
24653
  root,
@@ -24511,12 +24671,12 @@ function upgradeStandaloneCli(installation, version2, repo) {
24511
24671
  "--prefix",
24512
24672
  installation.root,
24513
24673
  "--bin-dir",
24514
- dirname9(installation.launcher)
24674
+ dirname10(installation.launcher)
24515
24675
  ];
24516
24676
  if (version2 !== void 0) args.push("--version", version2);
24517
24677
  if (repo !== void 0) args.push("--repo", repo);
24518
24678
  return new Promise((resolve6, reject) => {
24519
- const child = spawn6("sh", args, { stdio: ["pipe", "inherit", "inherit"] });
24679
+ const child = spawn7("sh", args, { stdio: ["pipe", "inherit", "inherit"] });
24520
24680
  child.on("error", reject);
24521
24681
  child.stdin.on("error", (error51) => {
24522
24682
  if (error51.code !== "EPIPE") reject(error51);
@@ -24571,7 +24731,7 @@ function upgradeCli(version2, logger) {
24571
24731
  const spec = `@puddle-code/cli@${version2 ?? "latest"}`;
24572
24732
  logger.info(`puddle CLI ${cliVersion()} \u2014 asking npm for ${version2 ?? "the latest release"}`);
24573
24733
  return new Promise((resolve6, reject) => {
24574
- const child = spawn7("npm", ["install", "-g", spec], { stdio: "inherit" });
24734
+ const child = spawn8("npm", ["install", "-g", spec], { stdio: "inherit" });
24575
24735
  child.on(
24576
24736
  "error",
24577
24737
  () => reject(
@@ -24596,7 +24756,7 @@ async function removeCli(yes, logger) {
24596
24756
  const standalone = standaloneInstallation();
24597
24757
  if (standalone) {
24598
24758
  const proceed2 = await confirm(
24599
- `Remove the standalone CLI at ${standalone.root} and its launcher in ${dirname10(standalone.launcher)}? Close its cockpits first; daemons and their sessions are untouched.`,
24759
+ `Remove the standalone CLI at ${standalone.root} and its launcher in ${dirname11(standalone.launcher)}? Close its cockpits first; daemons and their sessions are untouched.`,
24600
24760
  { skip: yes }
24601
24761
  );
24602
24762
  if (!proceed2) {
@@ -24608,7 +24768,7 @@ async function removeCli(yes, logger) {
24608
24768
  return 0;
24609
24769
  }
24610
24770
  const managed = await new Promise((resolve6) => {
24611
- const child = spawn7("npm", ["ls", "-g", "@puddle-code/cli", "--depth=0"], { stdio: "ignore" });
24771
+ const child = spawn8("npm", ["ls", "-g", "@puddle-code/cli", "--depth=0"], { stdio: "ignore" });
24612
24772
  child.on("error", () => resolve6(false));
24613
24773
  child.on("exit", (code) => resolve6(code === 0));
24614
24774
  });
@@ -24628,7 +24788,7 @@ async function removeCli(yes, logger) {
24628
24788
  return 0;
24629
24789
  }
24630
24790
  return new Promise((resolve6, reject) => {
24631
- const child = spawn7("npm", ["uninstall", "-g", "@puddle-code/cli"], { stdio: "inherit" });
24791
+ const child = spawn8("npm", ["uninstall", "-g", "@puddle-code/cli"], { stdio: "inherit" });
24632
24792
  child.on("error", () => reject(new CliError("not_installed", "npm is not on PATH")));
24633
24793
  child.on("exit", (code) => {
24634
24794
  if (code === 0) {
@@ -24642,7 +24802,7 @@ async function removeCli(yes, logger) {
24642
24802
  }
24643
24803
 
24644
24804
  // src/cli/manage.ts
24645
- import { spawn as spawn9 } from "node:child_process";
24805
+ import { spawn as spawn10 } from "node:child_process";
24646
24806
  import { existsSync as existsSync6 } from "node:fs";
24647
24807
  import { chmod as chmod2, copyFile, mkdir as mkdir3, rename, rm as rm3 } from "node:fs/promises";
24648
24808
  import { homedir as homedir2 } from "node:os";
@@ -24783,9 +24943,9 @@ async function upgradeDaemon(transport, opts = {}) {
24783
24943
  }
24784
24944
 
24785
24945
  // src/cli/detach.ts
24786
- import { spawn as spawn8 } from "node:child_process";
24946
+ import { spawn as spawn9 } from "node:child_process";
24787
24947
  import { closeSync as closeSync2, mkdirSync as mkdirSync6, openSync as openSync2, readFileSync as readFileSync10 } from "node:fs";
24788
- import { dirname as dirname11 } from "node:path";
24948
+ import { dirname as dirname12 } from "node:path";
24789
24949
  init_types();
24790
24950
  var COCKPIT_CHILD_ENV = "PUDDLE_COCKPIT_CHILD";
24791
24951
  var READY_TIMEOUT_MS = 3e5;
@@ -24824,10 +24984,10 @@ async function launchDetached(opts) {
24824
24984
  }
24825
24985
  if (target !== "local") await new SshTransport(target).open();
24826
24986
  const logFile = cockpitLogPath(target);
24827
- mkdirSync6(dirname11(logFile), { recursive: true });
24987
+ mkdirSync6(dirname12(logFile), { recursive: true });
24828
24988
  const fd = openSync2(logFile, "w");
24829
24989
  const argv = opts.argv ?? process.argv.slice(2);
24830
- const child = spawn8(process.execPath, [process.argv[1] ?? "", ...argv], {
24990
+ const child = spawn9(process.execPath, [process.argv[1] ?? "", ...argv], {
24831
24991
  detached: true,
24832
24992
  stdio: ["ignore", fd, fd, "ipc"],
24833
24993
  env: { ...process.env, [COCKPIT_CHILD_ENV]: "1" }
@@ -24892,7 +25052,7 @@ async function followStartup(target, childPid, logFile) {
24892
25052
  }
24893
25053
  function spawnDetachedRefresh(target, argv, refreshId) {
24894
25054
  const logFile = cockpitLogPath(target);
24895
- mkdirSync6(dirname11(logFile), { recursive: true });
25055
+ mkdirSync6(dirname12(logFile), { recursive: true });
24896
25056
  const fd = openSync2(logFile, "a");
24897
25057
  const env = {
24898
25058
  ...process.env,
@@ -24900,7 +25060,7 @@ function spawnDetachedRefresh(target, argv, refreshId) {
24900
25060
  PUDDLE_INTERNAL_REFRESH: "1"
24901
25061
  };
24902
25062
  delete env[COCKPIT_CHILD_ENV];
24903
- const child = spawn8(process.execPath, [process.argv[1] ?? "", ...argv], {
25063
+ const child = spawn9(process.execPath, [process.argv[1] ?? "", ...argv], {
24904
25064
  detached: true,
24905
25065
  stdio: ["ignore", fd, fd],
24906
25066
  env
@@ -25135,7 +25295,7 @@ async function installDesktopAppImage(version2, logger) {
25135
25295
  ...protocol ? { protocol } : {}
25136
25296
  });
25137
25297
  logger.info(`installed \u2014 run it directly (${target}) or add it to your launcher`);
25138
- const opener = spawn9("xdg-open", [dir], { stdio: "ignore", detached: true });
25298
+ const opener = spawn10("xdg-open", [dir], { stdio: "ignore", detached: true });
25139
25299
  opener.on("error", () => void 0);
25140
25300
  opener.unref();
25141
25301
  return 0;
@@ -25302,7 +25462,7 @@ function timestampedLogger() {
25302
25462
 
25303
25463
  // src/cli/run.ts
25304
25464
  function assetsDir() {
25305
- const here = dirname12(fileURLToPath5(import.meta.url));
25465
+ const here = dirname13(fileURLToPath5(import.meta.url));
25306
25466
  for (const candidate of [join17(here, "public"), join17(here, "..", "..", "dist", "public")]) {
25307
25467
  if (existsSync7(join17(candidate, "index.html"))) return candidate;
25308
25468
  }